-
Notifications
You must be signed in to change notification settings - Fork 13
2.5 Moteur de prédicats (fr)
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.
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).
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")]
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é.
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.
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,[]);
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.
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.