src/HOL/Tools/ATP/reduce_axiomsN.ML
author paulson
Tue, 28 Mar 2006 16:48:18 +0200
changeset 19334 96ca738055a6
parent 19321 30b5bb35dd33
child 19335 9e82f341a71b
permissions -rw-r--r--
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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
     1
(* Authors: Jia Meng, NICTA and Lawrence C Paulson, Cambridge University Computer Laboratory
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
     2
   ID: $Id$
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
     3
   Filtering strategies *)
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
     4
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
     5
structure ReduceAxiomsN =
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
     6
struct
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
     7
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
     8
val pass_mark = ref 0.6;
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
     9
val reduction_factor = ref 1.0;
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
    10
val convergence = ref 4.0;   (*Higher numbers allow longer inference chains*)
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
    11
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
    12
(*FIXME DELETE Whether all "simple" unit clauses should be included*)
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    13
val add_unit = ref false;
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    14
val unit_pass_mark = ref 0.0;
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
    15
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
    16
(*The default ignores the constant-count and gives the old Strategy 3*)
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
    17
val weight_fn = ref (fn x : real => 1.0);
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
    18
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
    19
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    20
(*Including equality in this list might be expected to stop rules like subset_antisym from
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    21
  being chosen, but for some reason filtering works better with them listed.*)
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    22
val standard_consts =
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    23
  ["Trueprop","==>","all","Ex","op &","op |","Not","All","op -->",
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    24
   "op =","==","True","False"];
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
    25
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
    26
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    27
(*** unit clauses ***)
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    28
datatype clause_kind = Unit_neq | Unit_geq | Other
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    29
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    30
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    31
fun literals_of_term args (Const ("Trueprop",_) $ P) = literals_of_term args P
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    32
  | literals_of_term args (Const ("op |",_) $ P $ Q) = 
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    33
    literals_of_term (literals_of_term args P) Q
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    34
  | literals_of_term args P = P::args;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    35
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    36
fun is_ground t = (term_vars t = []) andalso (term_frees t = []);
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    37
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    38
fun eq_clause_type (P,Q) = 
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    39
    if ((is_ground P) orelse (is_ground Q)) then Unit_geq else Other;
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    40
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    41
fun unit_clause_type (Const ("op =",_) $ P $ Q) = eq_clause_type (P,Q)
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    42
  | unit_clause_type _ = Unit_neq;
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    43
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    44
fun clause_kind tm = 
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    45
    case literals_of_term [] tm of
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    46
        [lit] => unit_clause_type lit
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    47
      | _ => Other;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    48
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    49
(*** constants with types ***)
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    50
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    51
(*An abstraction of Isabelle types*)
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    52
datatype const_typ =  CTVar | CType of string * const_typ list
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    53
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    54
fun uni_type (CType(con1,args1)) (CType(con2,args2)) = con1=con2 andalso uni_types args1 args2
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    55
  | uni_type (CType _) CTVar = true
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    56
  | uni_type CTVar CTVar = true
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    57
  | uni_type CTVar _ = false
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    58
and uni_types [] [] = true
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    59
  | uni_types (a1::as1) (a2::as2) = uni_type a1 a2 andalso uni_types as1 as2;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    60
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    61
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    62
fun uni_constants (c1,ctp1) (c2,ctp2) = (c1=c2) andalso uni_types ctp1 ctp2;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    63
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    64
fun uni_mem _ [] = false
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    65
  | uni_mem (c,c_typ) ((c1,c_typ1)::ctyps) =
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    66
      uni_constants (c1,c_typ1) (c,c_typ) orelse uni_mem (c,c_typ) ctyps;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    67
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    68
fun const_typ_of (Type (c,typs)) = CType (c, map const_typ_of typs) 
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    69
  | const_typ_of (TFree _) = CTVar
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    70
  | const_typ_of (TVar _) = CTVar
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    71
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    72
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    73
fun const_with_typ thy (c,typ) = 
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
    74
    let val tvars = Sign.const_typargs thy (c,typ)
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    75
    in (c, map const_typ_of tvars) end
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    76
    handle TYPE _ => (c,[]);   (*Variable (locale constant): monomorphic*)   
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    77
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    78
(*Free variables are counted, as well as constants, to handle locales*)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    79
fun add_term_consts_typs_rm thy (Const(c, typ)) cs =
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    80
      if (c mem standard_consts) then cs 
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    81
      else const_with_typ thy (c,typ) ins cs
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    82
  | add_term_consts_typs_rm thy (Free(c, typ)) cs =
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    83
      const_with_typ thy (c,typ) ins cs
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    84
  | add_term_consts_typs_rm thy (t $ u) cs =
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    85
      add_term_consts_typs_rm thy t (add_term_consts_typs_rm thy u cs)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    86
  | add_term_consts_typs_rm thy (Abs(_,_,t)) cs = add_term_consts_typs_rm thy t cs
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    87
  | add_term_consts_typs_rm thy _ cs = cs;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    88
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
    89
