X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicUntrusted.ml;h=771568018b0d44ca99c61580e27152d2f1befad1;hb=6412f9910328878785ccb3ad6d87fb5dd276cffe;hp=633ecea576540e80ed8786eef5916c6bcd783c88;hpb=233826389b4c0c4192c1eb1cacc8cfa99b2750f4;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicUntrusted.ml b/helm/software/components/ng_kernel/nCicUntrusted.ml index 633ecea57..771568018 100644 --- a/helm/software/components/ng_kernel/nCicUntrusted.ml +++ b/helm/software/components/ng_kernel/nCicUntrusted.ml @@ -168,7 +168,43 @@ let clean_or_fix_dependent_abstrations ctx t = aux (List.map fst ctx) t ;; -let apply_subst subst context t = +let rec fire_projection_redex on_args = function + | C.Meta _ as t -> t + | C.Appl(C.Const(Ref.Ref(_,Ref.Fix(fno,rno,_)) as r)::args as ol)as ot-> + let l= if on_args then List.map (fire_projection_redex true) ol else ol in + let t = if l == ol then ot else C.Appl l in + let ifl,(_,_,pragma),_ = NCicEnvironment.get_checked_fixes_or_cofixes r in + let conclude () = + if on_args then + let l' = HExtlib.sharing_map (fire_projection_redex true) l in + if l == l' then t else C.Appl l' + else + t (* ot is the same *) + in + if pragma <> `Projection || List.length args <= rno then conclude () + else + (match List.nth args rno with + | C.Appl (C.Const(Ref.Ref(_,Ref.Con _))::_) -> + let _, _, _, _, fbody = List.nth ifl fno in (* fbody is closed! *) + let t = C.Appl (fbody::args) in + (match NCicReduction.head_beta_reduce ~delta:max_int t with + | C.Match (_,_,C.Appl(C.Const(Ref.Ref(_,Ref.Con (_,_,leftno)))::kargs),[pat])-> + let _,kargs = HExtlib.split_nth leftno kargs in + fire_projection_redex false + (NCicReduction.head_beta_reduce + ~delta:max_int (C.Appl (pat :: kargs))) + | C.Appl(C.Match(_,_,C.Appl(C.Const(Ref.Ref(_,Ref.Con (_,_,leftno)))::kargs),[pat]) :: args) -> + let _,kargs = HExtlib.split_nth leftno kargs in + fire_projection_redex false + (NCicReduction.head_beta_reduce + ~delta:max_int (C.Appl (pat :: kargs @ args))) + | _ -> conclude ()) + | _ -> conclude ()) + | t when on_args -> NCicUtils.map (fun _ x -> x) true fire_projection_redex t + | t -> t +;; + +let apply_subst ?(fix_projections=false) subst context t = let rec apply_subst subst () = function NCic.Meta (i,lc) -> @@ -187,10 +223,12 @@ let apply_subst subst context t = apply_subst subst () (NCicSubstitution.lift n t)) l)))) | t -> NCicUtils.map (fun _ () -> ()) () (apply_subst subst) t in - clean_or_fix_dependent_abstrations context (apply_subst subst () t) + (if fix_projections then fire_projection_redex true else fun x -> x) + (clean_or_fix_dependent_abstrations context (apply_subst subst () t)) ;; -let apply_subst_context subst context = +let apply_subst_context ~fix_projections subst context = + let apply_subst = apply_subst ~fix_projections in let rec aux c = function | [] -> [] | (name,NCic.Decl t as e) :: tl -> @@ -206,6 +244,11 @@ let rec apply_subst_metasenv subst = function | [] -> [] | (i,_) :: _ when List.mem_assoc i subst -> assert false | (i,(name,ctx,ty)) :: tl -> - (i,(name,apply_subst_context subst ctx,apply_subst subst ctx ty)) :: + (i,(name,apply_subst_context ~fix_projections:true subst ctx, + apply_subst ~fix_projections:true subst ctx ty)) :: apply_subst_metasenv subst tl ;; + +(* hide optional arg *) +let apply_subst s c t = apply_subst s c t;; +