• Aucun résultat trouvé

Implantation du retour-arrière (1)

N/A
N/A
Protected

Academic year: 2022

Partager "Implantation du retour-arrière (1)"

Copied!
33
0
0

Texte intégral

(1)

c 2006 Marc Feeley IFT2030 page 333

Implantation du retour-arrière (1)

Basé sur les continuations

Une requête c’est une série de buts à prouver (chaque but est un appel d’une relation)

Deux “continuations” possibles pour un but B 1. succès (une preuve a été trouvée pour B) 2. échec (une preuve n’a pas été trouvée)

Un “succès” fait avancer le calcul à la preuve du prochain but

Un “échec” fait un retour-arrière au but précédent pour trouver une autre preuve

(2)

c 2006 Marc Feeley IFT2030 page 334

Implantation du retour-arrière (2)

La continuation de succès d’un but B1, si elle échoue la preuve du prochain but B2, doit pouvoir retourner à B1 pour trouver une autre preuve

Donc la continuation de succès a elle même une continuation d’échec en paramètre

(3)

c 2006 Marc Feeley IFT2030 page 335

Implantation du retour-arrière (3)

Traduction d’une requête Prolog en Scheme

; | ?- member(X,[1,2,3]).

; X = 1 ? ;

; X = 2 ? ;

; X = 3 ? ;

; no

(define generer

(lambda (lst echec succes) (if (null? lst)

(echec)

(succes (car lst) (lambda ()

(generer (cdr lst) echec succes)))))) (generer ’(1 2 3)

(lambda () (display "no")) (lambda (x retour)

(begin

(write x) (read)

(retour))))

(4)

c 2006 Marc Feeley IFT2030 page 336

Implantation du retour-arrière (4)

; somme(L,N,X,Y) :- member(X,L),

; member(Y,L),

; N is X+Y.

;

; | ?- somme([2,5,8],10,X,Y).

; X = 2, Y = 8 ? ;

; X = 5, Y = 5 ? ;

; X = 8, Y = 2 ? ;

; no

(define somme

(lambda (lst n echec succes) (generer lst

echec

(lambda (x retour1) (generer lst

retour1

(lambda (y retour2) (if (= (+ x y) n)

(succes x y retour2) (retour2))))))))

(somme ’(2 5 8) 10

(lambda () (display "no")) (lambda (x y retour)

(begin

(write (list x y)) (read)

(retour))))

(5)

c 2006 Marc Feeley IFT2030 page 337

Applications de Prolog (1)

Calcul de la dérivée symbolique d’une expression (par exemple: dérivée de x*x est 2*x)

On se sert du fait qu’en Prolog X+Y est une syntaxe conviviale pour le terme +(X,Y)

(6)

c 2006 Marc Feeley IFT2030 page 338

Applications de Prolog (2)

deriv( A, 0 ) :- number(A).

deriv( x, 1 ).

deriv( A+B, DA+DB ) :- deriv(A,DA), deriv(B,DB).

deriv( A-B, DA-DB ) :- deriv(A,DA), deriv(B,DB).

deriv( A*B, A*DB+DA*B ) :- deriv(A,DA), deriv(B,DB).

deriv( A/B, (B*DA-DB*A)/(B*B) ) :- deriv(A,DA), deriv(B,DB).

deriv( sin(A), cos(A)*DA ) :- deriv(A,DA).

deriv( cos(A), -sin(A)*DA ) :- deriv(A,DA).

| ?- deriv( x, D ).

D = 1 ? ; no

| ?- deriv( 2*x, D ).

D = 2*1+0*x ? ; no

| ?- deriv( cos(x*x), D ).

D = -(sin(x*x)*(x*1+1*x)) ? ; no

| ?- deriv( F, 1 ).

F = x ? ; no

| ?- deriv( F, 2 ).

no

| ?- deriv( F, 2*1+0*x ).

F = 2*x ? ; no

(7)

c 2006 Marc Feeley IFT2030 page 339

Applications de Prolog (3)

