Les questions
• En Prolog, les questions débutent par le point d’interrogation suivi du nom de la relation et du/des argument(s) (objet). On parle également de but pour désigner une question.
Par exemple, on peut se poser la question de savoir si « Est-ce que Jean aime
Marie ? ». Cette question se traduit par :
?- aime(jean, marie).
Pour y répondre, l’interprète Prolog va essayer d’unifier la question posée avec un des faits de sa base de connaissance. S’il réussit, il répond « Yes » et « No » dans le cas contraire. Sur la base des connaissances suivantes :
aime(jean, marie).
aime(paul, marie).
aime(marie, paul).
aime(jean, peche).
aime(paul, biere).
roi(tintin,belgique).
?- aime(jean, biere).
No
?- aime(jean, marie).
Yes
?- roi(tintin,belgique).
Yes
?- homme(tintin).
ERROR: Undefined procedure: homme/1
La réponse « No » ne signifie pas que c’est faux mais que sur la base des connaissances dont dispose Prolog, la question n’a pas pu être unifiée. De même, la réponse « Yes » n’indique pas que cela est vrai dans le monde réel mais que la question a pu être unifiée (peut-être qu’un jour Tintin sera le roi de Belgique …). Finalement, on a utilisé un prédicat non défini homme avec un seul argument.
Les variables (inconnues)
• Jusqu’à présent, nous pouvons écrire et interroger Prolog sur des questions fermées (ou des faits précis) dont la réponse est binaire (« oui / non »).
Mais on aimerait savoir ce qu’aime Jean (tout ce qu’il aime), sans connaître
a priori l’ensemble des choses que Jean aime. On a alors besoin d’une variable pour énumérer toutes ces choses. (Je préfère appeler ceci une inconnue mais de facto, on a choisit le mot de variable). On peut écrire quelque chose comme
?- aime(jean, «ce qui rend vrai cette relation »).
Dans ce but, Prolog permet l’introduction de variables (dont le nom commence par une majuscule et dont la portée lexicale se limite à un énoncé).
?- aime(jean, CeQueJeanAime).
ou (plus simplement)
?- aime(jean, X).
X = marie
Yes
L’interpréteur doit alors unifier la question (qui comprend une variable libre) avec ses connaissances. Unifier ne signifie pas seulement voir s’il y a une égalité entre deux faits mais « rendre égaux » les deux faits. On peut trouver un (ou dans ce cas plusieurs) fait(s) qui s’unifie(nt) avec la question. La force de Prolog est de vous donner la possibilité de vous arrêter à la première réponse, de continuer pour voir la deuxième, … ou toutes les réponses possibles.
Suivez le travail de l’interpréteur Prolog pour répondre à cette question et pour vous donnez toutes les réponses (introduisez un « ; » après chaque réponse pour indiquer « OU »).
?- aime(jean, X).
X = marie ;
X = peche ;
No
L’ordre des réponses fournies par l’interpréteur est donc dépendant de l’ordre des faits de la base de connaissance.
Mais les variables peuvent aussi être introduites dans des faits (et cela est parfois très commode). Par exemple, pour indique qu’ « Anne aime tout ».
aime(anne, Z).
aime(anne, _). % car le _ indique aussi une variable
Les conjonctions
• En Prolog, on n’est pas limité à interroger un seul fait. On peut se demander si deux (ou plus) sont vérifiés simultanément. Voici notre base de connaissances :
aime(jean, peche).
aime(jean, marie).
aime(jean, paris).
aime(marie, paul).
aime(marie, paris).
aime(paul, marie).
aime(paul, biere).
aime(anne, bretagne).
roi(tintin, belgique).
Ainsi, on peut se poser la question de savoir « Si Jean aime Marie et si Marie aime Jean ».
?- aime(jean, marie).
Yes
?- aime(marie, jean).
No
Mais cela est un peu laborieux et on peut grouper ces deux questions en une seule (conjonction de deux faits) par l’introduction d’un « , » (pour un « ET » logique).
?- aime(jean, marie) , aime(marie, jean).
No
D’autres questions peuvent être posées :
« Existe-t-il quelque chose que Jean et Paul aiment ? ».
Les règles
• Les faits sont toujours vrais (dans le monde que Prolog connaît). On ne limite d’aucune manière la véracité de ces faits. Par exemple, on aimerait dire que « Benjamin aime toutes les boissons sucrées ».
D’autre part, on aimerait généraliser des faits (au moyen d’une règle) afin d’éviter d’introduire tous les faits (qui sont vrais). Par exemple, on aimerait dire que
« Paul aime toutes les femmes » ou que « Tous les oiseaux ont des plumes », que « deux personnes appartiennent à la même fratrie s’ils ont les mêmes parents », etc.
Une règle correspond à une affirmation générale sur les objets et leurs relations. Par exemple, on sait que « Paul aime tous ceux qui aiment la bière » que l’on écrit en Prolog comme suit :
aime(paul, X) :- aime(X, biere).
Et cette règle se compose :
d’une tête (aime(paul, X)) ;
du symbole « :- » pour indiquer le « SI » ;
d’un corps (aime(X, biere)) ;
et d’un « . » final.
Et dans cette règle, la portée lexicale de la variable X est la règle ; le X désigné dans n’importe quelle partie de la règle est toujours le même objet.
La règle peut s’analyser comme un fait conditionnellement vrai, c’est-à-dire vrai si le corps de la règle est vérifié. En d’autres termes, la tête peut être inférée si l’ensemble du corps est vérifié.
• L’ensemble des règles possédant le même nom (foncteur) et le même nombre d’arguments (arité) doivent se suivre dans votre programme (elles doivent former un paquet de clauses).
D’autres règles peuvent être introduites :
« Anne aime tous les rois ».
« Arthur aime ceux qui l’aiment ».
« Jean aime toutes les femmes ».
« Paul aime les gens qui aiment la biere et Londres ».
« Il faut taxer les riches ».
« Marie aime toutes les villes ».
aime(anne, UnRoi) :- roi(UnRoi, Pays).
aime(arthur, X) :- aime(X, arthur).
aime(jean, X) :- femme(X).
aime(paul, X) :- aime(X, biere), aime(X, londres).
taxer(UnePersonne) :- riche(UnePersonne).
• Voici notre base de connaissances :
masculin(hubert).
masculin(denis).
masculin(robert).
masculin(joseph).
masculin(georges).
masculin(henri).
feminin(nelly).
feminin(martine).
feminin(anne).
feminin(jeanne).
% parent(X,Y) est vrai si Y est le pere/mere de X parent(robert, hubert).
parent(robert, georges). parent(robert, anne). parent(joseph, nelly).
parent(hubert, denis).
parent(hubert, martine).
parent(nelly, denis).
parent(nelly, martine).
parent(georges, jeanne).
parent(georges, henri).
Définissez une règle pere(Pere, Enfant) qui est vrai si Pere est le père de Enfant. Faites de même avec la relation mere(Mere, Enfant).
Définissez une règle fils(Fils, Parent) qui est vrai si Fils est le fils du parent Parent. Faites de même avec la relation fille(Fille, Parent).
Définissez une règle
frere(Frere, X) qui est vrai si Frere est le frère de X.
oncle(Oncle, X) qui est vrai si Oncle est l’oncle de X.
neveu(Neveu, X) qui est vrai si Neveu est le neveu de X.
grand-pere(GP, X) qui est vrai si GP est le grand-père de X.
• Regardez bien que l’on peut interroger une règle de plusieurs manières. Par exemple avec frere(Frere,Personne) :
– savoir si Frere est le frère de Personne ;
– trouver le (les) frère(s) de Personne ;
– savoir si Frere a des frères ou sœurs ;
• Voir des exemples dans famille.pl ou dieux.pl
Chapitre 1 : Un survol de Prolog
Chapitre 2 : Avec quelques détails
Chapitre 3 : Structures
Chapitre 4 : Techniques de programmation