type identifier = string ;; type operator = Plus | Moins | Fois | Divise ;; type expression = Op of operator * expression * expression | Con of int | Var of identifier | Let of identifier * expression * expression | Fun of identifier * expression (* lambda abstraction *) | App of expression * expression ;; (* let rec fonction_quelconque = match e with Op (op, e1, e2) -> | Con n -> | Var id -> | Fun (id, e) -> | Let (id, e1, e2) -> | App (e1, e2) -> ;; let test1 = Let("a",[],Con(3), Let("b",[],Con(4),Op(Plus,Var("a"),Var("c"))));; *) type typ = INT | ARR of typ*typ | VAR of identifier ;; (* pour engendrer de nouvelles variables *) let var_compt = ref 0;; let reset_vars = function () -> var_compt := 0;; let new_var = function () -> (incr var_compt; "v"^(string_of_int (!var_compt)));; let mk_id_var id = VAR ("v"^id);;