Analyse syntaxique de langue naturelle (pour tester qu’une phrase est valide)

Une phrase sera une liste de symboles

[le,chat,est,sur,la,chaise]

La syntaxe est spécifiée par une grammaire

<phrase> ::= <chose> <verbe> <relation> <chose>

<chose> ::= le chat | la chaise | la table

<verbe> ::= est

<relation> ::= sur | sous

(8)

c 2006 Marc Feeley IFT2030 page 340

Applications de Prolog (4)

Chaque catégorie syntaxique se traduit par une relation:

chose([le,chat|L],L).

chose([la,chaise|L],L).

chose([la,table|L],L).

verbe([est|L],L).

relation([sur|L],L).

relation([sous|L],L).

phrase(P) :- chose(P,A), verbe(A,B),

relation(B,C), chose(C,[]).

(9)

c 2006 Marc Feeley IFT2030 page 341

Applications de Prolog (5)

| ?- phrase([le,chat,est,sous,la,table]).

yes

| ?- phrase(P).

P = [le,chat,est,sur,le,chat] ? ; P = [le,chat,est,sur,la,chaise] ? ; P = [le,chat,est,sur,la,table] ? ; P = [le,chat,est,sous,le,chat] ? ; P = [le,chat,est,sous,la,chaise] ? ; P = [le,chat,est,sous,la,table] ? ; P = [la,chaise,est,sur,le,chat] ? ; P = [la,chaise,est,sur,la,chaise] ? ; P = [la,chaise,est,sur,la,table] ? ; P = [la,chaise,est,sous,le,chat] ? ; P = [la,chaise,est,sous,la,chaise] ? ; P = [la,chaise,est,sous,la,table] ? ; P = [la,table,est,sur,le,chat] ? ;

P = [la,table,est,sur,la,chaise] ? ; P = [la,table,est,sur,la,table] ? ; P = [la,table,est,sous,le,chat] ? ; P = [la,table,est,sous,la,chaise] ? ; P = [la,table,est,sous,la,table] ? ; no

(10)

c 2006 Marc Feeley IFT2030 page 342

L’opérateur de coupure (1)

Par défaut Prolog tente de prouver la requête de toutes les façons possibles (suivant le programme) jusqu’à ce qu’une preuve soit trouvée

Si une preuve échoue, Prolog fait un retour-arrière pour tenter une autre ligne de preuve

Dans certains cas ce retour-arrière peut être nuisible:

1. si le retour-arrière va répéter une solution

2. si le retour-arrière n’a aucune chance de trouver une solution

(11)

c 2006 Marc Feeley IFT2030 page 343

L’opérateur de coupure (2)

L’opérateur de coupure (“cut”) permet de signaler qu’un retour-arrière n’est pas désiré

Syntaxe:

rel(...) :- hGi, !, hDi.

Si le système trouve une preuve pour hGi alors un

échec de prouver hDi sera un échec pour cette règle et aucune autre règle pour rel(...) ne sera essayée

(12)

c 2006 Marc Feeley IFT2030 page 344

L’opérateur de coupure (3)

couleur(bleu).

couleur(orange).

couleur(chocolat).

aliment(pomme).

aliment(orange).

aliment(chocolat).

deuxsens1(X) :- couleur(X), aliment(X).

deuxsens2(X) :- couleur(X), !, aliment(X).

deuxsens3(X) :- couleur(X), aliment(X), !.

| ?- deuxsens1(orange).

yes

| ?- deuxsens2(orange).

yes

| ?- deuxsens3(orange).

yes

| ?- deuxsens1(X).

X = orange ? ; X = chocolat ? ; no

| ?- deuxsens2(X).

no

| ?- deuxsens3(X).

X = orange ? ; no

(13)

c 2006 Marc Feeley IFT2030 page 345

L’opérateur de coupure (4)

L’opérateur de coupure est impur car une relation qui l’utilise peut ne plus avoir la même interprétation

logique

Déf: Une utilisation de “!” est mauvaise (“red cut”) si la relation ne donne plus les mêmes résultats (exemple

précédent)

