]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_unification/cicRefine.ml
Every exception that used to have type string is now a string Lazy.t.
[helm.git] / helm / ocaml / cic_unification / cicRefine.ml
index e3392bf05ff949b9778aa96eccbe43d56b598aa7..120fdceaa1b5a08452ff30c4398a0d0cad76bebd 100644 (file)
 
 open Printf
 
-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;;
+exception RefineFailure of string Lazy.t;;
+exception Uncertain of string Lazy.t;;
+exception AssertFailure of string Lazy.t;;
 
 let debug_print = fun _ -> ()
 
@@ -48,7 +39,7 @@ let foo () =
     CicUnification.fo_unif_subst subst context metasenv t1 t2 ugraph
 in profiler.HExtlib.profile foo ()
   with
-      (CicUnification.UnificationFailure msg) -> raise (RefineFailure (UnificationFailure msg))
+      (CicUnification.UnificationFailure msg) -> raise (RefineFailure msg)
     | (CicUnification.Uncertain msg) -> raise (Uncertain msg)
 ;;
                        
@@ -56,7 +47,7 @@ let rec split l n =
  match (l,n) with
     (l,0) -> ([], l)
   | (he::tl, n) -> let (l1,l2) = split tl (n-1) in (he::l1,l2)
-  | (_,_) -> raise (AssertFailure "split: list too short")
+  | (_,_) -> raise (AssertFailure (lazy "split: list too short"))
 ;;
 
 let rec type_of_constant uri ugraph =
@@ -74,7 +65,7 @@ let rec type_of_constant uri ugraph =
     | C.CurrentProof (_,_,_,ty,_,_) -> ty,u
     | _ ->
        raise
-        (RefineFailure (Reason ("Unknown constant definition " ^  U.string_of_uri uri)))
+        (RefineFailure (lazy ("Unknown constant definition " ^  U.string_of_uri uri)))
 
 and type_of_variable uri ugraph =
   let module C = Cic in
@@ -91,7 +82,7 @@ and type_of_variable uri ugraph =
     | _ ->
         raise
          (RefineFailure
-          (Reason ("Unknown variable definition " ^ UriManager.string_of_uri uri)))
+          (lazy ("Unknown variable definition " ^ UriManager.string_of_uri uri)))
 
 and type_of_mutual_inductive_defs uri i ugraph =
   let module C = Cic in
@@ -110,7 +101,7 @@ and type_of_mutual_inductive_defs uri i ugraph =
     | _ ->
        raise
         (RefineFailure
-         (Reason ("Unknown mutual inductive definition " ^ U.string_of_uri uri)))
+         (lazy ("Unknown mutual inductive definition " ^ U.string_of_uri uri)))
 
 and type_of_mutual_inductive_constr uri i j ugraph =
   let module C = Cic in
@@ -130,7 +121,7 @@ and type_of_mutual_inductive_constr uri i j ugraph =
       | _ ->
          raise
            (RefineFailure
-               (Reason ("Unkown mutual inductive definition " ^ U.string_of_uri uri)))
+               (lazy ("Unkown mutual inductive definition " ^ U.string_of_uri uri)))
 
 
 (* type_of_aux' is just another name (with a different scope) for type_of_aux *)
@@ -169,8 +160,8 @@ and check_branch n context metasenv subst left_args_no actualtype term expectedt
                   check_branch (n+1) 
                      ((Some (name,(C.Decl so)))::context) 
                        metasenv subst left_args_no de' term' de ugraph1
-             | _ -> raise (AssertFailure "Wrong number of arguments"))
-      | _ -> raise (AssertFailure "Prod or MutInd expected")
+             | _ -> raise (AssertFailure (lazy "Wrong number of arguments")))
+      | _ -> raise (AssertFailure (lazy "Prod or MutInd expected"))
 
 and type_of_aux' metasenv context t ugraph =
   let rec type_of_aux subst metasenv context t ugraph =
@@ -193,9 +184,9 @@ and type_of_aux' metasenv context t ugraph =
                        (S.lift n bo) ugraph 
                      in
                       t,ty,subst,metasenv,ugraph
-                | None -> raise (RefineFailure (Reason "Rel to hidden hypothesis"))
+                | None -> raise (RefineFailure (lazy "Rel to hidden hypothesis"))
              with
-                _ -> raise (RefineFailure (Reason "Not a close term"))
+                _ -> raise (RefineFailure (lazy "Not a close term"))
            )
        | C.Var (uri,exp_named_subst) ->
            let exp_named_subst',subst',metasenv',ugraph1 =
