我已經包括河內,階乘的完整方案,及以下回溯。我希望初學者能從中受益。如果有人不確定接口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).