Le langage Prolog - WordPress.com · 2016-02-04 · l Prolog pratique la négation par...

Preview:

Citation preview

ProLog

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

Mathieu Vidal

Université Grenoble Alpes

Année 2015-2016

L2 - MIASHS

Grenoble - France

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

Partie 1-

Unification

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

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

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

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

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

Partie 2-

Arbre de Recherche

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)

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

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

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

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

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

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

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

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

Partie 3-

Récursion

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

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.

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

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

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 Donne les bonnes solutionsl Mais finit par une erreur : Out of local stack

Partie 4-

Coupure

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.

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.

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

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

?-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

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

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

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

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

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

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

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)

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

Exercice

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

Recommended