| C.Match (_,oty,t,pl) -> List.fold_left (f k) (f k (f k acc oty) t) pl
;;
-let map status g k f = function
+let map ?(hbr=true) status g k f = function
| C.Meta _ -> assert false
| C.Implicit _
| C.Sort _
| C.Appl l :: tl -> C.Appl (l@tl)
| l1 -> C.Appl l1
in
- if fire_beta then !head_beta_reduce (status :> NCicEnvironment.status) ~upto t
+ if fire_beta & hbr then !head_beta_reduce (status :> NCicEnvironment.status) ~upto t
else t
| C.Prod (n,s,t) as orig ->
let s1 = f k s in let t1 = f (g (n,C.Decl s) k) t in
;;
+ let rec alpha_norm k = function
+ | NCic.Lambda (_,ty,t) ->
+ NCic.Lambda("_",alpha_norm k ty,alpha_norm k t)
+ | NCic.Prod (_,ty,t) ->
+ NCic.Prod("_",alpha_norm k ty,alpha_norm k t)
+ | NCic.LetIn (_,ty,t,b) ->
+ NCic.LetIn("_",alpha_norm k ty,alpha_norm k t,alpha_norm k b)
+ | NCic.Meta (_,(_,NCic.Irl _)) as t -> t
+ | NCic.Meta (n,(s,NCic.Ctx tl)) as t ->
+ let tl' = HExtlib.sharing_map (alpha_norm k) tl in
+ if tl == tl' then t else NCic.Meta (n,(s,NCic.Ctx tl'))
+ | t -> NCicUtils.map ~hbr:false (new NCicPp.status None)
+ (fun _ _ -> ()) () alpha_norm t
+
(* let compare x y =
(* CSC: NCicPp.status is the best I can put here *)
(* WR: and I can't guess a user id, so I must put None *)
let res,vars = List.fold_left
(fun (r,v) t -> let r1,v1 = embed t in (r1::r),aux [] v v1) ([],[]) l
in (Terms.Node (List.rev res)), vars
- | t -> Terms.Leaf t, []
+ | t -> Terms.Leaf (alpha_norm () t), []
;;
let embed t = fst (embed t) ;;