type base_type = UNIT | BOOL | INT | FLOAT;; type simple_type = BASE of base_type | ARROW of simple_type * simple_type | PRODUCT of simple_type list;; type identifier = string;; type operator = Not | IAdd | ISub | IMul | IDiv | FAdd | FSub | FMul | FDiv;; type constant = Unit | Bool of bool | Int of int | Float of float | Op of operator;; type expression = Const of constant | Id of identifier | App of expression * expression | If of expression * expression * expression | Tuple of expression list | Lambda of identifier * simple_type * expression | Let of identifier * expression * expression | Rec of identifier * simple_type * expression;;