Skip to content

2.5 Moteur de prédicats (fr)

Claude Roux edited this page Oct 19, 2022 · 1 revision

Les prédicats de Tamgu

English Version

Nous avons intégré dans Tamgu un véritable moteur de prédicats, proche de Prolog. Non seulement il est désormais possible d'appeler du code Prolog depuis Tamgu, mais il est aussi possible d'appeler du code Tamgu depuis une clause Prolog.

Quelques différences

Si le Prolog de Tamgu est assez proche de la syntaxe d'Edimbourg, il y a quelques différences mineures. En particulier, la notion d'atomes et de variables a été légèrement remaniées. Tout d'abord, Tamgu ne connait pas la notion d'atomes, qui sont ici remplacés par des chaînes de caractères Tamgu. Ensuite, les noms de variables sont remplacé par une forme canonique: ?X, un peu à la façon de SPARQL.

Ainsi la clause: parent(marie,jean) est remplacé par: parent("marie","jean").

De la même façon, la clause: parent(Mere,Fils) où la présence d'une majuscule indique que Mere et Fils sont des variables est remplacé par parent(?Mere,?Fils).

Variables

La présence de ? en début de variable permet de différencier les variables purement Prolog des variables Tamgu.

En particulier, Tamgu accepte les choses suivantes:

string père = "Jean";
parent(père,"Pierre").

vector v = parent(?X,?Y);

v vaut désormais [parent("Jean","Pierre")]

Objets

Les prédicats peuvent fonctionner avec n'importe quel type d'objet. Pour certains tels que les vecteurs ou les termes, le mécanisme d'unification a été modifiés pour que leur traitement soit spécifiquement Prolog. En revanche, pour les autres objets, l'unification se réduit à une simple de comparaison d'égalité.

Appeler une clause Prolog

Il existe différente façon d'appeler du Prolog depuis Tamgu, selon que l'on veut une évaluation unique ou complète. Il suffit de changer la variable de réception pour indiquer à Prolog comment évaluer une expression.

Si la variable de réception est un Booléen alors Tamgu s'arrêtera à la première unification complète. Si la variable est en revanche un conteneur, Tamgu effectuera toutes les évaluations.

DCG (Definite Clause Grammar)

Un module DCG est aussi disponible. Les clauses DCG sont automatiquement traduites en appel Prolog.

phrase --> groupe_nominal, groupe_verbal.
groupe_nominal --> det, nom.
groupe_verbal --> verbe, adjectif.

det --> ["le"].
det --> ["un"].

nom --> ["plat"].

adjectif --> ["rouge"].
verbe --> ["est"].

vector v=phrase(?X,[]);

Appeler du Tamgu depuis Prolog

Il est aussi possible d'appeler du Tamgu depuis une clause Prolog:

grandparent(?X,?Y) :- parent(?X,?Z), println(?Z), parent(?Z,?Y).

Dans le cas ci-dessus, println est appelé dans la clause et affiche le contenu de la variable ?Z.

Utiliser sa propre fonction

On peut encore définir sa propre fonction. Cette fonction doit renvoyer Vrai ou Faux. Si elle renvoie Faux, elle fera échouer l'évaluation de la clause.

function tst(int i, int j) {
   if (i > j)
       return true;
  return false;
}

check(?X,?Y) :- tst(?X,?Y), truc(?X,?Y).

Dans le cas ci-dessus, si l'interprétation de ?X est inférieur à ?Y alors check échouera.

Clone this wiki locally