Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2...

28
Fonctionnement du moteur Prolog

Transcript of Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2...

Page 1: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Fonctionnement du moteurProlog

Page 2: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits pour effacer une question sans variable

boite(a). %2boite(b). %1boite(c). %0 ?- boite(b).yes P=boite(b).1

E={}P=.succès

• Numéroter les clauses d’une procédure en ordre décroissant

• P = Pile des buts à effacer (atteindre)

• Le moteur s’arrête sur un succès quand P devient vide

Page 3: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits pour effacer une question sans variable

boite(a). %2boite(b). %1boite(c). %0

?- boite(g).no P=boite(g).échec

• Numéroter les clauses d’une procédure en ordre décroissant

• P = Pile des buts à effacer (atteindre)

• Le moteur s’arrête sur échec quand il n’existe pas de clause pour effacer le sommet de P

Page 4: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits pour effacer une question avec variable

boite(a). %2

boite(b). %1

boite(c). %0

 

?- boite(X).

X=a ;

X=b ;

X=c ;

no

E={X=_}P=boite(X).%2

E={X=a}P=.succès

%1E={X=b}P=.succès

%0E={X=c}P=.succès

échec

Page 5: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits pour effacer une question avec variable

E={X=_}P=boite(X).%2

E={X=a}P=.succès

%1E={X=b}P=.succès

%0E={X=c}P=.succès

échec

• E=ensemble des contraintes sur les variables

• P=Pile des buts à effacer (atteindre)

• Le moteur s’arrête sur un succès quand P devient vide

• Après un succès le moteur effectue un retour arrière pour fournir toutes les solutions

Page 6: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Prolog est non déterministe

• Il effectue un retour arrière (backtrack) sur succès pour fournir toutes les solutions

• En fait il faut taper ; pour forcer le backtract

Page 7: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits et des règles pour effacer une question sans variable

pere(michel,jacques). %2

pere(michel,julien). %1

pere(jacques,jean). %0

 

a_un_pere(Z) :-

pere(_, Z). %0

 

Effaçons la question 

?- a_un_pere(julien).

yes

E={}

P=a_un_pere(julien).

0E={}

P=pere(_,julien).

1E={}

P=.

succès

Page 8: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des règles pour effacer une question sans variable

• Appliquer une règle consiste à substituer sa queue à sa tête au sommet de la pile

• Cette substitution ne peut avoir lieu que si le sommet de la pile peut être mis en correspondance (unifié) avec la tête de la règle moyennant des liaisons sur les variables

• Attention : il n’y a pas de backtrack car sans variable dans la question il ne peut y avoir plusieurs solutions

Page 9: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Des faits et des règles pour effacer une question avec variable

pere(michel,jacques).%2

pere(michel,julien). %1

pere(jacques,jean). %0

 

a_un_pere(Z) :-

pere(_, Z). %0

 

Effaçons la question 

?- a_un_pere(X).

E={X=_}P=a_un_pere(X).0

E={X=_}P=pere(_,X).2

E={X=jacques}P=.succès

1E={X=julien}P=.succès

0E={X=jean}P=.succès

échec

Page 10: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Le mécanisme d’unification

• Deux prédicats sont unifiables s’ils ont le même nom, la même arité et si leurs arguments sont unifiables

 • Deux constantes sont unifiables si elles sont identiques • Deux variables sont unifiables ; elles deviennent identiques • Une variable est unifiable avec une constante, un terme composé ou une liste. La

variable est alors instanciées (liée) avec la valeur correspondante • Deux termes composés sont unifiables s’ils ont le même nom, la même arité et si

leurs arguments sont unifiables • Deux listes sont unifiables si elles ont le même nombre d’éléments et si leurs

éléments sont unifiables

Page 11: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Prolog et la Logique

Prolog est une implémentation de la logique des prédicats qui présente certaines limites :

• Prolog examine les clauses d’une même procédure dans leur ordre d’écriture

• Prolog applique une stratégie en profondeur d’abord

• Prolog essaie d’effacer le dernier but introduit, (sommet de la pile des buts)

• Prolog effectue des rebroussements sur succès et sur échec

Page 12: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Ces choix peuvent engendrer des comportements

inattendus, par exemples … a :- a. %1a. %0 ?-a.

P=a.%1

P=a.%1

P=a.%1…

a. %1

a :- a. %0

?-a.

P=a.

%1P=.

succès

Page 13: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Ces choix peuvent engendrer des comportements

inattendus, par exemples … a(q). %1

a(Y) :- a(Y). %0

?-a(X).

E={X=_}

P=a(X).

%1

E={X=q}

P=.

Succès

%0

E={X=_}

P=a(X).

%1

E={X=q}

P=.

Succès

Page 14: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Ces choix peuvent engendrer des comportements inattendus, par exemples …

