]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_proof_checking/cicEnvironment.ml
Big commit and major code clean-up:
[helm.git] / helm / ocaml / cic_proof_checking / cicEnvironment.ml
index 461c3edc62f49d595cdb49fc5e82b23c0c15984e..86b8dd921a246969fb26df7636c10ff0c5edf479 100644 (file)
@@ -44,7 +44,7 @@ let cleanup_tmp = true;;
 let trust = ref  (fun _ -> true);;
 let set_trust f = trust := f
 let trust_obj uri = !trust uri
-
+let debug_print = fun _ -> ()
 
 (* ************************************************************************** *
                                    TYPES 
@@ -99,6 +99,7 @@ module Cache :
    val is_in_frozen: UriManager.uri -> bool
    val is_in_unchecked: UriManager.uri -> bool
    val is_in_cooked: UriManager.uri -> bool
+   val list_all_cooked_uris: unit -> UriManager.uri list
   end 
 =
   struct
@@ -164,6 +165,9 @@ module Cache :
               ) l
             in
              C.Meta(i,l')
+         | C.Sort (C.Type u) -> 
+             CicUniv.assert_univ u;
+             C.Sort (C.Type (CicUniv.recons_univ u))
          | C.Sort _ as t -> t
          | C.Implicit _ as t -> t
          | C.Cast (te,ty) -> C.Cast (restore_in_term te, restore_in_term ty)
@@ -213,7 +217,7 @@ module Cache :
             in
              C.CoFix (i, liftedfl)
       in
-      function
+      function 
          C.Constant (name,bo,ty,params,attrs) ->
            let bo' =
              match bo with
@@ -291,14 +295,14 @@ module Cache :
        *)
       empty (); 
       HT.iter
-       (fun k v ->
+       (fun k (v,u) ->
          callback (UriManager.string_of_uri k);
          HT.add cacheOfCookedObjects 
            (UriManager.uri_of_string (UriManager.string_of_uri k))
             (***********************************************
                TSSI: FIXME add channel stuff for universes
             ************************************************)
-           ((restore_uris v),CicUniv.empty_ugraph))
+           (restore_uris v, CicUniv.recons_graph u))
        restored
     ;;
 
@@ -319,7 +323,7 @@ module Cache :
     (*******************************************************************
       TASSI: invariant
       we need, in the universe generation phase, to traverse objects
-      that are not jet committed, so we search them in the frozen list.
+      that are not yet committed, so we search them in the frozen list.
       Only uncommitted objects without a universe file (see the assertion) 
       can be searched with method
     *******************************************************************)
@@ -392,6 +396,7 @@ module Cache :
            None -> 
              assert false (* only NON dummy universes can be committed *)
          | Some g ->
+              CicUniv.assert_univs_have_uri g;
              frozen_list := List.remove_assq uri !frozen_list ;
              HT.add cacheOfCookedObjects uri (obj,g) 
     with
@@ -425,14 +430,14 @@ module Cache :
               frozen_list := List.remove_assoc uri !frozen_list;
               frozen_list := (uri,(o,Some real_ugraph))::!frozen_list;
           | Some g -> 
