fonctionnement du moteur prolog. des faits pour effacer une question sans variable boite(a).%2...

Post on 03-Apr-2015

148 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Fonctionnement du moteurProlog

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ?

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

Structure de liste

• Notation en extension

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

• Notation [tête|queue]

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

• Liste vide []

Simplifier les écritures

[0|[]]

[[]|[]]

[[]|[0]]

[1|[2,3]]

[[2,3]|[1]]

Simplifier les écritures

[0|[]]=

[[]|[]]=

[[]|[0]]=

[1|[2,3]]=

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

[0]

[[]]

[[],0]

[1,2,3]

[[2,3],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).

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)

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

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

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=[];

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

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

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]

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

top related