X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicReduction.ml;h=aa7f84ad660428a9109e47fcf02fc97a81365f24;hb=2b837ca9e298eb44eee95d9ca0e331c577785dcb;hp=8012f0b753990745d037e3ee0a4d678f1f6c4398;hpb=d45787d8c1bd22f27b64f214a9fb8f54e69c9533;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicReduction.ml b/helm/software/components/ng_kernel/nCicReduction.ml index 8012f0b75..aa7f84ad6 100644 --- a/helm/software/components/ng_kernel/nCicReduction.ml +++ b/helm/software/components/ng_kernel/nCicReduction.ml @@ -15,6 +15,8 @@ module C = NCic module Ref = NReference module E = NCicEnvironment +exception AssertFailure of string Lazy.t;; + module type Strategy = sig type stack_term type env_term @@ -162,7 +164,7 @@ module Reduction(RS : Strategy) = struct | (_, _, C.Const (Ref.Ref (_,Ref.Con (_,j,_))),[]) -> aux (k, e, List.nth pl (j-1), s) | (_, _, C.Const (Ref.Ref (_,Ref.Con (_,j,lno))), s')-> - let _,params = HExtlib.split_nth lno s' in + let _,params = HExtlib.split_nth "NR 1" lno s' in aux (k, e, List.nth pl (j-1), params@s) | _ -> config, true) in @@ -251,7 +253,7 @@ let are_convertible ~metasenv ~subst = let relevance = E.get_relevance r1 in let relevance = match r1 with | Ref.Ref (_,Ref.Con (_,_,lno)) -> - let _,relevance = HExtlib.split_nth lno relevance in + let _,relevance = HExtlib.split_nth "NR 2" lno relevance in HExtlib.mk_list false lno @ relevance | _ -> relevance in @@ -263,13 +265,13 @@ let are_convertible ~metasenv ~subst = | HExtlib.FailureAt fail -> let relevance = !get_relevance ~metasenv ~subst context hd1 tl1 in - let _,relevance = HExtlib.split_nth fail relevance in + let _,relevance = HExtlib.split_nth "NR 3" fail relevance in let b,relevance = (match relevance with | [] -> assert false | b::tl -> b,tl) in if (not b) then - let _,tl1 = HExtlib.split_nth (fail+1) tl1 in - let _,tl2 = HExtlib.split_nth (fail+1) tl2 in + let _,tl1 = HExtlib.split_nth "NR 4" (fail+1) tl1 in + let _,tl2 = HExtlib.split_nth "NR 5" (fail+1) tl2 in try HExtlib.list_forall_default3 (fun t1 t2 b -> not b || aux true context t1 t2) @@ -363,24 +365,32 @@ let are_convertible ~metasenv ~subst = aux false ;; -let rec head_beta_reduce ?(delta=max_int) ?(upto=(-1)) t l = +let rec head_beta_reduce ~delta ~upto ~subst t l = match upto, t, l with | 0, C.Appl l1, _ -> C.Appl (l1 @ l) | 0, t, [] -> t | 0, t, _ -> C.Appl (t::l) - | _, C.Appl (hd::tl), _ -> head_beta_reduce ~delta ~upto hd (tl @ l) + | _, C.Meta (n,ctx), _ -> + (try + let _,_, term,_ = NCicUtils.lookup_subst n subst in + head_beta_reduce ~delta ~upto ~subst + (NCicSubstitution.subst_meta ctx term) l + with NCicUtils.Subst_not_found _ -> if l = [] then t else C.Appl (t::l)) + | _, C.Appl (hd::tl), _ -> head_beta_reduce ~delta ~upto ~subst hd (tl @ l) | _, C.Lambda(_,_,bo), arg::tl -> let bo = NCicSubstitution.subst arg bo in - head_beta_reduce ~delta ~upto:(upto - 1) bo tl + head_beta_reduce ~delta ~upto:(upto - 1) ~subst bo tl | _, C.Const (Ref.Ref (_, Ref.Def height) as re), _ when delta <= height -> let _, _, bo, _, _, _ = NCicEnvironment.get_checked_def re in - head_beta_reduce ~upto ~delta bo l + head_beta_reduce ~upto ~delta ~subst bo l | _, t, [] -> t | _, t, _ -> C.Appl (t::l) ;; -let head_beta_reduce ?delta ?upto t = head_beta_reduce ?delta ?upto t [];; +let head_beta_reduce ?(delta=max_int) ?(upto= -1) ?(subst=[]) t = + head_beta_reduce ~delta ~upto ~subst t [] +;; type stack_item = RS.stack_term type environment_item = RS.env_term @@ -391,4 +401,19 @@ let reduce_machine = R.reduce let from_stack = RS.from_stack let unwind = R.unwind +let _ = + NCicUtils.set_head_beta_reduce (fun ~upto t -> head_beta_reduce ~upto t); + NCicPp.set_head_beta_reduce (fun ~upto t -> head_beta_reduce ~upto t); +;; + +(* if n < 0, then splits all prods from an arity, returning a sort *) +let rec split_prods ~subst context n te = + match (n, R.whd ~subst context te) with + | (0, _) -> context,te + | (n, C.Sort _) when n <= 0 -> context,te + | (n, C.Prod (name,so,ta)) -> + split_prods ~subst ((name,(C.Decl so))::context) (n - 1) ta + | (_, _) -> raise (AssertFailure (lazy "split_prods")) +;; + (* vim:set foldmethod=marker: *)