Vous êtes sur la page 1sur 27

Université de SOUK AHRAS

Faculté des sciences et technologie


Département de Mathématiques et Informatique

Programmation
Logique
Enseignant: Arous Mokdad
Niveau: 3eme Année Informatique
2016/2017
 Sémantique des
Programmes Prolog
1. Mécanisme utilisé pour
répondre à une question
 A partir d'un programme Prolog P on peut déduire un
ensemble des atomes logiques qui sont des conséquences
logiques de P.
 Cet ensemble peut être "calculé" par une approche
ascendante, dite en « chaînage avant » .
 On part des faits, et on applique itérativement toutes les
règles conditionnelles pour déduire de nouvelles relations
..., jusqu'à ce qu'on ait tout déduit.
 La réponse de Prolog à une question est l'ensemble des
instances de cette question qui font partie de la
dénotation.
1. Mécanisme utilisé pour
répondre à une question
 D'une façon générale, on ne peut pas calculer l'ensemble
des conséquences logiques d'un programme par
l'approche ascendante.
 Ce calcul serait trop coûteux, voire infini.
 En revanche, on peut démontrer qu'un but (composé
d'une suite d'atomes logiques) est une conséquence
logique du programme, en utilisant une approche
descendante, dite en chaînage arrière.
 La sémantique de Prolog est donc basée sur une
approche descendante de calcul : le chaînage arrière
(backward chaining).
1. Mécanisme utilisé pour
répondre à une question
Prolog est basé sur deux grands mécanismes:
 Le chaînage arrière est le fait de partir du but
recherché, de rechercher les règles dont le but est la
conclusion, puis, en prenant les conditions de ces règles
comme nouveaux sous buts, recommencer la recherche
récursivement. Ensuite, il ne reste plus qu'à unifier les
faits trouvés avec le but recherché.
 L'unification est le fait d'essayer de rendre deux
assertions identiques (un fait et une tête de règle en
général) en donnant des valeurs aux variables qu'elles
contiennent.
1. Mécanisme utilisé pour
répondre à une question
L'unification
 L'unification est une opération de base dans un
programme logique.
 Pour pouvoir appliquer la règle de résolution à deux
clauses, il est nécessaire de savoir si deux ou plusieurs
formules atomiques peuvent être unifiées, c-à-d s'il existe
une substitution des variables de ces formules par des
termes du langage qui permettent de les rendre égales.
 L'unification représente le processus par lequel tout
langage logique met en correspondance un atome avec
un fait, où la tête d'une règle pour vérifier le but proposé.
1. Mécanisme utilisé pour
répondre à une question
L'unification
Exemple :
f(X, s) et f(a,Y) sont unifiable en substituant X par a et Y par
s, et en obtenant le même terme f(a,s).
f(X1, X1) et f(a,b) ne sont pas unifiables.
1. Mécanisme utilisé pour
répondre à une question
L'unification
 Prolog tente de faire correspondre la question avec les
faits disponibles.
 Si un fait s'accorde avec la question alors les variables de
la question prennent les valeurs nécessaires.
 On dit que l'on unifie la question avec le fait et que les
variables sont instanciées.
 Cette instanciation se fait par construction d'une
substitution qui est un ensemble des couples (variable,
valeur), généralement représenté sous la forme {(Var1,
Val1), ..., (Varn = Valn)}.
1. Mécanisme utilisé pour
répondre à une question
L'unification
Les règles pour décider si deux atomes logiques
sont unifiables sont les suivantes :
 deux termes atomiques sont unifiables s’ils sont identiques,
 une variable libre (non instanciée) s’unifie toujours en s’instanciant à
l’autre terme,
 une variable instanciée se comporte comme son terme,
 l’unification de deux variables libres les lie,
 toutes les variables liées ne peuvent s’instancier qu’au même terme.
 deux termes composés s’unifient composant à composant, c.à.d. un
terme composé va unifier avec un autre terme composé de même
foncteur et même nombre d'arguments, et tous les arguments
correspondants doivent unifier.
1. Mécanisme utilisé pour
répondre à une question
L'unification
Unifiables
Termes 1 Terme 2 Substitution commentaire
?
aa aa
Oui {}
1980 1980 Deux termes atomiques sont unifiables
papier crayon s'ils sont identiques.
Non /
2016 2006

Si un des deux termes est une variable


Z ab Oui { (Z, ab) }
libre, l'unification est toujours possible.

