Simplified version of Jia's filter. Now all constants are pooled, rather than
authorpaulson
Tue, 28 Mar 2006 16:48:18 +0200
changeset 19334 96ca738055a6
parent 19333 99dbefd7bc2e
child 19335 9e82f341a71b
Simplified version of Jia's filter. Now all constants are pooled, rather than relevance being compared against separate clauses. Rejects are no longer noted, and units cannot be added at the end.
src/HOL/Tools/ATP/reduce_axiomsN.ML
--- a/src/HOL/Tools/ATP/reduce_axiomsN.ML	Tue Mar 28 12:11:33 2006 +0200
+++ b/src/HOL/Tools/ATP/reduce_axiomsN.ML	Tue Mar 28 16:48:18 2006 +0200
@@ -7,11 +7,15 @@
 
 val pass_mark = ref 0.6;
 val reduction_factor = ref 1.0;
+val convergence = ref 4.0;   (*Higher numbers allow longer inference chains*)
 
-(*Whether all "simple" unit clauses should be included*)
+(*FIXME DELETE Whether all "simple" unit clauses should be included*)
 val add_unit = ref false;
 val unit_pass_mark = ref 0.0;
 
+(*The default ignores the constant-count and gives the old Strategy 3*)
+val weight_fn = ref (fn x : real => 1.0);
+
 
 (*Including equality in this list might be expected to stop rules like subset_antisym from
   being chosen, but for some reason filtering works better with them listed.*)
@@ -89,7 +93,6 @@
 
 (**** Constant / Type Frequencies ****)
 
-
 local
 
 fun cons_nr CTVar = 0
@@ -126,9 +129,6 @@
 
 (******** filter clauses ********)
 
-(*The default ignores the constant-count and gives the old Strategy 3*)
-val weight_fn = ref (fn x : real => 1.0);
-
 fun const_weight ctab (c, cts) =
   let val pairs = CTtab.dest (Option.valOf (Symtab.lookup ctab c))
       fun add ((cts',m), n) = if uni_types cts cts' then m+n else n
@@ -150,24 +150,29 @@
 	rel_weight / (rel_weight + real (length consts_typs - length rel))
     end;
     
-fun relevant_clauses ctab rel_axs [] (addc,tmpc) keep =
-      if null addc orelse null tmpc 
-      then (addc @ rel_axs @ keep, tmpc)   (*termination!*)
-      else relevant_clauses ctab addc tmpc ([],[]) (rel_axs @ keep)
-  | relevant_clauses ctab rel_axs ((clstm,(consts_typs,w))::e_axs) (addc,tmpc) keep =
-      let fun clause_weight_ax (_,(refconsts_typs,wa)) =
-              wa * clause_weight ctab refconsts_typs consts_typs;
-          val weight' = List.foldl Real.max w (map clause_weight_ax rel_axs)
-	  val e_ax' = (clstm, (consts_typs,weight'))
-      in
-	if !pass_mark <= weight' 
-	then relevant_clauses ctab rel_axs e_axs (e_ax'::addc, tmpc) keep
-	else relevant_clauses ctab rel_axs e_axs (addc, e_ax'::tmpc) keep
-      end;
-
 fun pair_consts_typs_axiom thy (tm,name) =
     ((tm,name), (consts_typs_of_term thy tm));
 
+fun relevant_clauses ctab p rel_consts =
+  let fun relevant (newrels,rejects) []  =
+	    if null newrels then [] 
+	    else 
+	      let val new_consts = map #2 newrels
+	          val rel_consts' = foldl (op union) rel_consts new_consts
+                  val newp = p + (1.0-p) / !convergence
+	      in Output.debug ("found relevant: " ^ Int.toString (length newrels));
+                 newrels @ relevant_clauses ctab newp rel_consts' rejects
+	      end
+	| relevant (newrels,rejects) ((ax as (clstm,consts_typs)) :: axs) =
+	    let val weight = clause_weight ctab rel_consts consts_typs
+	    in
+	      if p <= weight 
+	      then relevant (ax::newrels, rejects) axs
+	      else relevant (newrels, ax::rejects) axs
+	    end
+    in  Output.debug ("relevant_clauses: " ^ Real.toString p);
+        relevant ([],[]) end;
+
 (*Unit clauses other than non-trivial equations can be included subject to
   a separate (presumably lower) mark. *)
 fun good_unit_clause ((t,_), (_,w)) = 
@@ -177,16 +182,9 @@
 	| Unit_geq => true
 	| Other => false);
 	
-fun axiom_ord ((_,(_,w1)), (_,(_,w2))) = Real.compare (w2,w1);
-
 fun showconst (c,cttab) = 
       List.app (fn n => Output.debug (Int.toString n ^ " occurrences of " ^ c))
 	        (map #2 (CTtab.dest cttab))
-
-fun show_cname (name,k) = name ^ "__" ^ Int.toString k;
-
-fun showax ((_,cname), (_,w)) = 
-    Output.debug ("Axiom " ^ show_cname cname ^ " has weight " ^ Real.toString w)
 	      
 exception ConstFree;
 fun dest_ConstFree (Const aT) = aT
@@ -210,27 +208,11 @@
 fun relevance_filter_aux thy axioms goals = 
   let val const_tab = List.foldl (count_axiom_consts thy) Symtab.empty axioms
       val goals_consts_typs = get_goal_consts_typs thy goals
-      fun relevant [] (rels,nonrels) = (rels,nonrels)
-	| relevant ((clstm,consts_typs)::axs) (rels,nonrels) =
-	    let val weight = clause_weight const_tab goals_consts_typs consts_typs
-		val ccc = (clstm, (consts_typs,weight))
-	    in
-	      if !pass_mark <= weight orelse defines thy clstm goals_consts_typs
-	      then relevant axs (ccc::rels, nonrels)
-	      else relevant axs (rels, ccc::nonrels)
-	    end
-      val (rel_clauses,nrel_clauses) =
-	  relevant (map (pair_consts_typs_axiom thy) axioms) ([],[]) 
-      val (rels,nonrels) = relevant_clauses const_tab rel_clauses nrel_clauses ([],[]) []
-      val max_filtered = floor (!reduction_factor * real (length rels))
-      val rels' = Library.take(max_filtered, Library.sort axiom_ord rels)
+      val rels = relevant_clauses const_tab (!pass_mark) goals_consts_typs 
+                   (map (pair_consts_typs_axiom thy) axioms)
   in
-      if !Output.show_debug_msgs then
-	   (List.app showconst (Symtab.dest const_tab);
-	    List.app showax rels)
-      else ();
-      if !add_unit then (filter good_unit_clause nonrels) @ rels'
-      else rels'
+      Output.debug ("Total relevant: " ^ Int.toString (length rels));
+      rels
   end;
 
 fun relevance_filter thy axioms goals =