4 | Lam of variable * term
12 class fold = Camlp4Filters.GenerateFold.generated;;
13 (* class fold = Camlp4FoldGenerator.generated;; *)
15 module VarSet = Set.Make(String);;
17 (* Compute free variables with the fold class *)
18 let free_variables_v1 =
24 method empty_fv = {< fv = VarSet.empty >}
27 | Var(v) -> {< fv = VarSet.add v fv >}
29 let fv1 = VarSet.remove v (self#empty_fv#term t)#fv in
30 {< fv = VarSet.union fv fv1 >}
33 in fun t -> VarSet.elements (o#term t)#fv
36 (* Let's try to abstract that a little *)
38 let fold_term f t init =
44 method reset = {< acc = init >}
46 {< acc = f t acc (fun t -> (self#reset#term t)#get)
47 (fun t -> (super#term t)#get) >}
53 (* A nicer version of free_variables *)
54 let free_variables_v2 t =
56 fold_term begin fun t fv self next ->
58 | Var(v) -> VarSet.add v fv
59 | Lam(v, t) -> VarSet.union fv (VarSet.remove v (self t))
69 App(Var"x", App(Var"y", (Lam("y", Lam("z", (App(Var"y", App(Var"x4",Var"z")))))))))),
74 let fv1 = free_variables_v1 term1;;
75 let fv2 = free_variables_v2 term1;;
78 let ( ^-> ) v t = Lam(v, t)
79 let ( @ ) t1 t2 = App(t1, t2)
84 ("x" ^-> !"x" @ !"y" @ ("y" ^-> ("z" ^-> !"y" @ !"x4" @ !"z"))) @
89 let fv1' = free_variables_v1 term2;;
90 let fv2' = free_variables_v2 term2;;