{ ( X, c ) , Deux termes composés s’unifient


a(b,X) a(Y,c) Oui
( Y, b ) } composant à composant.
{ ( X, c ) ,
a(X, b(Y,c)) a(Y, b(c,X)) Oui Les variables X et Y sont liées.
( Y, c ) }

L'unification de X avec c nécessiterait


X = Y , X = c et Y
a(X, b(Y,c)) a(Y, b(3,X)) Non l'unification des deux termes atomiques
= 3 : Impossible !
c et 3 (qui sont non unifiables).

{ (X, 3) , On donne la valeur de Y en remplaçant


a(3, b(d,X)) a(X , Y) Oui
(Y, b(d , 3)) } X par sa valeur.
2. Définitions préliminaires :
 Une Substitution est une liste de couples (V, T) tels que
le premier élément est une variable et le second un
terme Prolog contenant éventuellement des variables.
Définition : Une substitution (notée σ) est une fonction de
l'ensemble des variables dans l'ensemble des termes.
Par exemple : σ={(X,Y), (Z,f(a,Y))} est la substitution qui
"remplace'' X par Y, Z par f(a,Y), et laisse inchangée
toute autre variable que X et Z.
 Par extension, une substitution peut être appliquée à un
atome logique. Par exemple :
σ(p(X,f(Y,Z))) = p(σ(X),f(σ(Y), σ(Z))) = p(Y,f(Y,f(a,Y)))
2. Définitions préliminaires :
 Instancier un atome logique P avec une substitution σ
(on note σ(P) ), c'est remplacer dans P toutes les
occurrences d'une variables de σ par son expression
associée dans σ.
Définition : Instance
Une instance d'un atome logique A est le résultat σ(A) de
l'application d'une substitution σ sur A.

Par exemple : pere(toto,paul) est une instance de


pere(toto,X).
2. Définitions préliminaires :
Définition : Unificateur
Un unificateur de deux atomes logiques A1 et A2 est une
substitution σ telle que σ(A1)=σ(A2). On dit que les deux
prédicats A1 et A2 sont unifiables
 Par exemple : soit A1=p(X,f(X,Y)), et soit A2=p(a,Z),
σ = {(X,a),(Z,f(a,Y))} est un unificateur de A1 et A2 car
σ(A1)=σ(A2)=p(a,f(a,Y)).
 Soient Q= pere(ali,X) F= pere(ali,salah)
Q et F sont unifiables par la substitution σ={(X, salah)},
on obtient:
σ(Q) = σ(pere(ali,X)) = pere(ali,salah) = F
3. Signification opérationnelle
 Soit P un programme Prolog contenant un ensemble de
clauses.
 Pour prouver un but composé d'une suite d'atomes
logiques : But = [A_1, A_2, ..., A_n]
 l'interprète Prolog commence par prouver le premier de
ces atomes logiques (A_1).
 Pour cela, on cherche une clause dans le programme
dont l'atome de tête s'unifie avec le premier atome
logique à prouver, par exemple, une clause :
B_0 :- B_1 , B_2 , .. , B_r.
telle que: σ (A_1) = σ(B_0)
3. Signification opérationnelle
 Pour prouver un but composé d'une suite d'atomes
logiques :
But = [A_1, A_2, ..., A_n]
l'interprète Prolog commence par prouver le premier de
ces atomes logiques (A_1).
 Pour cela, il cherche une clause dans le programme dont
l'atome de tête s'unifie avec le premier atome logique à
prouver, par exemple, une clause :
B_0 :- B_1 , B_2 , .. , B_r.
telle que: σ (A_1) = σ(B_0)
3. Signification opérationnelle
 L'interprète Prolog remplace le premier atome logique à
prouver (A_1) dans le but par les atomes logiques du
corps de la clause, en leur appliquant la substitution (σ).
 Le nouveau but à prouver devient :
But = [σ(B_1), σ(B_2), ..., σ(B_r), σ(A_2), .., σ(A_n)]
 L'interprète Prolog recommence alors ce processus,
jusqu'à ce que le but à prouver soit vide, c'est à dire
jusqu'à ce qu'il n'y ait plus rien à prouver.
 A ce moment, l'interprète Prolog a prouvé le but initial.
3. Signification opérationnelle
 si le but initial comportait des variables, il affiche les
valeurs de ces variables obtenues en leur appliquant les
substitutions successivement utilisées pour la preuve.
 Il existe généralement plusieurs clauses dans le
