Inspiré de http://www.coli.uni-saarland.de/~kris/learn-prolog-now (version pdf).
Ce TP a pour objectif :
Il y a trois constructions de base en Prolog : les faits, les règles et les requêtes. Un ensemble de faits et de règles est appelé base de connaissances.
Sur cette base de connaissance, on effectue des requêtes, c'est-à-dire que l'on pose des questions sur ces connaissances.
La bases de connaissance 1 est un ensemble de faits, c'est-à-dire de propositions qui sont vraies.
Par exemple, on peut fixer que Mia, Jody, et Yolanda sont des femmes et que Jody joue de la guitare en écrivant les faits Prolog suivants :
woman(mia). woman(jody). woman(yolanda). playsAirGuitar(jody).
On placera ce qui précède dans un fichier bc1.pl, que l'on chargera dans une session Prolog :
?- consult('bc1.pl').
On peut maintenant poser la question en Prolog : est-ce que Mia est une femme ?
?- woman(mia). yes
Ce à quoi Prolog répond oui ; c'est en effet un fait explicite stocké dans BC1. Si on demande si Mia joue de la guitare :
?- playsAirGuitar(mia). no
Prolog répond que non car il ne peut pas déduire cette information de la base de faits BC1. De même, si on pose la requête :
?- playsAirGuitar(vincent). no
Prolog répond que non, pour les mêmes raisons. Enfin, si on pose la requête :
?- tatooed(jody). no
Prolog répond que non...
Saisissez cette nouvelle base de connaissance dans un fichier, et consultez-là dans une session Prolog.
listensToMusic(mia). happy(yolanda). playsAirGuitar(mia) :- listensToMusic(mia). playsAirGuitar(yolanda) :- listensToMusic(yolanda). listensToMusic(yolanda):- happy(yolanda).
BC2 contient deux faits :
et trois règles, données sur les trois dernière lignes.
Une règle permet d'exprimer que la partie gauche est vraie à condition que la partie droite l'est. Ainsi, la première règle
playsAirGuitar(mia) :- listensToMusic(mia).
exprime que Mia joue de la guitare si elle écoute de la musique.
Si une base de connaissances contient une règle de la forme
head :- body.
et que Prolog réussit à déduire body des informations stockées dans la base de connaissances, alors Prolog va déduire (on dit inférer) head. Cette déduction se nomme naturellement modus ponens.
Par exemple si on demande à Prolog si Mia joue de la guitare :
?- playsAirGuitar(mia). yes
Prolog répond oui même si le fait playsAirGuitar(mia) n'est pas explicitement présent dans BC2. En fait BC2 contient :
playsAirGuitar(mia) :- listensToMusic(mia). listensToMusic(mia).
et grâce au modus ponens, Prolog déduit playsAirGuitar(mia).
Selon vous, que répondrait Prolog à la requête...
?- playsAirGuitar(yolanda).
Essayez, pour voir...
Les fait et les règles sont appelés aussi des clauses. Ainsi BC2 contient cinq clauses, constituées de trois prédicats :
happy listensToMusic playsAirGuitar
La nouvelle base de connaissance :
happy(vincent). listensToMusic(butch). playsAirGuitar(vincent):- listensToMusic(vincent), happy(vincent). playsAirGuitar(butch):- happy(butch). playsAirGuitar(butch):- listensToMusic(butch).
est constituée de deux faits
et de trois règles.
Dans la règle
playsAirGuitar(vincent):- listensToMusic(vincent), happy(vincent).
la virgule du corps qui sépare les prédicats
exprime la conjonction logique (le "et").
Cette règle dit donc « Vincent joue de la guitare s'il écoute de la musique et s'il est content ».
Ainsi, si on pose la question
?- playsAirGuitar(vincent).
Prolog répondra non, car BC3 contient certes happy(vincent), mais il ne peut pas déduire l'information listensToMusic(vincent).
BC3 contient aussi deux règles avec la même tête :
playsAirGuitar(butch):- happy(butch). playsAirGuitar(butch):- listensToMusic(butch).
Ces règles expriment que Butch joue de la guitare s'il écoute de la musique ou s'il est content. Ceci pourrait aussi s'écrire à l'aide du point virgule qui signifie la disjonction:
playsAirGuitar(butch):- happy(butch); listensToMusic(butch).
woman(mia). woman(jody). woman(yolanda). loves(vincent,mia). loves(marcellus,mia). loves(pumpkin,honey_bunny). loves(honey_bunny,pumpkin).
Cet ensemble de connaissances de base ne contient pas de règle.
Par rapport aux précédents, il définit une relation qui a deux noms en argument et qui signifie que le premier aime le second.
On pose la requête suivante :
?- woman(X).
portant sur le prédicat woman et la variable X. Elle s'interprète comme suit : «dis moi de quels individus peux-tu dire qu'ils sont des femmes».
Prolog répond en parcourant BC4 de haut en bas en essayant d'unifier l'expression woman(X) avec l'information lue.
Le premier élément dans la base est woman(mia). Ainsi Prolog unifie X à mia, rendant la requête cohérente avec ce premier élément comme suit :
X = mia
Comme il y a d'autres informations sur les femmes BC4, si on effectue la requête :
?- ;
qui signifie «y en a-t-il d'autres ?», Prolog répond
X = jody
puis encore si on saisit un point virgule
X = yolanda
et enfin non.
Si on essaie une requête plus complexe comme :
loves(marcellus,X),woman(X).
et qui signifie «y a-t-il un individu X tel que Marcellus aime X et X est une femme ?».
Prolog répond
X = mia
La capacité d'unifier les variables est le coeur de Prolog...
On définit ici les termes comme les constituants fondamentaux des expressions Prolog (par exemple, jody, playsAirGuitar(mia), X).
Il y a quatre sortes de termes en Prolog: les atomes, les nombres, les variables et les termes complexes.
Un atome permet de représenter une constante. C'est
butch
,
big_kahuna_burger
,
m_monroe2
;
'Vincent'
,
'The Gimp'
,
'Five_Dollar_Shake'
,
'&^%&#@$ &*'
.
Prolog dispose des nombres
Une variable est une chaîne de caractères constituées de majuscules, minuscules, chiffres, underscore et qui commence par une majuscule ou un underscore
Les constituants de base des termes sont les atomes, les nombres et les variables.
Un terme complexe est composé d'un foncteur suivis d'arguments placés dans des parenthèses. Par exemple,
playsAirGuitar(jody)
,
loves(vincent,mia)
,
jealous(marcellus,W)
sont des termes complexes.
Les arguments peuvent aussi êtres des termes complexes comme dans
hide(X,father(father(father(butch))))
On peut commenter la base de connaissance, en mettant le commentaire entre /* et */ (comme en C).
Parmi les chaînes suivantes lesquelles sont des atomes, et lesquelles sont des variables ?
Parmi les chaînes suivantes lesquelles sont des atomes, des variables, des termes complexes ?
Combien de faits, de règles, de clauses et de prédicats y a-t-il dans la base de connaissances suivante ?
Représentez en Prolog les éléments suivants :
On considère la famille suivante :
Écrire la base de faits en Prolog, en précisant le sexe des individus, et en décrivant leurs liens de parenté à l'aide des règles d'accès : homme, femme, parent.
Enrichir ensuite cette base de connaissances, en écrivant, à l'aide des règles de la base de faits, les règles qui permettent de définir les autres liens de parenté : père, mère, grand-père, grand-mère, enfant, petit-enfant, frère, soeur, oncle, tante, neveu, nièce, cousin, et cousine.
Supposons que l'on travaille avec la base de connaissance suivante:
wizard(ron). hasWand(harry). quidditchPlayer(harry). wizard(X) :- hasBroom(X),hasWand(X). hasBroom(X) :- quidditchPlayer(X).
Comment Prolog répond-il aux requêtes suivantes ? Tester sa réponse.