Déf: Une utilisation de “!” est bonne (“green cut”) si la relation donne les mêmes résultats (mais possiblement plus rapidement ou sans solution redondante)

(14)

c 2006 Marc Feeley IFT2030 page 346

L’opérateur de coupure (5)

Exemple

% sans op´erateur de coupure element(X,noeud(X,_,_)).

element(X,noeud(C,G,_)) :- X<C, element(X,G).

element(X,noeud(C,_,D)) :- X>C, element(X,D).

% avec op´erateur de coupure element(X,noeud(X,_,_)) :- !.

element(X,noeud(C,G,_)) :- X<C, !, element(X,G).

element(X,noeud(C,_,D)) :- element(X,D).

(15)

c 2006 Marc Feeley IFT2030 page 347

L’opérateur de coupure (6)

max1(X,Y,Y) :- X=<Y.

max1(X,Y,X) :- X>=Y.

| ?- max1(1,2,X).

X = 2 ? ; no

| ?- max1(1,1,X).

X = 1 ? ; X = 1 ? ; no

max2(X,Y,Y) :- X<Y.

max2(X,Y,X) :- X>=Y.

| ?- max2(1,2,X).

X = 2 ? ; no

| ?- max2(1,1,X).

X = 1 ? ; no

(16)

c 2006 Marc Feeley IFT2030 page 348

L’opérateur de coupure (7)

max3(X,Y,Y) :- X<Y, !. % green cut max3(X,Y,X) :- X>=Y.

| ?- max3(1,2,X).

X = 2 ? ; no

| ?- max3(1,1,X).

X = 1 ? ; no

| ?- max3(1,2,1).

no

max4(X,Y,Y) :- X<Y, !. % red cut max4(X,Y,X).

| ?- max4(1,2,X).

X = 2 ? ; no

| ?- max4(1,1,X).

X = 1 ? ; no

| ?- max4(1,2,1).

yes

(17)

c 2006 Marc Feeley IFT2030 page 349

La négation (1)

La négation logique ne s’exprime pas complètement en Prolog

Lorsque Prolog répond “no” à une requête c’est qu’il n’a pas trouvé de preuve que la requête est vraie

Ce n’est pas la même chose que de trouver une preuve que la requête est fausse

C’est ce qu’on appèle “négation par l’échec”

(18)

c 2006 Marc Feeley IFT2030 page 350

La négation (2)

La négation (partielle) d’une relation est possible avec l’opérateur de coupure:

pasrel(X) :- rel(X), !, fail.

pasrel(_).

Si rel(X) est vraie, alors pasrel(X) aboutira à un échec (car la relation fail n’existe pas), sinon

pasrel(X) sera vraie

(19)

c 2006 Marc Feeley IFT2030 page 351

La négation (3)

Exemple montrant que cela ne correspond pas exactement à la négation logique:

petit(0).

petit(1).

petit(2).

paszero(0) :- !, fail.

paszero(_).

| ?- petit(X), paszero(X).

X = 1 ? ; X = 2 ? ; no

| ?- paszero(X), petit(X).

no

Ici la relation paszero(X) fonctionne bien à condition que X soit un terme clos

Lorsque X n’est pas liée, il y aura unification de X avec 0 et donc un échec après le “!

(20)

c 2006 Marc Feeley IFT2030 page 352

Programmation impérative / procédurale

Style de programmation offert par la plupart des

langages de programmation (machine, assembleur,

FORTRAN, Algol, SIMULA, C/C++, Pascal, Ada, Java, Lisp, ML, ...)

Basé sur le modèle d’une machine; le programme

indique la séquence d’opérations que la machine doit suivre pour faire le calcul

Le programmeur dicte précisément chaque étape que la machine doit effectuer pour réaliser le calcul

(21)

c 2006 Marc Feeley IFT2030 page 353

Points de contrôle

Déf: point de contrôle = un emplacement du programme entre deux opérations

void main () /*programme C*/

1 2

4 3

{ char c;

c = getchar ();

c = toupper (c);

putchar (c);

}

