2017-08-11 4 views
1

私はfactoraryを計算する簡単なプロローグファイルを持っています。私はfactorial.plファイルを調べ、それをC++を通してfactという名前のモジュールと呼んでいます。既存のプロローグファイルをC++に照会する方法とそのモジュールですか?

ここは私のサンプルコードですが、正しく動作しません。

#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; 
} 

とfactorial.pl

fact(N, F) :- N =< 1, F is 1. 
fact(N, F) :- N > 1, fact(N - 1, F1), F is F1 * N. 

答えて

0

私はおそらくいくつかの他の人が同じ問題を抱えている、ここで答えを入れて解決策を見つけました。

私は推測して私のミスは、私はあなたがCPPファイルの同じフォルダにPLソースファイルを置くべき方法により、PLソースファイルをコンサルティングする代わりに、述語のPlCallを使用し、コンサルティングにあったにしている。

#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; 
} 
関連する問題