8 (* ************************ SYNTAX ************************ *)
32 (* ************************ SEMANTICS ************************ *)
33 function aeval (st:state) (e:aexpr) : int =
37 | Aadd e1 e2 -> aeval st e1 + aeval st e2
38 | Asub e1 e2 -> aeval st e1 - aeval st e2
39 | Amul e1 e2 -> aeval st e1 * aeval st e2
42 function beval (st:state) (b:bexpr) : bool =
46 | Bnot b' -> notb (beval st b')
47 | Band b1 b2 -> andb (beval st b1) (beval st b2)
48 | Beq a1 a2 -> aeval st a1 = aeval st a2
49 | Ble a1 a2 -> aeval st a1 <= aeval st a2
52 inductive ceval state com state =
54 | E_Skip : forall m. ceval m Cskip m
57 | E_Ass : forall m a x. ceval m (Cassign x a) m[x <- aeval m a]
60 | E_Seq : forall cmd1 cmd2 m0 m1 m2.
61 ceval m0 cmd1 m1 -> ceval m1 cmd2 m2 -> ceval m0 (Cseq cmd1 cmd2) m2
64 | E_IfTrue : forall m0 m1 cond cmd1 cmd2. beval m0 cond ->
65 ceval m0 cmd1 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1
67 | E_IfFalse : forall m0 m1 cond cmd1 cmd2. not beval m0 cond ->
68 ceval m0 cmd2 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1
71 | E_WhileEnd : forall cond m body. not beval m cond ->
72 ceval m (Cwhile cond body) m
74 | E_WhileLoop : forall mi mj mf cond body. beval mi cond ->
75 ceval mi body mj -> ceval mj (Cwhile cond body) mf ->
76 ceval mi (Cwhile cond body) mf
79 lemma ceval_deterministic_aux : forall c mi mf1. ceval mi c mf1 ->
80 forall mf2. ("inversion" ceval mi c mf2) -> mf1 = mf2
82 lemma ceval_deterministic : forall c mi mf1 mf2.
83 ceval mi c mf1 -> ceval mi c mf2 -> mf1 = mf2