Note: dépendant du point de vue certains énoncés du programme peuvent donner lieu à plus d’un point de contrôle si ils font plus qu’une opération

(p.e. c=toupper(c);)

(22)

c 2006 Marc Feeley IFT2030 page 354

Exécution d’un programme (1)

Déf: l’état de l’exécution d’un programme (si on

suppose une seule entrée et sortie et pas d’appel de procédure) =

1. point de contrôle où se trouve l’exécution

2. contenu de toutes les variables et structures de données

3. partie de l’entrée qui reste à lire et sortie produite jusqu’à date

EXÉCUTION

1 2

4 3

void main () /*programme C*/

{ char c;

c = getchar ();

c = toupper (c);

putchar (c);

}

1 c=? ab 2 c=’a’ b 3 c=’A’ b

4 c=’A’ b A pt. variables entrée sortie

(23)

c 2006 Marc Feeley IFT2030 page 355

Exécution d’un programme (2)

L’état change après l’exécution de chaque opération (donc revenir à un état précédent => boucle infinie)

L’ordre des opérations est important

/* ce programme n’est pas ´equivalent */

c = getchar ();

putchar (c);

c = toupper (c);

Pourquoi? Parce que l’effet de chaque opération dépend de l’état du programme au moment de son exécution

(24)

c 2006 Marc Feeley IFT2030 page 356

Énoncés de contrôle

Normalement, après l’exécution d’un énoncé, le point d’exécution se trouve juste avant le prochain énoncé (i.e. exécution séquentielle)

Pour un ordre d’exécution autre que séquentiel, il faut utiliser des énoncés de contrôle

Exemple:

1

else

4

3

if (x < 0) x = 0;

x = x*2;

2

L’ordre d’exécution sera 1-2-4 ou 1-3-4 dépendant de la valeur de la variable x

(25)

c 2006 Marc Feeley IFT2030 page 357

Énoncé de contrôle “ goto

Énoncé de contrôle le plus primitif; correspond

directement avec les instructions de branchement en langage machine; offert par FORTRAN, SIMULA, C, Pascal, ...

Change le point de contrôle de façon arbitraire

La destination est indiquée par une étiquette

x = 1; | x = 1;

goto fin; | while (x<10)

deb: x = x*2; | x = x*2;

fin: if (x<10) goto deb; | printf ("%d\n", x);

printf ("%d\n", x); |

Problème: difficile de comprendre un programme à base de goto car la séquence d’opérations obtenue n’est pas évidente

L’utilisation abusive de mène à des programmes

(26)

c 2006 Marc Feeley IFT2030 page 358

Programmation structurée (1)

Afin d’éviter le spaghetti les langages modernes prônent la programmation structurée

• idée: la structure syntaxique d’un programme doit aider à comprendre ce que fait le programme (en particulier au niveau du séquencement des

opérations)

Déf: le flux de contrôle c’est la progression du point d’exécution pendant l’exécution (la séquence de points de contrôle atteints)

(27)

c 2006 Marc Feeley IFT2030 page 359

Programmation structurée (2)

Déf: un programme est structuré si le flux de contrôle est directement lié à sa structure syntaxique

En général, chaque énoncé (simple ou composé) a un seul point de contrôle d’entrée et un seul point de

contrôle de sortie

y=x

else

x<y

FLOWCHART

oui non

entrée

sortie 1

2

3 4

1

2 3

4

if (x < y) x = y;

y = x;

x=y

(28)

c 2006 Marc Feeley IFT2030 page 360

Énoncé “bloc” (1)

Exécution séquentielle d’un groupe d’énoncés

Exemple en Pascal:

begin x:=x+1; y:=y+1 end

Exemple en C:

{ int t; t=x; x=y; y=t; }

Certains langages (p.e. C et SIMULA) permettent

d’introduire des variables locales au bloc; en général au début seulement, C++ et Java sont des exceptions notables:

{ x++; int y=x/2; z=y*y; }

(29)

c 2006 Marc Feeley IFT2030 page 361

