Interface avec swi-prolog

Contenu du snippet

#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
.



Compatibilité : C, C++

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.