pair a b ::= Pair a b;
list a ::= Nil | Cons a (list a);
{ What you get after expanding out type synonyms }
{
cExprP a
::= EVar name
| ENum num
| EConstr name
| EAp (cExprP a) (cExprP a)
| ELet
isRec
(list (pair a (cExprP a)))
(cExprP a)
| ECase
(cExprP a)
(list (pair (list char) (pair (list a) (cExprP a))))
| ELam
(list a)
(cExprP a)
}
cExprP t1 t2 t3 t4 t5 t6 t7
::= EVar t1
| ENum t2
| EConstr t3
| EAp (cExprP t1 t2 t3 t4 t5 t6 t7) (cExprP t1 t2 t3 t4 t5 t6 t7)
| ELet
t4
t5
(cExprP t1 t2 t3 t4 t5 t6 t7)
| ECase
(cExprP t1 t2 t3 t4 t5 t6 t7)
t6
| ELam
t7
(cExprP t1 t2 t3 t4 t5 t6 t7)
; ;;
append l1 l2 = case l1 of
Nil -> l2;
Cons x xs -> Cons x (append xs l2)
end;
getBs dl =
case dl of
Nil -> Nil;
Cons bi bis -> Cons (case bi of Pair naam rhs -> naam end) (getBs bis)
end;
concat ll =
case ll of
Nil -> Nil;
Cons lx lxx -> append lx (concat lxx)
end;
allBinders e = case e of
EVar v -> Nil;
ENum n -> Nil;
EConstr c -> Nil;
EAp e1 e2 -> append (allBinders e1) (allBinders e2);
ELet rf dl e12 -> Cons rf (append (concat (getBs dl)) (allBinders e12));
ECase sw alts -> Nil;
ELam vs e11 -> allBinders e11
end;
|