(*****************************************************************************)
(*We present now the definitions that concerns the Categorical Abstract      *)
(*Machine. The Set Commande defines its syntax                               *)
(*****************************************************************************)

Inductive Value : Set :=
  | null : Value
  | elem : bool -> Value
  | int : nat -> Value
  | def_op : OP -> Value.(*****************************************************************************)
(*We present now the definitions that concerns the Categorical Abstract      *)
(*Machine. The Set Commande defines its syntax                               *)
(*****************************************************************************)

Inductive Value : Set :=
  | null : Value
  | elem : bool -> Value
  | int : nat -> Value
  | def_op : OP -> Value.(*****************************************************************************)
(*We present now the definitions that concerns the Categorical Abstract      *)
(*Machine. The Set Commande defines its syntax                               *)
(*****************************************************************************)

Inductive Value : Set :=
  | null : Value
  | elem : bool -> Value
  | int : nat -> Value
  | def_op : OP -> Value.(*****************************************************************************)
(*We present now the definitions that concerns the Categorical Abstract      *)
(*Machine. The Set Commande defines its syntax                               *)
(*****************************************************************************)

Inductive Value : Set :=
  | null : Value
  | elem : bool -> Value
  | int : nat -> Value
  | def_op : OP -> Value.(*****************************************************************************)
(*We present now the definitions that concerns the Categorical Abstract      *)
(*Machine. The Set Commande defines its syntax                               *)
(*****************************************************************************)

Inductive Value : Set :=
  | null : Value
  | elem : bool -> Value
  | int : nat -> Value
  | def_op : OP -> Value.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive Commande : Set :=
  | quote : Value -> Commande
  | car : Commande
  | cdr : Commande
  | cons : Commande
  | push : Commande
  | swap : Commande
  | branch : Commande -> Commande -> Commande
  | cur : Commande -> Commande
  | cur_rec : Commande -> Commande
  | app : Commande
  | o : Commande -> Commande -> Commande.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive CSem_val : Set :=
  | val : Value -> CSem_val
  | Cam_pair : CSem_val -> CSem_val -> CSem_val
  | Cam_clos : Commande -> CSem_val -> CSem_val
  | Cam_clos_rec : Commande -> CSem_val -> CSem_val
  | Cam_nil : CSem_val.(*****************************************************************************)

Inductive Etat : Set :=
  | nil : Etat
  | ETcons : CSem_val -> Etat -> Etat.(*****************************************************************************)

Inductive Etat : Set :=
  | nil : Etat
  | ETcons : CSem_val -> Etat -> Etat.(*****************************************************************************)

Inductive Etat : Set :=
  | nil : Etat
  | ETcons : CSem_val -> Etat -> Etat.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*               We provide now the Semantics of the CAM                     *)
(*****************************************************************************)


Inductive CAM_DS : Etat -> Commande -> Etat -> Prop :=
  | QUO :
      forall (s : Etat) (a : CSem_val) (b : Value),
      CAM_DS (ETcons a s) (quote b) (ETcons (val b) s)
  | CAR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) car (ETcons a s)
  | CDR :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons (Cam_pair a b) s) cdr (ETcons b s)
  | CONS :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons b (ETcons a s)) cons (ETcons (Cam_pair a b) s)
  | PUSH :
      forall (s : Etat) (a : CSem_val),
      CAM_DS (ETcons a s) push (ETcons a (ETcons a s))
  | SWAP :
      forall (s : Etat) (a b : CSem_val),
      CAM_DS (ETcons a (ETcons b s)) swap (ETcons b (ETcons a s))
  | BRANCHT :
      forall (s s1 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS (ETcons (val (elem true)) s) (branch c1 c2) s1
  | BRANCHF :
      forall (s s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c2 s2 ->
      CAM_DS (ETcons (val (elem false)) s) (branch c1 c2) s2
  | CUR :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur c) (ETcons (Cam_clos c a) s)
  | APPcam1 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair a b) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos c a) b) s) app s1
  | APPcam2 :
      forall (s s1 : Etat) (a b : CSem_val) (c : Commande),
      CAM_DS (ETcons (Cam_pair (Cam_pair b (Cam_clos_rec c b)) a) s) c s1 ->
      CAM_DS (ETcons (Cam_pair (Cam_clos_rec c b) a) s) app s1
  | APPcam_op :
      forall (s : Etat) (n m : nat) (oper : OP),
      CAM_DS
        (ETcons
           (Cam_pair (val (def_op oper))
              (Cam_pair (val (int n)) (val (int m)))) s) app
        (ETcons (val (int (eval_op oper n m))) s)
  | CUR_REC :
      forall (s : Etat) (a : CSem_val) (c : Commande),
      CAM_DS (ETcons a s) (cur_rec c) (ETcons (Cam_clos_rec c a) s)
  | o_DS :
      forall (s s1 s2 : Etat) (c1 c2 : Commande),
      CAM_DS s c1 s1 -> CAM_DS s1 c2 s2 -> CAM_DS s (o c1 c2) s2.(*****************************************************************************)
(*We now define the "Squelette"of an environment which is the intuitive      *)
(*corresponding list of Debruijn indexes of an environment                   *)
(*****************************************************************************)


Inductive Squelette : Set :=
  | nil_squelette : Squelette
  | cons_squelette : Pat -> Squelette -> Squelette.(*****************************************************************************)
(*We now define the "Squelette"of an environment which is the intuitive      *)
(*corresponding list of Debruijn indexes of an environment                   *)
(*****************************************************************************)


Inductive Squelette : Set :=
  | nil_squelette : Squelette
  | cons_squelette : Pat -> Squelette -> Squelette.(*****************************************************************************)
(*We now define the "Squelette"of an environment which is the intuitive      *)
(*corresponding list of Debruijn indexes of an environment                   *)
(*****************************************************************************)


Inductive Squelette : Set :=
  | nil_squelette : Squelette
  | cons_squelette : Pat -> Squelette -> Squelette.(*****************************************************************************)

Inductive Habite : MLenv -> Squelette -> Prop :=
  | triv_habite : Habite Enil nil_squelette
  | cons_habite :
      forall (x : Pat) (u : MLval) (e : MLenv) (s : Squelette),
      Habite e s -> Habite (Econs x u e) (cons_squelette x s).(*****************************************************************************)

Inductive Habite : MLenv -> Squelette -> Prop :=
  | triv_habite : Habite Enil nil_squelette
  | cons_habite :
      forall (x : Pat) (u : MLval) (e : MLenv) (s : Squelette),
      Habite e s -> Habite (Econs x u e) (cons_squelette x s).(*****************************************************************************)

Inductive Habite : MLenv -> Squelette -> Prop :=
  | triv_habite : Habite Enil nil_squelette
  | cons_habite :
      forall (x : Pat) (u : MLval) (e : MLenv) (s : Squelette),
      Habite e s -> Habite (Econs x u e) (cons_squelette x s).

(* Specifications: *)
Lemma Habite_inject : forall (e : MLenv) (s1 s2 : Squelette), Habite e s1 -> Habite e s2 -> s1 = s2.