Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
H. Wertz -- Exécution Symbolique
D’abord un mini-langage : déclaration de procédure : nom: PROCEDURE (paramètre1, paramètre2, … paramètren) <suite-d’instructions> END; deux types de procédures : fonctions et subroutines (CALL) toute variable a des valeurs entiers : DECLARE var1, vae2, … varn INTEGER opérations de base : + * - … affectation : var := <expression> composition : DO <suite-d’instruction> END opérations booléenne : true, false, <, >, =, , , , & (et), | (ou), (implique), (not) conditionnelle : IF <booléen> THEN instruction1 ELSE instruction2 itérative : DO WHILE <booléen>; <suite-d’instructions> END; paramètres par référence, RETURN; (subroutine), RETURN(<expr>); (fonction) Chaque procédure possède 1 return, subroutine CALL nom(a1, a2, … a3); basé sur Hantler et King « an introduction to proving the correctness of programs », IBM Thomas J Watson Research Center, RC 5893, 24/02/2019 H. Wertz -- Exécution Symbolique
2
H. Wertz -- Exécution Symbolique
Assertions des contraintes sur les entrées et sorties peuvent être exprimées par des assertions : assertion d’entrée : ASSUME (<booléen>); exemple: ASSUME (P1 > 0); assertion de sortie : PROVE (<booléen>); exemple: PROVE ((X = Y) & (Y = X)); Un programme est (partiellement) correct si la vérification de l’assertion d’entrée implique la vérification de l’assertion de sortie Relation entre entrée et sortie : assertion 24/02/2019 H. Wertz -- Exécution Symbolique
3
Un programme exemple (simple)
1 ABSOLUTE: PROCEDURE(X); ASSUME(true); DECLARE X, Y INTEGER; IF X < 0 THEN Y := -X ELSE Y := X PROVE((Y = X | Y = -X) & Y 0 & X = X); RETURN(Y); 9 END; PROVE spécifie à la fois ce que le programme fais et ce qu’il ne fais pas 24/02/2019 H. Wertz -- Exécution Symbolique
4
Exécution symbolique de ABSOLUTE
Un appel typique : ABSOLUTE(); Cas : <0 test-IF = true THEN Y:=- Y=- X=X= (-= | -=-)& -0 & = démontrer: -0 ou <0 Cas : 0 test-IF = false ELSE Y:= Y= X=X= (= | =-)& 0 & = démontrer: 0 24/02/2019 H. Wertz -- Exécution Symbolique
5
équivalent exécution réelle = exécution algébrique
Affectation change exemple: X= Y= X:=Y+X X:= + Y:=3*X-Y Y:=3+2 CALL et RETURN ne changent pas IF change : soit true, soit false soit indéterminé si indéterminé, alors analyse de cas (pour la preuve et/ou pour trouver des cas impossibles) exemple : IF X<0 THEN Y:=88 IF X=3 THEN Y:=99 Indéterminé si expr. Booléenne sur les variables d’entrées 24/02/2019 H. Wertz -- Exécution Symbolique
6
Exemple de cas impossible
Y:= X=3 X=3 impossible … Y:=99 … non oui non oui Exécution symbolique fonctionne sur toutes les entrées possibles (satisfaisant les assertions d’entrée) 24/02/2019 H. Wertz -- Exécution Symbolique
7
Conditions de chemin (path-condition)
La path-condition (PC) donne à tout instant de l’exécution symbolique l’ensemble des valeurs symboliques en vigueur. Exemple : exécution symbolique de IF <bool> THEN <expression1> ELSE <expression2> eval de <bool> donne B (symbolique) si PC B alors <expression1> est toujours exécuté si PC B alors <expression2> est toujours exécuté si ni B ni B alors continuer en assumer B et PC:=PCold&B exécuter <expression1> assumer B et PC:=PCold& B exécuter <expression2> 24/02/2019 H. Wertz -- Exécution Symbolique
8
exécution symbolique des assertions
Exécution symbolique de ASSUME ASSUME(<bool>); 1 eval de <bool> donne B (symbolique) 2 PC:=PCold&B Exécution symbolique de PROVE PROVE(<bool>); 2 si PC B alors le programme est vérifié sinon le programme est vérifié 24/02/2019 H. Wertz -- Exécution Symbolique
9
Arbre d’exécution symbolique
1 ABSOLUTE: PROCEDURE(X); ASSUME(true); DECLARE X, Y INTEGER; IF X < 0 THEN Y := -X ELSE Y := X PROVE((Y = X | Y = -X) & Y 0 & X = X); RETURN(Y); 9 END; Arbre fini 24/02/2019 H. Wertz -- Exécution Symbolique
10
Un 2ème programme exemple (moins simple)
1 GCD: PROCEDURE (M, N) ASSUME (M > 0 & N > 0); DECLARE M,N,A,B INTEGER; A:=M; B:=N; DO WHILE (A = B); IF A > B THEN A:=A-B; ELSE B:=B-A; END PROVE (A=(M,N)); RETURN(A); 14 END Exécution symbolique de DO WHILE similaire à IF (éventuellement arbre infini) (a,b) = pgcd de a et b Axiomes pour PGCD : (a,a) = a si a > 0 (a,b)=(b,a) (a,b)=(a-b,b) 24/02/2019 H. Wertz -- Exécution Symbolique
11
Arbre d’exécution pour GCD
1 GCD: PROCEDURE (M, N) ASSUME (M > 0 & N > 0); DECLARE M,N,A,B INTEGER; A:=M; B:=N; DO WHILE (A = B); IF A > B THEN A:=A-B; ELSE B:=B-A; END PROVE (A=(M,N)); RETURN(A); 14 END Arbre infini Branche non étiqueté : pc: m>0 & n>0 & m<n & m!=n-m 24/02/2019 H. Wertz -- Exécution Symbolique
12
Comment éviter les arbres infinis
chaque traversée d’une itération peut être marquée par une coupure au moins à un endroit de l’itération : commencer par une coupure et arrêter au RETURN ou à la coupure suivante Associé à chaque coupure un ASSUME et à sa fin un PROVE on peut démontrer les coupures Preuve du programme devient somme des preuves des coupures 24/02/2019 H. Wertz -- Exécution Symbolique
13
H. Wertz -- Exécution Symbolique
ASSERT ASSERT (<bool>); au premier rencontre, ASSERT joue le rôle d’un PROVE c’est alors une assertion de sortie pour l’exécution symbolique arrivant à la coupure. C’est également une assertion d’entrée, un ASSUME, pour l’exécution symbolique commençant à la coupure. Sinon c’est la dernière instruction d’une coupure, c’est alors une assertion de sortie, un PROVE, qui devient une assertion d’entrée, un ASSUME, pour l’exécution symbolique suivant la coupure 24/02/2019 H. Wertz -- Exécution Symbolique
14
H. Wertz -- Exécution Symbolique
ASSERT (suite) ASSERT Assertion inductive ou prédicat inductive correspond à l’hypothèse dans les preuves par induction 24/02/2019 H. Wertz -- Exécution Symbolique
15
H. Wertz -- Exécution Symbolique
Retour vers GCD 1 GCD: PROCEDURE (M, N) ASSUME (M > 0 & N > 0); coupure2 DECLARE M,N,A,B INTEGER; A:=M; B:=N; DO WHILE (A = B); ASSERT ((A,B)=(M,N) & A B); coupure7 IF A > B THEN A:=A-B; ELSE B:=B-A; END PROVE (A=(M,N)); RETURN(A); return 14 END 24/02/2019 H. Wertz -- Exécution Symbolique
16
et l’arbre arrivant à la coupure7
24/02/2019 H. Wertz -- Exécution Symbolique
17
Ensuite l’arbre à partir de la coupure7
24/02/2019 H. Wertz -- Exécution Symbolique
18
deuxième version de GCD
1 GCD2: PROCEDURE (M, N); ASSUME (M>0 & N>0); coupure2 DECLARE M, N, A, B, D INTEGER; A := M; B := N; DO WHILE (A B); ASSERT ((A, B) = (M, N) & A B); coupure7 D := ABSOLUTE(A-B); if A > B THEN A := D; ELSE B := D; END; PROVE (A = (M, N)); RETURN (A); return 15 END; 24/02/2019 H. Wertz -- Exécution Symbolique
19
H. Wertz -- Exécution Symbolique
première partie ( et retur ) ne change pas L’exécution de et return doit refaire l’exécution de ABSOLUTE chaque fois return return 24/02/2019 H. Wertz -- Exécution Symbolique
20
H. Wertz -- Exécution Symbolique
Arbre de GCD2 24/02/2019 H. Wertz -- Exécution Symbolique
21
H. Wertz -- Exécution Symbolique
Sous-procédures On invente des symboles pour chaque variable de la procédure appelante qui risque de changer de valeur par l’appel Au lieu d’exécuter symboliquement le corps de la sous-procédure, les valeurs des variables potentiellement changées sont remplacées par les nouvelles symboles Si la sous-procédure a été démontrée correcte, son assertion de sortie est valide pour ces nouvelles valeurs et donne les informations nécessaires sur ces valeurs pour démontrer le programme Assertions ne décrivent pas tout, mais seulement des aspects. Tout programme est correct par rapport à l’assertion de sortie T. L’information ne dit pas COMMENT mais QUOI : ((Y= | Y =-X) & Y>=0 & X=X ne dit rien sur le COMMENT 24/02/2019 H. Wertz -- Exécution Symbolique
22
Utiliser les preuves comme des lemmes
On crée des sous-procédures abrégées en : Changeant le ASSUME initial en PROVE (sans changer les arguments) Changeant le PROVE final en un ASSUME (sans changer les arguments) Remplaçant le corps de la sous-procédure par une séquence d’affectations (de nouveaux symboles), une pour chaque variable qui peut être altérée par la procédure 24/02/2019 H. Wertz -- Exécution Symbolique
23
H. Wertz -- Exécution Symbolique
ABSOLUTE abrégée 1 ABSOLUTE: PROCEDURE (X); PROVE (T) DECLARE X, Y INTEGER; X := newsymbol(); Y := newsymbol(); ASSUME ((Y=X | Y=-X) & Y0 & X=X); RETURN (Y) 8 END; 24/02/2019 H. Wertz -- Exécution Symbolique
24
H. Wertz -- Exécution Symbolique
Nouvel arbre de GCD2 24/02/2019 H. Wertz -- Exécution Symbolique
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.