]> matita.cs.unibo.it Git - helm.git/blobdiff - components/grafite_engine/grafiteSync.ml
- components: composed coercions mus be generated with current base uri
[helm.git] / components / grafite_engine / grafiteSync.ml
index 37a3132e70e232c04b1437f6613d36c6983a02ef..fecdde3c6a8321edcadec528908ff138222e611f 100644 (file)
 
 open Printf
 
-let add_obj ~basedir uri obj status =
- let lemmas = LibrarySync.add_obj uri obj basedir in
-  {status with GrafiteTypes.objects = uri::status.GrafiteTypes.objects},
+let is_a_variant obj = 
+  match obj with
+    | Cic.Constant(_,_,_,_,attrs) ->
+       List.exists (fun x -> x = `Flavour `Variant) attrs
+    | _ -> false
+
+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
+ 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 uris_to_index = 
+   if is_a_variant obj then []
+   else (uris_for_inductive_type uri obj)@lemmas 
+ in
+ let universe,status =
+   List.fold_left add_to_universe 
+     (status.GrafiteTypes.universe,status) 
+     uris_to_index 
+ in
+  {status with 
+     GrafiteTypes.objects = uri::status.GrafiteTypes.objects;
+     GrafiteTypes.universe = universe},
    lemmas
 
-let add_coercion ~basedir ~add_composites status uri =
- let compounds = LibrarySync.add_coercion ~add_composites ~basedir uri in
+let add_coercion refinement_toolkit ~add_composites status uri arity baseuri =
+ let compounds = 
+   LibrarySync.add_coercion ~add_composites refinement_toolkit uri arity baseuri in
   {status with GrafiteTypes.coercions = uri :: status.GrafiteTypes.coercions},
    compounds
  
@@ -59,8 +127,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 ();
@@ -71,4 +139,5 @@ let init () =
     options = GrafiteTypes.no_options;
     objects = [];
     coercions = [];
+    universe = Universe.empty;
   }