@@ -235,7 +226,7 @@ and type_of_aux' metasenv context t ugraph =
              t,(C.Sort (C.Type tno')),subst,metasenv,ugraph1
        | C.Sort _ -> 
             t,C.Sort (C.Type (CicUniv.fresh())),subst,metasenv,ugraph
-       | C.Implicit _ -> raise (AssertFailure "21")
+       | C.Implicit _ -> raise (AssertFailure (lazy "21"))
        | C.Cast (te,ty) ->
            let ty',_,subst',metasenv',ugraph1 =
               type_of_aux subst metasenv context ty ugraph 
@@ -250,7 +241,7 @@ and type_of_aux' metasenv context t ugraph =
                 in
                   C.Cast (te',ty'),ty',subst''',metasenv''',ugraph3
                with
-                  _ -> raise (RefineFailure (Reason "Cast")))
+                  _ -> raise (RefineFailure (lazy "Cast")))
        | C.Prod (name,s,t) ->
            let s',sort1,subst',metasenv',ugraph1 = 
               type_of_aux subst metasenv context s ugraph 
@@ -284,7 +275,7 @@ and type_of_aux' metasenv context t ugraph =
                       | CoercGraph.NoCoercion 
                       | CoercGraph.NotHandled _ -> raise exn
                       | CoercGraph.NotMetaClosed -> 
-                          raise (Uncertain "Coercions on metas")
+                          raise (Uncertain (lazy "Coercions on metas"))
                       | CoercGraph.SomeCoercion c -> Cic.Appl [c;t])
                 in
                 (* this is probably not the best... *)
@@ -322,7 +313,7 @@ and type_of_aux' metasenv context t ugraph =
                   C.Meta _
                 | C.Sort _ -> ()
                 | _ ->
-                    raise (RefineFailure (Reason (sprintf
+                    raise (RefineFailure (lazy (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))))
@@ -366,7 +357,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 (Reason "Appl: no arguments"))
+       | C.Appl _ -> raise (RefineFailure (lazy "Appl: no arguments"))
        | C.Const (uri,exp_named_subst) ->
            let exp_named_subst',subst',metasenv',ugraph1 =
              check_exp_named_subst subst metasenv context 
@@ -410,7 +401,7 @@ and type_of_aux' metasenv context t ugraph =
                | _ ->
                    raise
                      (RefineFailure
-                        (Reason ("Unkown mutual inductive definition " ^ 
+                        (lazy ("Unkown mutual inductive definition " ^ 
                          U.string_of_uri uri)))
            in
           let rec count_prod t =
@@ -613,7 +604,7 @@ and type_of_aux' metasenv context t ugraph =
                        None,ugraph4,metasenv,subst
                in
                match candidate with
-               | None -> raise (Uncertain "can't solve an higher order unification problem") 
+               | None -> raise (Uncertain (lazy "can't solve an higher order unification problem"))
                | Some candidate ->
                    let subst,metasenv,ugraph = 
                      fo_unif_subst subst context metasenv 
@@ -769,7 +760,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 (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))))))
+                   with e -> raise (RefineFailure (lazy (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 -> Lazy.force msg | _ -> (Printexc.to_string e))))))
                    in
                      l @ [Some t],subst',metasenv',ugraph'
                | Some t,Some (_,C.Decl ct) ->
@@ -780,11 +771,11 @@ and type_of_aux' metasenv context t ugraph =
                     (try
                        fo_unif_subst
                          subst' context metasenv' inferredty ct ugraph1
-                     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))))))
+                     with e -> raise (RefineFailure (lazy (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 -> Lazy.force msg | _ -> (Printexc.to_string e))))))
                    in
                      l @ [Some t'], subst'',metasenv'',ugraph2
                | None, Some _  ->
-                  raise (RefineFailure (Reason (sprintf
+                  raise (RefineFailure (lazy (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))))
@@ -793,7 +784,7 @@ and type_of_aux' metasenv context t ugraph =
          Invalid_argument _ ->
            raise
            (RefineFailure
-               (Reason (sprintf
+               (lazy (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))))
@@ -827,7 +818,7 @@ and type_of_aux' metasenv context t ugraph =
                fo_unif_subst 
                   metasubst' context metasenv' typeoft typeofvar ugraph2
               with _ ->
-               raise (RefineFailure (Reason
+               raise (RefineFailure (lazy
                         ("Wrong Explicit Named Substitution: " ^ 
                            CicMetaSubst.ppterm metasubst' typeoft ^
                          " not unifiable with " ^ 
@@ -877,7 +868,7 @@ and type_of_aux' metasenv context t ugraph =
         | _,_ -> 
             raise 
               (RefineFailure 
-                (Reason 
+                (lazy 
                   (sprintf
                     ("Two sorts were expected, found %s " ^^ 
                      "(that reduces to %s) and %s (that reduces to %s)")
@@ -965,7 +956,7 @@ and type_of_aux' metasenv context t ugraph =
                        | CoercGraph.NoCoercion 
                        | CoercGraph.NotHandled _ -> raise exn
                        | CoercGraph.NotMetaClosed -> 
-                           raise (Uncertain "Coercions on meta")
+                           raise (Uncertain (lazy "Coercions on meta"))
                        | CoercGraph.SomeCoercion c -> 
                            (Cic.Appl [ c ; hete ]), subst, metasenv, ugraph
                   in
@@ -1035,7 +1026,7 @@ let type_of_aux' metasenv context term ugraph =
   try 
     type_of_aux' metasenv context term ugraph
   with 
-    CicUniv.UniverseInconsistency msg -> raise (RefineFailure (Reason msg))
+    CicUniv.UniverseInconsistency msg -> raise (RefineFailure (lazy msg))
 
 (*CSC: this is a very very rough approximation; to be finished *)
 let are_all_occurrences_positive uri =
@@ -1045,7 +1036,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 (Reason "not well formed constructor type"))
+   | _ -> raise (RefineFailure (lazy "not well formed constructor type"))
  in
   aux
     
@@ -1074,7 +1065,7 @@ let typecheck metasenv uri obj =
        (* instead of raising Uncertain, let's hope that the meta will become
           a sort *)
        | Cic.Meta _ -> ()
-       | _ -> raise (RefineFailure (Reason "The term provided is not a type"))
+       | _ -> raise (RefineFailure (lazy "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