]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_kernel/nCicLibrary.ml
undo/serialization for universes implemented
[helm.git] / helm / software / components / ng_kernel / nCicLibrary.ml
index 1efe173e73620db5c17b3bdd23f781355e2bab4c..43b4a78a3c59428bc7f5b2ef094c2a4de45065be 100644 (file)
 
 exception LibraryOutOfSync of string Lazy.t
 
-let magic = 1;;
+let magic = 2;;
 
 let refresh_uri uri = NUri.uri_of_string (NUri.string_of_uri uri);;
 
+let refresh_uri_in_universe =
+ List.map (fun (x,u) -> x, refresh_uri u)
+;;
+
 let rec refresh_uri_in_term =
  function
-    NCic.Const (NReference.Ref (u,spec)) ->
+  | NCic.Const (NReference.Ref (u,spec)) ->
      NCic.Const (NReference.reference_of_spec (refresh_uri u) spec)
+  | NCic.Sort (NCic.Type l) -> NCic.Sort (NCic.Type (refresh_uri_in_universe l))
   | t -> NCicUtils.map (fun _ _ -> ()) () (fun _ -> refresh_uri_in_term) t
 ;;
 
@@ -57,11 +62,14 @@ let require0 ~baseuri = require_path (path_of_baseuri baseuri);;
 
 let db_path () = Helm_registry.get "matita.basedir" ^ "/ng_db.ng";;
 
+
 type timestamp =
- (NUri.uri * NCic.obj) list *
+ [ `Obj of NUri.uri * NCic.obj 
+ | `Constr of bool * NCic.universe * NCic.universe] list *
  (NUri.uri * string * NReference.reference) list *
  NCic.obj NUri.UriMap.t *
- NUri.uri list;;
+ NUri.uri list
+;;
 
 let time0 = [],[],NUri.UriMap.empty,[];;
 let storage = ref [];;
@@ -126,6 +134,7 @@ let load_db,set_global_aliases,get_global_aliases,add_deps,get_deps,remove_deps=
 
 let init = load_db;;
 
+
 class status =
  object
   val timestamp = (time0 : timestamp)
@@ -141,8 +150,7 @@ let time_travel status =
   let diff_len = List.length !storage - List.length sto in
   let to_be_deleted,_ = HExtlib.split_nth diff_len !storage in
    if List.length to_be_deleted > 0 then
-    let u,_ = HExtlib.list_last to_be_deleted in
-     NCicEnvironment.invalidate_obj u;
+     NCicEnvironment.invalidate_item (HExtlib.list_last to_be_deleted);
    storage := sto; local_aliases := ali; cache := cac; includes := inc
 ;;
 
@@ -151,10 +159,12 @@ let serialize ~baseuri dump =
  Marshal.to_channel ch (magic,dump) [];
  close_out ch;
  List.iter
-  (fun (uri,obj) ->
-    let ch = open_out (path_of_baseuri uri) in
-    Marshal.to_channel ch (magic,obj) [];
-    close_out ch
+  (function 
+   | `Obj (uri,obj) ->
+       let ch = open_out (path_of_baseuri uri) in
+       Marshal.to_channel ch (magic,obj) [];
+       close_out ch
+   | `Constr _ -> ()
   ) !storage;
  set_global_aliases (!local_aliases @ get_global_aliases ());
  List.iter (fun u -> add_deps u [baseuri]) !includes;
@@ -167,7 +177,7 @@ module type Serializer =
   type obj
   val register:
    string ->
-    ('a -> refresh_uri_in_term:(NCic.term -> NCic.term) -> status -> status) ->
+    ('a -> refresh_uri_in_universe:(NCic.universe -> NCic.universe) -> refresh_uri_in_term:(NCic.term -> NCic.term) -> status -> status) ->
     ('a -> obj)
   val serialize: baseuri:NUri.uri -> obj list -> unit
   val require: baseuri:NUri.uri -> status -> status
@@ -187,7 +197,7 @@ module Serializer(S: sig type status end) =
    require1 :=
     (fun (tag',data) as x ->
      if tag=tag' then
-      require (Obj.magic data) ~refresh_uri_in_term
+      require (Obj.magic data) ~refresh_uri_in_universe ~refresh_uri_in_term 
      else
       !require1 x);
    (fun x -> tag,Obj.repr x)
@@ -256,7 +266,7 @@ let aliases_of uri =
 
 let add_obj status ((u,_,_,_,_) as obj) =
  NCicEnvironment.check_and_add_obj obj;
- storage := (u,obj)::!storage;
+ storage := (`Obj (u,obj))::!storage;
   let _,height,_,_,obj = obj in
   let references =
    match obj with
@@ -289,8 +299,18 @@ let add_obj status ((u,_,_,_,_) as obj) =
   status#set_timestamp (!storage,!local_aliases,!cache,!includes)
 ;;
 
+let add_constraint status strict u1 u2 = 
+  NCicEnvironment.add_constraint strict u1 u2;
+  storage := (`Constr (strict,u1,u2)) :: !storage;
+  status#set_timestamp (!storage,!local_aliases,!cache,!includes)
+;;
+
 let get_obj u =
- try List.assq u !storage
+ try 
+  List.assq u 
+   (HExtlib.filter_map 
+    (function `Obj (u,o) -> Some (u,o) | _ -> None )
+    !storage)
  with Not_found ->
   try fetch_obj u
   with Sys_error _ ->