I would like to call swi-prolog from c++, but I can't find good tutorial. I started with this program on
https://stackoverflow.com/questions/45641606/how-to-consult-existing-prolog-file-into-c-and-its-module.
But when I put my own prolog program I couldn't get any result. My prolog program is this:
==================
d.pl=================
d( X, X, 1 ):- !. /* d(X) w.r.t. X is 1 */
d( C, X, 0 ):- atomic(C). /* If C is a constant then */
/* d(C)/dX is 0 */
d( U+V, X, R ):- /* d(U+V)/dX = A+B where */
d( U, X, A ), /* A = d(U)/dX and */
d( V, X, B ),
R = A + B.
d( U-V, X, R ):-
d( U, X, A ),
d( V, X, B ),
R = A - B.
d( C*U, X, R ):-
atomic(C),
C \= X,
d( U, X, A ),
R = C * A,
!.
d( U*V, X, U*B+V*A ):- /* d(U*V)/dX = B*U+A*V where */
d( U, X, A ), /* A = d(U)/dX and */
d( V, X, B ). /* B = d(V)/dX */
d( U/V, X, (A*V-B*U)/(V^2) ):- /* d(U/V)/dX = (A*V-B*U)/(V*V) */
d( U, X, A), /* where A = d(U)/dX and */
d( V, X, B). /* B = d(V)/dX */
d( U^C, X, R ):- /* d(U^C)/dX = C*A*U^(C-1) */
atomic(C), /* where C is a number or */
C\=X,
d( U, X, A ),
R = C * A * U ^ ( C - 1 ).
====================end
d.pl====================
and my c++ program look like this :
int main(int argc, char **argv)
{
int n;
cout << "Please enter a number: ";
cin >> n;
PL_initialise(argc, argv);
PlCall("consult('d.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); <-- here on I have to change something
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;
}
Can anybody help me to write a good tutorial about calling prolog from c++?
Regards Janez