programme Prolog dont l'atome de tête s'unifie avec
l'atome logique à prouver. Ainsi, l'interprète Prolog va
successivement répéter ce processus de preuve pour
chacune des clauses candidates. Par conséquent,
l'interprète Prolog peut trouver plusieurs réponses à un
but.
3. Signification opérationnelle
 Ce processus de preuve en chaînage arrière est résumé
par la fonction prouver(But) suivante.
 Cette fonction affiche l'ensemble des instances de But qui
font partie de la dénotation du programme.
3. Signification opérationnelle
fonction prouver(But: liste d'atomes logiques )
si But = [] alors
le but initial est prouvé
afficher les valeurs des variables du but initial
sinon soit But = [A_1, A_2, .., A_n]
pour toute clause (B_0 :- B_1, B_2, .., B_r) du programme:
(où les variables ont été renommées)
σ  unificateur de A_1 et B_0 (c-à-d. σ (A_1) = σ(B_0))
si σ ≠ echec alors
prouver([σ(B_1), σ(B_2),.. σ(B_r), σ(A_2),.. σ(A_n)])
finsi
finpour
finsi
fin
3. Signification opérationnelle
 Quand on pose une question à l'interprète Prolog, celui-
ci exécute dynamiquement l'algorithme précédent.
 L'arbre constitué de l'ensemble des appels récursifs à la
procédure prouver(But) est appelé Arbre de
Recherche.
 Prolog va chercher à effacer tous les termes du but
(résolvant), il essaie par dérivation successives d'obtenir
une résolvante vide, s'il y arrive alors il y a succès et la
substitution obtenue donne les conditions de la succès.
S'il n' y parvient pas il y a alors échec.
3. Signification opérationnelle
Remarques
 la stratégie de recherche n'est pas complète, dans la
mesure où l'on peut avoir une suite infinie d'appels
récursifs,
 la stratégie de recherche dépend d'une part de l'ordre de
définition des clauses dans un paquet (si plusieurs clauses
peuvent être utilisées pour prouver un atome logique, on
considère les clauses selon leur ordre d'apparition dans le
paquet), et d'autre part de l'ordre des atomes logiques
dans le corps d'une clause (on prouve les atomes logiques
selon leur ordre d'apparition dans la clause).
3. Signification opérationnelle

Exemple 01:
 Prenons l’exemple du calcul de la multiplication d’un
entier naturel X par un entier Y par additions successives
(Multiplication Egyptienne).
3. Signification opérationnelle

Exemple 01:
 Prenons l’exemple du calcul de la multiplication d’un
entier naturel X par un entier Y par additions successives
(Multiplication Egyptienne).

mlt(X,Y,R) :- Y<0 , Y1 is -Y, mlt(X,Y1,R1), R is –R1. /* r1 */


mlt(_,0,0). /* r2: 0 est élément absorbant de la multiplication*/
mlt(X,1,X). /* r3: 1 est élément neutre de la multiplication*/
mlt(X,Y,R) :- Y1 is Y-1, Y1>0, mlt(X,Y1,R1), R is R1+X. /* r4 */
3. Signification opérationnelle
 Puisque la fonction prouver(But) est récursif, la même
règle peut être utilisée plusieurs fois dans la résolution.
 Afin d’éviter toute confusion sur les variables (telles que
X, Y et R) qui pourraient être apparaître plusieurs fois,
nous effectueront des renommage du type X_i, Y_i et
R_i. Ce renommage est effectué en interne par le
moteur de résolution de Prolog.

 Soit la requête suivante:


?- mlt(10 , -2 , A).
Construisez l'arbre de résolution pour ce but.
3. Signification opérationnelle

Exemple 02:
 Prenons le programme Prolog suivant :
s(a). p(X,Y) :- q(X),r(X,Y).
s(b). q(X) :- t(X).
r(a,b). q(X) :- s(X).
r(b,c). t(e).
r(c,b).

 Soit la question suivante:


?- p(R,S).
3. Signification opérationnelle
?- p(A,B).
p(A,B)

={(X,A), (Y,B)}

q(A), r(A,B)
={(X,A)} ={(X,A)}

t(A), r(A,B) s(A), r(A,B)


={(A,a)} ={(A,b)}
={(A,e)}
r(a,B) r(b,B)
r(e,B)
={(B,b)} ={(B,c)}
échec

succès succès
3. Signification opérationnelle

 La réponse renvoyée par Prolog est donc :

?- p(A,B).
A=a
B=b ;
A=b
B=c

Vous aimerez peut-être aussi