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).