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.