]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/tactics/paramodulation/saturation.ml
using the new metadataConstraint function
[helm.git] / helm / software / components / tactics / paramodulation / saturation.ml
index f81556c8f997e7088fbfe006b3552fdec48c8132..bb1b3a853515d22c49fecc0e9b43e944e0b55d17 100644 (file)
@@ -1888,8 +1888,19 @@ let rec position_of i x = function
   | _ -> i
 ;;
 
-let superposition_tac ~what ~other ~subterms_only ~demodulate status = 
+(* Syntax: 
+ *   auto superposition target = NAME 
+ *     [table = NAME_LIST] [demod_table = NAME_LIST] [subterms_only]
+ *
+ *  - if table is omitted no superposition will be performed
+ *  - if demod_table is omitted no demodulation will be prformed
+ *  - subterms_only is passed to Indexing.superposition_right
+ *
+ *  lists are coded using _ (example: H_H1_H2)
+ *)
+let superposition_tac ~target ~table ~subterms_only ~demod_table status = 
   reset_refs();
+  Indexing.init_index ();
   let proof,goalno = status in 
   let curi,metasenv,pbo,pty = proof in
   let metano,context,ty = CicUtil.lookup_meta goalno metasenv in
@@ -1897,18 +1908,32 @@ let superposition_tac ~what ~other ~subterms_only ~demodulate status =
   let env = (metasenv, context, CicUniv.empty_ugraph) in
   let names = names_of_context context in
   let eq_index, equalities, maxm = find_equalities context proof in
-  let what = find_in_ctx 1 what context in
-  let other = find_in_ctx 1 other context in
-  let eq_what = List.nth equalities (position_of 0 what eq_index) in
-  let eq_other = List.nth equalities (position_of 0 other eq_index) in
-  let index = Indexing.index Indexing.empty eq_other in
+  let eq_what = 
+    let what = find_in_ctx 1 target context in
+    List.nth equalities (position_of 0 what eq_index)
+  in
+  let eq_other = 
+    if table <> "" then
+      let other = 
+        let others = Str.split (Str.regexp "_") table in 
+        List.map (fun other -> find_in_ctx 1 other context) others 
+      in
+      List.map 
+        (fun other -> List.nth equalities (position_of 0 other eq_index)) 
+        other 
+    else
+      []
+  in
+  let index = List.fold_left Indexing.index Indexing.empty eq_other in
   let maxm, eql = 
+    if table = "" then maxm,[eq_what] else 
     Indexing.superposition_right 
       ~subterms_only eq_uri maxm env index eq_what
   in
   prerr_endline ("Superposition right:");
   prerr_endline ("\n eq: " ^ Equality.string_of_equality eq_what ~env);
-  prerr_endline ("\n table: " ^ Equality.string_of_equality eq_other ~env);
+  prerr_endline ("\n table: ");
+  List.iter (fun e -> prerr_endline ("  " ^ Equality.string_of_equality e ~env)) eq_other;
   prerr_endline ("\n result: ");
   List.iter (fun e -> prerr_endline (Equality.string_of_equality e ~env)) eql;
   prerr_endline ("\n result (cut&paste): ");
@@ -1917,9 +1942,18 @@ let superposition_tac ~what ~other ~subterms_only ~demodulate status =
       let t = Equality.term_of_equality eq_uri e in
       prerr_endline (CicPp.pp t names)) 
   eql;
-  if demodulate then
+  if demod_table <> "" then
     begin
-      let table = List.fold_left Indexing.index Indexing.empty equalities in
+      let demod = 
+        let demod = Str.split (Str.regexp "_") demod_table in 
+        List.map (fun other -> find_in_ctx 1 other context) demod 
+      in
+      let eq_demod = 
+        List.map 
+          (fun demod -> List.nth equalities (position_of 0 demod eq_index)) 
+          demod 
+      in
+      let table = List.fold_left Indexing.index Indexing.empty eq_demod in
       let maxm,eql = 
         List.fold_left 
           (fun (maxm,acc) e -> 
@@ -1946,5 +1980,6 @@ let superposition_tac ~what ~other ~subterms_only ~demodulate status =
 
 let get_stats () = 
   <:show<Saturation.>> ^ Indexing.get_stats () ^ Inference.get_stats () ^
-  Equality.get_stats ();;
+  Equality.get_stats ()
+;;