360 likes | 490 Views
Contrôle du moteur Prolog. Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer qu’il est possible de le contrôler L’outil de base pour agir sur le comportement de Prolog est un prédicat prédéfini appelé le CUT (ou coupure). La coupure (cut).
E N D
Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer qu’il est possible de le contrôler • L’outil de base pour agir sur le comportement de Prolog est un prédicat prédéfini appelé le CUT (ou coupure)
La coupure (cut) • Le cut est un prédicat déterministe qui peut toujours être effacé • Son effacement a pour effet de « couper » les choix en attente portant • sur le but qui l’a introduit dans le pile • ainsi que sur tous les buts introduits depuis son introduction
a :- b. %0 b :- c, !, d. %1 b. %0 c. %1 c :- e , f. %0 P = a. 0 P = b. 1 P = c,!,d. 1 P = !,d. ! P=d. no Un premier exemple
b(1). %1 b(2). %0 c(1). %1 c(2). %0 {X=_,Y=_}P=b(X),c(Y). 1 {X=1,Y=_} P=c(Y). 1 {X=1,Y=1}P=.succès 0 {X=1,Y=2}P=.succès {X=_,Y=_}P=b(X),c(Y). 0 {X=2,Y=_}P=c(Y). 1 {X=2,Y=1}P=.succès 0 {X=2,Y=2}P=.succès Effet du Cut dans une questionavec variables
b(1). %1 b(2). %0 c(1). %1 c(2). %0 {X=_,Y=_}P=b(X),!,c(Y). 1 {X=1,Y=_} P=!, c(Y). ! {X=1,Y=_} P=c(Y). 1 {X=1,Y=1}P=.succès 0 {X=1,Y=2}P=.succès Effet du Cut dans une questionavec variables le cut rend déterministe les prédicats qui le précèdent
a(X,Y):- b(X),c(Y). %1 a(3,3). %0 b(1). %1 b(2). %0 c(1). %1 c(2). %0 {X=_,Y=_}P=a(X,Y). 1{X=_,Y=_}P=b(X),c(Y). 1 {X=1,Y=_}P=c(Y). 1 {X=1,Y=1} P=. succès 0 {X=1,Y=2} P=. succès 0 {X=2,Y=_}P=c(Y). 1 {X=2,Y=1} P=. succès 0 {X=2,Y=2} P=. succès 0{X=3,Y=3}P=b(3),c(3). no Effet du Cut dans la queue d’une règle
a(X,Y):- b(X),!, c(Y). %1 a(3,3). %0 b(1). %1 b(2). %0 c(1). %1 c(2). %0 {X=_,Y=_}P=a(X,Y). 1 {X=_,Y=_}P=b(X), ! ,c(Y). 1 {X=1,Y=_}P= !,c(Y). ! {X=1,Y=_}P=c(Y). 1 {X=1,Y=1} P=. succès 0 {X=1,Y=2} P=. succès Effet du Cut dans la queue d’une règle
a :- fail. %1 a . %0 P = a. 1 P = fail . échec 0 P = . succès Effet du Cut sur le réponse(succès ou bien échec)
a :- !, fail. %1 a . %0 P = a. 1 P = !, fail . ! P = fail . échec Effet du Cut sur le réponse(succès ou bien échec)
a(_). %1 a(1). %0 {X=_}P = a(X). 1 {X=_}P = . succès 0 {X=1}P = . succès Effet du Cut sur le réponse(instanciation de variable)
a(_):- !. %1 a(1). %0 {X=_}P = a(X). 1 {X=_}P = ! . ! {X=_}P = . succès Effet du Cut sur le réponse(instanciation de variable)
chiffre(0). %9 chiffre(1). %8 chiffre(2). %7 chiffre(3). %6 chiffre(4). %5 chiffre(5). %4 chiffre(6). %3 chiffre(7). %2 chiffre(8). %1 chiffre(9). %0 Comment obtenir uniquement le premier chiffre (0) ? ?- chiffre(X). A quoi cela sert-il ?obtenir une unique solution
chiffre(0). %9 chiffre(1). %8 chiffre(2). %7 chiffre(3). %6 chiffre(4). %5 chiffre(5). %4 chiffre(6). %3 chiffre(7). %2 chiffre(8). %1 chiffre(9). %0 Comment obtenir uniquement le premier chiffre (0) ? ?- chiffre(X), ! . A quoi cela sert-il ?obtenir une unique solution
chiffre(0). %9 chiffre(1). %8 chiffre(2). %7 chiffre(3). %6 chiffre(4). %5 chiffre(5). %4 chiffre(6). %3 chiffre(7). %2 chiffre(8). %1 chiffre(9). %0 {X=_} P = chiffre(X) , ! . 9 {X=0} P = !. ! {X=0} P=. succes A quoi cela sert-il ?obtenir une unique solution
chiffre(0). %9 chiffre(1). %8 chiffre(2). %7 chiffre(3). %6 chiffre(4). %5 chiffre(5). %4 chiffre(6). %3 chiffre(7). %2 chiffre(8). %1 chiffre(9). %0 premier_chiffre(X) :- chiffre(X), ! . Comment obtenir uniquement le premier chiffre (0) ? A quoi cela sert-il ?obtenir une unique solution
chiffre(0). %9 chiffre(1). %8 chiffre(2). %7 chiffre(3). %6 chiffre(4). %5 chiffre(5). %4 chiffre(6). %3 chiffre(7). %2 chiffre(8). %1 chiffre(9). %0 premier_chiffre(C) :- chiffre(C), ! . %0 {X=_} P=premier_chiffre(X). 0 {X=_} P=chiffre(X),!. 9 {X=0} P=!. ! {X=0} P=. succes A quoi cela sert-il ?obtenir une unique solution
max(X,Y,X) :- Y =< X. %1 max(X,Y,Y) :- X < Y. %0 {X=_} P= max(2,3,X). 1 {X=2} P= 3=<2. no 0 {X=3} P= 2<3. < {X=3} P=. succes A quoi cela sert-il ?optimiser le moteur
max(X,Y,X) :- Y =< X. %1 max(X,Y,Y) :- X < Y. %0 {X=_} P= max(3,2,X). 1 {X=3} P= 2=<3. =< {X=2} P=. succes 0 {X=2} P= 3<2. no A quoi cela sert-il ?optimiser le moteur
max(X,Y,X) :- Y =< X, ! . %1 max(X,Y,Y) :- X < Y. %0 {X=_} P= max(3,2,X). 1 {X=3} P= 2=<3, !. =< {X=3} P= !. ! {X=3} P=. succes A quoi cela sert-il ?optimiser le moteur
max(X,Y,X) :- Y =< X, ! . %1 max(X,Y,Y) :- X < Y. %0 {X=_} P= max(2,3,X). 1 {X=2} P= 3=<2, !. no 0 {X=3} P= 2<3. < {X=3} P=. succes A quoi cela sert-il ?optimiser le moteur
max(X,Y,X) :- Y =< X, ! . %1 max(_,Y,Y). %0 {X=_} P= max(3,2,X). 1 {X=3} P= 2=<3, !. =< {X=3} P= !. ! {X=3} P=. succes Peut-on encore simplifier ?
max(X,Y,X) :- Y =< X, ! . %1 max(_,Y,Y). %0 {X=_} P= max(2,3,X). 1 {X=2} P= 3=<2, !. no 0 {X=3} P=. succes Peut-on encore simplifier ?
max(X,Y,X) :- Y =< X, ! . %1 max(_,Y,Y). %0 P= max(2,3,2). 1 {X=2} P= 3=<2, !. no Peut-on encore simplifier ?
max(X,Y,X) :- Y =< X, ! . %1 max(_,Y,Y). %0 P= max(2,3,3). 0 P=. succes Peut-on encore simplifier ?
max(X,Y,X) :- Y =< X, ! . %1 max(_,Y,Y). %0 P= max(3,2,2). 0 P=. succes Peut-on encore simplifier ?
non_c :- c , ! , fail. %1 non_c. %0 P=non_c. 1 P= c, ! , fail. c P= ! , fail. ! P= fail. no A quoi cela sert-il ?définir la négation
non_c :- c , ! , fail. %1 non_c. %0 P=non_c. 1 P= c, ! , fail. no 0 P= . succes A quoi cela sert-il ?définir la négation
Définir un (méta) prédicatnot/1 • prend en argument un prédicat • échoue si ce prédicat réussit • réussit dans le cas contraire not(P) :- P , ! , fail. %1 not(_). %0
proc(X) :- X=0, ! ,write(‘nul’). %1 proc(_):- write(‘non nul’). %0 Proc(X) Si (X==0)ecrire(«nul») Sinon ecrire(«non nul») FinProc A quoi cela sert-il ?implémenter une structure alternative
proc(X) :- X=0,!,write(‘nul’). %1 proc(_):- write(‘non nul’). %0 P=proc(0). 1 P= 0=0, !, write(‘nul’). = P= ! , write(‘nul’). ! P= write(‘nul’). write P=.succès A quoi cela sert-il ?implémenter une structure alternative
proc(X) :- X=0,!,write(‘nul’). %1 proc(_):- write(‘non nul’). %0 P=proc(1). 1 P= 1=0, !, write(‘nul’). no 0 P= write(‘non nul’). write P=.succès A quoi cela sert-il ?implémenter une structure alternative
Définir un (méta) prédicatsi/3 • prend en argument trois prédicats • Si le premier s’efface alors effacer le second • Sinon effacer le troisième si(C,P,_) :- C, !, P. %1 si(_,_,Q) :- Q. %0
repeat. %1 repeat :- repeat %0 proc :- repeat, a, b, c, !. %0 Proc repeter a b jusque c A quoi cela sert-il ?implémenter une structure répétitive
On suppose que les prédicats a et b sont déterministes et s’effacent avec succès P= repeat,a,b,c,!. 1 P= a,b,c,!. a P= b,c,!. b P= c,!. No 0 P= repeat,a,b,c,!. a P= b,c,! b P= c,!. c P= !. ! P=. succes repeat. %1repeat :- repeat %0proc :- repeat, a, b, c, !. %0
Proc :- repeat, read(Note), Si( Note>10, write(“admis”), write(« refuse ») ), Note=-1, !. Proc Repeter Lire(Note) si Note>10 écrire(«admis») sinon écrire(«refuse») Jusque Note=-1 A quoi cela sert-il ?Traduire le procédure suivante