]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/tactics/metadataQuery.ml
- changes defaults of getxml (format gzipped, don't patch dtd)
[helm.git] / helm / ocaml / tactics / metadataQuery.ml
index 5afd37a9aafe6cb2620412f8d8f19d597f453acd..d0b384e750cfc92ba922fc9136637d294350fb57 100644 (file)
@@ -100,7 +100,7 @@ let match_term ~(dbd:Mysql.dbd) ty =
       None, diff
   in
   let constraints = List.map MetadataTypes.constr_of_metadata metadata in
-  Constr.at_least ~dbd ?full_card ?diff constraints
+    Constr.at_least ~dbd ?full_card ?diff constraints
 
 let ( ** ) x y = int_of_float ((float_of_int x) ** (float_of_int y))
 
@@ -250,13 +250,24 @@ let experimental_hint
   ~(dbd:Mysql.dbd) ?(facts=false) ?signature ((proof, goal) as status) =
   let (_, metasenv, _, _) = proof in
   let (_, context, ty) = CicUtil.lookup_meta goal metasenv in
+  let uris = 
+    if facts then
+      ["cic:/Coq/Init/Logic/eq.ind#xpointer(1/1/1)"]
+    else
+      ["cic:/Coq/Init/Logic/eq.ind#xpointer(1/1/1)";
+       (* "cic:/Coq/Init/Logic/trans_eq.con"; *)
+       "cic:/Coq/Init/Logic/f_equal.con";
+       "cic:/Coq/Init/Logic/f_equal2.con";
+       "cic:/Coq/Init/Logic/f_equal3.con"] 
+  in
+  (* 
   let (uris, (main, sig_constants)) =
     match signature with
     | Some signature -> 
        (Constr.sigmatch ~dbd ~facts signature, signature)
     | None -> 
        (Constr.cmatch' ~dbd ~facts ty, Constr.signature_of ty)
-  in
+  in 
   let uris = List.filter nonvar (List.map snd uris) in
   let uris = List.filter Hashtbl_equiv.not_a_duplicate uris in
   let types_constants =
@@ -284,6 +295,7 @@ let experimental_hint
     in
     Constr.StringSet.union main hyp_and_sug
   in
+(* Constr.StringSet.iter prerr_endline hyp_constants; *)
   let all_constants_closed = close_with_types all_constants metasenv context in
   let other_constants = 
     Constr.StringSet.diff all_constants_closed types_constants
@@ -300,7 +312,7 @@ let experimental_hint
       filter_uris_forward ~dbd (main, other_constants) uris
     end else
       filter_uris_backward ~dbd ~facts (main, other_constants) uris
-  in
+  in *)
   let rec aux = function
     | [] -> []
     | uri :: tl ->
@@ -337,3 +349,92 @@ let elim ~dbd uri =
   in
   MetadataConstraints.at_least ~rating:`Hits ~dbd constraints
 
+
+let fill_with_dummy_constants t =
+  let rec aux i types =
+    function
+       Cic.Lambda (n,s,t) -> 
+         let dummy_uri = 
+           UriManager.uri_of_string ("cic:/dummy_"^(string_of_int i)) in
+           (aux (i+1) (s::types)
+              (CicSubstitution.subst (Cic.Const(dummy_uri,[])) t))
+      | t -> t,types
+  in 
+  let t,types = aux 0 [] t in
+  t, List.rev types
+      
+let instance ~dbd t =
+  let t',types = fill_with_dummy_constants t in 
+  let metadata = MetadataExtractor.compute ~body:None ~ty:t' in
+  List.iter 
+    (fun x -> 
+       prerr_endline 
+        (MetadataPp.pp_constr (MetadataTypes.constr_of_metadata x))) 
+    metadata;
+  let no_concl = MetadataDb.count_distinct `Conclusion metadata in
+  let no_hyp = MetadataDb.count_distinct `Hypothesis metadata in
+  let no_full = MetadataDb.count_distinct `Statement metadata in
+  let is_dummy =
+      function
+         `Obj(s, _) -> (String.sub s 0 10) <> "cic:/dummy" 
+       | _ -> true in
+  let rec look_for_dummy_main =
+    function
+       [] -> None
+      | `Obj(s,`MainConclusion (Some d))::_ 
+         when ((String.sub s 0 10) = "cic:/dummy") -> 
+         let len = String.length s in
+          let dummy_index = int_of_string (String.sub s 11 (len-11)) in
+         let dummy_type = List.nth types dummy_index in
+         Some (d,dummy_type)
+      | _::l -> look_for_dummy_main l in
+  match (look_for_dummy_main metadata) with
+      None->
+       prerr_endline "Caso None";
+       (* no dummy in main position *)
+       let metadata = List.filter is_dummy metadata in
+       let constraints = List.map MetadataTypes.constr_of_metadata metadata in
+       let concl_card = Some (MetadataConstraints.Eq no_concl) in
+       let full_card = Some (MetadataConstraints.Eq no_full) in
+       let diff = Some (MetadataConstraints.Eq (no_hyp - no_concl)) in
+         Constr.at_least ~dbd ?concl_card ?full_card ?diff constraints
+    | Some (depth, dummy_type) ->
+        prerr_endline 
+         (sprintf "Caso Some %d %s" depth (CicPp.ppterm dummy_type));
+       (* a dummy in main position *)
+       let metadata_for_dummy_type = 
+         MetadataExtractor.compute ~body:None ~ty:dummy_type in
+       (* Let us skip this for the moment 
+          let main_of_dummy_type = 
+          look_for_dummy_main metadata_for_dummy_type in *)
+       let metadata = List.filter is_dummy metadata in
+       let constraints = List.map MetadataTypes.constr_of_metadata metadata in
+       let metadata_for_dummy_type = 
+         List.filter is_dummy metadata_for_dummy_type in
+       let constraints_for_dummy_type =
+          List.map MetadataTypes.constr_of_metadata metadata_for_dummy_type in
+       (* start with the dummy constant in main conlusion *)
+       let from = ["refObj as table0"] in
+       let where = 
+         [sprintf "table0.h_position = \"%s\"" MetadataTypes.mainconcl_pos;
+           sprintf "table0.h_depth = %d" depth] in
+       let (n,from,where) =
+         List.fold_left 
+           (MetadataConstraints.add_constraint ~start:2)
+           (2,from,where) constraints in
+       let concl_card = Some (MetadataConstraints.Eq no_concl) in
+       let full_card = Some (MetadataConstraints.Eq no_full) in
+       let diff = Some (MetadataConstraints.Eq (no_hyp - no_concl)) in
+       let (n,from,where) = 
+         MetadataConstraints.add_all_constr 
+           (n,from,where) concl_card full_card diff in
+        (* join with the constraints over the type of the constant *)
+       let where = 
+         (sprintf "table0.h_occurrence = table%d.source" n)::where in
+       let (m,from,where) =
+         List.fold_left 
+           (MetadataConstraints.add_constraint ~start:n)
+           (n,from,where) constraints_for_dummy_type in
+       Constr.exec ~dbd (m,from,where)
+
+