Les Snippets

Connexion

interface avec swi-prolog

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 20/04/2010 22:40:39 et initié par coucou747 [Liste]
Vue : 5507
Catégorie(s) : API
Langage sélectionné : C
Langages dispo pour ce code :
- C, C++
- Voir tous les langages pour ce code snippet



Langage : C , C++
Date ajout : 20/04/2010
Posté par coucou747 [Liste]
#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
.


Remarque :
ca se compile avec plld. Le style est douteux : c'est un melange de C et de Cpp (for (int i...) ) parce-que les interfaces avec d'autres langages sont beaucoup plus souples en Cpp, mais n'existent qu'avec une interface C, donc on en fait une naive avec du C avant d'en faire une vraie avec du CPP.

si j'avais fait une vraie interface CPP, ca aurait ete trop complexe pour etre montre ici.



Codes sources en rapport avec : Prolog, Swiprolog, Swi-prolog, Interface

{Visual Basic, VB6, VB.NET, VB 2005} BOT TYPE CHAINE DE MARKOV ( ACTOR PAR EXEMPLE)
Ce post est constitue d'un moteur de Bot comparable a pyborg , et d'une interface de test, pour voi...

{PHP} ENVOYER DES EMAILS HTML AVEC PHP
Bonjour PhpHtmlM@il est une application tournant en php5 permettant l'envoie de mail html via une in...

{C# / C#.NET} LIAISON ENTRE LES BASES DE DONNÉS ET UNE APPLICATION C#
Montre l'utilisation d'une interface pour la simplicité, et la flexibilité de connexion à différente...

{JAVA / J2EE} [ANDROID JAVA JAVASCRIPT] FAIRE D'UNE PAGE WEB UN VRAI APPLICATION ANDROID
Etant donnée mon exceptionnel niveau en java (sic!) je prefere une page web adapter au mobile qu'une...

{Delphi} CODE SOURCE DU TUTORIEL - INTERFACE
vous trouverez ici le code d'exemple de mon tutoriel : Comment se passer d’une référence pour ...

{Delphi} INTERFACE CANUSB
L'utilisation de l'interface CANUSB Lawicel n'est pas chose très pratique. J'ai donc construit un co...

{Visual Basic, VB6, VB.NET, VB 2005} ROCHE PAPIER CISEAUX À 5 ÉLÉMENTS
Jeu de Roche Papier ciseaux où l'on peut jouer à cinq éléments, soit : Roche Papier Ciseaux Air Feu....

{JAVA / J2EE} UTILISATION DES INTERFACES
Ce tutoriel explique l'utilité des interfaces, comment et pourquoi les créer, comment les appeler da...

{Delphi} TFOLDERSLIST OU COMMENT UTILISER LES INTERFACES POUR MASQUER CERTAINES METHODES D'UN OBJET
J'avais besoin d'un objet type tStringList qui serait orienté stockage de repertoires (autoriser les...

{JAVA / J2EE} MASTERMIND EN JAVA
Jeu de Mastermind en Java (interface graphique) Projet personnel réalisé afin de me remettre dans l...