44
ProLog Partie 2 : Unification, Arbre, Récursion, Coupure, Négation Mathieu Vidal Université Grenoble Alpes Année 2015-2016 L2 - MIASHS Grenoble - France

Le langage Prolog - WordPress.com · 2016-02-04 · l 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

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

ProLog

Partie 2 : Unification, Arbre, Récursion, Coupure, Négation

Mathieu Vidal

Université Grenoble Alpes

Année 2015-2016

L2 - MIASHS

Grenoble - France

Page 2: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Planl Unification l Arbre de Recherchel Récursionl Coupure (Cut)l Négation

Page 3: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Partie 1-

Unification

Page 4: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Unification : Idée de base

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 ? l Unification : procédé par lequel on essaie de rendre

deux formules identiques en donnant des valeurs aux variables qu’elles contiennent.

l Unification réussie : substitution possible

Page 5: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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).

homme(patrick)enfant(patrick,Z)enfant(Y,Z)patrick\=Y

Unification avec frere(X,Y)

X=patrick et Qui=Y

Page 6: Le langage Prolog - WordPress.com · 2016-02-04 · l 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éfinition Précise

l Si t1 et t2 sont des constantes, t1 et t2 unifient ssi ils sont le même atome ou le même nombre.

l Si t1 est une variable et t2 quelconque, t1 et t2 unifient ssi t1 est instanciable en t2.

l 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 unifientl Les instanciations de variables sont compatibles

Page 7: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Conséquence

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

l Le résultat n’est pas forcément unique : ensemble de solutions

l Prédicat d’unification : « = ». Teste si l'unification a réussie. Ecriture 1 : =(a,b). Ecriture 2 : a=b.

l Unification optimiste : pere(X)=X unifiel Unification pessimiste :n'unifie pas

unify_with_occurs_check(pere(X),X).

Page 8: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exercice

l Dire si les expressions suivantes unifient et comment :l ?- sam = sam.l ?- sam = lea.l ?- 'sam' = sam.l ?- '1' = 1l ?- X = Y.l ?- X = sam, X = lea.l ?- k(s(g),Y) = k(X,t(k)).l ?- k(s(g), t(k)) = k(X,t(Y)).l ?- aime(X,X) = aime(sam,lea).

Page 9: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Partie 2-

Arbre de Recherche

Page 10: Le langage Prolog - WordPress.com · 2016-02-04 · l 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 Prolog

l Pour répondre à une question, Prolog cherche à l'unifier, soit avec un fait, soit avec la tête d'une règle

l Unification avec la tête d'une Règlel Si l’unification réussit : substitution des

variables de la queue par les valeurs correspondantes dans la tête.

l L'algorithme est appelé SLDNF résolution (Selective Linear Definite Negation as Failure)

Page 11: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Résultat Final

l Prolog continue à unifier jusqu'à vérification de la requête initiale

l Si l’unification échoue : Prolog répond faux (false)l 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 »

l A la fin de la démonstration, Prolog a construit une liste de couples valeur-variable

Page 12: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Parcours

l Parcours de la base du haut vers le basl Parcours des clauses de gauche à droitel 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

Page 13: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Arbre de recherche

l Pour résoudre une question, Prolog construit l’arbre de recherche de la question

l Construction de l'arbrel Racine : la question initiale l Nœud : point de choixl Passage d’un nœud vers son fils en effectuant

une unification

Page 14: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Stratégie de Prolog

l Parcours en profondeur d’abordl nœud de succès : c’est une solution, Prolog

l’affiche et peut chercher d’autres solutionsl 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

Page 15: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Backtracking

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.

l Bactrack : toutes les unifications faites depuis le dernier point de choix sont défaites

l Possibilité de branche infinie et donc de recherche sans terminaison… Attention à :l L’ordre des littéraux dans la queue de clausel L’ordre des clauses

Page 16: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exemple d'Arbre de rechercheExemple de programme:pere(charlie, david). (p1)pere(henri, charlie). (p2)papi(X,Y) :- pere(X,Z), pere(Z,Y). (p3)

Question :?- papi(X,Y).

Page 17: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Résolution versus SLDNF

Résolutionl Théorie Mathématiquel Clauses de Horn

SLDNFl Algorithme effectifl Unification

Expl : Base = {p, q si p} et Question = {q?}

Base = {p,q v ¬p}. Qu. = {¬q}

[p] [q, ¬p] [¬q]

[q] [¬q]

[]

Base = {p,q:- p}. Qu. = {q}

?- q

?- p

OK

Equivalent

Page 18: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exercice

rectangle(a).

