| |
exception Error of context * expr;;
exception Value of int;;
let rec decompose_down (c,e as ce) =
match e with
| Var _ -> raise (Error (c, e))
| Const c when c.constr -> raise (Value (c.arity + 1))
| Const c -> raise (Value (c.arity))
| Fun (_, _) -> raise (Value 1)
| Let (x, e1, e2) -> decompose_down (LetL (x, c, e2), e1)
| App (e1, e2) as e ->
try decompose_down (AppL (c, e2), e1) with Value k1 ->
try decompose_down (AppR ((k1, e1), c), e2) with Value k2 ->
if k1 > 1 then raise (Value (k1 -1)) else ce;; |
|