]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_unification/cicRefine.ml
This commit (partially) removes a big source of inefficiency (at least for
[helm.git] / helm / ocaml / cic_unification / cicRefine.ml
index e4b935089ebdb26c992b7db79b2afacefcbd93e3..a5221c22976f3d3c337121cbb116e82b7a0bb88c 100644 (file)
 
 open Printf
 
-exception RefineFailure of string;;
+type failure_msg =
+   Reason of string
+ | UnificationFailure of CicUnification.failure_msg
+
+let explain_error =
+ function
+    Reason msg -> msg
+  | UnificationFailure msg -> CicUnification.explain_error msg
+
+exception RefineFailure of failure_msg;;
 exception Uncertain of string;;
 exception AssertFailure of string;;
 
@@ -35,7 +44,7 @@ let fo_unif_subst subst context metasenv t1 t2 ugraph =
   try
     CicUnification.fo_unif_subst subst context metasenv t1 t2 ugraph
   with
-      (CicUnification.UnificationFailure msg) -> raise (RefineFailure msg)
+      (CicUnification.UnificationFailure msg) -> raise (RefineFailure (UnificationFailure msg))
     | (CicUnification.Uncertain msg) -> raise (Uncertain msg)
 ;;
 
@@ -61,7 +70,7 @@ let rec type_of_constant uri ugraph =
     | C.CurrentProof (_,_,_,ty,_,_) -> ty,u
     | _ ->
        raise
-        (RefineFailure ("Unknown constant definition " ^  U.string_of_uri uri))
+        (RefineFailure (Reason ("Unknown constant definition " ^  U.string_of_uri uri)))
 
 and type_of_variable uri ugraph =
   let module C = Cic in
@@ -78,7 +87,7 @@ and type_of_variable uri ugraph =
     | _ ->
         raise
          (RefineFailure
-          ("Unknown variable definition " ^ UriManager.string_of_uri uri))
+          (Reason ("Unknown variable definition " ^ UriManager.string_of_uri uri)))
 
 and type_of_mutual_inductive_defs uri i ugraph =
   let module C = Cic in
@@ -97,7 +106,7 @@ and type_of_mutual_inductive_defs uri i ugraph =
     | _ ->
        raise
         (RefineFailure
-         ("Unknown mutual inductive definition " ^ U.string_of_uri uri))
+         (Reason ("Unknown mutual inductive definition " ^ U.string_of_uri uri)))
 
 and type_of_mutual_inductive_constr uri i j ugraph =
   let module C = Cic in
@@ -117,7 +126,7 @@ and type_of_mutual_inductive_constr uri i j ugraph =
       | _ ->
          raise
            (RefineFailure
-               ("Unkown mutual inductive definition " ^ U.string_of_uri uri))
+               (Reason ("Unkown mutual inductive definition " ^ U.string_of_uri uri)))
 
 
 (* type_of_aux' is just another name (with a different scope) for type_of_aux *)
@@ -180,9 +189,9 @@ and type_of_aux' metasenv context t ugraph =
                        (S.lift n bo) ugraph 
                      in
                       t,ty,subst,metasenv,ugraph
-                | None -> raise (RefineFailure "Rel to hidden hypothesis")
+                | None -> raise (RefineFailure (Reason "Rel to hidden hypothesis"))
              with
-                _ -> raise (RefineFailure "Not a close term")
+                _ -> raise (RefineFailure (Reason "Not a close term"))
            )
        | C.Var (uri,exp_named_subst) ->
            let exp_named_subst',subst',metasenv',ugraph1 =