rectangle(b).

losange(b).

carre(X) :- rectangle(X),losange(X).

?- carre(X).

l Soit la base de connaissance et la requête suivante. Construire l'arbre de recherche Prolog

Page 19: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Partie 3-

Récursion

Page 20: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Programmation récursive

l Rappel : un programme récursif est un programme qui s’appelle lui-même

l Exemple : factoriellel factorielle(0) = 1 (Cas de base)l factorielle(n) = n * factorielle(n-1) si n≠0

l En Prolog, un prédicat est récursif si au moins une de ses règles associées réfère à lui-même

Page 21: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exemple deRé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.

Page 22: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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èglesdescend(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), enfant(Z,Y).descend(X,Y):- enfant(X,Z), enfant(Z,A), enfant(A,Y). ...

descend(X,Y):- enfant(X,Y).descend(X,Y):- enfant(X,Z), descend(Z,Y).

Page 23: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Le cas de base

p :-p.

?- p.

l Sans cas de base, la récursion ne s'arrête pas

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

Page 24: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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).

Page 25: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Solution

l Donne les bonnes solutionsl Mais finit par une erreur : Out of local stack

Page 26: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Partie 4-

Coupure

Page 27: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Notion de coupure (1)

l La recherche systématique de toutes les solutions possibles est une caractéristique importante de Prolog.

l 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.

Page 28: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Notion de coupure (2)

l Différents noms utilisés: coupure, cut ou coupe choix

l Introduit un contrôle du programmeur sur l'exécution de ses programmesl en élaguant les branches de l’arbre de recherchel rend les programmes plus simples et efficaces

l Notation: ! l Le coupe choix est un prédicat prédéfini qui

réussit toujours.

Page 29: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Notion de coupure (3)

l Le coupe choix permet de signifier à Prolog qu’on ne désire pas conserver les points de choix en attente

l Les autres solutions possibles à l'unification ne sont donc pas examinées

Page 30: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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.

Page 31: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Arbre de Recherche

?-a(X),b(X).

X=2

?-b(1). ?-b(2).

OK

X=1

?-p(X).

OK

?-a(X), !,b(X).

?- !,b(1).

X=1

?-p(X).

?-b(1).

OK

Sans Coupure Avec Coupure

Page 32: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exemples d'utilisation

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.

l 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.

l Exprimer des clauses exclusives :humain(X) :- homme(X). humain(X) :- homme(X), !.

humain(X) :- femme(X). humain(X) :- femme(X), !.

Page 33: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Danger

l Dangers du coupe-choix : on peut perdre des solutions. Expl :

achete(helene, journal). achete(helene, journal) :- !.

achete(corinne, timbres). achete(corinne, timbres) :- !.

achete(X, pain). achete(X, pain).

l et l’interrogation achete(helene, N).

l Sans coupure : N=journal et N=painl Avec coupure : N=journal

Page 34: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Notion de coupure (fin)

l En résumé, les utilités du coupe-choix sont :l éliminer les points de choix menant à des

échecs certainsl supprimer certains tests d’exclusion mutuelle

dans les clausesl permettre de n’obtenir que la première solution

de la démonstrationl assurer la terminaison de certains programmesl contrôler et diriger la démonstration

Page 35: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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).

Page 36: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Partie 5-

Négation

Page 37: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

La négation

l Négation par l'échec l Si F est une formule, sa négation est notée \+(F).

Dans d'autres implémentations, noté not(F)l 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.

l 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.

Page 38: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

La négation

l \+(X) ne veut pas dire que X est faux mais que X ne peut pas être prouvé.

l Elle est utilisée pour vérifier qu’une formule n’est pas vraie.

l 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

Page 39: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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.

Page 40: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

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.

Page 41: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

La différence

l La différence est définie comme le contraire de l’unificationl 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).

Page 42: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Le prédicat fail

l fail signale à Prolog l'échec de la branche courante

l Prolog effectue alors un backtrack (retour arrière jusqu'au dernier point de choix)

Page 43: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Combinaison cut-fail

l Enchaînement :?- …,!,fail.l Le cut a supprimé tous les points de choixl Le fail essaye de retourner au dernier point de

choixl Leur combinaison termine donc la démonstrationl Permet d'exprimer une exception à une règle

l vole(X):- autruche(X), !,fail.

l vole(X):- oiseaux(X).

Page 44: Le langage Prolog - WordPress.com · 2016-02-04 · l 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

Exercice

l Définir la base de connaissance décrivant qu'en Europe, les voitures roulent à droite, sauf au Royaume-Uni et en Irlande.