X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicLibrary.ml;h=6d1797677a6f23b8c587afe71709990f9e4189b1;hb=db7f6d6b32515c091e0f338dd4903624f35f27ac;hp=1efe173e73620db5c17b3bdd23f781355e2bab4c;hpb=bd1e80fb01cfb419e256d5899ac5bf8818f11e64;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicLibrary.ml b/helm/software/components/ng_kernel/nCicLibrary.ml index 1efe173e7..6d1797677 100644 --- a/helm/software/components/ng_kernel/nCicLibrary.ml +++ b/helm/software/components/ng_kernel/nCicLibrary.ml @@ -13,21 +13,32 @@ 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)) + | NCic.Match (NReference.Ref (uri,spec),outtype,term,pl) -> + let r = NReference.reference_of_spec (refresh_uri uri) spec in + let outtype = refresh_uri_in_term outtype in + let term = refresh_uri_in_term term in + let pl = List.map refresh_uri_in_term pl in + NCic.Match (r,outtype,term,pl) | t -> NCicUtils.map (fun _ _ -> ()) () (fun _ -> refresh_uri_in_term) t ;; let refresh_uri_in_obj (uri,height,metasenv,subst,obj_kind) = assert (metasenv = []); assert (subst = []); - uri,height,metasenv,subst, + refresh_uri uri,height,metasenv,subst, NCicUntrusted.map_obj_kind refresh_uri_in_term obj_kind ;; @@ -57,11 +68,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 +140,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 +156,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 +165,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 +183,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 +203,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 +272,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 +305,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 _ ->