La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

1 Fonctionnement du moteur Prolog

2 Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(b). yes P=boite(b). 1 E={} P=. succès Numéroter les clauses dune procédure en ordre décroissant P = Pile des buts à effacer (atteindre) Le moteur sarrête sur un succès quand P devient vide

3 Des faits pour effacer une question sans variable boite(a).%2 boite(b).%1 boite(c).%0 ?- boite(g). no P=boite(g). échec Numéroter les clauses dune procédure en ordre décroissant P = Pile des buts à effacer (atteindre) Le moteur sarrête sur échec quand il nexiste pas de clause pour effacer le sommet de P

4 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 %1 E={X=b} P=. succès %0 E={X=c} P=. succès échec

5 Des faits pour effacer une question avec variable E={X=_} P=boite(X). %2 E={X=a} P=. succès %1 E={X=b} P=. succès %0 E={X=c} P=. succès échec E=ensemble des contraintes sur les variables P=Pile des buts à effacer (atteindre) Le moteur sarrê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

6 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

7 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). 0 E={} P=pere(_,julien). 1 E={} P=. succès

8 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 ny a pas de backtrack car sans variable dans la question il ne peut y avoir plusieurs solutions

9 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 1 E={X=julien} P=. succès 0 E={X=jean} P=. succès échec

10 Le mécanisme dunification Deux prédicats sont unifiables sils 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 sils 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

11 Prolog et la Logique Prolog est une implémentation de la logique des prédicats qui présente certaines limites : Prolog examine les clauses dune même procédure dans leur ordre décriture Prolog applique une stratégie en profondeur dabord Prolog essaie deffacer le dernier but introduit, (sommet de la pile des buts) Prolog effectue des rebroussements sur succès et sur échec

12 Ces choix peuvent engendrer des comportements inattendus, par exemples … a :- a.%1 a.%0 ?-a. P=a. %1 P=a. %1 P=a. %1 … a.%1 a :- a.%0 ?-a. P=a. %1 P=. succès

13 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 …

14 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

15 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). %1 P= bon(arbre(pomme)). %1 P=bon(arbre(arbre(pomme))). %1 … Prolog boucle alors que bon(pomme) se déduit logiquement Il suffit dappliquer %0, puis %1 et enfin %2 Peut-on modifier lordre des clauses ?

16 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). %0 P= bon(branche(pomme)). %0 P=bon(branche(branche(pomme))). %0 … Il ny a pas de permutation sur les clauses qui permette détablir bon(pomme).

17 Structure de liste Notation en extension [p,r,o,l,o,g] Notation [tête|queue] [p | [r,o,l,o,g]] Liste vide []

18 Simplifier les écritures [0|[]] [[]|[]] [[]|[0]] [1|[2,3]] [[2,3]|[1]]

19 Simplifier les écritures [0|[]]= [[]|[]]= [[]|[0]]= [1|[2,3]]= [[2,3]|[1]]= [0] [[]] [[],0] [1,2,3] [[2,3],1]

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

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

22 Un terme est element_de une liste … si cest la tête ousi cest un element_de la queue element_de(X,[X|_]). element_de(X,[_|Q]) :- element_de(X,Q).

23 concat/3 Relation 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

24 concat/3 Relation 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=[];

25 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). 0 x=[1 | Q] P=concat([2],[a,b],Q). 0 X=[1,2 | R] P=concat([],[a,b],R). 1 X=[1,2,a,b] P=. succès

26 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 0 X=[a|Q], Y=_ P=concat(Q,Y,[b]). 1 X=[a] Y=[b] P=. Succès 0 X=[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]) ? creep X = []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

27 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]

28 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


Télécharger ppt "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."

Présentations similaires


Annonces Google