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