Principales caractéristiques de ce type de programmation
1. Les faits
• Les faits : « Jean est le père de Marie » ou
« Marie est la mère de Paul » sont traduits en Prolog par :
père(jean, marie). % car Jean est le père de
Marie
mère(marie , jean). % et Marie est la mère de Paul
Avec
-
d’abord, le nom de la relation ou prédicat (débutant par une minuscule),
- puis
le/les arguments (ici « jean » et « marie ») séparés par une virgule,
dans un ordre qui possède un sens (qui est le sujet et le complément de
l’action décrite),
- enfin,
le fait se termine par un point « . ».
Les
espaces ne jouent pas de rôle et le % indique le début du commentaire. (Le
commentaire peut aussi être placé entre /* … */). Le nom de la relation (ici «
aime ») dépend du programmeur / analyste.
Autres
exemples :
«
Socrate est un homme »
«
Socrate est un Grec »
«
Aristote est le disciple de Socrate »
«
L’éléphant est un grand animal gris »
Autres
faits (dans la base de connaissance car ce n’est pas une base de données ou une
simple collection de données).
aime(jean, peche).
homme(tintin).
pere(henri, paul).
livre(marx, leCapital).
donne(tintin, milou, os).
etudiant(tintin,20,informatique,1).
roi(tintin,belgique).
Si une relation comprend un seul argument, on
parlera plutôt de propriété que de relation (par exemple, homme(tintin),
grand(babar)).
L’interprétation
de l’objet « tintin ».
L’interprétation
« etudiant(tintin,20,informatique,1) » ou « e(t,20,i,1) » et la véracité du
fait « roi (tintin, belgique) ».
• Une
représentation graphique à l’aide d’un arbre est possible avec le nom de la
relation comme racine et les arguments (ordonnés) comme branches.
2. 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 est le père de Marie ? ». Cette question se traduit
par :
?- pere(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 :
pere(jean, marie).
pere (paul, marie).
mere (marie, paul).
mere (jean, peche).
pere (paul, biere).
roi (tintin,belgique).
?- pere(jean, paul).
No
?- pere(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.
3. 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 ceux dont le père est Jean
(tout ces fils et filles), 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. On
peut écrire quelque chose comme
?- pere(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é).
?- pere(jean, FilsouFilledeJean). ou (plus simplement)
?- pere(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 »).
?- pere(jean, X).
X = marie ;
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 est la mère de tout ».
mere(anne, Z).
mere(anne, _). % car le _ indique aussi une variable
4. 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 :
fait(jean, peche).
pere(jean, marie).
habite(jean, paris).
mere(marie, paul).
habite(marie, paris).
habite(anne, bretagne).
roi(tintin, belgique).
Ainsi, on peut se poser la question de savoir
« Si Jean est le père de Marie et si Marie est la mère de Jean ».
?- pere(jean, marie).
Yes
?- mere(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).
?- pere(jean, marie) , mere(marie, jean).
No
D’autres questions peuvent être posées : «
Existe-t-il quelqu'un dont le pere est Jean et la mere est Anne ? ».
5. 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 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 habite Paris » que l’on écrit en Prolog comme suit :
aime(paul, X) :- habite (X, paris).
Et cette règle se compose :
d’une tête (aime(paul, X)) ;
du
symbole « :- » pour indiquer le « SI » ;
d’un
corps (habite(X, paris)) ;
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 ». aime(anne, UnRoi) :- roi(UnRoi, Pays).
« Arthur aime ceux qui l’aiment ». aime(arthur, X) :- aime(X, arthur).
« Il faut taxer les
riches ». taxer(UnePersonne) :-
riche(UnePersonne).
0 Commentaires