-              prerr_endline (
+              debug_print (
                 "You are probably hacking an object already hacked or an"^
                 " object that has the universe file but is not"^
                 " yet committed.");
               assert false
      with
         Not_found -> 
-          prerr_endline (
+          debug_print (
             "You are hacking an object that is not in the"^
             " frozen_list, this means you are probably generating an"^
             " universe file for an object that already"^
@@ -452,12 +457,16 @@ module Cache :
     * something. this means check and frozen must be empty.
     *)
    let remove uri =
-     if (!unchecked_list <> []) || (!frozen_list <> []) then
+     if !frozen_list <> [] then
        failwith "CicEnvironment.remove while type checking"
      else
        HT.remove cacheOfCookedObjects uri 
    ;;
    
+   let  list_all_cooked_uris () =
+     HT.fold (fun u _ l -> u::l) cacheOfCookedObjects []
+   ;;
+   
   end
 ;;
 
@@ -470,72 +479,80 @@ let dump_to_channel = Cache.dump_to_channel;;
 let restore_from_channel = Cache.restore_from_channel;;
 let empty = Cache.empty;;
 
+let total_parsing_time = ref 0.0
+
 let get_object_to_add uri =
- let filename = Http_getter.getxml' uri in
- let bodyfilename =
-   match UriManager.bodyuri_of_uri uri with
-      None -> None
-   |  Some bodyuri ->
-       try
-        ignore (Http_getter.resolve' bodyuri) ;
-        (* The body exists ==> it is not an axiom *)
-        Some (Http_getter.getxml' bodyuri)
-       with
-        Http_getter_types.Key_not_found _ ->
-         (* The body does not exist ==> we consider it an axiom *)
-         None
- in
- let cleanup () =
-   Unix.unlink filename ;
-   (*
-     begin
-       match filename_univ with
-         Some f -> Unix.unlink f
-       | None -> ()
-     end;
-   *)
-   begin
-     match bodyfilename with
-         Some f -> Unix.unlink f
-       | None -> ()
-   end 
- in
- (* this brakes something : 
-  *   let _ = CicUniv.restart_numbering () in 
-  *)
- let obj = 
-   try 
-     CicParser.obj_of_xml filename bodyfilename 
-   with exn -> 
-     cleanup ();
-     (match exn with
-     | CicParser.Getter_failure ("key_not_found", uri) ->
-         raise (Object_not_found (UriManager.uri_of_string uri))
-     | _ -> raise exn)
- in
+ try
+  let filename = Http_getter.getxml' uri in
+  let bodyfilename =
+    match UriManager.bodyuri_of_uri uri with
+       None -> None
+    |  Some bodyuri ->
+        try
+         ignore (Http_getter.resolve' bodyuri) ;
+         (* The body exists ==> it is not an axiom *)
+         Some (Http_getter.getxml' bodyuri)
+        with
+         Http_getter_types.Key_not_found _ ->
+          (* The body does not exist ==> we consider it an axiom *)
+          None
+  in
+  let cleanup () =
+    Unix.unlink filename ;
+    (*
+      begin
+        match filename_univ with
+          Some f -> Unix.unlink f
+        | None -> ()
+      end;
+    *)
+    begin
+      match bodyfilename with
+          Some f -> Unix.unlink f
+        | None -> ()
+    end 
+  in
+  (* restarts the numbering of named universes (the ones inside the cic) *)
+  let _ = CicUniv.restart_numbering () in 
+  let obj = 
+    try 
+      let time = Unix.gettimeofday() in
+      let rc = CicParser.obj_of_xml uri filename bodyfilename in
+      total_parsing_time := 
+        !total_parsing_time +. ((Unix.gettimeofday()) -. time );
+      rc
+    with exn -> 
+      cleanup ();
+      (match exn with
+      | CicParser.Getter_failure ("key_not_found", uri) ->
+          raise (Object_not_found (UriManager.uri_of_string uri))
+      | _ -> raise exn)
+  in
  let ugraph,filename_univ = 
    (* FIXME: decomment this when the universes will be part of the library
-   try 
-     let filename_univ = 
-       Http_getter.getxml' (
-         UriManager.uri_of_string (
-           (UriManager.string_of_uri uri) ^ ".univ")) 
-     in
-       (Some (CicUniv.ugraph_of_xml filename_univ),Some filename_univ)
-   with Failure s ->
-     
-     prerr_endline (
-       "WE HAVE NO UNIVERSE FILE FOR " ^ (UriManager.string_of_uri uri));
-       Inix.unlink
-     None,None
-     *)
-     (**********************************************
-       TASSI: should fail when universes will be ON
-     ***********************************************)
-     (Some CicUniv.empty_ugraph,None)
- in
-   cleanup();
-   obj,ugraph
+    try 
+      let filename_univ = 
+        Http_getter.getxml' (
+          UriManager.uri_of_string (
+            (UriManager.string_of_uri uri) ^ ".univ")) 
+      in
+        (Some (CicUniv.ugraph_of_xml filename_univ),Some filename_univ)
+    with Failure s ->
+      
+      debug_print (
+        "WE HAVE NO UNIVERSE FILE FOR " ^ (UriManager.string_of_uri uri));
+        Inix.unlink
+      None,None
+      *)
+      (**********************************************
+        TASSI: should fail when universes will be ON
+      ***********************************************)
+      (Some CicUniv.empty_ugraph,None)
+  in
+    cleanup();
+    obj,ugraph
+ with
+  Http_getter_types.Key_not_found _ -> raise (Object_not_found uri)
 ;;
  
 (* this is the function to fetch the object in the unchecked list and 
@@ -551,23 +568,29 @@ let find_or_add_to_unchecked uri =
 (* the replacement ugraph must be the one returned by the       *)
 (* typechecker, restricted with the CicUnivUtils.clean_and_fill *)
 let set_type_checking_info ?(replace_ugraph=None) uri =
-  if Cache.can_be_cooked uri && replace_ugraph <> None then
-    invalid_arg (
+(*
+  if not (Cache.can_be_cooked uri) && replace_ugraph <> None then begin
+    debug_print (
       "?replace_ugraph must be None if you are not committing an "^
       "object that has a universe graph associated "^
       "(can happen only in the fase of universes graphs generation).");
-  if not (Cache.can_be_cooked uri) && replace_ugraph = None then
-    invalid_arg (
-      "?replace_ugraph must be (Some ugraph) when committing an object that "^
-      "has no associated universe graph. If this is in make_univ phase you "^
-      "should drop this exception and let univ_make commit thi object with "^
-      "proper arguments");
-  begin
-    match replace_ugraph with 
-       None -> ()
-      | Some g -> Cache.hack_univ uri g
-  end;
-  Cache.frozen_to_cooked uri
+    assert false
+  else
+*)
+  match Cache.can_be_cooked uri, replace_ugraph with
+  | true, Some _
+  | false, None ->
+      debug_print (
+        "?replace_ugraph must be (Some ugraph) when committing an object that "^
+        "has no associated universe graph. If this is in make_univ phase you "^
+        "should drop this exception and let univ_make commit thi object with "^
+        "proper arguments");
+      assert false
+  | _ ->
+      (match replace_ugraph with 
+      | None -> ()
+      | Some g -> Cache.hack_univ uri g);
+      Cache.frozen_to_cooked uri
 ;;
 
 (* fetch, unfreeze and commit an uri to the cacheOfCookedObjects and
@@ -597,7 +620,7 @@ let get_cooked_obj ?(trust=true) base_univ uri =
     else
       (* we don't trust the uri, so we fail *)
       begin
-        prerr_endline ("CACHE MISS: " ^ (UriManager.string_of_uri uri));
+        debug_print ("CACHE MISS: " ^ (UriManager.string_of_uri uri));
         raise Not_found
       end
       
@@ -627,6 +650,7 @@ let is_type_checked ?(trust=true) base_univ uri =
         CheckedObj ( o, CicUniv.merge_ugraphs u base_univ )
     else
       let o,u = find_or_add_to_unchecked uri in
+      Cache.unchecked_to_frozen uri;
         UncheckedObj o
 ;;
 
@@ -640,32 +664,15 @@ let get_obj base_univ uri =
       o,(CicUniv.merge_ugraphs base_univ u)
   with Not_found ->
     (* this should be an error case, but if we trust the uri... *)
-    if trust_obj uri then
-      (* trusting we add it to the unchecked list *)
       let o,u = find_or_add_to_unchecked uri in
         o,(CicUniv.merge_ugraphs base_univ u)
-    else
-      raise Not_found
 ;; 
 
-exception OnlyPutOfInductiveDefinitionsIsAllowed
-
-let put_inductive_definition uri (obj,ugraph) =
- match obj with
-    Cic.InductiveDefinition _ -> Cache.add_cooked uri (obj,ugraph)
-  | _ -> raise OnlyPutOfInductiveDefinitionsIsAllowed
-;;
-
 let in_cache uri =
   Cache.is_in_cooked uri || Cache.is_in_frozen uri || Cache.is_in_unchecked uri
 
-let add_type_checked_term uri (obj,ugraph) =
-  match obj with 
-      Cic.Constant (s,(Some bo),ty,ul,_) ->
-       Cache.add_cooked ~key:uri (obj,ugraph)
-    | _ -> 
-       assert false 
-;;
+let add_type_checked_obj uri (obj,ugraph) =
+ Cache.add_cooked ~key:uri (obj,ugraph)
 
 let in_library uri =
   in_cache uri ||
@@ -674,5 +681,20 @@ let in_library uri =
     true
   with Http_getter_types.Key_not_found _ -> false)
 
-let remove_term = Cache.remove
+let remove_obj = Cache.remove
+  
+let list_uri () = 
+  Cache.list_all_cooked_uris ()
+;;
 
+let list_obj () =
+  try 
+    List.map (fun u -> 
+      let o,ug = get_obj CicUniv.empty_ugraph u in
+        (u,o,ug)) 
+    (list_uri ())
+  with
+    Not_found -> 
+      debug_print "Who has removed the uri in the meanwhile?";
+      raise Not_found
+;;