Commençons ensemble à taper quelques commandes dans notre interpréteur Prolog
Le '?-' indique que l'interpréteur attend une commande de l'utilisateur.
Exemple de référence s'il en est.
"Tous les hommes sont mortels, or Socrate est un homme, donc Socrate est mortel"
Ce qui donne sous forme de règle d'inférence (n'oublions pas que Prolog est un moteur d'inférences fonctionnant en chaînage arrière) :
Homme (X) => Mortel (X)
Homme(Socrate)
Conclusion
Mortel (Socrate)
En Prolog (ou le chaînage arrière va ressortir syntaxiquement), taper
mortel(X) :-
  homme(X).
?- homme(socrate).
Faire attention aux majuscules/minuscules car en Prolog, la majuscule en début d'identifiant denote une variable, la minuscule une constante. Ici nous avons bien la variable 'X' et la constante 'socrate'. Interroger ensuite Prolog
?- mortel(socrate)?
YES
?- mortel(jean)?
?-
La première réponse (YES) signifie que Socrate est mortel, en revanche, l'absence de réponse à la seconde question signifie 'NON' car prolog faisant 'l'hypothèse du monde clos' suppose faux tout ce qu'il ne connait pas.
Est-ce à dire que Prolog n'est qu'un moteur d'inférences en chaînage arrière ?
NON, Prolog signifie PROgrammation en LOGique, il est donc possible aussi de programmer
affiche(A,B,C) :-
  write(A),
  write(B),
  write(C),
  nl.
?- affiche(1,2,3)?
123
YES
L'exemple ci-dessus montre parfaitement que l'on est loin de vouloir représenter la règle : "Si on peut écrire A, et si on peut écrire B et si on peut écrire C et si on peut sauter une ligne, alors, le but 'affiche' de A, B et C a réussit". On retrouve beaucoup plus une approche procédurale qui décrit l'affichage en 4 étapes consécutives.
En prolog, une liste est une suite de symboles (ou de listes) séparés par des virgules et encadrées par des crochets
[le,chien,mange]
Lors d'une unification il est possible de récupérer le premier élément d'une liste, et le reste de la liste, le symbole à utiliser est le 'pipe unix' (AltGr - 6 sur un PC) qui va séparer les deux variables HL et TL qui par convention désigne 'Head of List' et 'Tail of List'
[HL | TL]
En unification avec l'exemple précédent, cela donnerait :
HL = le
TL = [chien,mange]
On remarquera au passage la conservation de structure de TL permettant la récursivité : dans le cas d'une liste de 2 éléments, TL n'est pas le deuxième élément, mais bien la liste privée du premier élément.
Voici le programme qui affiche un à un tous les éléments d'une liste
al([]).
al([HL|TL]):-
  write(HL),
  nl,
  al(TL).
?- al([1,2,3,4])?
1
2
3
4
YES
Ecrire (et comprendre) maintenant le programme qui compte les éléments d'une liste
long([],0).
long([HL|TL],N):-
  long(TL,M),
  N is M + 1.
?- long([a,b,c,d,e],L).
L = 5
YES
Les arguments du prédicat ne sont pas des paramètres, mais des variables ou des constantes. Si ce sont des variables, Prolog va essayer toutes les unifications possibles avec des constantes pour trouver une valeur qui satisfasse le but ; si ce sont des constantes, il va vérifier que le but est exact. Que se passe-t-il si on tape ceci ?
?- long([a,b],3).
Qu'est-ce que cela signifie ?
Et avec cela...
?- long(Liste,4).
?- long(L,N).
Qu'obtient-on ?
ICAM Toulouse - Last update: 20-Sep-2013