Sémantique des langages - Programmation raisonnée
Transcription
Sémantique des langages - Programmation raisonnée
Sémantique des langages Programmation raisonnée ENSIIE S5 : Sémantique des langages, Programmation raisonnée 1 Motivations Pourquoi de la sémantique ? On cherche à accroître la confiance en la sûreté d’un programme en raisonnant dessus I il faut donc être capable de dire ce que le programme fait Sans sémantique, seulement intuition, bonne impression : Sémantique des langages, Programmation raisonnée 2 Motivations Que fait ce programme ? En C : while (*a++ = *b++); : Sémantique des langages, Programmation raisonnée 3 Motivations Que fait ce programme ? En C : while (*a++ = *b++); I copie de chaînes de caractère, sous certaines conditions : Sémantique des langages, Programmation raisonnée 4 Motivations L’intuition est importante I I I I Essentielle pour écrire de bons programmes Suffisante pour comprendre la plupart des codes Pas toujours suffisante pour s’assurer de leur correction Il s’agit d’aller au delà de l’intuition : Sémantique des langages, Programmation raisonnée 5 Motivations L’intuition n’est pas suffisante I I I Quand on transforme des programmes (compilateurs, outils de refactoring, . . .) Pour des applications critiques (transports, nucléaire, . . .) Dès qu’on veut pouvoir raisonner (formellement) sur les programmes : Sémantique des langages, Programmation raisonnée 6 Motivations Comment définir la sémantique d’un programme ? En le faisant tourner ? I Un compilateur permet de définir une sémantique pour le langage : Un programme de ce langage fait ce que fait l’exécutable obtenu par compilation Problèmes : I Comment définir la sémantique de l’exécutable ? I Difficile de faire des raisonnements formels dessus (trop de détails) I Plusieurs (version de) compilateurs → plusieurs sémantiques : Sémantique des langages, Programmation raisonnée 7 Motivations Sémantique Besoin de décrire une sémantique abstraite du langage, indépendamment du compilateur I Peu de langages ont une telle sémantique I Le plus souvent informelle (anglais) I Ne couvre qu’une partie du langage : Sémantique des langages, Programmation raisonnée 8 Motivations Sémantique : Quoi ? “Sémantique : Étude du sens des unités linguistiques et de leur composition.” [Petit Larousse, 1994] Associer une “signification” à un programme. Sémantique d’un langage : définition précise, non ambiguë et indépendante de l’implantation, de la “signification” des constructions de ce langage I quelle valeur nous décidons de donner à une expression ? I quel effet nous décidons d’attribuer à une instruction ? Sémantique formelle d’un langage : exprimée dans un formalisme mathématique : Sémantique des langages, Programmation raisonnée 9 Motivations Sémantique formelle Premier langage réel avec une sémantique formelle : Standard ML (SML) The Definition of Standard ML, Robin Milner, Mads Tofte, Robert Harper, MIT Press 1990 : Sémantique des langages, Programmation raisonnée 10 Motivations Sémantique : Pourquoi (1) ? Garantir certaines propriétés vérifiées par les programmes ... augmenter la confiance que l’on peut avoir dans les programmes. I spécification d’un compilateur pour un langage donné • définition d’un standard • portabilité des programmes I raisonnement sur les propriétés attendues du langage – comme par exemple le déterminisme de l’exécution des instructions : Sémantique des langages, Programmation raisonnée 11 Motivations Sémantique : Pourquoi (2) ? I raisonnement sur les propriétés des programmes • Equivalence de programmes ... utile pour transformer un programme en un programme équivalent mais plus efficace • Terminaison de programmes • Non-modification par un programme des valeurs contenues à des adresses sensibles de la mémoire • ... I génération d’outils • interpréteur • prouveurs spécialisés • ... : Sémantique des langages, Programmation raisonnée 12 Motivations Sémantique : Comment ? (1) Sémantique dynamique : description du comportement (i.e., l’exécution) de tous les programmes, y compris ceux dont l’exécution provoque une “erreur”. I sémantique dénotationnelle (vision fonctionnelle) programme = fonction Associer un ensemble à chaque famille de données et une fonction sur l’ensemble dénotant son paramètre à chaque procédure. On s’intéresse à l’effet d’un programme et non à la manière avec laquelle il a été exécuté. peu développé ici I sémantique axiomatique (vision déclarative) programme = “transformateur” de propriétés (sur les états) Logique de Hoare : Sémantique des langages, Programmation raisonnée 13 Motivations Sémantique : Comment ? (2) I sémantique opérationnelle (vision impérative) programme = “transformateur” d’états de la mémoire Définition d’une relation de transition entre états décrivant les changements produits par l’exécution d’une instruction. Abstraction : on ignore les détails sur l’utilisation de registres, l’adressage des variables ... indépendance vis à vis de l’architecture des machines. • • • • Expressions arithmétiques et booléennes Constructions impératives Expressions fonctionnelles ... Sémantique statique : le typage par exemple ... sans avoir recours à l’exécution ... voir aussi module d’analyse statique : Sémantique des langages, Programmation raisonnée 14 Rappels Outline Motivations Rappels • Systèmes d’inférence Expressions arithmétiques Expressions booléennes IMP MiniML : Sémantique des langages, Programmation raisonnée 15 Rappels Systèmes d’inférence Rappels : Systèmes d’inférence Permet la définition d’ensembles, de relations, ... J : ensemble de jugements Φ[J ] : système d’inférence = ensemble de règles portant sur des jugements de J : j1 j2 · · · jn (R) j {j1 , · · · , jn } : prémisses qui doivent être “satisfaites” pour que la conclusion j le soit. axiome (n = 0) : (R) j Le jugement j est toujours satisfait. Exemples : règles de la déduction naturelle, règles de typage du λ-calcul : Sémantique des langages, Programmation raisonnée 16 Rappels Systèmes d’inférence Arbres d’inférence (de preuve, de dérivation) Un arbre d’inférence d’un jugement j ∈ J pour un système d’inférence Φ[J ] est un arbre fini dont la racine est j et tel que pour chaque noeud jk dont les fils sont jk1 , jk2 , ... , jkn , il existe une règle de Φ[J ] : (r) j k1 : Sémantique des langages, Programmation raisonnée ··· j k2 jkn jk 17 Rappels Systèmes d’inférence Théorèmes Φ[J ] caractérise un ensemble de théorèmes Th(Φ[J ]) ⊆ J contenant les jugements qui admettent un arbre d’inférence. j ∈ J est un théorème s’il existe dans Φ[J ] une règle : (R) j ou (R) j1 ··· j2 jn j telle que chaque ji (1 ≤ i ≤ n) soit un théorème. : Sémantique des langages, Programmation raisonnée 18 Rappels Systèmes d’inférence Systèmes d’inférence et Définitions inductives Etant donné un système d’inférence Φ[J ], un ensemble A ⊆ J est dit Φ[J ]-clos si pour toute règle : (R) ··· j j1 jn ∈ Φ[J ] {j1 , · · · , jn } ⊆ A ⇒ j ∈ A. L’ensemble défini inductivement par Φ[J ] est l’intersection de tous les ensembles Φ[J ]-clos : Ind(Φ[J ]) = \ {A ⊆ J | A est Φ[J ]-clos} Théorème : Ind(Φ[J ]) = Th(Φ[J ]) Preuve : exercice ... : Sémantique des langages, Programmation raisonnée 19 Rappels Systèmes d’inférence Syntaxe abstraite Chaîne de caractères analyse lexicale −→ analyse syntaxique Arbre de syntaxe abstraite (AST) := a a := 3 / 2 + 4 * 5; + −→ / 3 syntaxe concrète : Sémantique des langages, Programmation raisonnée * 2 4 5 syntaxe abstraite 20 Expressions arithmétiques Outline Motivations Rappels Expressions arithmétiques • • • • Définition inductive Sémantique dénotationnelle Sémantique opérationnelle à grands pas Sémantique opérationnelle à petits pas Expressions booléennes IMP : Sémantique des langages, Programmation raisonnée 21 Expressions arithmétiques Définition inductive Définition inductive des expressions arithmétiques Définition inductive de l’ensemble EA par un système d’inférence Jugements : (Z ∪ V ∪ {+, −, ×, /})? (n ∈ Z) (A2 ) (x ∈ V ) n x a1 a2 a a2 a1 a2 (A4 ) (A5 ) 1 (A3 ) a1 + a2 a1 − a2 a1 × a2 (A1 ) (A6 ) a1 a2 a1 /a2 La règle A1 peut s’appliquer pour tout n ∈ Z : elle dénote en fait un ensemble de règles : Inst(A1 ) = · · · , (A1 ) −2 , (A1 ) −1 , (A1 ) 0 , (A1 ) 1 , (A1 ) 2 , ··· n est une méta-variable, A1 est une méta-règle dont les instances sont les règles contenues dans l’ensemble Inst(A1 ) qui sont obtenues en remplaçant les méta-variables par des éléments de Z. : Sémantique des langages, Programmation raisonnée 22 Expressions arithmétiques Définition inductive Syntaxe abstraite – Implantation 37 + v ∈ EA ? (A1 ) (A3 ) (A2 ) 37 v 37 + v Arbre d’inférence = arbre de syntaxe abstraite Expressions arithmétiques en Ocaml : type ’a exp_arith = | Ent of int | Var of ’a | Plus of ’a exp_arith * ’a exp_arith | Moins of ’a exp_arith * ’a exp_arith | Fois of ’a exp_arith * ’a exp_arith | Div of ’a exp_arith * ’a exp_arith : Sémantique des langages, Programmation raisonnée 23 Expressions arithmétiques Définition inductive Induction Prouver par induction une propriété P sur tous les éléments de l’ensemble Ind(Φ[J ]), c’est prouver que pour toute règle de Φ[J ], si chacune des prémisses satisfait P (hypothèse d’induction), alors la conclusion satisfait aussi P. Théorème Si ∀ j1 ···j jn ∈ Φ[J ] (∀k ∈ {j1 , · · · , jn } P(k)) implique P(j) alors ∀x ∈ Ind(Φ[J ]) P(x). Preuve : exercice ... n Exemple Définition inductive de N : (N1 ) , (N2 ) 0 n+1 Induction sur N : Si P(0) et si pour tout n ∈ N, P(n) ⇒ P(n + 1), alors ∀n ∈ N P(n). : Sémantique des langages, Programmation raisonnée 24 Expressions arithmétiques Définition inductive Induction sur les expressions arithmétiques si et et et et et alors ∀n ∈ Z P(n) ∀x ∈ V P(x) ∀a1 , a2 ∈ EA (P(a1 ) ∀a1 , a2 ∈ EA (P(a1 ) ∀a1 , a2 ∈ EA (P(a1 ) ∀a1 , a2 ∈ EA (P(a1 ) ∀a ∈ EA P(a) : Sémantique des langages, Programmation raisonnée et et et et P(a2 )) ⇒ P(a1 + a2 ) P(a2 )) ⇒ P(a1 − a2 ) P(a2 )) ⇒ P(a1 × a2 ) P(a2 )) ⇒ P(a1 /a2 ) 25 Expressions arithmétiques Sémantique dénotationnelle Sémantique dénotationnelle On associe à chaque mot du langage une dénotation (' interprétation) qui abstrait son comportement Exemples I ensembles pour les données I fonctions transformant des états pour les procédures I etc. Ici on cherche à interpréter des expressions arithmétiques I candidat naturel : entiers relatifs : Sémantique des langages, Programmation raisonnée 26 Expressions arithmétiques Sémantique dénotationnelle Interprétation des expressions arithmétiques I Pour interpréter les expressions arithmétiques : • on associe une “signification” à chacun des symboles pouvant apparaître dans une expression • puis à chacune des constructions possibles. I Interpréter une expression arithmétique, c’est lui donner une valeur appartenant à un certain ensemble : V = Z ∪ {Err} Err dénote une erreur lors de l’interprétation ... lors d’une division par 0, par exemple. En Ocaml : Err est une exception : Sémantique des langages, Programmation raisonnée 27 Expressions arithmétiques Sémantique dénotationnelle Interprétation des symboles • Interprétation des variables par une valuation : V[Z] = {V → Z} (mémoire, environnement, ...) • Interpréter des symboles de Z ∪ {+, −, ×, /} : n est interprété par lui-même : [[n]] = n [[+]] v1 [[−]] v2 [[×]] v2 ∈ Z Err v1 ∈ Z + v1 − v2 × Err Err Err Err : Sémantique des langages, Programmation raisonnée v1 [[/]]v2 v2 ∈ Z\{0} 0 Err v1 ∈ Z v1 /v2 Err Err Err Err Err Err 28 Expressions arithmétiques Sémantique dénotationnelle Schéma d’interprétation des expressions arithmétiques A[[_]]_ : EA → V[Z] → Z ∪ {Err} n σ(x) A[[e ]] [[+]]A[[e ]] 1 σ 2 σ A[[e]]σ = A[[e1 ]]σ [[−]]A[[e2 ]]σ A[[e1 ]]σ [[×]]A[[e2 ]]σ A[[e1 ]]σ [[/]] A[[e2 ]]σ si si si si si si e e e e e e =n =x = e1 + e2 = e1 − e2 = e1 × e2 = e1 /e2 Ce schéma correspond exactement à celui de l’interprétation d’un ensemble de termes. : Sémantique des langages, Programmation raisonnée 29 Expressions arithmétiques Sémantique dénotationnelle Evaluation des expressions arithmétiques : Implantation en Ocaml exception Err let rec eval_arith s e = match e with Ent n -> n | Var x -> (s x) | Plus(e1,e2) -> (eval_arith s e1) + (eval_arith s e2) | Moins(e1,e2) -> (eval_arith s e1) -(eval_arith s e2) | Fois(e1,e2) -> (eval_arith s e1) * (eval_arith s e2) | Div(e1,e2) -> let n1 = (eval_arith s e1) in let n2 = (eval_arith s e2) in if n2=0 then raise Err else n1/n2 eval_arith : (’a -> int) -> ’a exp_arith -> int : Sémantique des langages, Programmation raisonnée 30 Expressions arithmétiques Sémantique opérationnelle à grands pas Sémantique opérationnelle d’évaluation à grands pas Décrire le processus d’évaluation à l’aide de systèmes d’inférence dont les règles portent sur des jugements exprimant qu’une valeur v ∈ Z est le résultat de l’évaluation d’une expression a ∈ EA étant donnée une valuation σ ∈ V[Z] : ha, σi v Caractériser un sous-ensemble des jugements de la forme ha, σi v qui sont “corrects d’un point de vue sémantique” : il s’agit de l’ensemble des théorèmes d’un système d’inférence. Exemples h3 + 2, σi 5 est un théorème h3 + 2, σi 1 n’est pas un théorème, il s’agit d’un jugement “syntaxiquement” correct mais “sémantiquement” erroné : Sémantique des langages, Programmation raisonnée 31 Expressions arithmétiques Sémantique opérationnelle à grands pas Règles d’évaluation à grands pas (n ∈ Z) (A2 ) (x ∈ V ) (A1 ) hn, σi (A3 ) ha1 , σi n1 ha2 , σi n2 ha1 + a2 , σi n1 [[+]]n2 (A4 ) ha1 , σi n1 ha2 , σi n2 ha1 × a2 , σi n1 [[×]]n2 (A5 ) ha1 , σi n1 ha2 , σi n2 ha1 − a2 , σi n1 [[−]]n2 (A6 ) ha1 , σi n1 ha2 , σi n2 ha1 /a2 , σi n1 [[/]]n2 n : Sémantique des langages, Programmation raisonnée hx, σi σ(x) 32 Expressions arithmétiques Sémantique opérationnelle à grands pas Évaluation : exemple σ : valuation telle que σ(x) = 2 h(2 × 3) + x, σi 8? (A1 ) (A4 ) (A3 ) (A1 ) h2, σi 2 h3, σi h2 × 3, σi 6 h(2 × 3) + x, σi : Sémantique des langages, Programmation raisonnée 3 (A2 ) hx, σi 2 8 33 Expressions arithmétiques Sémantique opérationnelle à grands pas Déterminisme de l’évaluation des expressions arithmétiques (1) Dans la suite on pose VA = Z ∪ {Err}. Proposition : ∀a ∈ EA ∀σ ∈ V[Z] ∀v1 , v2 ∈ VA (ha, σi v1 et ha, σi v2 ) ⇒ v1 = v2 Preuve : Par induction sur a. : Sémantique des langages, Programmation raisonnée 34 Expressions arithmétiques Sémantique opérationnelle à grands pas Déterminisme de l’évaluation des expressions arithmétiques (2) Si a = z ∈ Z, alors seule la règle A1 a pu être appliquée et on a donc v1 = z et v2 = z ce qui permet d’obtenir v1 = v2 . : Sémantique des langages, Programmation raisonnée 35 Expressions arithmétiques Sémantique opérationnelle à grands pas Déterminisme de l’évaluation des expressions arithmétiques (3) Si a = x ∈ V , alors seule la règle A2 a pu être appliquée et on a donc v1 = σ(x) et v2 = σ(x) ce qui permet d’obtenir v1 = v2 . : Sémantique des langages, Programmation raisonnée 36 Expressions arithmétiques Sémantique opérationnelle à grands pas Déterminisme de l’évaluation des expressions arithmétiques (4) Si a = a1 + a2 , alors, par hypothèse d’induction, on a : ∀σ ∈ V[Z] ∀v1 , v2 ∈ VA(ha1 , σi ∀σ ∈ V[Z] ∀v1 , v2 ∈ VA(ha2 , σi v1 et ha1 , σi v1 et ha2 , σi v2 ) ⇒ v1 = v2 v2 ) ⇒ v1 = v2 Puisque, par hypothèse, ha1 + a2 , σi v1 , c’est que par la règle du +, il existe n1 et n2 tels que ha1 , σi n1 , ha2 , σi n2 et v1 = n1 [[+]]n2 Par hypothèse d’induction, on a n1 = n10 et n2 = n20 ce qui permet d’obtenir v1 = v2 . : Sémantique des langages, Programmation raisonnée 37 Expressions arithmétiques Sémantique opérationnelle à grands pas Déterminisme de l’évaluation des expressions arithmétiques (7) Raisonnement similaire pour a = a1 − a2 , a = a1 × a2 et a = a1 /a2 Cas de la division : à faire Exercice : ajouter les expressions conditionnelles au langage des expressions arithmétiques. Spécifier les règles nécessaires et faire la preuve que le langage reste déterministe. : Sémantique des langages, Programmation raisonnée 38 Expressions arithmétiques Sémantique opérationnelle à grands pas Équivalence des sémantiques opérationnelle et dénotationnelle Théorème : ∀σ ∈ V[Z] ∀e ∈ EA ∀v ∈ VA he, σi : Sémantique des langages, Programmation raisonnée v ⇔ A[[e]]σ = v 39 Expressions arithmétiques Sémantique opérationnelle à grands pas Évaluation des expressions arithmétiques : variables Le résultat de l’évaluation d’une expression arithmétique a, étant donnée une valuation σ, ne dépend que de la valeur associée par σ aux variables dans ϑ(a). ∅ {x} si a = n si a = x ϑ(a) = ϑ(a ) ∪ ϑ(a ) si a = a1 + a2 ou a = a1 − a2 1 2 ou a = a1 × a2 ou a = a1 /a2 Proposition : ∀a ∈ EA , ∀σ1 , σ2 ∈ V[Z], σ1 =ϑ(a) σ2 ⇒ (∀v ∈ VA ha, σ1 i v ⇔ ha, σ2 i v) où ∀σ1 , σ2 ∈ V[Z] σ1 =X σ2 ssi ∀x ∈ X , σ1 (x) = σ2 (x) Exercice Montrer que si X1 ⊆ X2 et σ1 =X2 σ2 , alors σ1 =X1 σ2 . : Sémantique des langages, Programmation raisonnée 40 Expressions arithmétiques Sémantique opérationnelle à grands pas Évaluation des expressions arithmétiques : variables Preuve : par induction sur a Si a = n ∈ Z, alors ϑ(a) = ∅ et seule la règle A1 a pu être utilisée pour établir ha, σ1 i v avec n = v et en utilisant cette même règle, il vient ha, σ2 i v. Si a = x ∈ V , alors ϑ(a) = {x}, et seule la règle A2 a pu être utilisée pour établir ha, σ1 i σ1 (x). Par hypothèse, σ1 =ϑ(a) σ2 , et donc σ1 (x) = σ2 (x) = n et il suffit d’appliquer la règle A2 pour établir ha, σ2 i n. : Sémantique des langages, Programmation raisonnée 41 Expressions arithmétiques Sémantique opérationnelle à grands pas Évaluation des expressions arithmétiques : variables Si a = a1 + a2 , alors si ha, σ1 i À partir de la règle A3 : v a été obtenu : .. .. . . (Aj ) (Ai ) ha1 , σ1 i n1 ha2 , σ1 i (A3 ) ha1 + a2 , σ1 i v n2 avec v = n1 [[+]]n2 . Par hypothèse d’induction, puisque ϑ(a1 ) ⊆ ϑ(a) et ϑ(a2 ) ⊆ ϑ(a) (et donc σ1 =ϑ(a1 ) σ2 et σ1 =ϑ(a2 ) σ2 ), on a ha1 , σ2 i n1 et ha2 , σ2 i n2 , et donc en appliquant la règle A5 , on a ha1 + a2 , σ2 i v. Si a = a1 − a2 , a = a1 × a2 ou a = a1 /a2 alors le raisonnement est similaire au cas précédent : Sémantique des langages, Programmation raisonnée 42 Expressions arithmétiques Sémantique opérationnelle à grands pas Expressions arithmétiques équivalentes (1) Caractériser les expressions arithmétiques qui s’évaluent à la même valeur. a1 ∼ a2 ⇔ (∀v ∈ VA ∀σ ∈ V[Z] ha1 , σi v ⇔ ha2 , σi v) Proposition : ∼ est une congruence. Une congruence est une relation d’équivalence compatible avec la structure des expressions : si a ∼ b alors pour tout c on a a + c ∼ b + c, c + a ∼ c + b, a − c ∼ b − c, ... : Sémantique des langages, Programmation raisonnée 43 Expressions arithmétiques Sémantique opérationnelle à grands pas Expressions arithmétiques équivalentes (2) Exemple x + x ∼ 2 × x Si hx + x, σi n, alors on a : (A2 ) (A3 ) (A2 ) hx, σi σ(x) hx, σi σ(x) hx + x, σi σ(x)[[+]]σ(x) où σ(x) + σ(x) = n. D’autre part, on peut construire l’arbre : (A1 ) (A4 ) h2, σi 2 h2 × x, σi (A2 ) hx, σi σ(x) 2[[×]]σ (x) Puisque 2[[×]]σ(x) = σ(x)[[+]]σ(x) = n, on a bien h2 × x, σi De même, on montre que si h2 × x, σi n, alors hx + x, σi : Sémantique des langages, Programmation raisonnée n. n. 44 Expressions arithmétiques Sémantique opérationnelle à grands pas Expressions arithmétiques équivalentes (3) On peut donc remplacer dans toute expression l’expression x + x par 2 × x Puisque ∼ est une congruence, on a (x + x) + (x + x) ∼ (2 × x) + (2 × x). : Sémantique des langages, Programmation raisonnée 45 Expressions arithmétiques Sémantique opérationnelle à grands pas Dans la suite on allège la sémantique en ne donnant que les règles d’inférence qui conduisent à des valeurs entières. L’interprétation du symbole + devient alors l’addition entière. On notera dorénavant [[+]] par +. C’est donc le contexte qui permet de dire si on parle du symbole + ou de son interprétation. (Si il y a ambiguité, on précisera.) Les règles en sémantique à grands pas sont alors les suivantes : (n ∈ Z) (A2 ) (x ∈ V ) (A1 ) hn, σi (A3 ) ha1 , σi n1 ha2 , σi n2 ha1 + a2 , σi n1 + n2 (A4 ) ha1 , σi n1 ha2 , σi n2 ha1 × a2 , σi n1 × n2 (A5 ) ha1 , σi n1 ha2 , σi n2 ha1 − a2 , σi n1 − n2 (A6 ) ha1 , σi n1 ha2 , σi n2 (n2 6= 0) ha1 /a2 , σi n1 /n2 n : Sémantique des langages, Programmation raisonnée hx, σi σ(x) 46 Expressions arithmétiques Sémantique opérationnelle à petits pas Grands pas vs petits pas Sémantique opérationnelle à grands pas : I on a accès uniquement à la valeur finale, pas la manière dont elle est calculée • ordre d’évaluation ? • états intermédiaires ? • calculs en parallèle, terminaison ? Besoin d’une sémantique à grain plus fin (moins abstraite) I sémantique opérationnelle à petits pas : Sémantique des langages, Programmation raisonnée 47 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas (1) On dit aussi sémantique de réduction. Rendre compte des étapes qui ont conduit au résultat d’un calcul de manière “plus fine” que la sémantique à grands pas. Relation ,→ de transition entre configurations he, σi : he, σi ,→ he 0 , σi est un jugement exprimant le fait que l’évaluation d’une expression e à partir d’une valuation σ conduit à évaluer une expression e 0 “plus simple” à partir de la même valuation. Exemples h3 + (2 × 8), σi,→ h3 + 16, σi h2/x, σi,→ h2/0, σi si σ(x) = 0 Configuration : paire he, σi où e ∈ EA et σ ∈ V[Z] Configuration terminale : hv, σi où v ∈ Z : Sémantique des langages, Programmation raisonnée 48 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas (2) Séquence de calcul : he0 , σi ,→ he1 , σi ,→ he2 , σi ,→ · · · telle que ∀i ≥ 0, hei , σi ,→ hei+1 , σi admette un arbre d’inférence à partir des règles définissant ,→. ? he, σi ,→ he 0 , σi ssi il existe une séquence de calcul de longueur finie he0 , σi ,→ he1 , σi ,→ he2 , σi ,→ · · · ,→ hek , σi avec e = e0 et e 0 = ek . k he, σi ,→ he 0 , σi ssi il existe une séquence de calcul de longueur k he0 , σi ,→ he1 , σi ,→ he2 , σi ,→ · · · ,→ hek , σi avec e = e0 et e 0 = ek . ? De plus, si ek = v ∈ Z (configuration terminale), alors he, σi ,→ v. e s’évalue en la valeur v (∈ Z) si et seulement il existe une ? séquence finie he, σi ,→ hv, σi : Sémantique des langages, Programmation raisonnée 49 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas (3) Deux sortes de règles : • règles de réduction élémentaires (AS1 ) hx, σi ,→ hσ(x), σi (si x ∈ V ) (AS4 ) hn1 op2 n2 , σi ,→ hn, σi (AS5 ) hn1 /n2 , σi ,→ hn, σi : Sémantique des langages, Programmation raisonnée si n1 , n2 ∈ Z et op2 ∈ {+, −, ×} et n = n1 [[op2 ]]n2 ! (si n1 ∈ Z et n2 ∈ Z\{0} et n = n1 /n2 ) 50 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas (4) • Etapes de simplification (passage au contexte, propagation) Choisissons un mode d’évaluation “de gauche à droite” (AS7 ) he1 , σi ,→ he10 , σi (si op2 ∈ {+, −, ×, /}) he1 op2 e2 , σi ,→ he10 op2 e2 , σi he2 , σi ,→ he20 , σi (AS8 ) hn1 op2 e2 , σi ,→ hn1 op2 e20 , σi : Sémantique des langages, Programmation raisonnée si n1 ∈ Z et op2 ∈ {+, −, ×, /} ! 51 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas : Exemple 1 σ : valuation telle que σ(x) = 1, σ(y) = 3 et σ(z) = 2 Séquence de calcul qui permet de décrire l’évaluation de l’expression ,→ ,→ ,→ ,→ ,→ ,→ ,→ ,→ h(z + (x − y)) × (x + 7), σi h(2 + (x − y)) × (x + 7), σi h(2 + (1 − y)) × (x + 7), σi h(2 + (1 − 3)) × (x + 7), σi h(2 + −2) × (x + 7), σi h0 × (x + 7), σi h0 × (1 + 7), σi h0 × 8, σi h0, σi : Sémantique des langages, Programmation raisonnée 52 Expressions arithmétiques Sémantique opérationnelle à petits pas Sémantique opérationnelle d’évaluation à petits pas : Exemple 2 σ : valuation telle que σ(x) = 1, σ(y) = 3 et σ(z) = 2 ,→ ,→ ,→ ,→ ,→ ,→ ,→ h(z + (x − y))/(x − 1), σi h(2 + (x − y))/(x − 1), σi h(2 + (1 − y))/(x − 1), σi h(2 + (1 − 3))/(x − 1), σi h(2 + −2)/(x − 1), σi h0/(x − 1), σi h0/(1 − 1), σi h0/0, σi Séquence bloquée : configuration terminale qui ne correspond pas à une valeur. : Sémantique des langages, Programmation raisonnée 53 Expressions arithmétiques Sémantique opérationnelle à petits pas ,→ est déterministe Proposition : ∀a ∈ EA ∀σ ∈ V[Z] ∀v1 , v2 ∈ VA (ha, σi ,→ ha1 , σ1 i et ha, σi ,→ ha2 , σ2 i) ⇒ (a1 = a2 et σ1 = σ2 ) Preuve : Par induction sur a et étude de cas : Sémantique des langages, Programmation raisonnée 54 Expressions arithmétiques Sémantique opérationnelle à petits pas Autre présentation : Contexte d’évaluation (1) Autre présentation plus synthétique (Wright Felleisen) Toutes les règles de simplification sont réduites à une seule : la règle de passage au contexte Contexte d’évaluation : expression dont une feuille unique est remplacée par un trou (métavariable, placeholder) Les contextes sont décrits par une grammaire, ils spécifient l’ordre d’évaluation : C ::= • | C op e | v op C avec op ∈ {×, /, +, −} , e une expression et v un entier (valeur) Exemples : (• + x) × 2 est un contexte d’évaluation valide (C1 ) • + • n’est pas un contexte (y × x) + • n’est pas un contexte : Sémantique des langages, Programmation raisonnée 55 Expressions arithmétiques Sémantique opérationnelle à petits pas Contexte d’évaluation (2) C [e] : expression obtenue en remplissant le trou avec e C1 [x + y] = ((x + y) + x) × 2 La sémantique à réduction est spécifiée par les règles de réduction élémentaires et la règle suivante : he1 , σi ,→ he2 , σi (contexte) hC [e1 ], σi ,→ hC [e2 ], σi : Sémantique des langages, Programmation raisonnée 56 Expressions arithmétiques Sémantique opérationnelle à petits pas Equivalence des sémantiques (1) ? Proposition ∀e ∈ EA ∀σ ∈ V[Z] ∀v ∈ V he, σi v ⇒ he, σi ,→ v Preuve Induction sur e. • si e = n ∈ Z, alors l’arbre de dérivation de he, σi v est : (A1 ) hn, σi n (n = v) ∗ On a alors clairement hn, σi ,→ n (configuration terminale). • si e = x ∈ V , alors l’arbre de dérivation de he, σi v est : (A2 ) hx, σi σ(x) (σ(x) = v) Dans ce cas, la règle AS1 permet de construire un arbre de ∗ dérivation pour hx, σi ,→ hσ(x), σi et on a donc hx, σi ,→ v. : Sémantique des langages, Programmation raisonnée 57 Expressions arithmétiques Sémantique opérationnelle à petits pas Equivalence des sémantiques (5) • si e = a1 op2 a2 avec op2 ∈ {+, −, ×} On a donc ha1 , σi n1 et ha2 , σi n2 (n1 , n2 ∈ Z) ∗ ∗ Par hypothèse d’induction on a ha1 , σi ,→ n1 et ha2 , σi ,→ n2 et il existe donc 2 séquences de calcul : ha1 , σi = ha10 , σi ,→ ha11 , σi ,→ ha12 , σi ,→ · · · ,→ ha1k1 , σi = hn1 , σi (1) ha2 , σi = ha20 , σi ,→ ha21 , σi ,→ ha22 , σi ,→ · · · ,→ ha2k2 , σi = hn2 , σi (2) La règle AS7 permet de transformer chaque ha1i , σi ,→ ha1i+1 , σi de (1) en ha1i op2 a2 , σi ,→ ha1i+1 op2 a2 , σi. On obtient alors : ha1 op2 a2 , σi = ha10 op2 a2 , σi ,→ ha11 op2 a2 , σi ,→ ha12 op2 a2 , σi ,→ · · · · · · ,→ ha1k1 op2 a2 , σi = hn1 op2 a2 , σi (3) : Sémantique des langages, Programmation raisonnée 58 Expressions arithmétiques Sémantique opérationnelle à petits pas Equivalence des sémantiques (6) La règle AS8 permet de transformer chaque ha2i , σi ,→ ha2i+1 , σi de (2) en hn1 op2 a2i , σi ,→ hn1 op2 a2i+1 , σi. On obtient alors : hn1 op2 a2 , σi = hn1 op2 a20 , σi ,→ hn1 op2 a21 , σi ,→ hn1 op2 a22 , σi ,→ · · · · · · ,→ hn1 op2 a2k2 , σi = hn1 op2 n2 , σi (4) Enfin, la règle AS4 permet d’obtenir la transition hn1 op2 n2 , σi ,→ hn, σi où n est la valeur de n1 op2 n2 , et en concaténant les séquences (3) et (4) avec cette transition on ∗ obtient finalement ha1 op2 a2 , σi ,→ n1 op2 n2 . • Si e = a1 /a2 , . . . : Sémantique des langages, Programmation raisonnée 59 Expressions arithmétiques Sémantique opérationnelle à petits pas Equivalence des sémantiques (7) Pour montrer ? ∀e ∈ EA ∀σ ∈ V[Z] ∀v ∈ V he, σi ,→ v ⇒ he, σi tout d’abord : v, on montre Lemme ∀e1 , e2 ∈ EA ∀σ ∈ V[Z] ∀v ∈ V, si he1 , σi ,→ he2 , σi et he2 , σi v, alors he1 , σi v. Preuve Induction sur l’étape de réduction : Sémantique des langages, Programmation raisonnée 60 Expressions arithmétiques Sémantique opérationnelle à petits pas Equivalence des sémantiques (8) ? Proposition ∀e ∈ EA ∀σ ∈ V[Z] ∀v ∈ Z he, σi ,→ v ⇒ he, σi Preuve ? Puisque he, σi ,→ v, il existe une séquence : v he, σi = he 0 , σi ,→ he 1 , σi ,→ · · · ,→ he k , σi avec e k = v ∈ Z. La preuve s’obtient par induction sur la longueur k de cette séquence. Si k = 0, alors e = v et la règle A1 permet de conclure. Si k = k0 + 1, alors on conclut en utilisant l’hypothèse de récurrence et le lemme précédent. : Sémantique des langages, Programmation raisonnée 61 Expressions booléennes Outline Motivations Rappels Expressions arithmétiques Expressions booléennes IMP MiniML : Sémantique des langages, Programmation raisonnée 62 Expressions booléennes Expressions booléennes On suit exactement la même démarche qu’avec les expressions arithmétiques ... Définition inductive de l’ensemble EB des expressions booléennes. Jugements : (Z ∪ V ∪ {+, −, ×, /} ∪ {true, false} ∪ {=, ≤} ∪ { or , and , not })? (B1 ) (t ∈ {true, false}) t (B2 ) b not b (B5 ) (B3 ) a1 ≤ a2 b1 b2 b1 or b2 (B6 ) (B4 ) a1 = a2 (a1 , a2 ∈ EA ) b1 b2 b1 and b2 Exemple not (x = 0 and x ≤ (7/z)) : Sémantique des langages, Programmation raisonnée 63 Expressions booléennes Interprétation des expressions booléennes Interpréter une expression booléenne c’est lui donner une valeur appartenant à B ∪ {Err} avec B = {true, false} ... à partir de l’interprétation des expressions arithmétiques, il reste a interpréter les symboles de {true, false} ∪ {=, ≤} ∪ { or , and , not }. t ∈ B est interprété par lui-même : [[true]] = true et [[false]] = false v1 [[=]] [[≤]] Err v1 ∈ Z v2 ∈ Z = v1 v2 ≤ Err Err Err Err v2 [[not ]]v : Sémantique des langages, Programmation raisonnée v1 v∈B ¬t [[and]] [[or]] Err v1 ∈ B v2 ∈ B ∧ v1 v2 ∨ Err Err Err v2 Err Err Err 64 Expressions booléennes Schéma d’interprétation des expressions booléennes B[[_]]_ : EB → V[Z] → B ∪ {Err} B[[e]]σ = t A[[e1 ]]σ [[≤]]A[[e2 ]]σ A[[e ]] [[=]]A[[e ]] 1 σ 2 σ B[[e1 ]]σ [[ and ]]B[[e2 ]]σ B[[e1 ]]σ [[ or ]]B[[e2 ]]σ 0 [[not ]]B[[e ]]σ : Sémantique des langages, Programmation raisonnée si si si si si si e e e e e e =t∈B = e1 ≤ e2 = (e1 = e2 ) = e1 and e2 = e1 or e2 = not e 0 65 Expressions booléennes Sémantique opérationnelle à grands pas (1) Système d’inférence définissant le jugement hb, σi v : une expression booléenne b ∈ EB s’évalue en une valeur v ∈ B étant donnée une valuation σ. t∈B (B14 ) hb, σi hnot b, σi t (¬t) (B1 ) ht, σi (B2 ) ha1 , σi n1 ha2 , σi n2 ha , σi n1 ha2 , σi n2 n1 , n2 ∈ (B3 ) 1 ha1 = a2 , σi (n1 = n2 ) ha1 ≤ a2 , σi (n1 ≤ n2 ) a1 , a2 ∈ (B8 ) hb1 , σi true hb2 , σi hb1 and b2 , σi v (B11 ) t hb1 , σi false hb2 , σi hb1 or b2 , σi v : Sémantique des langages, Programmation raisonnée v (B9 ) v hb1 , σi false hb1 and b2 , σi false (B12 ) hb1 , σi true hb1 or b2 , σi true 66 Expressions booléennes Choix des règles A-t-on B[[b]]σ = v ⇔ hb, σi Non v? B[[(2 = 2) or (2/0 ≤ x)]]σ = Err et h(2 = 2) or (2/0 ≤ x), σi true On a définit deux sémantiques différente pour le même langage : La sémantique opérationnelle a donné une sémantique paresseuse aux opérateurs and et or . On peut définir une sémantique dénotationnelle équivalente en changeant l’interprétation de and et or : true B[[and]] Err = true false B[[or]] Err = false : Sémantique des langages, Programmation raisonnée 67 Expressions booléennes Sémantique opérationnelle : Propriétés Expressions booléennes équivalentes ∀b1 , b2 ∈ EB b1 ∼ b2 ⇔ (∀v ∈ B ∀σ ∈ V[Z] hb1 , σi t ⇔ hb2 , σi t) Proposition ∼ est une congruence. Preuve. Exercice ... Proposition Unicité d’un résultat ∀b ∈ EB ∀σ ∈ V[Z], ∀v1 , v2 ∈ B (hb, σi v1 et hb, σi v2 ) ⇒ v1 = v2 Preuve. Exercice ... : Sémantique des langages, Programmation raisonnée 68 IMP Outline Motivations Rappels Expressions arithmétiques Expressions booléennes IMP • Définition • Sémantique opérationnelle à grands pas • Sémantique opérationnelle à petits pas : Sémantique des langages, Programmation raisonnée 69 IMP Définition Constructions impératives Syntaxe (abstraite) d’un “petit” langage impératif : c ::= skip | x := a | c1 ; c2 | if b then c1 else c2 | while b do c ... exprimée à l’aide d’un système d’inférence. EC est l’ensemble des programmes, et est défini inductivement par : x ∈ V , a ∈ E A , b ∈ EB (C1 ) (C3 ) skip (C2 ) c1 c2 c1 ; c2 x := a (C4 ) c1 c2 if b then c1 else c2 : Sémantique des langages, Programmation raisonnée (C5 ) c while b do c 70 IMP Définition Constructions impératives : Exemple (PGCD) while not (x = y) do if x ≤ y then y := y−x else x := x−y ∈ EC ? (C2 ) y := y − x x := x − y if x ≤ y then y := y − x else x := x − y (C5 ) while not (x = y) do if x ≤ y then y := y − x else x := x − y (C2 ) (C4 ) si x, y ∈ V , not (x = y), x ≤ y ∈ EB et y − x, x − y ∈ EA Arbre de syntaxe abstraite du programme à partir duquel on va donner sa sémantique. : Sémantique des langages, Programmation raisonnée 71 IMP Sémantique opérationnelle à grands pas Etats (de la mémoire) Construction de base d’un langage impératif : affectation d’une valeur à “une variable”. Pour donner une sémantique aux éléments de EC , il faut commencer par donner une “signification” à chacun des symboles de variable. On associe à x ∈ V une cellule mémoire xC , dans laquelle est encodée une valeur k. Une mémoire est donc décrite par un ensemble dont les éléments sont des adresses-mémoire. On notera plus simplement x la cellule xC . Un état de la mémoire est la description du contenu de chacune de ses cellules. Un état peut être représenté par une valuation ... vue comme une fonction partielle qui associe à tout x ∈ V la valeur k encodée dans la cellule désignée par x. : Sémantique des langages, Programmation raisonnée 72 IMP Sémantique opérationnelle à grands pas Changement d’état Le rôle d’un programme c est de modifier l’état courant σ1 de la mémoire en un état σ2 : hc, σ1 i → σ2 L’exécution de l’instruction c dans l’état σ1 conduit à l’état σ2 . Description de l’exécution d’une instruction par le changement d’état qu’elle provoque. Changement d’état ( σ[x ← n](y) = n si y = x σ(y) sinon Exemple hx := 0, σi → σ[x ← 0] : Sémantique des langages, Programmation raisonnée 73 IMP Sémantique opérationnelle à grands pas Sémantique opérationnelle à grands pas Caractériser un sous-ensemble de jugements de la forme hc, σ1 i → σ2 à l’aide d’un système d’inférence. (C2 ) ha, σi n hx := a, σi → σ[x ← n] (C1 ) hskip, σi → σ (C3 ) hc1 , σi → σ1 hc2 , σ1 i → σ2 hc1 ; c2 , σi → σ2 (C4 ) hb, σi true hc1 , σi → σ1 hif b then c1 else c2 , σi → σ1 (C6 ) hb, σi false hwhile b do c, σi → σ (C7 ) hb, σi (C5 ) n∈Z hb, σi false hc2 , σi → σ2 hif b then c1 else c2 , σi → σ2 true hc, σi → σ1 hwhile b do c, σ1 i → σ2 hwhile b do c, σi → σ2 : Sémantique des langages, Programmation raisonnée 74 IMP Sémantique opérationnelle à grands pas Sémantique opérationnelle à grands pas : Exemple (A1 ) (C2 ) (C3 ) D1 D2 D3 h0, σi 0 (C7 ) hx := 0, σi → σ1 hwhile x ≤ 0 do x := x + 1, σ1 i → σ2 hx := 0 ; while x ≤ 0 do x := x + 1, σi → σ2 où σ1 = σ[x ← 0], σ2 = σ1 [x ← 1], D1 et D2 sont respectivement des arbres d’inférence de hx ≤ 0, σ1 i true et hx := x + 1, σ1 i → σ2 et où D3 est l’arbre : (A1 ) hx, σ2 i 1 h0, σ2 i 0 (B3 ) hx ≤ 0, σ2 i false (C6 ) hwhile x ≤ 0 do x := x + 1, σ2 i → σ2 (A2 ) : Sémantique des langages, Programmation raisonnée 75 IMP Sémantique opérationnelle à grands pas Effets de bords lors de l’évaluation des expressions Les règles : (C4 ) hb, σi true hc1 , σi → σ1 hif b then c1 else c2 , σi → σ1 (C5 ) hb, σi false hc2 , σi → σ2 hif b then c1 else c2 , σi → σ2 ne sont correctes que si l’évaluation d’une expression booléenne ne modifie pas l’état dans lequel s’effectue l’évaluation. Est-ce le cas avec le langage C ? Non if (i++ > 0) {i=i-1} else {i=i+1}; ... même remarque pour toutes les règles nécessitant l’évaluation d’une expression. : Sémantique des langages, Programmation raisonnée 76 IMP Sémantique opérationnelle à grands pas Boucle et Terminaison Contrairement aux autres, l’instruction while permet d’écrire des programmes dont l’exécution ne termine pas. Puisque les arbres d’inférence sont des objets finis, la sémantique opérationnelle à grands pas n’est pas en mesure de rendre compte de l’exécution des programmes qui ne terminent pas ... contrairement à la sémantique opérationnelle à petits pas. Exemple while true do skip (B1 ) (C7 ) htrue, σi .. . (C1 ) (C7 ) true hskip, σi → σ hwhile true do skip, σi → hwhile true do skip, σi → σ 0 Il n’existe pas d’état σ 0 tel que hwhile true do skip, σi → σ 0 . : Sémantique des langages, Programmation raisonnée 77 IMP Sémantique opérationnelle à grands pas Programmes équivalents Programmes dont l’exécution est décrite par la même transformation. ∀c1 , c2 ∈ EC c1 ≡ c2 ⇔ (∀σ, σ 0 ∈ V[Z] hc1 , σi → σ 0 ⇔ hc2 , σi → σ 0 ) ? Exemple : c; (if b then c 0 else c 00 ) ≡ if b then (c; c 0 ) else (c; c 00 ) Non. c c0 c 00 b σ x := 0 x := x + 1 x := x + 5 1≤x σ(x) = 2 hc; (if b then c 0 else c 00 ), σi → σ 0 σ 0 (x) = 5 0 00 00 hif b then (c; c ) else (c; c ), σi → σ σ 00 (x) = 1 : Sémantique des langages, Programmation raisonnée 78 IMP Sémantique opérationnelle à grands pas Programmes équivalents : Exemple (1) c1 : (if b then c else c 0 ); c 00 c2 : if b then (c; c 00 ) else (c 0 ; c 00 ) ? c1 ≡ c2 Construction un arbre d’inférence de hc1 , σi → σ 0 à partir d’un arbre de d’inférence de hc2 , σi → σ 0 et vice versa. Si on dispose d’un arbre d’inférence de h(if b then c else c 0 ); c 00 , σi → σ 0 , il a forcément été obtenu à partir de la règle C3 : .. .. . . (Cj ) 00 (Ci ) 0 hif b then c else c , σi → σ1 hc , σ1 i → σ 0 (C3 ) h(if b then c else c 0 ); c 00 , σi → σ 0 On distingue alors deux cas (résultat de l’évaluation de b). : Sémantique des langages, Programmation raisonnée 79 IMP Sémantique opérationnelle à grands pas Programmes équivalents : Exemple (2) (1) Si b s’évalue à true, alors, à partir de l’arbre : .. . .. . .. (Bi ) (Cj ) . hb, σi true hc, σi → σ1 (C4 ) (Ck ) 00 0 hif b then c else c , σi → σ1 hc , σ1 i → σ 0 (C3 ) 0 00 0 h(if b then c else c ); c , σi → σ on peut obtenir l’arbre : .. .. . . (Cj ) (Ck ) 00 hc, σi → σ1 hc , σ1 i → σ 0 (Bi ) (C3 ) 00 hb, σi true hc; c , σi → σ 0 (C4 ) 00 hif b then (c; c ) else (c 0 ; c 00 ), σi → σ 0 .. . et vice versa. : Sémantique des langages, Programmation raisonnée 80 IMP Sémantique opérationnelle à grands pas Programmes équivalents : Exemple (3) (2) Si b s’évalue à false, alors, à partir de l’arbre : .. . .. (Cj ) 0 (Bi ) . hb, σi false hc , σi → σ1 (C5 ) (Ck ) 00 0 hif b then c else c , σi → σ1 hc , σ1 i → σ 0 (C3 ) 0 00 0 h(if b then c else c ); c , σi → σ .. . on peut obtenir l’arbre : .. .. . . (Cj ) 0 (Ck ) 00 hc , σi → σ1 hc , σ1 i → σ 0 (C3 ) (Bi ) 0 00 hb, σi false hc ; c , σi → σ 0 (C5 ) 00 hif b then (c; c ) else (c 0 ; c 00 ), σi → σ 0 .. . et vice versa. : Sémantique des langages, Programmation raisonnée 81 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (1) Puisque tout arbre d’inférence est fini, montrer qu’un programme c termine à partir d’un état σ revient à montrer qu’il existe un état σ 0 tel que hc, σi → σ 0 . Exemple Terminaison du programme Euclid : while not (x = y) do if x ≤ y then y := y − x else x := x − y Ce programme termine à partir de tous les états σ tels que σ(x) ≥ 1 et σ(y) ≥ 1. ∀σ ∈ V[Z] (σ(x) ≥ 1 ∧ σ(y) ≥ 1) ⇒ ∃σ 0 ∈ V[Z] hEuclid, σi → σ 0 : Sémantique des langages, Programmation raisonnée 82 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (2) Utilisation de la récurrence bien fondée pour prouver la propriété P(σ) : (∃σ 0 ∈ V[Z] hEuclid, σi → σ 0 ) pour tout σ ∈ S = {σ ∈ V[Z] | σ(x) ≥ 1 ∧ σ(y) ≥ 1}. Quelle relation d’ordre bien fondée utiliser sur S ? : Sémantique des langages, Programmation raisonnée 83 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (3) A chaque tour de boucle, au moins une valeur des deux variables x et y diminue strictement. Définition d’une relation d’ordre sur S : σ1 σ2 ⇔ σ1 (x) ≤ σ2 (x)∧σ1 (y) ≤ σ2 (y)∧∀z ∈ V \{x, y} σ1 (z) = σ2 (z) Ordre strict associé à : σ1 ≺ σ2 ⇔ σ1 σ2 ∧ σ1 6= σ2 . (σ1 (x) 6= σ2 (x) ∨ σ1 (y) 6= σ2 (y)) σ1 ≺ σ2 ⇔ ∧ (σ1 (x) ≤ σ2 (x) ∧ σ1 (y) ≤ σ2 (y)) ∧ ∀z ∈ V \{x, y} σ1 (z) = σ2 (z) Remarque (σ1 (x) 6= σ2 (x) ∨ σ1 (y) 6= σ2 (y)) ∧(σ1 (x) ≤ σ2 (x) ∧ σ1 (y) ≤ σ2 (y)) : Sémantique des langages, Programmation raisonnée ! ⇒ (σ1 (x) < σ2 (x)∨σ1 (y) < σ2 (y 84 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (4) est un ordre bien fondé sur S. S’il existait une suite infinie strictement décroissante σ1 σ2 · · · , alors à partir d’un certain rang k, on aurait : ∀j ≥ k σk (x) = σj (x) ∧ σk (y) = σj (y) puisque on se place ici dans le sous-ensemble S de V[Z] dont les états associent uniquement des valeurs strictement positives aux deux variables x et y et que toute suite infinie décroissante d’entiers strictement positifs est stationnaire à partir d’un certain rang. Or, par définition, si σk σk+1 alors σk (x) 6= σk+1 (x) ou σk (y) 6= σk+1 (y) ce qui est contradictoire. : Sémantique des langages, Programmation raisonnée 85 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (5) Soit σ ∈ S, supposons que ∀σ 0 ≺ σ, P(σ 0 ) (hypothèse de récurrence) et montrons P(σ). Notons σ(x) = m et σ(y) = n. Deux cas se présentent. (1) Si m = n, alors on peut conclure : (A2 ) hx, σi m hy, σi hx = y, σi true hnot (x = y), σi false hEuclid, σi → σ (A2 ) (B2 ) (B14 ) (C6 ) n (2) Si m 6= n, alors on a l’arbre : (A2 ) hx, σi m hy, σi hx = y, σi false hnot (x = y), σi true (A2 ) (B2 ) (B14 ) : Sémantique des langages, Programmation raisonnée n (D) 86 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (6) (2.1) Si m ≤ n alors on peut construire l’arbre D1 : (A2 ) (A2 ) hy, σi n hx, σi m hy − x, σi n−m D2 (C2 ) hy := y − x, σi → σ[y ← n − m] (C4 ) hif x ≤ y then y := y − x else x := x − y, σi → σ[y ← n − m] (A7 ) où D2 est l’arbre : (A2 ) (B3 ) (A2 ) hx, σi m hy, σi hx ≤ y, σi true n (D2 ) Or, par définition, σ[y ← n − m] ≺ σ, et par hypothèse de récurrence, on a l’arbre D3 : (Ci ) .. . hEuclid, σ[y ← n − m]i → σ 0 : Sémantique des langages, Programmation raisonnée (D3 ) 87 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (7) (2.2) Si n ≤ m alors on peut construire l’arbre D1 : (A2 ) (A2 ) hx, σi m hy, σi n hx − y, σi m−n D2 (C2 ) hx := x − y, σi → σ[x ← m − n] (C5 ) hif x ≤ y then y := y − x else x := x − y, σi → σ[x ← m − n] (A7 ) où D2 est l’arbre : (A2 ) (B3 ) (A2 ) hx, σi m hy, σi hx ≤ y, σi false n (D2 ) Or, par définition, σ[y ← m − n] ≺ σ, et par hypothèse de récurrence, on a l’arbre D3 : (Ci ) .. . hEuclid, σ[x ← m − n]i → σ 0 : Sémantique des langages, Programmation raisonnée (D3 ) 88 IMP Sémantique opérationnelle à grands pas Terminaison de programmes (8) Dans ces deux sous-cas on peut conclure en considérant l’arbre d’inférence : D D1 D3 (C7 ) hEuclid, σi → σ 0 : Sémantique des langages, Programmation raisonnée 89 IMP Sémantique opérationnelle à grands pas Déterminisme (1) Proposition ∀σ, σ1 , σ2 ∈ V[Z] ∀c ∈ EC (hc, σi → σ1 et hc, σi → σ2 ) ⇒ σ1 = σ2 Peut-on prouver cette proposition par induction sur c ? c . Si b s’évalue à true : Cas de la règle (C5 ) while b do c .. . .. .. . . (Bi ) (Cj ) (Ck ) hb, σi true hc, σi → σ1 hwhile b do c, σ1 i → σ2 (C7 ) hwhile b do c, σi → σ2 .. .. .. . . . 0 (Bi ) (Cj 0 ) (C ) k 0 hb, σi true hc, σi → σ1 hwhile b do c, σ10 i → σ20 (C7 ) hwhile b do c, σi → σ20 Par hypothèse d’induction, on a seulement σ1 = σ10 . Pour prouver σ2 = σ20 , il faudrait aussi une hypothèse d’induction sur while b do c ! : Sémantique des langages, Programmation raisonnée 90 IMP Sémantique opérationnelle à grands pas Déterminisme (2) Schéma d’induction associé au système définissant hc, σi → σ 0 (induction sur les règles) ∀σ ∈ V[Z] P(hskip, σi → σ) ∀a ∈ EA ∀σ ∈ V[Z] ∀n ∈ Z ∀x ∈ V ha, σi n ⇒ P(hx := a, σi → σ[x ← ∀c1 , c2 ∈ EC ∀σ, σ 0 , σ 00 ∈ V[Z] (P(hc1 , σi → σ 0 ) et P(hc2 , σ 0 i → σ 00 )) ⇒ P(hc1 ; c2 , σi → σ 00 ) et ∀c1 , c2 ∈ EC ∀σ, σ 0 ∈ V[Z] ∀b ∈ EB (hb, σi true et P(hc1 , σi → σ 0 )) ⇒ P(hif b then c1 else c2 , σi → σ 0 ) et ∀c1 , c2 ∈ EC ∀σ, σ 0 ∈ V[Z] ∀b ∈ EB (hb, σi false et P(hc2 , σi → σ 0 )) ⇒ P(hif b then c1 else c2 , σi → σ 0 ) et ∀c ∈ EC ∀σ ∈ V[Z] ∀b ∈ EB hb, σi false ⇒ P(hwhile b do c, σi → σ) et ∀c ∈ EC ∀σ, σ 0 , σ 00 ∈ V[Z] ∀b ∈ EB (hb, σi true et P(hc, σi → σ 0 ) et P(hwhile b do c, σ 0 i → σ 00 ) ) ⇒ P(hwhile b do c, σi → σ 00 ) ⇒ ∀c ∈ EC ∀σ1 , σ2 ∈ V[Z] P(hc, σ1 i → σ2 ) et et : Sémantique des langages, Programmation raisonnée 91 IMP Sémantique opérationnelle à grands pas Déterminisme (3) Preuve : La propriété P à prouver peut s’exprimer par : P(hc, σi → σ1 ) ssi ∀σ2 ∈ V[Z] hc, σi → σ2 ⇒ σ1 = σ2 . A faire : Sémantique des langages, Programmation raisonnée 92 IMP Sémantique opérationnelle à grands pas Sémantique opérationnelle à grands pas I I I manipule des jugements qui permettent uniquement de spécifier l’état final de la mémoire après l’exécution d’un programme ne donne pas d’informations précises sur les étapes qui ont conduit à cet état. ne permet pas de modéliser l’exécution des programmes qui ne terminent pas. • si un programme n’a pas de sémantique, est-ce parce qu’il boucle ou parce qu’il est bloqué ? : Sémantique des langages, Programmation raisonnée 93 IMP Sémantique opérationnelle à petits pas Définition d’une sémantique opérationnelle à petits pas I I configuration : paire hc, σi (c ∈ EC , σ ∈ V[Z]) Relation de transition ,→ entre configurations De manière intuitive, hc, σi ,→ hc 0 , σ 0 i exprime qu’exécuter une étape de c dans un état σ conduit dans un état σ 0 où il restera à exécuter c 0 . : Sémantique des langages, Programmation raisonnée 94 IMP Sémantique opérationnelle à petits pas Relation de transition (S1 ) ha, σi n hx := a, σi ,→ hskip, σ[x ← n]i (S2 ) hc1 , σi ,→ hc10 , σ 0 i hc1 ; c2 , σi ,→ hc10 ; c2 , σ 0 i (S4 ) hb, σi true hif b then c1 else c2 , σi ,→ hc1 , σi (S5 ) (S3 ) hskip; c, σi ,→ hc, σi hb, σi false hif b then c1 else c2 , σi ,→ hc2 , σi (S6 ) hb, σi false hwhile b do c, σi ,→ hskip, σi (S7 ) hb, σi true hwhile b do c, σi ,→ hc; while b do c, σi : Sémantique des langages, Programmation raisonnée 95 IMP Sémantique opérationnelle à petits pas Séquence de calcul Séquence de calcul : suite, éventuellement infinie, de la forme : hc0 , σ0 i ,→ hc1 , σ1 i ,→ hc2 , σ2 i ,→ · · · telle que ∀i ≥ 0, hci , σi i ,→ hci+1 , σi+1 i admette un arbre de d’inférence à partir des règles définissant ,→. Configuration terminale : hskip, σi ? hc, σi ,→ he 0 , σ 0 i ssi il existe une séquence de calcul de longueur finie hc0 , σ0 i ,→ hc1 , σ1 i ,→ hc2 , σ2 i ,→ · · · ,→ hck , σk i avec c = c0 , σ = σ0 , c 0 = ck et σ 0 = σk . k hc, σi ,→ he 0 , σ 0 i ssi il existe une séquence de calcul de longueur k hc0 , σ0 i ,→ hc1 , σ1 i ,→ hc2 , σ2 i ,→ · · · ,→ hck , σk i avec c = c0 , σ = σ0 , c 0 = ck et σ 0 = σk . ? De plus, si ck = skip (configuration terminale), alors hc, σi ,→ σ 0 . : Sémantique des langages, Programmation raisonnée 96 IMP Sémantique opérationnelle à petits pas Sémantique opérationnelle à petits pas : Exemple ,→ ,→ ,→ ,→ ,→ ,→ hx := 0 ; while x ≤ 0 do x := x + 1, σi hskip ; while x ≤ 0 do x := x + 1, σ[x ← 0]i hwhile x ≤ 0 do x := x + 1, σ[x ← 0]i hx := x + 1 ; while x ≤ 0 do x := x + 1, σ[x ← 0]i hskip ; while x ≤ 0 do x := x + 1, σ[x ← 1]i hwhile x ≤ 0 do x := x + 1, σ[x ← 1]i hskip, σ2 i : Sémantique des langages, Programmation raisonnée 97 IMP Sémantique opérationnelle à petits pas Composition Lemme Si hc0 , σ0 i ,→ · · · ,→ hcn , σn i, alors ∀c ∈ EC , il existe une séquence hc0 ; c, σ0 i ,→ · · · ,→ hcn ; c, σn i. Preuve : Induction sur la (longueur de la) séquence. • Pour hc0 , σ0 i ,→ hc1 , σ1 i, il suffit d’appliquer la règle S2 pour obtenir la séquence hc0 ; c, σ0 i ,→ hc1 ; c, σ1 i. • Pour une séquence de longueur n + 1 : hc0 , σ0 i ,→ · · · ,→ hcn , σn i ,→ hcn+1 , σn+1 i Par hypothèse d’induction, il existe une séquence : hc0 ; c, σ0 i ,→ · · · ,→ hcn ; c, σn i et la règle S2 permet d’obtenir la transition hcn ; c, σn i ,→ hcn+1 ; c, σn+1 i à partir de la transition hcn , σn i ,→ hcn+1 , σn+1 i ce qui permet de construire la séquence : hc0 ; c, σ0 i ,→ · · · ,→ hcn ; c, σn i ,→ hcn+1 ; c, σn+1 i : Sémantique des langages, Programmation raisonnée 98 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (1) Proposition ? ∀c ∈ EC ∀σ1 , σ2 ∈ Σ hc, σ1 i → σ2 ⇒ hc, σ1 i ,→ σ2 Preuve : Induction sur hc, σ1 i → σ2 . I (C1 ) hskip, σi → σ Puisque hskip, σi est une configuration terminale, on a bien ? hskip, σi ,→ σ : Sémantique des langages, Programmation raisonnée 99 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (2) I .. . (Ai ) ha, σi n (C2 ) hx := a, σi → σ[x ← n] On peut construire l’arbre : .. . (Ai ) ha, σi n (S1 ) hx := a, σi ,→ hskip, σ[x ← n]i On obtient la séquence hx := a, σi ,→ hskip, σ[x ← n]i et puisque hskip, σ[x ← n]i est terminale, on a bien ? hx := a, σi ,→ σ[x ← n]. : Sémantique des langages, Programmation raisonnée 100 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (3) .. .. . . (Ci ) (Cj ) hc1 , σi → σ1 hc2 , σ1 i → σ2 I (C3 ) hc1 ; c2 , σi → σ2 ? ? Par hyp. d’induction, on a hc1 , σi ,→ σ1 et hc2 , σ1 i ,→ σ2 et donc : hc1 , σi ,→ · · · ,→ hskip, σ1 i (5) hc2 , σ1 i ,→ · · · ,→ hskip, σ2 i (6) D’après le lemme précédent, à partir de la séquence (5), on a : hc1 ; c2 , σi ,→ · · · ,→ hskip; c2 , σ1 i (7) La règle S3 permet de construire la transition : hskip; c2 , σ1 i ,→ hc2 , σ1 i (8) et à partir de (7), (8) et (6), on peut obtenir la séquence : hc1 ; c2 , σi ,→ · · · ,→ hskip, σ2 i : Sémantique des langages, Programmation raisonnée 101 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (4) .. . (Cj ) (Bi ) hb, σi true hc1 , σi → σ1 I (C4 ) hif b then c1 else c2 , σi → σ1 .. . ? Par hypothèse d’induction, hc1 , σi ,→ σ1 et on a donc hc1 , σi ,→ · · · ,→ hskip, σ1 i. A partir de hb, σi true on a : (S4 ) hb, σi true hif b then c1 else c2 , σi ,→ hc1 , σi On a alors hif b then c1 else c2 , σi ,→ hc1 , σi ,→ · · · ,→ hskip, σ1 i ? ce qui permet d’établir hif b then c1 else c2 , σi ,→ σ1 . .. . .. . (Bi ) (Cj ) hb, σi false hc , σi → σ1 2 I (C5 ) hif b then c1 else c2 , σi → σ1 Raisonnement similaire au cas précédent. : Sémantique des langages, Programmation raisonnée 102 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (5) .. . (Bi ) I (C6 ) hb, σi false hwhile b do c, σi → σ A partir de l’arbre de hb, σi false présent dans l’arbre en hypothèse, on peut construire l’arbre : (Bi ) (S6 ) .. . hb, σi false hwhile b do c, σi ,→ hskip, σi ? ce qui permet d’établir hwhile b do c, σi ,→ σ. : Sémantique des langages, Programmation raisonnée 103 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (6) I (Bi ) (C7 ) .. . hb, σi true .. .. . . (Cj ) (Ck ) hc, σi → σ1 hwhile b do c, σ1 i → σ2 hwhile b do c, σi → σ2 Par hypothèse d’induction on a : hc, σi ,→ · · · ,→ hskip, σ1 i (9) hwhile b do c, σ1 i ,→ · · · ,→ hskip, σ2 i (10) A partir de (9), on obtient : hc; while b do c, σi ,→ · · · ,→ hskip; while b do c, σ1 i (11) hskip; while b do c, σ1 i ,→ hwhile b do c, σ1 i (12) hwhile b do c, σi ,→ hc; while b do c, σi (13) règle S3 règle S7 A partir de (13), (11), (12) et (10), on obtient : hwhile b do c, σi ,→ · · · ,→ hskip, σ2 i et donc ? hwhile b do c, σi ,→ σ2 . : Sémantique des langages, Programmation raisonnée 104 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (7) k Lemme Si hc1 ; c2 , σi ,→ σ 00 , alors ∃σ 0 ∈ V[Z], ∃k1 , k2 ∈ N, tels k1 k2 que hc1 , σi ,→ σ 0 , hc2 , σ 0 i ,→ σ 00 avec k = k1 + k2 . Preuve : Par récurrence bien fondée sur k. Si k = 0 alors la propriété est triviale. Supposons cette propriété vraie pour tout k ≤ k0 et montrons la pour k0 + 1 (récurrence bien fondée). On distingue deux cas : k0 (1). hc1 ; c2 , σi ,→ hc10 ; c2 , σ1 i ,→ σ 00 avec hc1 , σi ,→ hc10 , σ1 i. Par hypothèse de récurrence, il existe k10 , k20 ∈ N et une valuation σ 0 k10 k20 tels que hc10 , σ1 i ,→ σ10 , hc2 , σ10 i ,→ σ 00 avec k0 = k10 + k20 . et on peut conclure avec k1 = k10 + 1 et k2 = k20 . k0 (2). hskip; c2 , σi ,→ hc2 , σ1 i ,→ σ 00 et on peut conclure avec k1 = 0 et k2 = k0 . : Sémantique des langages, Programmation raisonnée 105 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (8) ? Proposition ∀c ∈ EC ∀σ, σ 0 ∈ Σ hc, σi ,→ σ 0 ⇒ hc, σi → σ 0 Preuve : On a la séquence : hc, σi ,→ hc1 , σ1 i ,→ · · · ,→ hck , σk i = hskip, σ 0 i Induction sur la séquence de calcul. • hx := a, σi ,→ hskip, σ[x ← n]i avec ha, σi construisant l’arbre : n. On conclut en .. . (Ai ) ha, σi n (C2 ) hx := a, σi → σ[x ← n] : Sémantique des langages, Programmation raisonnée 106 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (9) • hc1 ; c2 , σi ,→ hc10 ; c2 , σ1 i ,→ · · · ,→ hskip, σ 0 i avec hc1 , σi ,→ hc10 , σ1 i. D’après le lemme précédent, il existe une valuation σ0 et deux entiers k1 et k2 (avec k1 + k2 = k) tels que k1 k2 hc1 , σi ,→ σ0 et hc2 , σ0 i ,→ σ 0 . Par hypothèse d’induction on a hc1 , σi → σ0 et hc2 , σ0 i → σ 0 et on conclut en construisant l’arbre : .. .. . . (Cj ) (Ci ) hc1 , σi → σ0 hc2 , σ0 i → σ 0 (C3 ) hc1 ; c2 , σi → σ 0 • hskip; c2 , σi ,→ hc2 , σi ,→ · · · ,→ hskip, σ 0 i Par hypothèse d’induction on a hc2 , σi → σ 0 et on conclut en construisant l’arbre : .. .. . . (Ci ) (Cj ) hskip, σi → σ hc2 , σi → σ 0 (C3 ) hc1 ; c2 , σi → σ 0 : Sémantique des langages, Programmation raisonnée 107 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (10) • hif b then c1 else c2 , σi ,→ hc1 , σi ,→ · · · ,→ hskip, σ 0 i avec hb, σi true. Par hypothèse d’induction on a hc1 , σi → σ 0 et on conclut en construisant l’arbre : .. .. . . (Bi ) (Cj ) hb, σi true hc1 , σi → σ 0 (C4 ) hif b then c1 else c2 , σi → σ 0 • hif b then c1 else c2 , σi ,→ hc2 , σi ,→ · · · ,→ hskip, σ 0 i avec hb, σi false. Raisonnement similaire au cas précédent. • hwhile b do c, σi ,→ hskip, σi avec hb, σi false. On conclut en construisant l’arbre : .. . (Bi ) hb, σi false (C6 ) hwhile b do c, σi → σ : Sémantique des langages, Programmation raisonnée 108 IMP Sémantique opérationnelle à petits pas Equivalence sémantique (11) • hwhile b do c, σi ,→ hc; while b do c, σi ,→ · · · ,→ hskip, σ 0 i avec hb, σi true. Par hypothèse d’induction on a hc; while b do c, σi → σ 0 . L’arbre d’inférence en grands pas finit obligatoirement par .. .. . . (Cj2 ) (Cj1 ) hc, σi → σ1 hwhile b do c, σ1 i → σ 0 (C3 ) hc; while b do c, σi → σ 0 On conclut en construisant l’arbre : (Bi ) (C4 ) .. . hb, σi .. .. . . (Cj ) (Cj2 ) true 1 hc, σi → σ1 hwhile b do c, σ1 i → σ 0 hwhile b do c, σi → σ 0 : Sémantique des langages, Programmation raisonnée 109 IMP Sémantique opérationnelle à petits pas Exercice Montrer que while b do c ≡ if b then c; while b do c else skip : Sémantique des langages, Programmation raisonnée 110 MiniML Outline Motivations Rappels Expressions arithmétiques Expressions booléennes IMP MiniML • Appel par valeur • Appel par nom : Sémantique des langages, Programmation raisonnée 111 MiniML Syntaxe Syntaxe (abstraite) d’un “petit” langage fonctionnel : e ::= n | x | fun x -> e | e e | e + e ... exprimée à l’aide d’un système d’inférence. EF est l’ensemble des expressions fonctionnelles, et est défini inductivement par : n∈N x∈V (F1 ) (F2 ) (F4 ) n e1 e2 e1 e2 : Sémantique des langages, Programmation raisonnée x (F5 ) (F3 ) e fun x -> e e1 e2 e1 + e2 112 MiniML Appel par nom vs appel par valeur Il existe plusieurs manière d’évaluer (fun x -> e) e 0 I I Appel par valeur : on évalue e 0 , et on remplace x par sa valeur dans e avant de l’évaluer on parle d’évaluation stricte OCaml, SML, C, Java, . . . Appel par nom : on remplace x par e 0 dans e et on évalue e on parle d’évaluation paresseuse, car e 0 n’est évalué qu’au moment où on en a besoin Haskell : Sémantique des langages, Programmation raisonnée 113 MiniML Appel par valeur Sémantique opérationnelle à grands pas (F1 ) n →v n (Fv3 ) (F4 ) (F2 ) fun x -> e →v fun x -> e e1 →v fun x -> e e2 →v v e1 e2 →v v 0 {v/x}e →v v 0 e1 →v v1 e2 →v v2 e1 + e2 →v v1 [[+]]v2 Remarque : pas besoin de garder d’état (langage fonctionnel) : Sémantique des langages, Programmation raisonnée 114 MiniML Appel par valeur Substitution Opération du méta-langage (celui dans lequel est définie la sémantique), ne fait pas partie de MiniML Définie récursivement sur les expressions fonctionnelles {t/x}x = t {t/x}y = y {t/x}(fun y -> t 0 ) = fun z -> {t/x}{z/y}t 0 {t/x}(t1 t2 ) = {t/x}t1 {t/x}t2 {t/x}(t1 + t2 ) = {t/x}t1 + {t/x}t2 : Sémantique des langages, Programmation raisonnée si y 6= x z fraîche 115 MiniML Appel par valeur Exemple (fun x -> x + x) (3 + 2) (F2 ) fun x -> x + x →v fun x -> x + x (F1 ) (F4 ) (F1 ) 3 →v 3 2 →v 2 3 + 2 →v 5 (F1 ) (F4 ) (Fv3 ) .. . (F1 ) 5 →v 5 5 →v 5 5 + 5 →v 10 .. . (fun x -> x + x) (3 + 2) →v 10 : Sémantique des langages, Programmation raisonnée .. . 116 MiniML Appel par valeur Propriétés Une valeur est soit un entier, soit une abstraction (fun x -> e) Proposition : Si e →v v alors v est une valeur. Preuve : Par induction sur la dérivation. Proposition : Si e →v v et e →v v 0 alors v = v 0 (à renommage près). Preuve : Par induction sur les deux dérivation. : Sémantique des langages, Programmation raisonnée 117 MiniML Appel par valeur Exercice Montrer que (fun x -> x x)(fun x -> x x) n’a pas de sémantique : Sémantique des langages, Programmation raisonnée 118 MiniML Appel par valeur Sémantique opérationnelle à petits pas On notera v une valeur (entier ou abstraction) (FSv1 ) (FSv2 ) (FSv4 ) (FSv5 ) (fun x -> e)v ,→v {v/x}e e1 ,→v e10 e1 e2 ,→v e10 e2 (FSv3 ) e2 ,→v e20 v e2 ,→v v e20 v1 + v2 ,→v v1 [[+]]v2 e1 ,→v e10 e1 + e2 ,→v e10 + e2 : Sémantique des langages, Programmation raisonnée (FSv6 ) e2 ,→v e20 v + e2 ,→v v + e20 119 MiniML Appel par valeur Exemple ! fun x -> (fun y -> x + y) 1 ! (fun x -> 3) 1 + 2 ,→v (fun y -> 1 + y) (((fun x -> 3) 1) + 2) ,→v (fun y -> 1 + y) (3 + 2) ,→v (fun y -> 1 + y) 5 ,→v 1 + 5 ,→v 6 : Sémantique des langages, Programmation raisonnée 120 MiniML Appel par valeur Déterminisme Proposition : Si e ,→v v et e ,→v v 0 alors v = v 0 . Preuve : Par induction sur e : pour une expression donnée, une seule règle de dérivation peut s’appliquer. : Sémantique des langages, Programmation raisonnée 121 MiniML Appel par valeur Équivalence Proposition : ? I Si e →v v alors e ,→v v ? I Si e ,→v v et v est une valeur alors e →v v : Sémantique des langages, Programmation raisonnée 122 MiniML Appel par nom Sémantique opérationnelle à grands pas (F1 ) n →n n (Fn3 ) (F4 ) (F2 ) fun x -> e →n fun x -> e e1 →n fun x -> e {e2 /x}e →n v e1 e2 →n v e1 →n v1 e2 →n v2 e1 + e2 →n v1 [[+]]v2 : Sémantique des langages, Programmation raisonnée 123 MiniML Appel par nom Exemple (fun x -> x + x) (3 + 2) (F2 ) fun x -> x + x →n fun x -> x + x .. (F1 ) . 3 →n 3 2 →n 2 (F4 ) (F4 ) 3 + 2 →n 5 3 + 2 →n 5 (F4 ) (3 + 2) + (3 + 2) →n 10 .. .. . . (Fn3 ) (fun x -> x + x) (3 + 2) →n 10 (F1 ) : Sémantique des langages, Programmation raisonnée 124 MiniML Appel par nom Propriétés Une valeur est soit un entier, soit une abstraction (fun x -> e) Proposition : Si e →n v alors v est une valeur. Preuve : Par induction sur la dérivation. Proposition : Si e →n v et e →n v 0 alors v = v 0 (à renommage près). Preuve : Par induction sur les deux dérivation. : Sémantique des langages, Programmation raisonnée 125 MiniML Appel par nom Sémantique opérationnelle à petits pas (FSn1 ) (FSn2 ) (FSn4 ) (FSn5 ) (fun x -> e1 )e2 ,→n {e2 /x}e1 e1 ,→n e10 e1 e2 ,→n e10 e2 v1 + v2 ,→n v1 [[+]]v2 e1 ,→n e10 e1 + e2 ,→n e10 + e2 : Sémantique des langages, Programmation raisonnée (FSn6 ) e2 ,→n e20 v + e2 ,→n v + e20 126 MiniML Appel par nom Exemple ! fun x -> (fun y -> x + y) 1 ! (fun x -> 3) 1 + 2 ,→n (fun y -> 1 + y) (((fun x -> 3) 1) + 2) ,→n 1 + (((fun x -> 3) 1) + 2) ,→n 1 + (3 + 2) ,→n 1 + 5 ,→n 6 : Sémantique des langages, Programmation raisonnée 127 MiniML Appel par nom Déterminisme Proposition : Si e ,→ v et e ,→ v 0 alors v = v 0 . Preuve : Par induction sur e : pour une expression donnée, une seule règle de dérivation peut s’appliquer. : Sémantique des langages, Programmation raisonnée 128 MiniML Appel par nom Équivalence Proposition : ? I Si e →n v alors e ,→n v ? I Si e ,→n v et v est une valeur alors e →n v : Sémantique des langages, Programmation raisonnée 129 MiniML Appel par nom Non-équivalence des appels par nom et par valeur Proposition : e →v v n’est pas équivalent à e →n v Contre exemple : (fun x -> 1) (fun x -> x x) (fun x -> x x) : Sémantique des langages, Programmation raisonnée 130