2010-04-09 2 views
1

의 내가 다음 프롤로그 지식 기반 있다고 가정 해 봅시다 : 나는 다음과 같은 C 코드를 작성할 경우역행 문제

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

: 그것은 술어를 호출합니다

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

:- 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). 
myPrologFile.pl

입니다