X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicUntrusted.ml;h=8c827a7598c9ce8b98ef08fd9c5c0a61ae59c5a9;hb=846c22b353bed991d0504818fa58e5ed65dec670;hp=771568018b0d44ca99c61580e27152d2f1befad1;hpb=63b86fce8a75490b957e7301517b9006f58321b6;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicUntrusted.ml b/helm/software/components/ng_kernel/nCicUntrusted.ml index 771568018..8c827a759 100644 --- a/helm/software/components/ng_kernel/nCicUntrusted.ml +++ b/helm/software/components/ng_kernel/nCicUntrusted.ml @@ -25,12 +25,7 @@ let map_term_fold_a g k f a = function let fire_beta, upto = match l with C.Meta _ :: _ -> true, List.length l - 1 | _ -> false, 0 in - let a,l1 = - (* sharing fold? *) - List.fold_right - (fun t (a,l) -> let a,t = f k a t in a, t :: l) - l (a,[]) - in + let a,l1 = HExtlib.sharing_map_acc (f k) a l in a, if l1 == l then orig else let t = match l1 with @@ -51,10 +46,7 @@ let map_term_fold_a g k f a = function a, if ty1 == ty && t1 == t && b1 == b then orig else C.LetIn (n,ty1,t1,b1) | C.Match (r,oty,t,pl) as orig -> let a,oty1 = f k a oty in let a,t1 = f k a t in - let a,pl1 = - (* sharing fold? *) - List.fold_right (fun t (a,l) -> let a,t = f k a t in a,t::l) pl (a,[]) - in + let a,pl1 = HExtlib.sharing_map_acc (f k) a pl in a, if oty1 == oty && t1 == t && pl1 == pl then orig else C.Match(r,oty1,t1,pl1) ;; @@ -252,3 +244,40 @@ let rec apply_subst_metasenv subst = function (* hide optional arg *) let apply_subst s c t = apply_subst s c t;; + +type meta_kind = [ `IsSort | `IsType | `IsTerm ] + +let is_kind x = x = `IsSort || x = `IsType || x = `IsTerm ;; + +let kind_of_meta l = + try + (match List.find is_kind l with + | `IsSort | `IsType | `IsTerm as x -> x + | _ -> assert false) + with + Not_found -> assert false +;; + +let rec replace_in_metasenv i f = function + | [] -> assert false + | (j,e)::tl when j=i -> (i,f e) :: tl + | x::tl -> x :: replace_in_metasenv i f tl +;; + +let rec replace_in_subst i f = function + | [] -> assert false + | (j,e)::tl when j=i -> (i,f e) :: tl + | x::tl -> x :: replace_in_subst i f tl +;; + +let set_kind newkind attrs = + newkind :: List.filter (fun x -> not (is_kind x)) attrs +;; + +let max_kind k1 k2 = + match k1, k2 with + | `IsSort, _ | _, `IsSort -> `IsSort + | `IsType, _ | _, `IsType -> `IsType + | _ -> `IsTerm +;; +