2 (** {1 Correctness of a toy compiler}
5 "Correctness of a Compiler for Arithmetic Expressions",
6 John McCarthy and James Painter,
9 Author: Claude Marché (Inria)
16 type expr = Cte int | Plus expr expr | Minus expr expr | Mult expr expr
18 function eval_expr (e:expr) : int =
21 | Plus e1 e2 -> eval_expr e1 + eval_expr e2
22 | Minus e1 e2 -> eval_expr e1 - eval_expr e2
23 | Mult e1 e2 -> eval_expr e1 * eval_expr e2
33 type asm = Push int | Add | Sub | Mul
38 function compute (s: stack) (a: code) : stack =
43 | Push n, _ -> compute (Cons n s) r
44 | Add, (Cons n1 (Cons n2 s)) -> compute (Cons (n2+n1) s) r
45 | Sub, (Cons n1 (Cons n2 s)) -> compute (Cons (n2-n1) s) r
46 | Mul, (Cons n1 (Cons n2 s)) -> compute (Cons (n2*n1) s) r
60 function compile (e: expr) : code =
62 | Cte n -> Cons (Push n) Nil
63 | Plus e1 e2 -> compile e1 ++ (compile e2 ++ Cons Add Nil)
64 | Minus e1 e2 -> compile e1 ++ (compile e2 ++ Cons Sub Nil)
65 | Mult e1 e2 -> compile e1 ++ (compile e2 ++ Cons Mul Nil)
68 let rec lemma soundness_gen (e: expr) (s: stack) (r: code) : unit
70 ensures { compute s (compile e ++ r) = compute (Cons (eval_expr e) s) r }
73 assert { compile e ++ r = Cons (Push n) r }
75 soundness_gen e1 s (compile e2 ++ Cons Add r);
76 soundness_gen e2 (Cons (eval_expr e1) s) (Cons Add r)
78 soundness_gen e1 s (compile e2 ++ Cons Sub r);
79 soundness_gen e2 (Cons (eval_expr e1) s) (Cons Sub r)
81 soundness_gen e1 s (compile e2 ++ Cons Mul r);
82 soundness_gen e2 (Cons (eval_expr e1) s) (Cons Mul r)
85 let lemma soundness (e: expr) : unit
86 ensures { compute Nil (compile e) = (Cons (eval_expr e) Nil) }
88 assert { compute Nil (compile e) = compute Nil (compile e ++ Nil) }