| 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) ;;