bon(arbre(branche(pomme)). %2

bon(X) :- bon(arbre(X)). %1

bon(X) :- bon(branche(X)). %0

Une pomme est sur une branche qui est sur un bon arbre

Pour être bon il suffit d’être sur un bon arbre

Pour être bon il suffit d’être sur un bonne branche

Page 15: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Ces choix peuvent engendrer des comportements inattendus, par exemples …

bon(arbre(branche(pomme)). %2

bon(X) :- bon(arbre(X)). %1

bon(X) :- bon(branche(X)). %0

 

?-bon(pomme).

P=bon(pomme).

%1P=bon(arbre(pomme)).%1

P=bon(arbre(arbre(pomme))).

%1

Prolog boucle alors que bon(pomme) se déduit logiquementIl suffit d’appliquer %0, puis %1 et enfin %2

Peut-on modifier l’ordre des clauses ?

Page 16: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Ces choix peuvent engendrer des comportements inattendus, par exemples …

bon(X) :- bon(branche(X)). %0

bon(X) :- bon(arbre(X)). %1

bon(arbre(branche(pomme)). %2

 

?-bon(pomme).

P=bon(pomme).

%0P=bon(branche(pomme)).%0

P=bon(branche(branche(pomme))).

%0

Il n’y a pas de permutation sur les clauses qui permette d’établir bon(pomme).

Page 17: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Structure de liste

• Notation en extension

[p,r,o,l,o,g]

• Notation [tête|queue]

[p | [r,o,l,o,g]]

• Liste vide []

Page 18: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Simplifier les écritures

[0|[]]

[[]|[]]

[[]|[0]]

[1|[2,3]]

[[2,3]|[1]]

Page 19: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Simplifier les écritures

[0|[]]=

[[]|[]]=

[[]|[0]]=

[1|[2,3]]=

[[2,3]|[1]]=

[0]

[[]]

[[],0]

[1,2,3]

[[2,3],1]

Page 20: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

print_l/1 vs. l_print/1

print_l([a,b,c]).

abc

print_l([]). %1

print_l([T|Q]) :- %0

write(T),

print_l(Q).

l_print([a,b,c]).

cba

l_print([]). %1

l_print([T|Q]) :- %0

l_print(Q),

write(T).

Page 21: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

element_de/2

Relation entre une liste et un de ses éléments ?-element_de([a,b,c], b). %mode(in,in)yes

?-element_de([a,b,c], f). %mode(in,in)no ?-element_de([a,b,c], X). %mode(in,out)X=a ;X=b ;X=c ;no 

?-element_de(X, a). %mode(out,in)

Page 22: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

Un terme est element_de une liste …

si c’est la tête

ousi c’est un element_de la queue

element_de(X,[X|_]).

element_de(X,[_|Q]) :- element_de(X,Q).

Page 23: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

concat/3Relation entre deux listes et leur concaténée

?-concat([1,2],[a,b],[1,2,a,b]). %mode(in,in,in)

yes

 

?-concat([1,2],[a,b],[1,2,a,c]). %mode(in,in,in)

no

 

?-concat([1,2],[a,b],X). %mode(in,in,out)

X=[1,2,a,b];

no

Page 24: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

concat/3Relation entre deux listes et leur concaténée

?-concat([1,2],X,[1,2,a,b]). %mode(in,out,in)

X=[a,b];

no

 

?-concat(X,[a,b],[1,2,a,b]). %mode(out,in,in)

X=[1,2];

no

 

?-concat(X,Y,[1,2]). %mode(out,out,in)

X=[] Y=[1,2];

X=[1] Y=[2];

X=[1,2] Y=[];

Page 25: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

concat([], L, L). %1

concat([Tete|Que], Ue ,[Tete|Queue]) :- concat(Que, Ue, Queue).   %0

Effaçons la question 

?- concat([1,2], [a,b], X).

yes

X=_

P=concat([1,2],[a,b],X).

0x=[1 | Q]

P=concat([2],[a,b],Q).

0X=[1,2 | R]

P=concat([],[a,b],R).

1X=[1,2,a,b]

P=.

succès

Page 26: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

concat([], L, L). %1

concat([Tete|Que], Ue ,[Tete|Queue]) :- concat(Que, Ue, Queue).   %0

X=_ Y=_P=concat(X,Y,[a,b]).1

X=[] Y=[a,b]P=.Succès

0X=[a|Q], Y=_P=concat(Q,Y,[b]).1

X=[a] Y=[b]P=.Succès

0X=[a|[b|R]] Y=_P=concat(R,Y,[]).1

X=[a,b] Y=[]P=.Succès

[trace] ?- concat(X,Y,[a,b]). Call: (6) concat(_G388, _G389, [a, b]) ? creep Exit: (6) concat([], [a, b], [a, b]) ? creepX = [] Y = [a, b] ; Redo: (6) concat(_G388, _G389, [a, b]) ? creep Call: (7) concat(_G462, _G389, [b]) ? creep Exit: (7) concat([], [b], [b]) ? creep Exit: (6) concat([a], [b], [a, b]) ? creep

X = [a] Y = [b] ; Redo: (7) concat(_G462, _G389, [b]) ? creep Call: (8) concat(_G465, _G389, []) ? creep Exit: (8) concat([], [], []) ? creep Exit: (7) concat([b], [], [b]) ? creep Exit: (6) concat([a, b], [], [a, b]) ? creep

X = [a, b] Y = [] ; Redo: (8) concat(_G465, _G389, []) ? creep Fail: (8) concat(_G465, _G389, []) ? creep Fail: (7) concat(_G462, _G389, [b]) ? creep Fail: (6) concat(_G388, _G389, [a, b]) ? creep

Page 27: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

mapList/3

• Met en relation– un prédicat binaire– deux listes

• Les éléments correspondant de chaque liste sont mis en relation par le prédicat

?- mapList(carre, [1,2,3], L).L=[1,4,9]

Page 28: Fonctionnement du moteur Prolog. Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1.

mapList/3

mapList(_, [], []). %1

mapList(P, [T1|Q1], [T2|Q2]) :- %0

B =.. [P,T1,T2],

B ,

mapList(P, Q1, Q2).

Le mode de mapList est celui de P