pattern e in |- *.
apply MLenv_ind.
exists nil_squelette.
exact triv_habite.
intros.
elim H; intro s; intro.
exists (cons_squelette p s).
exact (cons_habite p m m0 s H0).
Qed.
(*****************************************************************************)
(*It's now time to define the translation of ML code onto CAM code           *)
(*****************************************************************************)
Inductive Traduction : Squelette -> MLexp -> Commande -> Prop :=
| Bool_Trad :
forall (b : bool) (S : Squelette),
Traduction S (Bool b) (quote (elem b))
| Trad_num :
forall (n : nat) (S : Squelette), Traduction S (Num n) (quote (int n))
| Trad_clos :
forall (c : OP) (S : Squelette), Traduction S (op c) (quote (def_op c))
| Trad_var :
forall (p : Pat) (S : Squelette) (C : Commande),
Access p S C -> Traduction S (id p) C
| Trad_ite :
forall (S : Squelette) (E1 E2 E3 : MLexp) (C1 C2 C3 : Commande),
Traduction S E1 C1 ->
Traduction S E2 C2 ->
Traduction S E3 C3 ->
Traduction S (ite E1 E2 E3) (o push (o C1 (branch C2 C3)))
| Trad_pair :
forall (S : Squelette) (E1 E2 : MLexp) (C1 C2 : Commande),
Traduction S E1 C1 ->
Traduction S E2 C2 ->
Traduction S (mlpair E1 E2) (o push (o C1 (o swap (o C2 cons))))
| Trad_app :
forall (S : Squelette) (E1 E2 : MLexp) (C1 C2 : Commande),
Traduction S E1 C1 ->
Traduction S E2 C2 ->
Traduction S (appl E1 E2) (o push (o C1 (o swap (o C2 (o cons app)))))
| Trad_let :
forall (p : Pat) (S : Squelette) (E1 E2 : MLexp) (C1 C2 : Commande),
Traduction S E1 C1 ->
Traduction (cons_squelette p S) E2 C2 ->
Traduction S (let' p E1 E2) (o push (o C1 (o cons C2)))
| Trad_let_rec :
forall (p x : Pat) (S : Squelette) (E E2 : MLexp) (C C2 : Commande),
Traduction (cons_squelette x (cons_squelette p S)) E C ->
Traduction (cons_squelette p S) E2 C2 ->
Traduction S (letrec p x E E2) (o push (o (cur_rec C) (o cons C2)))
| Trad_lambda :
forall (S : Squelette) (p : Pat) (E : MLexp) (C : Commande),
Traduction (cons_squelette p S) E C ->
Traduction S (lambda p E) (cur C).
(*****************************************************************************)
(* The Traduction Predicate can be seen as a partial injective function      *)
(* that given a state and an ML expression yields a CAM sentence:            *)
(*****************************************************************************)

Lemma Traduction_inject :
forall (E : MLexp) (C C' : Commande) (s : Squelette),
Traduction s E C -> Traduction s E C' -> C = C' :>Commande.