X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_unification%2FcicUnification.ml;h=fb1ca113f23e7f3b40035b8c68f47cd74bf9048d;hb=9f60b3b0f4460aec52ec241037f6c475b421dd15;hp=70c7aa9cb17c1511394233117c8f7787c04fad38;hpb=0191fb3768820da9287c3bd401593664f40aec7b;p=helm.git diff --git a/helm/ocaml/cic_unification/cicUnification.ml b/helm/ocaml/cic_unification/cicUnification.ml index 70c7aa9cb..fb1ca113f 100644 --- a/helm/ocaml/cic_unification/cicUnification.ml +++ b/helm/ocaml/cic_unification/cicUnification.ml @@ -25,8 +25,9 @@ open Printf -exception AssertFailure of string;; exception UnificationFailure of string;; +exception Uncertain of string;; +exception AssertFailure of string;; let debug_print = prerr_endline @@ -37,9 +38,10 @@ let type_of_aux' metasenv subst context term = | CicMetaSubst.MetaSubstFailure msg -> raise (AssertFailure ((sprintf - "Type checking error: %s in context\n%s.\nException: %s.\nBroken invariant: unification must be invoked only on well typed terms" + "Type checking error: %s in context\n%s\nand metasenv\n%s.\nException: %s.\nBroken invariant: unification must be invoked only on well typed terms" (CicMetaSubst.ppterm subst term) - (CicMetaSubst.ppcontext subst context) msg))) + (CicMetaSubst.ppcontext subst context) + (CicMetaSubst.ppmetasenv metasenv subst) msg))) (* NUOVA UNIFICAZIONE *) (* A substitution is a (int * Cic.term) list that associates a @@ -96,7 +98,11 @@ let rec fo_unif_subst subst context metasenv t1 t2 = fo_unif_subst subst context metasenv lifted_oldt t with Not_found -> let t',metasenv',subst' = + try CicMetaSubst.delift n subst context metasenv l t + with + (CicMetaSubst.MetaSubstFailure msg)-> raise(UnificationFailure msg) + | (CicMetaSubst.Uncertain msg) -> raise (Uncertain msg) in (n, t')::subst', metasenv' in @@ -106,7 +112,7 @@ let rec fo_unif_subst subst context metasenv t1 t2 = type_of_aux' metasenv' subst'' context t in fo_unif_subst subst'' context metasenv' (S.lift_meta l meta_type) tyt - with _ -> + with AssertFailure _ -> (* TODO huge hack!!!! * we keep on unifying/refining in the hope that the problem will be * eventually solved. In the meantime we're breaking a big invariant: @@ -126,7 +132,7 @@ prerr_endline "********* PROCEED AT YOUR OWN RISK. AND GOOD LUCK." ; else raise (UnificationFailure (sprintf "Can't unify %s with %s due to different constants" - (CicPp.ppterm t1) (CicPp.ppterm t1))) + (CicPp.ppterm t1) (CicPp.ppterm t2))) | C.MutInd (uri1,i1,exp_named_subst1),C.MutInd (uri2,i2,exp_named_subst2) -> if UriManager.eq uri1 uri2 && i1 = i2 then fo_unif_subst_exp_named_subst subst context metasenv @@ -144,7 +150,7 @@ prerr_endline "********* PROCEED AT YOUR OWN RISK. AND GOOD LUCK." ; raise (UnificationFailure (sprintf "Can't unify %s with %s due to different inductive constructors" (CicPp.ppterm t1) (CicPp.ppterm t1))) - | (C.Implicit, _) | (_, C.Implicit) -> assert false + | (C.Implicit _, _) | (_, C.Implicit _) -> assert false | (C.Cast (te,ty), t2) -> fo_unif_subst subst context metasenv te t2 | (t1, C.Cast (te,ty)) -> fo_unif_subst subst context metasenv t1 te | (C.Prod (n1,s1,t1), C.Prod (_,s2,t2)) ->