X = Y. - WordPress.com

Transcription

X = Y. - WordPress.com
ProLog
Partie 2 : Unification, Arbre,
Récursion, Coupure, Négation
Mathieu Vidal
Université Grenoble Alpes
Année 2015-2016
L2 - MIASHS
Grenoble - France
Plan
l
l
l
l
l
Unification
Arbre de Recherche
Récursion
Coupure (Cut)
Négation
Partie 1
Unification
Unification : Idée de base
l
l
l
Exemple :
l Base de connaissance : elfe(galadriel).
l Question :?- elfe(X).
l Comment fait Prolog pour dire que galadriel est une
valeur possible pour X ?
Unification : procédé par lequel on essaie de rendre
deux formules identiques en donnant des valeurs
aux variables qu’elles contiennent.
Unification réussie : substitution possible
Unification dans les Clauses
l
L'unification réussie dans la tête se propage aux
clauses
frere(X,Y) :- homme(X), enfant(X,Z), enfant(Y,Z), X\=Y.
frere(patrick,Qui).
Unification avec frere(X,Y)
X=patrick et Qui=Y
homme(patrick)
enfant(patrick,Z)
enfant(Y,Z)
patrick\=Y
Définition Précise
l
l
l
Si t1 et t2 sont des constantes, t1 et t2 unifient ssi ils
sont le même atome ou le même nombre.
Si t1 est une variable et t2 quelconque, t1 et t2
unifient ssi t1 est instanciable en t2.
Si t1 et t2 sont des termes complexes, t1 et t2
unifient ssi :
l Ils ont le même foncteur et arité
l Tous leurs arguments correspondants unifient
l Les instanciations de variables sont compatibles
Conséquence
l
l
l
l
l
L’unification peut réussir ou échouer.
l
e(X) et e(2) peuvent être unifiés.
l
e(3) et e(2) ne peuvent être unifiés
Le résultat n’est pas forcément unique :
ensemble de solutions
Prédicat d’unification : « = ». Teste si l'unification
a réussie. Ecriture 1 : =(a,b). Ecriture 2 : a=b.
Unification optimiste : pere(X)=X unifie
Unification pessimiste :n'unifie pas
unify_with_occurs_check(pere(X),X).
Exercice
l
Dire si les expressions suivantes unifient et comment :
l
l
l
l
l
l
l
l
l
?- sam = sam.
?- sam = lea.
?- 'sam' = sam.
?- '1' = 1
?- X = Y.
?- X = sam, X = lea.
?- k(s(g),Y) = k(X,t(k)).
?- k(s(g), t(k)) = k(X,t(Y)).
?- aime(X,X) = aime(sam,lea).
Partie 2
Arbre de Recherche
Démonstration Prolog
l
l
l
Pour répondre à une question, Prolog cherche à
l'unifier, soit avec un fait, soit avec la tête d'une
règle
Unification avec la tête d'une Règle
l Si l’unification réussit : substitution des
variables de la queue par les valeurs
correspondantes dans la tête.
L'algorithme est appelé SLDNF résolution
(Selective Linear Definite Negation as Failure)
Résultat Final
l
l
l
l
Prolog continue à unifier jusqu'à vérification de la
requête initiale
Si l’unification échoue : Prolog répond faux (false)
Si l’unification réussit : Prolog répond soit vrai
(true), soit donne la valeur des variables (expl :
X=lea) s'il y en avait dans la requête.
l On demande à Prolog de chercher d'autres
valeurs en appuyant sur « ; » ou « Espace »
A la fin de la démonstration, Prolog a construit
une liste de couples valeur-variable
Parcours
l
l
l
Parcours de la base du haut vers le bas
Parcours des clauses de gauche à droite
Quand il y a plusieurs manières d'unifier, on a un
point de choix. Cas possibles :
l
Différentes règles définissant un même prédicat
l
Disjonction de prédicats dans une queue
l
Instanciation d'une variable
Arbre de recherche
l
l
Pour résoudre une question, Prolog construit
l’arbre de recherche de la question
Construction de l'arbre
l Racine : la question initiale
l Nœud : point de choix
l Passage d’un nœud vers son fils en effectuant
une unification
Stratégie de Prolog
l
Parcours en profondeur d’abord
l nœud de succès : c’est une solution, Prolog
l’affiche et peut chercher d’autres solutions
l nœud d'échec : remontée dans l’arbre jusqu'à
un point de choix possédant des branches
non explorées
l
Puis parcours de gauche à droite dans l'ordre
des conditions
Backtracking
l
l
l
Remontée dans l'arbre jusqu'au point de choix :
backtrack. Si un tel nœud de choix n’existe
pas, la démonstration est terminée, il n’y a pas
d’autre solution.
Bactrack : toutes les unifications faites depuis le
dernier point de choix sont défaites
Possibilité de branche infinie et donc de
recherche sans terminaison… Attention à :
l
l
L’ordre des littéraux dans la queue de clause
L’ordre des clauses
Exemple d'Arbre de recherche
Exemple de programme:
pere(charlie, david).
(p1)
pere(henri, charlie).
(p2)
papi(X,Y) :- pere(X,Z), pere(Z,Y). (p3)
Question :?- papi(X,Y).
Résolution versus SLDNF
l
l
Résolution
Théorie Mathématique
Clauses de Horn
l
l
SLDNF
Algorithme effectif
Unification
Expl : Base = {p, q si p} et Question = {q?}
Base = {p,q v ¬p}. Qu. = {¬q}
Base = {p,q:- p}. Qu. = {q}
[p] [q, ¬p] [¬q]
?- q
Equivalent
[q] [¬q]
?- p
[]
OK
Exercice
l
Soit la base de connaissance et la requête suivante.
Construire l'arbre de recherche Prolog
rectangle(a).
rectangle(b).
losange(b).
carre(X) :- rectangle(X),losange(X).
?- carre(X).
Partie 3
Récursion
Programmation récursive
l
l
Rappel : un programme récursif est un
programme qui s’appelle lui-même
Exemple : factorielle
l
l
l
factorielle(0) = 1 (Cas de base)
factorielle(n) = n * factorielle(n-1) si n≠0
En Prolog, un prédicat est récursif si au moins
une de ses règles associées réfère à lui-même
Exemple de
Récursion simple
digere(X,Y) :- vientDeManger(X,Y).
digere(X,Y) :- vientDeManger(X,Z), digere(Z,Y).
vientDeManger(moustique,sang(marie)).
vientDeManger(grenouille,moustique).
vientDeManger(marie,grenouille).
?- digere(marie,moustique).
true.
?- digere(grenouille,marie)
false
?- digere(marie,sang(marie)).
true.
Intérêt de la récursion
l
Permet d'exprimer de manière succincte un
processus réitéré n fois
l
Expl : Exprimer la relation de descendance
l
Non récursif : Nombre infini de règles
descend(X,Y):- enfant(X,Y).
descend(X,Y):- enfant(X,Z), enfant(Z,Y).
descend(X,Y):- enfant(X,Z), enfant(Z,A), enfant(A,Y). ...
l
Récursif : Deux règles
descend(X,Y):- enfant(X,Y).
descend(X,Y):- enfant(X,Z), descend(Z,Y).
Le cas de base
l
Sans cas de base, la récursion ne s'arrête pas
p :-p.
?- p.
l
Il faut placer le cas de base avant la relation de
récurrence dans la règle, sinon pas d'arrêt
descend(X,Y):- descend(X,Z), enfant(Z,Y).
descend(X,Y):- enfant(X,Y).
enfant(marie,paul).
?- descend(marie,paul).
ERROR : Out of local stack
Exercice
l
Trouvez-vous problématique la réécriture suivante du
prédicat descend ?
descend(X,Y):- enfant(X,Y).
descend(X,Y):- descend(X,Z), descend(Z,Y).
Solution
l
l
Donne les bonnes solutions
Mais finit par une erreur : Out of local stack
Partie 4
Coupure
Notion de coupure (1)
l
l
La recherche systématique de toutes les
solutions possibles est une caractéristique
importante de Prolog.
Mais elle constitue également son talon d’Achille
car elle conduit parfois à une explosion
combinatoire qu’il est nécessaire de couper si
l’on veut voir son programme se terminer.
Notion de coupure (2)
l
l
Différents noms utilisés: coupure, cut ou coupe
choix
Introduit un contrôle du programmeur sur
l'exécution de ses programmes
l
l
l
l
en élaguant les branches de l’arbre de recherche
rend les programmes plus simples et efficaces
Notation: !
Le coupe choix est un prédicat prédéfini qui
réussit toujours.
Notion de coupure (3)
l
l
Le coupe choix permet de signifier à Prolog qu’on
ne désire pas conserver les points de choix en
attente
Les autres solutions possibles à l'unification ne
sont donc pas examinées
Coupure dans une règle
l
Le coupe-choix ne conserve que les unifications
faites avant la suppression des points de choix.
a(1). b(1). a(2). b(2).
p(X):- a(X),b(X).
?- p(X).
X =1 ;
X=2.
a(1). b(1). a(2). b(2).
p(X):- a(X), !,b(X).
?- p(X).
X =1.
Arbre de Recherche
Sans Coupure
?-p(X).
?-a(X),b(X).
X=1
?-b(1).
OK
X=2
?-b(2).
OK
Avec Coupure
?-p(X).
?-a(X), !,b(X).
X=1
?- !,b(1).
?-b(1).
OK
Exemples d'utilisation
l
l
l
Pour prouver que x est un élément d’une liste, on peut
s'arrêter dès que la première occurrence de x a été
trouvée.
Pour calculer min(a,b) :
min(A, B, A) :- A=<B.
min(A, B, A) :- A=<B, !.
min(A, B, B) :- A >B.
min(A, B, B) :- A =B.
Exprimer des clauses exclusives :
humain(X) :- homme(X). humain(X) :- homme(X), !.
humain(X) :- femme(X).
humain(X) :- femme(X), !.
Danger
l
Dangers du coupe-choix : on peut perdre des
solutions. Expl :
l
achete(helene, journal).
achete(helene, journal) :- !.
achete(corinne, timbres).
achete(corinne, timbres) :- !.
achete(X, pain).
achete(X, pain).
et l’interrogation achete(helene, N).
l
Sans coupure : N=journal et N=pain
l
Avec coupure : N=journal
Notion de coupure (fin)
l
En résumé, les utilités du coupe-choix sont :
l
l
l
l
l
éliminer les points de choix menant à des
échecs certains
supprimer certains tests d’exclusion mutuelle
dans les clauses
permettre de n’obtenir que la première solution
de la démonstration
assurer la terminaison de certains programmes
contrôler et diriger la démonstration
Exercice
l
Etant donné la base de connaissance suivante,
quel sera la réponse de Prolog à la question ?
a(1). a(2). b(2). c(3).
p(X):- c(X).
p(X):- a(X), !, b(X).
?- p(X).
Partie 5
Négation
La négation
l
Négation par l'échec
l
l
l
Si F est une formule, sa négation est notée \+(F).
Dans d'autres implémentations, noté not(F)
Prolog pratique la négation par l'échec, c’est-à-dire
que pour démontrer \+(F) Prolog va tenter de
démontrer F. Si la démonstration de F échoue,
Prolog considère que \+(F) est démontrée.
Pour Prolog, \+(F) signifie que la formule F n’est pas
démontrable, et non que c’est une formule
fausse. C’est ce que l’on appelle l'hypothèse du
monde clos.
La négation
l
l
l
\+(X) ne veut pas dire que X est faux mais que X
ne peut pas être prouvé.
Elle est utilisée pour vérifier qu’une formule n’est
pas vraie.
La négation par l'échec ne doit être utilisée que
sur des prédicats dont les arguments sont
déterminés et à des fins de vérification.
l
Son utilisation ne détermine jamais la valeur d’une
variable
La négation
l
Dangers :
l
Considérez le programme suivant :
p(a).
l
Et interrogez Prolog avec :
?- X = b, \+ p(X).
YES { X = b }
l
Prolog répond positivement car p(b) n’est pas
démontrable.
La négation
l
Par contre, interrogez le avec :
?- \+ p(X), X=b.
No
l
Prolog répond négativement car p(X) étant
démontrable avec X = a, \+ p(X) est considéré
comme faux.
=> Incohérence qui peut être corrigée si
l’on applique la règle vue précédemment :
n’utiliser la négation que sur des prédicats
dont les arguments sont déterminés.
La différence
l
La différence est définie comme le contraire
de l’unification
l
Elle est notée : X \= Y. Elle signifie que X et Y ne
sont pas unifiables, et non qu’ils sont
différents.
Ex : Z \= 3. Sera faux car Z et 3 sont
unifiables.
l
Elle peut être définie comme :
X \= Y :- \+ (X = Y).
Le prédicat fail
l
l
fail signale à Prolog l'échec de la branche
courante
Prolog effectue alors un backtrack (retour arrière
jusqu'au dernier point de choix)
Combinaison cut-fail
l
l
l
l
l
Enchaînement :?- …,!,fail.
Le cut a supprimé tous les points de choix
Le fail essaye de retourner au dernier point de
choix
Leur combinaison termine donc la démonstration
Permet d'exprimer une exception à une règle
l vole(X):- autruche(X), !,fail.
l
vole(X):- oiseaux(X).
Exercice
l
Définir la base de connaissance décrivant qu'en
Europe, les voitures roulent à droite, sauf au
Royaume-Uni et en Irlande.