#include <stdio.h>
#include <SWI-Prolog.h>
#include <string.h>
#define MODULE "user"
void check(int rval) {
if (!rval){
printf("error...\n");
PL_halt(rval ? 0 : 1);
exit(1);
}
}
void print_pl_value_aux(term_t t){
if (PL_is_integer(t)) {
int i;
PL_get_integer(t, &i);
printf("%d", i);
}else{ // todo
printf("??");
}
}
foreign_t print_pl_value(term_t t){
print_pl_value_aux(t);
printf("\n");
return true;
}
int addition(int a, int b){
predicate_t pred = PL_predicate("add", 3, MODULE);
term_t args = PL_new_term_refs(3);
int rval;
int result;
PL_put_variable(args);
PL_put_integer(args + 1, a);
PL_put_integer(args + 2, b);
check(PL_call_predicate(NULL, PL_Q_NORMAL, pred, args));
PL_get_integer(args, &result); // todo check : is_integer
return result;
}
int sum_list(int size, int* content){
predicate_t pred = PL_predicate("sum_list", 2, MODULE);
term_t args = PL_new_term_refs(2);
int rval;
int result;
PL_put_variable(args);
PL_put_nil(args + 1);
for (int i = 0; i < size ; i ++){
term_t a = PL_new_term_ref();
PL_put_integer(a, i[content]);
PL_cons_list(args + 1, a, args + 1);
}
check(PL_call_predicate(NULL, PL_Q_NORMAL, pred, args));
PL_get_integer(args, &result); // todo check : is_integer
return result;
}
int
main(int argc, char **argv)
{
char *program = argv[0];
char *plav[2];
int n;
/* make the argument vector for Prolog */
plav[0] = program;
plav[1] = NULL;
/* initialise Prolog */
if ( !PL_initialise(1, plav) )
PL_halt(1);
PL_register_foreign("print__", 1, (void *)print_pl_value, 0);
printf("out = %d\n", addition(1, 2));
int li[3] = {1,2,3};
printf("out = %d\n", sum_list(3, li));
PL_halt(0);
return 0;
}
voici l'exemple de test en prolog :
add(C, A, B) :-
print__(A),
print__(B),
C is A + B.
sum_list(0, []).
sum_list(N, [H|T] ) :-
sum_list(N2, T),
N is N2 + H
.