2010-04-04 5 views
1

Я хотел бы разработать факториал номера. Мое факториальное правило находится в файле Prolog, и я подключаю его к файлу C++. Может кто-нибудь, пожалуйста, скажите мне, что не так с моим интерфейсом C++ для Prolog?Factorial in Prolog и C++

my factorial.pl file: 

factorial(1, 1):- 
    !. 
factorial(X, Fac):- 
    X > 1, 
    Y is X - 1, 
    factorial(Y, New_Fac), 
    Fac is X * New_Fac. 



my factorial.cpp file: 

headerfiles 

term_t tf; 
term_t tx; 
term_t goal_term; 
functor_t goal_functor; 

int main(int argc, char** argv) 
{ 
    argv[0] = "libpl.dll"; 

    PL_initialise(argc, argv); 

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

    cout << "Enter your factorial number: "; 
    long nf; 
    cin >> nf; 

    tf = PL_new_term_ref(); 
    PL_put_integer(tf, nf); 
    tx = PL_new_term_ref(); 

    goal_term = PL_new_term_ref(); 
    goal_functor = PL_new_functor(PL_new_atom("factorial"), 2); 
    rval = PL_cons_functor(goal_term, goal_functor, tf, tx); 

    PL_halt(PL_toplevel() ? 0 : 1); 
} 

Я получаю приглашение Prolog, что и делает последняя строка. Но я не получаю результат факториала, например:

?- factorial(5, X). 
X = 120 
true 

Что мне не хватает?

Спасибо,

+0

Какая у вас ошибка? –

+0

Незначительная точка: я не думаю, что вам нужно использовать оператора выреза. Просто напишите 'factorial (1,1) .' (Мой Пролог очень ржавый, поэтому извиняюсь, если это неправильно.) –

+1

Вы должны указать, что вы ожидаете, что происходит на самом деле, и как последний отличается от прежнего , Я смею сказать, что члены SO, кроме Jon Skeet, возможно, не имеют ESP. –

ответ

1
# include files 

term_t tf; 
term_t tx; 
term_t goal_term; 
functor_t goal_functor; 

int main(int argc, char** argv) 
{ 
    argv[0] = "libpl.dll"; 
    PL_initialise(argc, argv); 

    PlCall("consult(swi('plwin.rc'))"); 
    PlCall("consult('factorial.pl')"); 

    cout << " Enter your factorial number: "; 
    long nf; 
    cin >> nf; 

    tf = PL_new_term_ref(); 
    PL_put_integer(tf, nf); 
    tx = PL_new_term_ref(); 
    goal_term = PL_new_term_ref(); 
    goal_functor = PL_new_functor(PL_new_atom("factorial"), 2); 
    PL_cons_functor(goal_term, goal_functor, tf, tx); 

    int fact; 
    if(PL_call(goal_term, NULL)) 
     { 
      PL_get_integer(tx, &fact); 
      cout << fact << endl; 
     } 
    else 
     { 
      PL_fail; 
     } 

    PL_halt(PL_toplevel() ? 0 : 1); 
} 
1

Я не все, что знакомы с мостом SWI Prolog-C/C++, но это, кажется, что вы не инициирует запрос, как только вы определить термины. Вам нужно использовать PL_call или PL_open_query, а затем распечатать результат перед передачей SWI-Prolog.

PL_cons_functor(goal_term, goal_functor, tf, tx); 
int nfactorial; 
if (PL_call(goal_term, NULL)) { 
    PL_get_integer(tx, &nfactorial); 
    std::cout << "X = " << nfactorial << " ." << std::endl; 
} else { 
    PL_fail; 
} 
    PL_halt(PL_toplevel() ? 0 : 1); 

Я не знаю, если вы можете установить goal_term в качестве запроса верхнего уровня. Если вы хотите, чтобы запрос выполнялся по вызову PL_toplevel, вы могли бы построить запрос в виде строки и передать его как аргумент «-t» в векторе аргумента в PL_initialize.

+0

Спасибо большое outis. Оно работает! Ура, – Joshua