Académique Documents
Professionnel Documents
Culture Documents
Dans ce chapitre, on présente les notions de base de calcul des prédicats et le principe de
langage Prolog.
II. Calcul des prédicats
Éléments de base
- les variables ( notés en majuscules, éventuellement indicées ) : U, V, X, · ·,
Nous noterons Var l’ensemble des variables utilisées,
- les constantes, représentées par les minuscules a, b, c,…,
1
- les symboles de fonctions d’arité strictement positives (ceux d’arité nulle étant les
constantes), dénotés par les minuscules f, g, … , .
Nous noterons F l’ensemble des symboles de fonction,
- les symboles de prédicats, dénotés le plus souvent par les lettres p, q,…,
- des connecteurs, ce sont les symboles ¬, ∧, ∨, ←,↔ représentant respectivement la
négation, la conjonction, la disjonction, l’implication et l’équivalence,
- les quantificateurs universels et existentiels, ∀ et ∃.
Terme
• Toute constante est un terme.
• Toute variable est un terme.
• Si t1, t2, ..tn sont des termes et si f est une fonction n-aire, alors f(t1, t2, ..,tn) est un
terme.
Un terme est dit clos, si aucune variable n’y apparaît. Il est dit linéaire, si aucune variable
n’y apparaît deux fois.
un atome
• Si t1, t2, ..., tn sont des termes et si P est un prédicat n-aires alors P(t1, t2, .., tn) est
un atome.
Un littéral est un atome, on dit alors qu’il est positif, ou la négation d’un atome, il est
alors qualifié de négatif.
Un langage du premier ordre d’un alphabet donné est l’ensemble de toutes les formules
construites à partir des symboles de cet alphabet.
Exemple de syntaxe
• ∀x NOMBRE(x) ==> (∃y PLUSGRANDQUE(y, x)
2
• Il a été démontré que toute formule peut être transformée en une forme normale
disjonctive ou conjonctive.
On utilise habituellement une notation plus particulière pour les clauses, ainsi la clause
∀X1 · · ·∀Xn, A1 ∨ · · · ∨ Am ∨¬B1 ∨ · · · ∨ ¬Bp où les Ai et les Bi
sont des atomes, sera notée
A1, · · ·, Am ← B1, · · ·, Bp
Exemple
Une clause de Horn est une clause comportant au plus un littéral positif.
- Modus Tollens
De Non Q et P -->Q, on déduit Non P.
Non Q
P ==> Q
----------Modus Tollens
Non P
- Chaînage
De P --> Q et Q --> R, on déduit P --> R
P-->Q
Q-->R
P-->R
- Substitution :
De P ٨ Q, on déduit P
P٨Q
P
- Conjonction
De P et de Q, on déduit P ٨ Q
P
Q.
P٨Q
- Contraposée
De P --> Q, on déduit Non Q --> Non P
P --> Q
Non Q --> Non P
4
III. Langage Prolog
III.1. Introduction
Le nom de Prolog a été créé à Marseille en 1972. Philippe Roussel l’a proposé comme
abréviation de « PROgrammation en LOGique », pour désigner un outil informatique conçu
pour implanter un système de communication homme machine en langage naturel, en
l’occurrence le français.
- Prolog est un langage de programmation logique qui repose sur la logique des
prédicats restreinte aux clauses de Horn.
Prolog =Programmation en logique
Programmer en logique consiste :
• à définir les hypothèses (énoncés définis dans un programme exprimant la
connaissance relative au problème à résoudre.
• à introduire la conclusion (poser le problème).
• L'interpréteur tente ensuite de réaliser la preuve du but en utilisant l'inférence
logique.
Stratégie de Prolog
- comment choisir le littéral du but à unifier ? Prolog choisit le littéral le plus `a gauche.
- comment choisir la clause du programme dont la tête est unifiée avec le littéral du but
? Prolog examine d’abord les clauses du programme dans l’ordre d’écriture.
- comment constituer le nouveau but ? Prolog a une stratégie en profondeur d’abord, il
ajoute les nouveaux littéraux (obtenu `a partir de la clause), `a gauche de l’ancien but.
5
Exemple :
Clause de Horn Q(x) V ¬P(z, x) V ¬Q(z) qui peut s’écrit
P(z,x) ∧ Q(z) -> Q(x)
On a : ( a->b )<-> (¬a V b)
Clause de Prolog q(X) :- p (Z,X), q(Z).
pour que q(X) soit vrai, il faut que p (Z,X) et
q(Z) sont vrai.
Les listes
Une liste L est une suite ordonnée de termes
7
T: tête (le premier terme)
Q: queue (les autres termes)
l(T,Q) : liste (T : premier terme)
(Q : queue de liste)
No
On doit utiliser les listes. La syntaxe d’une liste est : aime(samir,[ frites, ris, poisson])
- aime (samir,Quoi)
- aime(samir,[Tete|Queue])
Tête=frites
Queue=[ris,poisson]
- aime(samir[X,Y|Queue])
X=frites
Y=ris
Queue=[poisson]
- l’affichage des éléments d’une liste : afficher(), write
exemple
afficher([]).
afficher([Tete|Queue]).
write(Tete) , nl , afficher(Queue). % nl permet de sauter la ligne
Récursivité en Prolog