module Implicit:sig..end
type exp = 
| | 
Int of  | 
(* | decimal integer | *) | 
| | 
Bool of  | 
(* | either true or false | *) | 
| | 
Arith of  | 
(* | e1 + e2, e1 - e2, or e1 * e2 | *) | 
| | 
Cmp of  | 
(* | e1 < e2, e1 > e2, or e1 = e2 | *) | 
| | 
If of  | 
(* | if e1 then e2 else e2 | *) | 
| | 
Id of  | 
(* | x, y, x1, y1, x_, y_, etc. | *) | 
| | 
Let of  | 
(* | let x = e1 in e2 | *) | 
| | 
Fun of  | 
(* | fun x -> e | *) | 
| | 
Fix of  | 
(* | fix x -> e | *) | 
| | 
App of  | 
(* | e1 e2 | *) | 
| | 
Empty | 
(* | empty | *) | 
| | 
Cons of  | 
(* | e1 :: e2 | *) | 
| | 
Head of  | 
(* | head e | *) | 
| | 
Tail of  | 
(* | tail e | *) | 
| | 
IsEmpty of  | 
(* | empty? e | *) | 
| | 
Pair of  | 
(* | (e1, e2) | *) | 
| | 
ProjL of  | 
(* | e.1 | *) | 
| | 
ProjR of  | 
(* | e.2 | *) |