X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicReduction.ml;h=8fc58f4c9c27002fe81b8c9930e455e9ba9212f1;hb=2c4dcfe11bdf6dae33566d353701965e41541ceb;hp=432ea9a45bd4c79e599181da2db0cd9038a06463;hpb=9aaaba04fbd198881aaee42cfc41fdb75db1eeaa;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicReduction.ml b/helm/software/components/ng_kernel/nCicReduction.ml index 432ea9a45..8fc58f4c9 100644 --- a/helm/software/components/ng_kernel/nCicReduction.ml +++ b/helm/software/components/ng_kernel/nCicReduction.ml @@ -17,6 +17,9 @@ module E = NCicEnvironment exception AssertFailure of string Lazy.t;; +let debug = ref false;; +let pp m = if !debug then prerr_endline (Lazy.force m) else ();; + module type Strategy = sig type stack_term type env_term @@ -141,31 +144,32 @@ module Reduction(RS : Strategy) = struct (Ref.Decl|Ref.Ind _|Ref.Con _|Ref.CoFix _))), _) as config -> config, true | (_, _, (C.Const (Ref.Ref - (_,Ref.Fix (fixno,recindex,height)) as refer) as head),s) as config -> -(* if delta >= height then config else *) - (match - try Some (RS.from_stack ~delta (List.nth s recindex)) - with Failure _ -> None - with - | None -> config, true - | Some recparam -> - let fixes,_,_ = NCicEnvironment.get_checked_fixes_or_cofixes refer in - match reduce ~delta:0 ~subst context recparam with - | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c, _ - when delta >= height -> - let new_s = - replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst - context) ~unwind c) - in - (0, [], head, new_s), false - | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c, _ -> - let new_s = - replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst - context) ~unwind c) - in - let _,_,_,_,body = List.nth fixes fixno in - aux (0, [], body, new_s) - | _ -> config, true) + (_,Ref.Fix (fixno,recindex,height)) as refer)),s) as config -> + (let arg = try Some (List.nth s recindex) with Failure _ -> None in + match arg with + None -> config, true + | Some arg -> + let fixes,(_,_,pragma),_ = + NCicEnvironment.get_checked_fixes_or_cofixes refer in + if delta >= height then + match pragma with + | `Projection -> + (match RS.from_stack ~delta:max_int arg with + | _,_,C.Const(Ref.Ref(_,Ref.Con _)),_::_ -> + let _,_,_,_,body = List.nth fixes fixno in + aux (0, [], body, s) + | _ -> config,false) + | _ -> config,false + else + match RS.from_stack ~delta:0 arg with + | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c -> + let new_s = + replace recindex s + (RS.compute_to_stack ~reduce:(reduce ~subst context) + ~unwind c) in + let _,_,_,_,body = List.nth fixes fixno in + aux (0, [], body, new_s) + | _ -> config, true) | (k, e, C.Match (_,_,term,pl),s) as config -> let decofix = function | (_,_,C.Const(Ref.Ref(_,Ref.CoFix c)as refer),s)-> @@ -213,12 +217,8 @@ let alpha_eq ~test_lambda_source aux test_eq_only metasenv subst context t1 t2 = true else match (t1,t2) with - | (C.Sort (C.Type a), C.Sort (C.Type b)) when not test_eq_only -> - NCicEnvironment.universe_leq a b - | (C.Sort (C.Type a), C.Sort (C.Type b)) -> - NCicEnvironment.universe_eq a b - | (C.Sort C.Prop,C.Sort (C.Type _)) -> (not test_eq_only) - | (C.Sort C.Prop, C.Sort C.Prop) -> true + | C.Sort s1, C.Sort s2 -> + NCicEnvironment.are_sorts_convertible ~test_eq_only s1 s2 | (C.Prod (name1,s1,t1), C.Prod(_,s2,t2)) -> aux true context s1 s2 && @@ -269,12 +269,14 @@ let alpha_eq ~test_lambda_source aux test_eq_only metasenv subst context t1 t2 = when (Ref.eq r1 r2 && List.length (E.get_relevance r1) >= List.length tl1) -> let relevance = E.get_relevance r1 in +(* if the types were convertible the following optimization is sound let relevance = match r1 with | Ref.Ref (_,Ref.Con (_,_,lno)) -> let _,relevance = HExtlib.split_nth lno relevance in HExtlib.mk_list false lno @ relevance | _ -> relevance in +*) (try HExtlib.list_forall_default3_var (fun t1 t2 b -> not b || aux true context t1 t2 )