Une particularité de Prolog est de ne pas donner de statut aux paramètres d'un prédicat, ce ne sont pas des paramètres 'donnés' ou 'résultats', ou même 'donnés/résultats', leur statut est indifférent et sera définis en fonction des requêtes utilisées.
Ceci permet, parfois, la définition de prédicats réversibles, c'est-à-dire dont les appels standards, permettant d'obtenir des résultats à partir de données, peuvent être inversés pour chercher les données initiales menant à certains résultats (alors ce qui est donné, ce sont les résultats, et ce qui est obtenu (les résultats) ce sont les données initiales recherchées).
Prenons des arbres binaires avec comme nœud f et comme feuille 0 ou 1.
symetrique(0,0). symetrique(1,1). symetrique(f(A,B),f(Y,X)):-symetrique(A,X), symetrique(B,Y).
L'utilisation standard de ce prédicat est du type :
?- symetrique(f(f(0,1),1),R). R = f(1,f(1,0))
Mais l'on peut aussi avoir :
?- symetrique(A,f(f(0,1),1)). A = f(1,f(1,0))
Lorsqu'on fait de la grammaire générative avec Prolog, le but est de ne pouvoir générer que des phrases grammaticalement correctes ; on peut aussi rajouter des foncteurs pour que Prolog nous donne des arbres représentant la structure des phrases.
EDITEUR : domains liste=string* predicates s(liste,liste) sn(liste,liste) sv(liste,liste) clauses /*grammaire*/ s(L0,L):-sn(L0,L1),sv(L1,L). /*lexique*/ sn([je|U],U). sv([mange|U],U). sv([viens|U],U). DIALOGUE : Goal:s([je,viens],[]) Yes Goal:s([je,mange],[]) Yes Goal:s([viens,mange],[]) No |
domains liste=string* expr= fs(string,string) predicates s(liste,liste,expr) sn(liste,liste,string) sv(liste,liste,string) clauses /*grammaire*/ s(L0,L,fs(A,B)):-sn(L0,L1,A),sv(L1,L,B). /*lexique*/ sn([je|U],U,je). sv([mange|U],U,mange). sv([viens|U],U,viens). DIALOGUE : Goal:s([je,viens],[],R) R=fs("je","viens") 1 Solution Goal:s([je,mange],[],R) R=fs("je","mange") 1 Solution Goal:s([viens,mange],[],R) No Solution |
Prolog et la programmation logique a donné naissance à un courant de programmation reprenant la plupart des spécificités de Prolog et les apports de la programmation par contrainte pour aboutir à la programmation logique par contrainte (PLC).
Autres pistes :
Comme langage de programmation, Prolog se distingue par :