如何将现有的prolog文件查询到C++;而它';s模块? 我有简单的PROlog文件计算阶乘,我想知道如何咨询FATORAL.PL文件,并调用它的模块,通过C++来命名事实。

如何将现有的prolog文件查询到C++;而它';s模块? 我有简单的PROlog文件计算阶乘,我想知道如何咨询FATORAL.PL文件,并调用它的模块,通过C++来命名事实。,c++,swi-prolog,C++,Swi Prolog,这是我的示例代码,但它不能正常工作 #include <iostream> using std::cout; using std::cin; using std::endl; #include <SWI-Prolog.h> #include <SWI-Stream.h> #include <SWI-cpp.h> int main(int argc, char **argv) { PL_initialise(argc, argv);

这是我的示例代码,但它不能正常工作

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <SWI-Prolog.h>
#include <SWI-Stream.h>
#include <SWI-cpp.h>

int main(int argc, char **argv)
{
    PL_initialise(argc, argv);

    predicate_t p_consult = PL_predicate("consult", 1, "database");
    term_t t = PL_new_term_refs(3);
    PL_put_string_chars(t, "D:\\factorial.pl");
    PL_put_integer(t + 1, 5);
    PL_put_variable(t + 2);
    qid_t query = PL_open_query(NULL, PL_Q_NORMAL, p_consult, t);
    int result = PL_next_solution(query);

    if (result)
    {
        int x;
        PL_get_integer(t + 2, &x);
        cout << "Found solution " << x << endl;
    }

    PL_close_query(query);

    cin.ignore();
    return 0;
}
#包括
使用std::cout;
使用std::cin;
使用std::endl;
#包括
#包括
#包括
int main(int argc,字符**argv)
{
PL_初始化(argc,argv);
predicate_t p_consult=PL_谓词(“consult”,1,“数据库”);
术语t=新术语参考文献(3);
PL_put_string_chars(t,“D:\\factorial.PL”);
PL_put_整数(t+1,5);
PL_put_变量(t+2);
qid_t query=PL_open_query(NULL,PL_Q_NORMAL,p_consult,t);
int result=PL\u next\u解决方案(查询);
如果(结果)
{
int x;
PL_get_整数(t+2,&x);

我找到了答案,我把答案放在这里,也许其他人也有同样的问题

我的错误是,正如我所猜测的,我使用PlCall而不是谓词来查询pl源文件,顺便说一下,您应该将pl源文件放在cpp文件所在的同一文件夹中

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <SWI-Prolog.h>
#include <SWI-Stream.h>
#include <SWI-cpp.h>

int main(int argc, char **argv)
{
    int n;
    cout << "Please enter a number: ";
    cin >> n;

    PL_initialise(argc, argv);

    PlCall("consult('factorial.pl')");

    term_t a, b, ans;
    functor_t func;

    a = PL_new_term_ref();
    PL_put_integer(a, n);
    b = PL_new_term_ref();
    ans = PL_new_term_ref();
    func = PL_new_functor(PL_new_atom("fact"), 2);
    PL_cons_functor(ans, func, a, b);

    int fact;

    if (PL_call(ans, NULL))
    {
        PL_get_integer(b, &fact);
        cout << "Result is: " << fact << endl;
    }

    cin.ignore(2);
    return 0;
}
#包括
使用std::cout;
使用std::cin;
使用std::endl;
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int n;
cout>n;
PL_初始化(argc,argv);
PlCall(“consult('factorial.pl')”);
术语a、b、ans;
函子;
a=PL_new_term_ref();
PL_put_整数(a,n);
b=PL_新术语_ref();
ans=PL_new_term_ref();
func=PL_new_函子(PL_new_原子(“事实”),2);
PL_cons_函子(ans,func,a,b);
事实;
如果(PL_调用(ans,NULL))
{
PL_get_integer(b和fact);

我找到了答案,我把答案放在这里,也许其他人也有同样的问题

我的错误是,正如我所猜测的,我使用PlCall而不是谓词来查询pl源文件,顺便说一下,您应该将pl源文件放在cpp文件所在的同一文件夹中

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <SWI-Prolog.h>
#include <SWI-Stream.h>
#include <SWI-cpp.h>

int main(int argc, char **argv)
{
    int n;
    cout << "Please enter a number: ";
    cin >> n;

    PL_initialise(argc, argv);

    PlCall("consult('factorial.pl')");

    term_t a, b, ans;
    functor_t func;

    a = PL_new_term_ref();
    PL_put_integer(a, n);
    b = PL_new_term_ref();
    ans = PL_new_term_ref();
    func = PL_new_functor(PL_new_atom("fact"), 2);
    PL_cons_functor(ans, func, a, b);

    int fact;

    if (PL_call(ans, NULL))
    {
        PL_get_integer(b, &fact);
        cout << "Result is: " << fact << endl;
    }

    cin.ignore(2);
    return 0;
}
#包括
使用std::cout;
使用std::cin;
使用std::endl;
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int n;
cout>n;
PL_初始化(argc,argv);
PlCall(“consult('factorial.pl')”);
术语a、b、ans;
函子;
a=PL_new_term_ref();
PL_put_整数(a,n);
b=PL_新术语_ref();
ans=PL_new_term_ref();
func=PL_new_函子(PL_new_原子(“事实”),2);
PL_cons_函子(ans,func,a,b);
事实;
如果(PL_调用(ans,NULL))
{
PL_get_integer(b和fact);
库特