36
1 Contrôle du moteur Prolog

1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

Embed Size (px)

Citation preview

Page 1: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

1

Contrôle du moteur Prolog

Page 2: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

2

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

Page 3: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

3

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

Page 4: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

4

Un premier exemple

a :- b. %0

b :- c, !, d. %1

b. %0

c. %1

c :- e , f. %0

P = a.0P = b.1

P = c,!,d.1

P = !,d. !

P=d.no

Page 5: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

5

Effet du Cut dans une question

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

{X=1,Y=1} P=. succès0

{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ès0

{X=2,Y=2} P=. succès

Page 6: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

6

Effet du Cut dans une question

avec 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

le cut rend déterministe les prédicats qui le précèdent

Page 7: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

7

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

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

Page 8: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

8

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

Page 9: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

9

Effet du Cut sur le réponse(succès ou bien échec)

a :- fail. %1

a . %0

P = a.

1

P = fail .

échec

0

P = .

succès

Page 10: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

10

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

Page 11: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

11

Effet du Cut sur le réponse(instanciation de variable)

a(_). %1

a(1). %0

{X=_} P = a(X).

1

{X=_} P = .

succès

0

{X=1} P = .

succès

Page 12: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

12

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

Page 13: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

13

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

Page 14: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

14

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

Page 15: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

15

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

Page 16: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

16

A quoi cela sert-il ?obtenir une unique solution

chiffre(0). %9chiffre(1). %8chiffre(2). %7chiffre(3). %6chiffre(4). %5chiffre(5). %4chiffre(6). %3chiffre(7). %2chiffre(8). %1chiffre(9). %0

premier_chiffre(X) :- chiffre(X), ! .

Comment obtenir uniquement le premier

chiffre (0) ?

Page 17: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

17

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

Page 18: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

18

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

Page 19: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

19

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

Page 20: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

20

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

Page 21: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

21

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

Page 22: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

22

Peut-on encore simplifier ?

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

Page 23: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

23

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

Page 24: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

24

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

Page 25: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

25

Peut-on encore simplifier ?

max(X,Y,X) :- Y =< X, ! . %1

max(_,Y,Y). %0

P= max(2,3,3).

0

P=. succes

Page 26: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

26

Peut-on encore simplifier ?

max(X,Y,X) :- Y =< X, ! . %1

max(_,Y,Y). %0

P= max(3,2,2).

0

P=. succes

Page 27: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

27

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.

c

P= ! , fail.

!

P= fail. no

Page 28: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

28

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

Page 29: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

29

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

Page 30: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

30

A quoi cela sert-il ?implémenter une structure alternative

proc(X) :-

X=0, ! ,write(‘nul’). %1

proc(_) :- write(‘non nul’). %0

Proc(X)

Si (X==0) ecrire(«nul»)

Sinon ecrire(«non nul»)

FinProc

Page 31: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

31

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

Page 32: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

32

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

Page 33: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

33

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

Page 34: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

34

A quoi cela sert-il ?implémenter une structure répétitive

repeat. %1

repeat :- repeat %0

proc :- repeat, a, b, c, !. %0

Proc

repeter

a

b

jusque c

Page 35: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

35

repeat. %1repeat :- repeat %0

proc :- repeat, a, b, c, !. %0

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

Page 36: 1 Contrôle du moteur Prolog. 2 Nous avons étudié le fonctionnement du moteur Prolog. Nous allons maintenant montrer quil est possible de le contrôler

36

A quoi cela sert-il ?Traduire le procédure suivante 

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