Énoncé “bloc” (2)

Le point-virgule est un séparateur d’énoncés dans certains langages (p.e. Pascal et SIMULA) et un

terminateur d’énoncés dans d’autres (p.e. C, C++ et Java)

En Pascal ce bloc a 3 énoncés:

begin x:=x+1; y:=y+1; end (*3`eme = vide*)

En Pascal ceci est illégal:

if x < y then x := y;

else (* erreur: else inattendu *) y := x;

;” comme terminateur est plus intuitif

(30)

c 2006 Marc Feeley IFT2030 page 362

Énoncé conditionnel (1)

La plupart des langages offrent deux formes:

• if <expr> then <´enonc ´e>

• if <expr> then <´enonc ´e> else <´enonc ´e>

Cette syntaxe est ambiguë

La syntaxe Modula-2 (EBNF):

IF <expr> THEN <s ´eq ´enonc ´es>

{ ELSIF <expr> THEN <s ´eq ´enonc ´es> } [ ELSE <s ´eq ´enonc ´es> ]

END

(31)

c 2006 Marc Feeley IFT2030 page 363

Énoncé conditionnel (2)

Les cascades de IFs ne sont pas élégants si on n’utilise pas ELSIF:

(* sans ELSIF *) (* avec ELSIF *)

IF c1 THEN IF c1 THEN

e1 e1

ELSE ELSIF c2 THEN

IF c2 THEN e2

e2 ELSIF c3 THEN

ELSE e3

IF c3 THEN ELSE

e3 e4

ELSE END

e4 END END END

(32)

c 2006 Marc Feeley IFT2030 page 364

Énoncé conditionnel (3)

Certains langages (p.e. SIMULA, C, C++ et Java)

offrent également des expressions conditionnelles:

• SIMULA: if <expr1> then <expr2> else <expr3>

• C/C++/Java: <expr1> ? <expr2> : <expr3>

Exemple, calcul de la valeur absolue de x:

x := if x<0 then -x else x; ! SIMULA ; x = (x<0) ? -x : x; /* C */

(33)

c 2006 Marc Feeley IFT2030 page 365

Énoncé conditionnel (4)

En C, toute expression suivie d’un point-virgule est un énoncé (à noter que C traite <var>=<expr> comme une expression)

Cela permet d’utiliser les opérateurs “&&”, “||” et “,” pour faire des traitements conditionnels:

rappel:

X && Y --> 0 si X==0 sinon Y!=0 X || Y --> 1 si X!=0 sinon Y!=0

X , Y --> Y (apr`es avoir ´evalu´e X) x<0 && (x=-x); /* x = abs (x); */

x==5 || (x=y=0, z=1);

/* if (x!=5) { x=0; y=0; z=1; } */

Références

Documents relatifs

nous nous sommes bien amusés(es) vous vous êtes bien amusés (es) ils se sont bien amusés.. elles se sont

Habituellement elle est présentée pour la multiplication et la division, mais elle peut être également utilisée pour l'addition et la soustraction.. Elle repose sur le principe

Indiquez une m´ ethode directe de r´ esolution du syst` eme (2) (on citera un th´ eor` eme assurant que la m´ ethode est efficace) et ´ evaluez l’ordre de grandeur du nombre

by Eric T. 1 ) has the unique continuation property, or u.c.p., relative to X if whenever u in X satisfies (1.1) (in the sense of distributions) and vanishes in (i.e. is zero a.e. in)

Un filtre maximal ou ultrafiltre est un filtre non contenu dans un autre filtre. Il est bien connu [7] que pour V quelconque, un ultrafiltre est caractérisé par les conditions 1°, 2°

Montrer qu’il existe une application injective de N dans

Si on fait vibrer une corde suffisamment tendue (souvent en nylon ou en acier), elle fait aussi vibrer l'air qui se trouve à côté et produit un son : on peut frotter, pincer

On répète cette épreuve de manière indépendante deux fois, et on compte le nombre Y de succès... On considère l’épreuve qui consiste à étudier