Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
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 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
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 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
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} %0 E={X=c} é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} %0 E={X=c} é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
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). P=pere(_,julien). 1 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 n’y 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). P=pere(_,X). 2 E={X=jacques} P=. succès 1 E={X=julien} E={X=jean} échec
10
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
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 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
12
Ces choix peuvent engendrer des comportements inattendus, par exemples …
a :- a. %1 a. %0 ?-a. 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 …
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)). P=bon(arbre(arbre(pomme))). … Prolog boucle alors que bon(pomme) se déduit logiquement Il suffit d’appliquer %0, puis %1 et enfin %2 Peut-on modifier l’ordre 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)). P=bon(branche(branche(pomme))). … Il n’y 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 l_print([a,b,c]). cba
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 ; ?-element_de(X, a). %mode(out,in)
22
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).
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];
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]; ?-concat(X,Y,[1,2]). %mode(out,out,in) X=[] Y=[1,2]; X=[1] Y=[2]; X=[1,2] Y=[];
25
X=_ P=concat([1,2],[a,b],X). x=[1 | Q] P=concat([2],[a,b],Q).
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). x=[1 | Q] P=concat([2],[a,b],Q). X=[1,2 | R] P=concat([],[a,b],R). 1 X=[1,2,a,b] P=. succès
26
X=_ Y=_ P=concat(X,Y,[a,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 X=[a|Q], Y=_ P=concat(Q,Y,[b]). X=[a] Y=[b] X=[a|[b|R]] Y=_ P=concat(R,Y,[]). X=[a,b] Y=[] [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
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.