]> matita.cs.unibo.it Git - helm.git/commitdiff
Map in NCicUtils now takes an optional boolea to disable head beta reduction.
authorAndrea Asperti <andrea.asperti@unibo.it>
Wed, 21 Sep 2011 15:51:06 +0000 (15:51 +0000)
committerAndrea Asperti <andrea.asperti@unibo.it>
Wed, 21 Sep 2011 15:51:06 +0000 (15:51 +0000)
We normalize cic terms in the paramodulation blob by stripping out names in
binders.

matitaB/components/ng_kernel/nCicUtils.ml
matitaB/components/ng_kernel/nCicUtils.mli
matitaB/components/ng_paramodulation/nCicBlob.ml

index 400d693638f880366da93bffe5b187b24eea2933..13fbb586f2dd044ba55666993b312fd8bb46ff22 100644 (file)
@@ -56,7 +56,7 @@ let fold g k f acc = function
  | 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 _
@@ -74,7 +74,7 @@ let map status g k f = function
       | 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
index de56c4e1f4888140a63a0eb49895bc8705bc1eb8..91bc2fe759f2c548fc1d6e7b4a891b2db14746ba 100644 (file)
@@ -25,6 +25,7 @@ val fold:
   (NCic.hypothesis -> 'k -> 'k) -> 'k ->
   ('k -> 'a -> NCic.term -> 'a) -> 'a -> NCic.term -> 'a
 val map:
+ ?hbr:bool ->
  #NCicEnvironment.status ->
  (NCic.hypothesis -> 'k -> 'k) -> 'k ->
  ('k -> NCic.term -> NCic.term) -> NCic.term -> NCic.term
index 14454c58b2b0c571a9fe7d62a0095f32d8a09d7c..59d57a854806aafe016d8a0ab8c56bebd09b1889 100644 (file)
@@ -84,6 +84,20 @@ with type t = NCic.term and type input = NCic.term = struct
        
   ;;
   
+  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 *)
@@ -122,7 +136,7 @@ with type t = NCic.term and type input = NCic.term = struct
        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) ;;