@@ -237,7 +246,7 @@ and type_of_aux' metasenv context t ugraph =
                 in
                   C.Cast (te',ty'),ty',subst''',metasenv''',ugraph3
                with
-                  _ -> raise (RefineFailure "Cast"))
+                  _ -> raise (RefineFailure (Reason "Cast")))
        | C.Prod (name,s,t) ->
            let s',sort1,subst',metasenv',ugraph1 = 
               type_of_aux subst metasenv context s ugraph 
@@ -259,10 +268,10 @@ and type_of_aux' metasenv context t ugraph =
                   C.Meta _
                 | C.Sort _ -> ()
                 | _ ->
-                    raise (RefineFailure (sprintf
+                    raise (RefineFailure (Reason (sprintf
                                             "Not well-typed lambda-abstraction: the source %s should be a type;
              instead it is a term of type %s" (CicPp.ppterm s)
-                                            (CicPp.ppterm sort1)))
+                                            (CicPp.ppterm sort1))))
              ) ;
              let t',type2,subst'',metasenv'',ugraph2 =
                type_of_aux subst' metasenv' 
@@ -303,7 +312,7 @@ and type_of_aux' metasenv context t ugraph =
                 hetype tlbody_and_type ugraph2
             in
               C.Appl (he'::tl'), applty,subst''',metasenv''',ugraph3
-       | C.Appl _ -> raise (RefineFailure "Appl: no arguments")
+       | C.Appl _ -> raise (RefineFailure (Reason "Appl: no arguments"))
        | C.Const (uri,exp_named_subst) ->
            let exp_named_subst',subst',metasenv',ugraph1 =
              check_exp_named_subst subst metasenv context 
@@ -347,8 +356,8 @@ and type_of_aux' metasenv context t ugraph =
                | _ ->
                    raise
                      (RefineFailure
-                        ("Unkown mutual inductive definition " ^ 
-                         U.string_of_uri uri)) 
+                        (Reason ("Unkown mutual inductive definition " ^ 
+                         U.string_of_uri uri)))
            in
           let rec count_prod t =
              match CicReduction.whd ~subst context t with
@@ -706,7 +715,7 @@ and type_of_aux' metasenv context t ugraph =
                    let subst',metasenv',ugraph' = 
                   (try
                      fo_unif_subst subst context metasenv t ct ugraph
-                   with e -> raise (RefineFailure (sprintf "The local context is not consistent with the canonical context, since %s cannot be unified with %s. Reason: %s" (CicMetaSubst.ppterm subst t) (CicMetaSubst.ppterm subst ct) (match e with AssertFailure msg -> msg | _ -> (Printexc.to_string e)))))
+                   with e -> raise (RefineFailure (Reason (sprintf "The local context is not consistent with the canonical context, since %s cannot be unified with %s. Reason: %s" (CicMetaSubst.ppterm subst t) (CicMetaSubst.ppterm subst ct) (match e with AssertFailure msg -> msg | _ -> (Printexc.to_string e))))))
                    in
                      l @ [Some t],subst',metasenv',ugraph'
                | Some t,Some (_,C.Decl ct) ->
@@ -717,23 +726,23 @@ and type_of_aux' metasenv context t ugraph =
                     (try
                        fo_unif_subst
                          subst' context metasenv' inferredty ct ugraph1
-                     with e -> raise (RefineFailure (sprintf "The local context is not consistent with the canonical context, since the type %s of %s cannot be unified with the expected type %s. Reason: %s" (CicMetaSubst.ppterm subst' inferredty) (CicMetaSubst.ppterm subst' t) (CicMetaSubst.ppterm subst' ct) (match e with AssertFailure msg -> msg | _ -> (Printexc.to_string e)))))
+                     with e -> raise (RefineFailure (Reason (sprintf "The local context is not consistent with the canonical context, since the type %s of %s cannot be unified with the expected type %s. Reason: %s" (CicMetaSubst.ppterm subst' inferredty) (CicMetaSubst.ppterm subst' t) (CicMetaSubst.ppterm subst' ct) (match e with AssertFailure msg -> msg | _ -> (Printexc.to_string e))))))
                    in
                      l @ [Some t'], subst'',metasenv'',ugraph2
                | None, Some _  ->
-                  raise (RefineFailure (sprintf
+                  raise (RefineFailure (Reason (sprintf
                                           "Not well typed metavariable instance %s: the local context does not instantiate an hypothesis even if the hypothesis is not restricted in the canonical context %s"
                                           (CicMetaSubst.ppterm subst (Cic.Meta (metano, l)))
-                                          (CicMetaSubst.ppcontext subst canonical_context)))
+                                          (CicMetaSubst.ppcontext subst canonical_context))))
          ) ([],subst,metasenv,ugraph) l lifted_canonical_context 
       with
          Invalid_argument _ ->
            raise
            (RefineFailure
-               (sprintf
+               (Reason (sprintf
                  "Not well typed metavariable instance %s: the length of the local context does not match the length of the canonical context %s"
                  (CicMetaSubst.ppterm subst (Cic.Meta (metano, l)))
-                 (CicMetaSubst.ppcontext subst canonical_context)))
+                 (CicMetaSubst.ppcontext subst canonical_context))))
 
   and check_exp_named_subst metasubst metasenv context tl ugraph =
     let rec check_exp_named_subst_aux metasubst metasenv substs tl ugraph  =
@@ -747,13 +756,13 @@ and type_of_aux' metasenv context t ugraph =
                 (match CicEnvironment.get_cooked_obj ~trust:false uri with
                 Cic.Variable (_,Some bo,_,_) ->
                 raise
-                (RefineFailure
-                "A variable with a body can not be explicit substituted")
+                (RefineFailure (Reason
+                "A variable with a body can not be explicit substituted"))
                 | Cic.Variable (_,None,_,_) -> ()
                 | _ ->
                 raise
-                (RefineFailure
-                ("Unkown variable definition " ^ UriManager.string_of_uri uri))
+                (RefineFailure (Reason
+                ("Unkown variable definition " ^ UriManager.string_of_uri uri)))
                 ) ;
              *)
            let t',typeoft,metasubst',metasenv',ugraph2 =
@@ -764,11 +773,11 @@ and type_of_aux' metasenv context t ugraph =
                fo_unif_subst 
                   metasubst' context metasenv' typeoft typeofvar ugraph2
               with _ ->
-               raise (RefineFailure
+               raise (RefineFailure (Reason
                         ("Wrong Explicit Named Substitution: " ^ 
                            CicMetaSubst.ppterm metasubst' typeoft ^
                          " not unifiable with " ^ 
-                          CicMetaSubst.ppterm metasubst' typeofvar))
+                          CicMetaSubst.ppterm metasubst' typeofvar)))
             in
             (* FIXME: no mere tail recursive! *)
             let exp_name_subst, metasubst''', metasenv''', ugraph4 = 
@@ -812,10 +821,10 @@ and type_of_aux' metasenv context t ugraph =
             in
               t2'',subst,metasenv,ugraph1
        | (_,_) ->
-            raise (RefineFailure (sprintf
+            raise (RefineFailure (Reason (sprintf
                                    "Two sorts were expected, found %s (that reduces to %s) and %s (that reduces to %s)"
                                    (CicPp.ppterm t1) (CicPp.ppterm t1'') (CicPp.ppterm t2)
-                                   (CicPp.ppterm t2'')))
+                                   (CicPp.ppterm t2''))))
 
   and eat_prods subst metasenv context hetype tlbody_and_type ugraph =
     let rec mk_prod metasenv context =
@@ -961,7 +970,7 @@ let type_of_aux' metasenv context term ugraph =
   try 
     type_of_aux' metasenv context term ugraph
   with 
-    CicUniv.UniverseInconsistency msg -> raise (RefineFailure msg)
+    CicUniv.UniverseInconsistency msg -> raise (RefineFailure (Reason msg))
 
 (*CSC: this is a very very rough approximation; to be finished *)
 let are_all_occurrences_positive uri =
@@ -971,7 +980,7 @@ let are_all_occurrences_positive uri =
      Cic.Appl (Cic.MutInd (uri',_,_)::_) when uri = uri' -> ()
    | Cic.MutInd (uri',_,_) when uri = uri' -> ()
    | Cic.Prod (_,_,t) -> aux t
-   | _ -> raise (RefineFailure "not well formed constructor type")
+   | _ -> raise (RefineFailure (Reason "not well formed constructor type"))
  in
   aux
     
@@ -1000,7 +1009,7 @@ let typecheck metasenv uri obj =
        (* instead of raising Uncertain, let's hope that the meta will become
           a sort *)
        | Cic.Meta _ -> ()
-       | _ -> raise (RefineFailure "The term provided is not a type")
+       | _ -> raise (RefineFailure (Reason "The term provided is not a type"))
      end;
      let subst,metasenv,ugraph = fo_unif_subst [] [] metasenv boty ty' ugraph in
      let bo' = CicMetaSubst.apply_subst subst bo' in