X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicReduction.ml;h=cc4d99e05473c1d2aeecef9b5103f40b0c803987;hb=0bd584a839bae570f44c4a5f8a06cdbc55fe0726;hp=61bb201b7f685e0e6c3bf615c4b4406aba719cb5;hpb=5f87c295e57d5c5ef9bcb13d71f19b24642355be;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicReduction.ml b/helm/software/components/ng_kernel/nCicReduction.ml index 61bb201b7..cc4d99e05 100644 --- a/helm/software/components/ng_kernel/nCicReduction.ml +++ b/helm/software/components/ng_kernel/nCicReduction.ml @@ -171,10 +171,23 @@ let whd = R.whd let (===) x y = Pervasives.compare x y = 0 ;; +exception Dance;; + +let prof = HExtlib.profiling_enabled := true;HExtlib.profile "cache failures";; +let prof2 = HExtlib.profiling_enabled := true;HExtlib.profile "dancing sorts";; (* t1, t2 must be well-typed *) let are_convertible ?(subst=[]) get_relevance = +(* + let get_relevance_p ~subst context t args = + (match prof with {HExtlib.profile = p} -> p) + (fun (a,b,c,d) -> get_relevance ~subst:a b c d) + (subst,context,t,args) + in + let dance () = (match prof2 with {HExtlib.profile = p} -> p) (fun () -> ()) () + in +*) let rec aux test_eq_only context t1 t2 = - let rec alpha_eq test_eq_only t1 t2 = + let alpha_eq test_eq_only t1 t2 = if t1 === t2 then true else @@ -222,7 +235,41 @@ let are_convertible ?(subst=[]) get_relevance = let term = NCicSubstitution.subst_meta l2 term in aux test_eq_only context t1 term with NCicUtils.Subst_not_found _ -> false) - + + | (C.Appl ((C.Const r1) as _hd1::tl1), C.Appl (C.Const r2::tl2)) + when (Ref.eq r1 r2 && + List.length (E.get_relevance r1) >= List.length tl1) -> + 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 + HExtlib.mk_list false lno @ relevance + | _ -> relevance + in + let fail = ref ~-1 in + let res = (try + HExtlib.list_forall_default3 + (fun t1 t2 b -> fail := !fail+1; not b || aux test_eq_only context t1 t2) + tl1 tl2 true relevance + with Invalid_argument _ -> false) + in res + (* if res then true + else + let relevance = get_relevance_p ~subst context _hd1 tl1 in + let _,relevance = HExtlib.split_nth !fail relevance in + let b,relevance = (match relevance with + | [] -> assert false + | b::tl -> b,tl) in + let _,tl1 = HExtlib.split_nth (!fail+1) tl1 in + let _,tl2 = HExtlib.split_nth (!fail+1) tl2 in + if (not b) then + (dance (); + try + HExtlib.list_forall_default3 + (fun t1 t2 b -> not b || aux test_eq_only context t1 t2) + tl1 tl2 true relevance + with Invalid_argument _ -> false) + else false *) | (C.Appl (hd1::tl1), C.Appl (hd2::tl2)) -> aux test_eq_only context hd1 hd2 && let relevance = get_relevance ~subst context hd1 tl1 in