]> matita.cs.unibo.it Git - helm.git/blobdiff - components/grafite_engine/grafiteSync.ml
The status has been extended with a "universe", that is a
[helm.git] / components / grafite_engine / grafiteSync.ml
index 7b4bdfb5e5c04f43bfc44ccd11debbb28cf5a04e..9581dc9d6a708bc5522b8d145db045977ae40cf3 100644 (file)
 
 open Printf
 
+let uris_for_inductive_type uri obj =
+  match obj with 
+    | Cic.InductiveDefinition(types,_,_,_) ->
+       let suri = UriManager.string_of_uri uri in
+       let uris,_ =
+         List.fold_left
+           (fun (acc,i) (_,_,_,constructors)->
+              let is = string_of_int i in           
+              let newacc,_ =
+                List.fold_left
+                  (fun (acc,j) _ ->
+                     let js = string_of_int j in
+                       UriManager.uri_of_string
+                         (suri^"#xpointer(1/"^is^"/"^js^")")::acc,j+1) 
+                  (acc,1) constructors
+              in
+              newacc,i+1)
+           ([],1) types 
+       in uris
+    | _ -> [uri] 
+    
 let add_obj refinement_toolkit uri obj status =
  let lemmas = LibrarySync.add_obj refinement_toolkit uri obj in
-  {status with GrafiteTypes.objects = uri::status.GrafiteTypes.objects},
+ let add_to_universe (universe,status) uri =
+   let term = CicUtil.term_of_uri uri in
+   let ty,_ = CicTypeChecker.type_of_aux' [] [] term CicUniv.empty_ugraph in
+(* prop filtering
+   let sort,_ = CicTypeChecker.type_of_aux' [] [] ty CicUniv.empty_ugraph in
+   prerr_endline (CicPp.ppterm term);
+   prerr_endline (CicPp.ppterm sort);
+   let tkeys = 
+     if sort = Cic.Sort(Cic.Prop) then Universe.keys [] ty 
+     else [] 
+   in
+*)
+   let tkeys = Universe.keys [] ty in
+   let index_cmd = 
+     List.map 
+       (fun key -> GrafiteAst.Index(HExtlib.dummy_floc,(Some key),uri))
+       tkeys
+   in
+(* prop filtering 
+   let universe = 
+     if sort = Cic.Sort(Cic.Prop) then 
+       Universe.index_term_and_unfolded_term universe [] term ty
+     else universe  
+*)
+   let universe = Universe.index_term_and_unfolded_term universe [] term ty
+   in
+   let status = GrafiteTypes.add_moo_content index_cmd status in
+   (universe,status)
+ in
+ let universe,status =
+   List.fold_left add_to_universe 
+     (status.GrafiteTypes.universe,status) 
+     ((uris_for_inductive_type uri obj)@lemmas) in
+  {status with 
+     GrafiteTypes.objects = uri::status.GrafiteTypes.objects;
+     GrafiteTypes.universe = universe},
    lemmas
 
 let add_coercion refinement_toolkit ~add_composites status uri arity =
@@ -60,8 +116,8 @@ let time_travel ~present ~past =
   let coercions_to_remove =
    uri_list_diff present.GrafiteTypes.coercions past.GrafiteTypes.coercions
   in
-   List.iter (fun uri -> LibrarySync.remove_coercion uri) coercions_to_remove;
-   List.iter LibrarySync.remove_obj objs_to_remove
+  List.iter (fun uri -> LibrarySync.remove_coercion uri) coercions_to_remove;
+  List.iter LibrarySync.remove_obj objs_to_remove
 
 let init () =
   LibrarySync.remove_all_coercions ();
@@ -72,4 +128,5 @@ let init () =
     options = GrafiteTypes.no_options;
     objects = [];
     coercions = [];
+    universe = Universe.empty;
   }