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, 8.3.76 24/02/2019 H. Wertz -- Exécution Symbolique
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
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
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
é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
Exemple de cas impossible Y:=88 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
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
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
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
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
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
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
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
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
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
et l’arbre arrivant à la coupure7 24/02/2019 H. Wertz -- Exécution Symbolique
Ensuite l’arbre à partir de la coupure7 24/02/2019 H. Wertz -- Exécution Symbolique
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
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
H. Wertz -- Exécution Symbolique Arbre de GCD2 24/02/2019 H. Wertz -- Exécution Symbolique
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
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
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
H. Wertz -- Exécution Symbolique Nouvel arbre de GCD2 24/02/2019 H. Wertz -- Exécution Symbolique