2010-04-09 95 views
1

比方說,我有以下的Prolog知識庫:回溯問題

likes(john, mary). 
likes(john, emma). 
likes(john, ashley). 

如果我撰寫的下面的C代碼:

#include... 

term_t tv; 
term_t tu; 
term_t goal_term; 
functor_t goal_functor; 

int main(int argc, char** argv) 
{ 
    argv[ 0 ] = "libpl.dll"; 
    PL_initialise(1, argv); 
    PlCall("consult('likes.pl')"); 

    tv = PL_new_term_ref(); 
    PL_put_atom_chars(tv, "john"); 
    tu = PL_new_term_ref(); 
    goal_term = PL_new_term_ref(); 
    goal_functor = PL_new_functor(PL_new_atom("likes"), 2); 
    PL_cons_functor(goal_term, goal_functor, tv, tu); 

    if (PL_call(goal_term, NULL)); 
    { 
     char* solution; 
     PL_get_atom_chars(tu, &solution); 
     cout << solution << endl; 
    } 

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

它將調用謂語「喜歡」只有一次,導致'瑪麗'只。我如何獲得回溯並獲得所有生成和打印的結果?

謝謝

回答

0

我已經包括河內,階乘的完整方案,及以下回溯。我希望初學者能從中受益。如果有人不確定接口C++和Prolog的VS2008設置,我會很樂意提供給他們。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdafx.h> 
using namespace std; 
#include "Windows.h" 
#include "ctype.h" 
#include "SWI-cpp.h" 
#include "SWI-Prolog.h" 
#include "SWI-Stream.h" 

term_t t; 
predicate_t p; 

term_t tf; 
term_t tx; 

term_t tv; 
term_t tu; 
predicate_t pred; 

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('myPrologFile.pl')"); 


    cout << "Enter your hanoi number: "; 
    int n; 
    cin >> n; 
    cout << "Calculating hanoi of " << n << endl; 
    PL_put_integer(t, n); 
    p = PL_predicate("hanoi", 1, NULL); 
    PL_call_predicate(NULL, PL_Q_NORMAL, p, t); 


    cout << "Enter your factorial number: "; 
    int nf; 
    cin >> nf; 
    cout << "Calculating factorial of " << nf << endl; 
    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; 
    } 


    cout << "Backtracking . . ."; 
    tv = PL_new_term_ref(); 
    PL_put_atom_chars(tv, "john"); 
    pred = PL_predicate("likes", 2, NULL); 
    tu = PL_new_term_ref(); 
    qid_t qid = PL_open_query(NULL, PL_Q_NODEBUG, pred, tv); 
    while (int i = PL_next_solution(qid)) 
    { 
     char* solution; 
     PL_get_atom_chars(tu, &solution); 
     cout << solution << endl; 
    } 
    PL_close_query(qid); 


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

這是myPrologFile.pl

:- use_module(library(shlib)). 
:- use_module(library(lists)). 


hanoi(N):- 
    move(N, left, center, right). 

move(0, _, _, _):- 
    !. 
move(N, A, B, C):- 
    M is N-1, 
    move(M, A, C, B), 
    inform(A, B), 
    move(M, C, B, A). 

inform(X, Y):- 
    write('move a disk from '), 
    write(X), 
    write(' to '), 
    write(Y), 
    nl. 


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


likes(john, mary). 
likes(john, emma). 
likes(john, ashley).