fun consts_typs_of_term thy t = add_term_consts_typs_rm thy t [];
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    90
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
    91
fun get_goal_consts_typs thy cs = foldl (op union) [] (map (consts_typs_of_term thy) cs)
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
    92
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    93
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    94
(**** Constant / Type Frequencies ****)
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    95
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    96
local
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    97
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    98
fun cons_nr CTVar = 0
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
    99
  | cons_nr (CType _) = 1;
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   100
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   101
in
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   102
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   103
fun const_typ_ord TU =
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   104
  case TU of
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   105
    (CType (a, Ts), CType (b, Us)) =>
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   106
      (case fast_string_ord(a,b) of EQUAL => dict_ord const_typ_ord (Ts,Us) | ord => ord)
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   107
  | (T, U) => int_ord (cons_nr T, cons_nr U);
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   108
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   109
end;
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   110
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   111
structure CTtab = TableFun(type key = const_typ list val ord = dict_ord const_typ_ord);
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   112
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   113
fun count_axiom_consts thy ((t,_), tab) = 
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   114
  let fun count_const (a, T, tab) =
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   115
	let val (c, cts) = const_with_typ thy (a,T)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   116
	    val cttab = Option.getOpt (Symtab.lookup tab c, CTtab.empty)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   117
	    val n = Option.getOpt (CTtab.lookup cttab cts, 0)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   118
	in 
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   119
	    Symtab.update (c, CTtab.update (cts, n+1) cttab) tab
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   120
	end
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   121
      fun count_term_consts (Const(a,T), tab) = count_const(a,T,tab)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   122
	| count_term_consts (Free(a,T), tab) = count_const(a,T,tab)
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   123
	| count_term_consts (t $ u, tab) =
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   124
	    count_term_consts (t, count_term_consts (u, tab))
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   125
	| count_term_consts (Abs(_,_,t), tab) = count_term_consts (t, tab)
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   126
	| count_term_consts (_, tab) = tab
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   127
  in  count_term_consts (t, tab)  end;
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   128
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   129
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   130
(******** filter clauses ********)
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   131
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   132
fun const_weight ctab (c, cts) =
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   133
  let val pairs = CTtab.dest (Option.valOf (Symtab.lookup ctab c))
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   134
      fun add ((cts',m), n) = if uni_types cts cts' then m+n else n
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   135
  in  List.foldl add 0 pairs  end;
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   136
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   137
fun add_ct_weight ctab ((c,T), w) =
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   138
  w + !weight_fn (real (const_weight ctab (c,T)));
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   139
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   140
fun consts_typs_weight ctab =
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   141
    List.foldl (add_ct_weight ctab) 0.0;
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   142
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   143
(*Relevant constants are weighted according to frequency, 
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   144
  but irrelevant constants are simply counted. Otherwise, Skolem functions,
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   145
  which are rare, would harm a clause's chances of being picked.*)
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   146
fun clause_weight ctab gctyps consts_typs =
19208
3e8006cbc925 Tidying and restructuring.
paulson
parents: 19200
diff changeset
   147
    let val rel = filter (fn s => uni_mem s gctyps) consts_typs
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   148
        val rel_weight = consts_typs_weight ctab rel
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   149
    in
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   150
	rel_weight / (rel_weight + real (length consts_typs - length rel))
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   151
    end;
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   152
    
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   153
fun pair_consts_typs_axiom thy (tm,name) =
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   154
    ((tm,name), (consts_typs_of_term thy tm));
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   155
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   156
fun relevant_clauses ctab p rel_consts =
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   157
  let fun relevant (newrels,rejects) []  =
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   158
	    if null newrels then [] 
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   159
	    else 
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   160
	      let val new_consts = map #2 newrels
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   161
	          val rel_consts' = foldl (op union) rel_consts new_consts
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   162
                  val newp = p + (1.0-p) / !convergence
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   163
	      in Output.debug ("found relevant: " ^ Int.toString (length newrels));
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   164
                 newrels @ relevant_clauses ctab newp rel_consts' rejects
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   165
	      end
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   166
	| relevant (newrels,rejects) ((ax as (clstm,consts_typs)) :: axs) =
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   167
	    let val weight = clause_weight ctab rel_consts consts_typs
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   168
	    in
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   169
	      if p <= weight 
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   170
	      then relevant (ax::newrels, rejects) axs
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   171
	      else relevant (newrels, ax::rejects) axs
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   172
	    end
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   173
    in  Output.debug ("relevant_clauses: " ^ Real.toString p);
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   174
        relevant ([],[]) end;
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   175
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   176
(*Unit clauses other than non-trivial equations can be included subject to
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   177
  a separate (presumably lower) mark. *)
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   178
fun good_unit_clause ((t,_), (_,w)) = 
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   179
     !unit_pass_mark <= w andalso
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   180
     (case clause_kind t of
19212
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   181
	  Unit_neq => true
ec53c138277a Frequency strategy. Revised indentation, etc.
paulson
parents: 19208
diff changeset
   182
	| Unit_geq => true
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   183
	| Other => false);
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   184
	
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   185
fun showconst (c,cttab) = 
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   186
      List.app (fn n => Output.debug (Int.toString n ^ " occurrences of " ^ c))
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   187
	        (map #2 (CTtab.dest cttab))
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   188
	      
19321
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   189
exception ConstFree;
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   190
fun dest_ConstFree (Const aT) = aT
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   191
  | dest_ConstFree (Free aT) = aT
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   192
  | dest_ConstFree _ = raise ConstFree;
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   193
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   194
(*Look for definitions of the form f ?x1 ... ?xn = t, but not reversed.*)
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   195
fun defines thy (tm,(name,n)) gctypes =
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   196
  let fun defs hs =
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   197
        let val (rator,args) = strip_comb hs
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   198
            val ct = const_with_typ thy (dest_ConstFree rator)
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   199
        in  forall is_Var args andalso uni_mem ct gctypes  end
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   200
        handle ConstFree => false
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   201
  in    
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   202
    case tm of Const ("Trueprop",_) $ (Const("op =",_) $ lhs $ _) => 
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   203
          defs lhs andalso
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   204
          (Output.debug ("Definition found: " ^ name ^ "_" ^ Int.toString n); true)
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   205
      | _ => false
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   206
  end
30b5bb35dd33 detection of definitions of relevant constants
paulson
parents: 19315
diff changeset
   207
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   208
fun relevance_filter_aux thy axioms goals = 
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   209
  let val const_tab = List.foldl (count_axiom_consts thy) Symtab.empty axioms
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   210
      val goals_consts_typs = get_goal_consts_typs thy goals
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   211
      val rels = relevant_clauses const_tab (!pass_mark) goals_consts_typs 
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   212
                   (map (pair_consts_typs_axiom thy) axioms)
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   213
  in
19334
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   214
      Output.debug ("Total relevant: " ^ Int.toString (length rels));
96ca738055a6 Simplified version of Jia's filter. Now all constants are pooled, rather than
paulson
parents: 19321
diff changeset
   215
      rels
19231
c8879dd3a953 Frequency analysis of constants (with types).
paulson
parents: 19212
diff changeset
   216
  end;
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   217
19315
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   218
fun relevance_filter thy axioms goals =
b218cc3d1bb4 Removal of obsolete strategies. Initial support for locales: Frees and Consts
paulson
parents: 19231
diff changeset
   219
  map #1 (relevance_filter_aux thy axioms goals);
19009
bb29bf9d3a72 Added another filter strategy.
mengj
parents: 18791
diff changeset
   220
    
18791
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
   221
9b4ae9fa67a4 Relevance filtering. Has replaced the previous version.
mengj
parents:
diff changeset
   222
end;