author | blanchet |
Tue, 28 May 2013 08:52:41 +0200 | |
changeset 52196 | 2281f33e8da6 |
parent 51998 | f732a674db1b |
child 53127 | 60801776d8af |
permissions | -rw-r--r-- |
48380 | 1 |
(* Title: HOL/Tools/Sledgehammer/sledgehammer_mepo.ML |
38027 | 2 |
Author: Jia Meng, Cambridge University Computer Laboratory and NICTA |
36393
be73a2b2443b
support readable names even when Isar proof reconstruction is enabled -- useful for debugging
blanchet
parents:
36227
diff
changeset
|
3 |
Author: Jasmin Blanchette, TU Muenchen |
39958 | 4 |
|
48380 | 5 |
Sledgehammer's iterative relevance filter (MePo = Meng-Paulson). |
33309 | 6 |
*) |
15452 | 7 |
|
48381 | 8 |
signature SLEDGEHAMMER_MEPO = |
16802
6eeee59dac4c
use Toplevel.print_state_hook instead of adhoc Proof.atp_hook;
wenzelm
parents:
16767
diff
changeset
|
9 |
sig |
46340 | 10 |
type stature = ATP_Problem_Generate.stature |
51004
5f2788c38127
distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents:
50985
diff
changeset
|
11 |
type raw_fact = Sledgehammer_Fact.raw_fact |
48296
e7f01b7e244e
gracefully handle the case of empty theories when going up the accessibility chain
blanchet
parents:
48293
diff
changeset
|
12 |
type fact = Sledgehammer_Fact.fact |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
13 |
type params = Sledgehammer_Provers.params |
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
14 |
type relevance_fudge = Sledgehammer_Provers.relevance_fudge |
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
15 |
|
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
16 |
val trace : bool Config.T |
48219 | 17 |
val pseudo_abs_name : string |
18 |
val pseudo_skolem_prefix : string |
|
43351
b19d95b4d736
compute the set of base facts only once (instead of three times in parallel) -- this saves about .5 s of CPU time, albeit much less clock wall time
blanchet
parents:
43324
diff
changeset
|
19 |
val const_names_in_fact : |
b19d95b4d736
compute the set of base facts only once (instead of three times in parallel) -- this saves about .5 s of CPU time, albeit much less clock wall time
blanchet
parents:
43324
diff
changeset
|
20 |
theory -> (string * typ -> term list -> bool * term list) -> term |
b19d95b4d736
compute the set of base facts only once (instead of three times in parallel) -- this saves about .5 s of CPU time, albeit much less clock wall time
blanchet
parents:
43324
diff
changeset
|
21 |
-> string list |
48406 | 22 |
val mepo_suggested_facts : |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
23 |
Proof.context -> params -> string -> int -> relevance_fudge option |
51004
5f2788c38127
distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents:
50985
diff
changeset
|
24 |
-> term list -> term -> raw_fact list -> fact list |
15347 | 25 |
end; |
26 |
||
48381 | 27 |
structure Sledgehammer_MePo : SLEDGEHAMMER_MEPO = |
15347 | 28 |
struct |
29 |
||
46320 | 30 |
open ATP_Problem_Generate |
50608 | 31 |
open Sledgehammer_Util |
48296
e7f01b7e244e
gracefully handle the case of empty theories when going up the accessibility chain
blanchet
parents:
48293
diff
changeset
|
32 |
open Sledgehammer_Fact |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
33 |
open Sledgehammer_Provers |
38652
e063be321438
perform eta-expansion of quantifier bodies in Sledgehammer translation when needed + transform elim rules later;
blanchet
parents:
38644
diff
changeset
|
34 |
|
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
35 |
val trace = |
48308 | 36 |
Attrib.setup_config_bool @{binding sledgehammer_filter_iter_trace} (K false) |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
37 |
fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else () |
35826 | 38 |
|
37616
c8d2d84d6011
always perform relevance filtering on original formulas
blanchet
parents:
37580
diff
changeset
|
39 |
val sledgehammer_prefix = "Sledgehammer" ^ Long_Name.separator |
48219 | 40 |
val pseudo_abs_name = sledgehammer_prefix ^ "abs" |
41 |
val pseudo_skolem_prefix = sledgehammer_prefix ^ "sko" |
|
38992
542474156c66
introduce fudge factors to deal with "theory const"
blanchet
parents:
38988
diff
changeset
|
42 |
val theory_const_suffix = Long_Name.separator ^ " 1" |
37616
c8d2d84d6011
always perform relevance filtering on original formulas
blanchet
parents:
37580
diff
changeset
|
43 |
|
46073
b2594cc862d7
removed special handling for set constants in relevance filter
blanchet
parents:
45982
diff
changeset
|
44 |
fun order_of_type (Type (@{type_name fun}, [T1, T2])) = |
38939 | 45 |
Int.max (order_of_type T1 + 1, order_of_type T2) |
46 |
| order_of_type (Type (_, Ts)) = fold (Integer.max o order_of_type) Ts 0 |
|
47 |
| order_of_type _ = 0 |
|
48 |
||
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
49 |
(* An abstraction of Isabelle types and first-order terms *) |
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
50 |
datatype pattern = PVar | PApp of string * pattern list |
38939 | 51 |
datatype ptype = PType of int * pattern list |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
52 |
|
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
53 |
fun string_of_pattern PVar = "_" |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
54 |
| string_of_pattern (PApp (s, ps)) = |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
55 |
if null ps then s else s ^ string_of_patterns ps |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
56 |
and string_of_patterns ps = "(" ^ commas (map string_of_pattern ps) ^ ")" |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
57 |
fun string_of_ptype (PType (_, ps)) = string_of_patterns ps |
24287 | 58 |
|
59 |
(*Is the second type an instance of the first one?*) |
|
38824 | 60 |
fun match_pattern (PVar, _) = true |
61 |
| match_pattern (PApp _, PVar) = false |
|
62 |
| match_pattern (PApp (s, ps), PApp (t, qs)) = |
|
63 |
s = t andalso match_patterns (ps, qs) |
|
64 |
and match_patterns (_, []) = true |
|
65 |
| match_patterns ([], _) = false |
|
66 |
| match_patterns (p :: ps, q :: qs) = |
|
67 |
match_pattern (p, q) andalso match_patterns (ps, qs) |
|
38939 | 68 |
fun match_ptype (PType (_, ps), PType (_, qs)) = match_patterns (ps, qs) |
24287 | 69 |
|
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
70 |
(* Is there a unifiable constant? *) |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
71 |
fun pconst_mem f consts (s, ps) = |
38939 | 72 |
exists (curry (match_ptype o f) ps) |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
73 |
(map snd (filter (curry (op =) s o fst) consts)) |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
74 |
fun pconst_hyper_mem f const_tab (s, ps) = |
38939 | 75 |
exists (curry (match_ptype o f) ps) (these (Symtab.lookup const_tab s)) |
37505
d9af5c01dc4a
added code to optionally perform fact filtering on the original (non-CNF) formulas
blanchet
parents:
37504
diff
changeset
|
76 |
|
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
77 |
fun pattern_of_type (Type (s, Ts)) = PApp (s, map pattern_of_type Ts) |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
78 |
| pattern_of_type (TFree (s, _)) = PApp (s, []) |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
79 |
| pattern_of_type (TVar _) = PVar |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
80 |
|
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
81 |
(* Pairs a constant with the list of its type instantiations. *) |
41204
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
82 |
fun ptype thy const x = |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
83 |
(if const then map pattern_of_type (these (try (Sign.const_typargs thy) x)) |
41204
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
84 |
else []) |
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
85 |
fun rich_ptype thy const (s, T) = |
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
86 |
PType (order_of_type T, ptype thy const (s, T)) |
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
87 |
fun rich_pconst thy const (s, T) = (s, rich_ptype thy const (s, T)) |
24287 | 88 |
|
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
89 |
fun string_of_hyper_pconst (s, ps) = |
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
90 |
s ^ "{" ^ commas (map string_of_ptype ps) ^ "}" |
24287 | 91 |
|
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
92 |
(* Add a pconstant to the table, but a [] entry means a standard |
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
93 |
connective, which we ignore.*) |
41066
3890ef4e02f9
pass constant arguments to the built-in check function, cf. d2b1fc1b8e19
blanchet
parents:
40418
diff
changeset
|
94 |
fun add_pconst_to_table also_skolem (s, p) = |
48219 | 95 |
if (not also_skolem andalso String.isPrefix pseudo_skolem_prefix s) then I |
41066
3890ef4e02f9
pass constant arguments to the built-in check function, cf. d2b1fc1b8e19
blanchet
parents:
40418
diff
changeset
|
96 |
else Symtab.map_default (s, [p]) (insert (op =) p) |
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
97 |
|
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
98 |
(* Set constants tend to pull in too many irrelevant facts. We limit the damage |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
99 |
by treating them more or less as if they were built-in but add their |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
100 |
axiomatization at the end. *) |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
101 |
val set_consts = [@{const_name Collect}, @{const_name Set.member}] |
47939
9ff976a6c2cb
added "Collect_cong" to cover extensionality of "Collect" (special cases of "ext" pass through the relevant filter)
blanchet
parents:
47933
diff
changeset
|
102 |
val set_thms = @{thms Collect_mem_eq mem_Collect_eq Collect_cong} |
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
103 |
|
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
104 |
fun add_pconsts_in_term thy is_built_in_const also_skolems pos = |
37505
d9af5c01dc4a
added code to optionally perform fact filtering on the original (non-CNF) formulas
blanchet
parents:
37504
diff
changeset
|
105 |
let |
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
106 |
val flip = Option.map not |
38587
1317657d6aa9
fix the relevance filter so that it ignores If, Ex1, Ball, Bex
blanchet
parents:
38395
diff
changeset
|
107 |
(* We include free variables, as well as constants, to handle locales. For |
41205 | 108 |
each quantifiers that must necessarily be skolemized by the automatic |
109 |
prover, we introduce a fresh constant to simulate the effect of |
|
110 |
Skolemization. *) |
|
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
111 |
fun do_const const ext_arg (x as (s, _)) ts = |
41336
0ea5b9c7d233
proper handling of the arguments of SMT builtins -- for numerals, ignore the arguments (Pls, Bit0, Bit1, ..), for functions, consider them;
blanchet
parents:
41279
diff
changeset
|
112 |
let val (built_in, ts) = is_built_in_const x ts in |
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
113 |
if member (op =) set_consts s then |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
114 |
fold (do_term ext_arg) ts |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
115 |
else |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
116 |
(not built_in |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
117 |
? add_pconst_to_table also_skolems (rich_pconst thy const x)) |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
118 |
#> fold (do_term false) ts |
41336
0ea5b9c7d233
proper handling of the arguments of SMT builtins -- for numerals, ignore the arguments (Pls, Bit0, Bit1, ..), for functions, consider them;
blanchet
parents:
41279
diff
changeset
|
119 |
end |
42741
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
120 |
and do_term ext_arg t = |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
121 |
case strip_comb t of |
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
122 |
(Const x, ts) => do_const true ext_arg x ts |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
123 |
| (Free x, ts) => do_const false ext_arg x ts |
38939 | 124 |
| (Abs (_, T, t'), ts) => |
42741
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
125 |
((null ts andalso not ext_arg) |
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
126 |
(* Since lambdas on the right-hand side of equalities are usually |
47953
a2c3706c4cb1
added "ext_cong_neq" lemma (not used yet); tuning
blanchet
parents:
47939
diff
changeset
|
127 |
extensionalized later by "abs_extensionalize_term", we don't |
a2c3706c4cb1
added "ext_cong_neq" lemma (not used yet); tuning
blanchet
parents:
47939
diff
changeset
|
128 |
penalize them here. *) |
48219 | 129 |
? add_pconst_to_table true (pseudo_abs_name, |
130 |
PType (order_of_type T + 1, []))) |
|
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
131 |
#> fold (do_term false) (t' :: ts) |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
132 |
| (_, ts) => fold (do_term false) ts |
38939 | 133 |
fun do_quantifier will_surely_be_skolemized abs_T body_t = |
37537 | 134 |
do_formula pos body_t |
38747 | 135 |
#> (if also_skolems andalso will_surely_be_skolemized then |
48219 | 136 |
add_pconst_to_table true (pseudo_skolem_prefix ^ serial_string (), |
137 |
PType (order_of_type abs_T, [])) |
|
38587
1317657d6aa9
fix the relevance filter so that it ignores If, Ex1, Ball, Bex
blanchet
parents:
38395
diff
changeset
|
138 |
else |
1317657d6aa9
fix the relevance filter so that it ignores If, Ex1, Ball, Bex
blanchet
parents:
38395
diff
changeset
|
139 |
I) |
42741
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
140 |
and do_term_or_formula ext_arg T = |
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
141 |
if T = HOLogic.boolT then do_formula NONE else do_term ext_arg |
37537 | 142 |
and do_formula pos t = |
143 |
case t of |
|
38939 | 144 |
Const (@{const_name all}, _) $ Abs (_, T, t') => |
145 |
do_quantifier (pos = SOME false) T t' |
|
37537 | 146 |
| @{const "==>"} $ t1 $ t2 => |
147 |
do_formula (flip pos) t1 #> do_formula pos t2 |
|
148 |
| Const (@{const_name "=="}, Type (_, [T, _])) $ t1 $ t2 => |
|
42741
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
149 |
do_term_or_formula false T t1 #> do_term_or_formula true T t2 |
37537 | 150 |
| @{const Trueprop} $ t1 => do_formula pos t1 |
41140
9c68004b8c9d
added Sledgehammer support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
151 |
| @{const False} => I |
9c68004b8c9d
added Sledgehammer support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
152 |
| @{const True} => I |
37537 | 153 |
| @{const Not} $ t1 => do_formula (flip pos) t1 |
38939 | 154 |
| Const (@{const_name All}, _) $ Abs (_, T, t') => |
155 |
do_quantifier (pos = SOME false) T t' |
|
156 |
| Const (@{const_name Ex}, _) $ Abs (_, T, t') => |
|
157 |
do_quantifier (pos = SOME true) T t' |
|
38795
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents:
38786
diff
changeset
|
158 |
| @{const HOL.conj} $ t1 $ t2 => fold (do_formula pos) [t1, t2] |
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents:
38786
diff
changeset
|
159 |
| @{const HOL.disj} $ t1 $ t2 => fold (do_formula pos) [t1, t2] |
38786
e46e7a9cb622
formerly unnamed infix impliciation now named HOL.implies
haftmann
parents:
38752
diff
changeset
|
160 |
| @{const HOL.implies} $ t1 $ t2 => |
37537 | 161 |
do_formula (flip pos) t1 #> do_formula pos t2 |
38864
4abe644fcea5
formerly unnamed infix equality now named HOL.eq
haftmann
parents:
38829
diff
changeset
|
162 |
| Const (@{const_name HOL.eq}, Type (_, [T, _])) $ t1 $ t2 => |
42741
546b0bda3cb8
do not pollute relevance filter facts with too many facts about the boring set constants Collect and mem_def, which we might anyway unfold depending on Meson's settings
blanchet
parents:
42738
diff
changeset
|
163 |
do_term_or_formula false T t1 #> do_term_or_formula true T t2 |
38587
1317657d6aa9
fix the relevance filter so that it ignores If, Ex1, Ball, Bex
blanchet
parents:
38395
diff
changeset
|
164 |
| Const (@{const_name If}, Type (_, [_, Type (_, [T, _])])) |
1317657d6aa9
fix the relevance filter so that it ignores If, Ex1, Ball, Bex
blanchet
parents:
38395
diff
changeset
|
165 |
$ t1 $ t2 $ t3 => |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
166 |
do_formula NONE t1 #> fold (do_term_or_formula false T) [t2, t3] |
38939 | 167 |
| Const (@{const_name Ex1}, _) $ Abs (_, T, t') => |
168 |
do_quantifier (is_some pos) T t' |
|
169 |
| Const (@{const_name Ball}, _) $ t1 $ Abs (_, T, t') => |
|
170 |
do_quantifier (pos = SOME false) T |
|
171 |
(HOLogic.mk_imp (incr_boundvars 1 t1 $ Bound 0, t')) |
|
172 |
| Const (@{const_name Bex}, _) $ t1 $ Abs (_, T, t') => |
|
173 |
do_quantifier (pos = SOME true) T |
|
174 |
(HOLogic.mk_conj (incr_boundvars 1 t1 $ Bound 0, t')) |
|
37537 | 175 |
| (t0 as Const (_, @{typ bool})) $ t1 => |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
176 |
do_term false t0 #> do_formula pos t1 (* theory constant *) |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
177 |
| _ => do_term false t |
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
178 |
in do_formula pos end |
24287 | 179 |
|
48227 | 180 |
fun pconsts_in_fact thy is_built_in_const t = |
181 |
Symtab.fold (fn (s, pss) => fold (cons o pair s) pss) |
|
182 |
(Symtab.empty |> add_pconsts_in_term thy is_built_in_const true |
|
183 |
(SOME true) t) [] |
|
184 |
||
185 |
val const_names_in_fact = map fst ooo pconsts_in_fact |
|
186 |
||
187 |
(* Inserts a dummy "constant" referring to the theory name, so that relevance |
|
188 |
takes the given theory into account. *) |
|
41200
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
189 |
fun theory_constify ({theory_const_rel_weight, theory_const_irrel_weight, ...} |
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
190 |
: relevance_fudge) thy_name t = |
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
191 |
if exists (curry (op <) 0.0) [theory_const_rel_weight, |
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
192 |
theory_const_irrel_weight] then |
41200
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
193 |
Const (thy_name ^ theory_const_suffix, @{typ bool}) $ t |
37505
d9af5c01dc4a
added code to optionally perform fact filtering on the original (non-CNF) formulas
blanchet
parents:
37504
diff
changeset
|
194 |
else |
41200
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
195 |
t |
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
196 |
|
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
197 |
fun theory_const_prop_of fudge th = |
6cc9b6fd7f6f
add the current theory's constant to the goal to make theorems from the current theory more relevant on the first iteration already
blanchet
parents:
41199
diff
changeset
|
198 |
theory_constify fudge (Context.theory_name (theory_of_thm th)) (prop_of th) |
37505
d9af5c01dc4a
added code to optionally perform fact filtering on the original (non-CNF) formulas
blanchet
parents:
37504
diff
changeset
|
199 |
|
48227 | 200 |
fun pair_consts_fact thy is_built_in_const fudge fact = |
201 |
case fact |> snd |> theory_const_prop_of fudge |
|
202 |
|> pconsts_in_fact thy is_built_in_const of |
|
203 |
[] => NONE |
|
204 |
| consts => SOME ((fact, consts), NONE) |
|
205 |
||
38743 | 206 |
(* A two-dimensional symbol table counts frequencies of constants. It's keyed |
207 |
first by constant name and second by its list of type instantiations. For the |
|
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
208 |
latter, we need a linear ordering on "pattern list". *) |
24287 | 209 |
|
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
210 |
fun pattern_ord p = |
38743 | 211 |
case p of |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
212 |
(PVar, PVar) => EQUAL |
38823
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
213 |
| (PVar, PApp _) => LESS |
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
214 |
| (PApp _, PVar) => GREATER |
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
215 |
| (PApp q1, PApp q2) => |
828e68441a2f
renaming + treat "TFree" better in "pattern_for_type"
blanchet
parents:
38822
diff
changeset
|
216 |
prod_ord fast_string_ord (dict_ord pattern_ord) (q1, q2) |
38939 | 217 |
fun ptype_ord (PType p, PType q) = |
218 |
prod_ord (dict_ord pattern_ord) int_ord (swap p, swap q) |
|
24287 | 219 |
|
38939 | 220 |
structure PType_Tab = Table(type key = ptype val ord = ptype_ord) |
24287 | 221 |
|
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40191
diff
changeset
|
222 |
fun count_fact_consts thy fudge = |
37503
c2dfa26b9da6
cosmetics + prevent consideration of inlined Skolem terms in relevance filter
blanchet
parents:
37502
diff
changeset
|
223 |
let |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
224 |
fun do_const const (s, T) ts = |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
225 |
(* Two-dimensional table update. Constant maps to types maps to count. *) |
41204
bd57cf5944cb
get rid of experimental feature of term patterns in relevance filter -- doesn't work well unless we take into consideration the equality theory entailed by the relevant facts
blanchet
parents:
41202
diff
changeset
|
226 |
PType_Tab.map_default (rich_ptype thy const (s, T), 0) (Integer.add 1) |
38939 | 227 |
|> Symtab.map_default (s, PType_Tab.empty) |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
228 |
#> fold do_term ts |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
229 |
and do_term t = |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
230 |
case strip_comb t of |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
231 |
(Const x, ts) => do_const true x ts |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
232 |
| (Free x, ts) => do_const false x ts |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
233 |
| (Abs (_, _, t'), ts) => fold do_term (t' :: ts) |
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
234 |
| (_, ts) => fold do_term ts |
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
235 |
in do_term o theory_const_prop_of fudge o snd end |
24287 | 236 |
|
39367 | 237 |
fun pow_int _ 0 = 1.0 |
38939 | 238 |
| pow_int x 1 = x |
239 |
| pow_int x n = if n > 0 then x * pow_int x (n - 1) else pow_int x (n + 1) / x |
|
240 |
||
24287 | 241 |
(*The frequency of a constant is the sum of those of all instances of its type.*) |
38824 | 242 |
fun pconst_freq match const_tab (c, ps) = |
38939 | 243 |
PType_Tab.fold (fn (qs, m) => match (ps, qs) ? Integer.add m) |
244 |
(the (Symtab.lookup const_tab c)) 0 |
|
38686 | 245 |
|
24287 | 246 |
|
38085
cc44e887246c
avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents:
38027
diff
changeset
|
247 |
(* A surprising number of theorems contain only a few significant constants. |
cc44e887246c
avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents:
38027
diff
changeset
|
248 |
These include all induction rules, and other general theorems. *) |
37503
c2dfa26b9da6
cosmetics + prevent consideration of inlined Skolem terms in relevance filter
blanchet
parents:
37502
diff
changeset
|
249 |
|
c2dfa26b9da6
cosmetics + prevent consideration of inlined Skolem terms in relevance filter
blanchet
parents:
37502
diff
changeset
|
250 |
(* "log" seems best in practice. A constant function of one ignores the constant |
38938
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
251 |
frequencies. Rare constants give more points if they are relevant than less |
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
252 |
rare ones. *) |
39367 | 253 |
fun rel_weight_for _ freq = 1.0 + 2.0 / Math.ln (Real.fromInt freq + 1.0) |
38938
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
254 |
|
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
255 |
(* Irrelevant constants are treated differently. We associate lower penalties to |
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
256 |
very rare constants and very common ones -- the former because they can't |
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
257 |
lead to the inclusion of too many new facts, and the latter because they are |
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
258 |
so common as to be of little interest. *) |
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
259 |
fun irrel_weight_for ({worse_irrel_freq, higher_order_irrel_weight, ...} |
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
260 |
: relevance_fudge) order freq = |
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
261 |
let val (k, x) = worse_irrel_freq |> `Real.ceil in |
38939 | 262 |
(if freq < k then Math.ln (Real.fromInt (freq + 1)) / Math.ln x |
263 |
else rel_weight_for order freq / rel_weight_for order k) |
|
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
264 |
* pow_int higher_order_irrel_weight (order - 1) |
38938
2b93dbc07778
improve weighting of irrelevant constants, based on Mirabelle experiments
blanchet
parents:
38937
diff
changeset
|
265 |
end |
37503
c2dfa26b9da6
cosmetics + prevent consideration of inlined Skolem terms in relevance filter
blanchet
parents:
37502
diff
changeset
|
266 |
|
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
267 |
fun multiplier_of_const_name local_const_multiplier s = |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
268 |
if String.isSubstring "." s then 1.0 else local_const_multiplier |
38821 | 269 |
|
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
270 |
(* Computes a constant's weight, as determined by its frequency. *) |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
271 |
fun generic_pconst_weight local_const_multiplier abs_weight skolem_weight |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
272 |
theory_const_weight chained_const_weight weight_for f |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
273 |
const_tab chained_const_tab (c as (s, PType (m, _))) = |
48219 | 274 |
if s = pseudo_abs_name then |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
275 |
abs_weight |
48219 | 276 |
else if String.isPrefix pseudo_skolem_prefix s then |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
277 |
skolem_weight |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
278 |
else if String.isSuffix theory_const_suffix s then |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
279 |
theory_const_weight |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
280 |
else |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
281 |
multiplier_of_const_name local_const_multiplier s |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
282 |
* weight_for m (pconst_freq (match_ptype o f) const_tab c) |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
283 |
|> (if chained_const_weight < 1.0 andalso |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
284 |
pconst_hyper_mem I chained_const_tab c then |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
285 |
curry (op *) chained_const_weight |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
286 |
else |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
287 |
I) |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
288 |
|
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
289 |
fun rel_pconst_weight ({local_const_multiplier, abs_rel_weight, |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
290 |
theory_const_rel_weight, ...} : relevance_fudge) |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
291 |
const_tab = |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
292 |
generic_pconst_weight local_const_multiplier abs_rel_weight 0.0 |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
293 |
theory_const_rel_weight 0.0 rel_weight_for I const_tab |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
294 |
Symtab.empty |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
295 |
|
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
296 |
fun irrel_pconst_weight (fudge as {local_const_multiplier, abs_irrel_weight, |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
297 |
skolem_irrel_weight, |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
298 |
theory_const_irrel_weight, |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
299 |
chained_const_irrel_weight, ...}) |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
300 |
const_tab chained_const_tab = |
41790
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
301 |
generic_pconst_weight local_const_multiplier abs_irrel_weight |
56dcd46ddf7a
give more weight to Frees than to Consts in relevance filter
blanchet
parents:
41768
diff
changeset
|
302 |
skolem_irrel_weight theory_const_irrel_weight |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
303 |
chained_const_irrel_weight (irrel_weight_for fudge) swap |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
304 |
const_tab chained_const_tab |
24287 | 305 |
|
46340 | 306 |
fun stature_bonus ({intro_bonus, ...} : relevance_fudge) (_, Intro) = |
307 |
intro_bonus |
|
308 |
| stature_bonus {elim_bonus, ...} (_, Elim) = elim_bonus |
|
309 |
| stature_bonus {simp_bonus, ...} (_, Simp) = simp_bonus |
|
310 |
| stature_bonus {local_bonus, ...} (Local, _) = local_bonus |
|
311 |
| stature_bonus {assum_bonus, ...} (Assum, _) = assum_bonus |
|
312 |
| stature_bonus {chained_bonus, ...} (Chained, _) = chained_bonus |
|
313 |
| stature_bonus _ _ = 0.0 |
|
38751
01c4d14b2a61
add a bonus for chained facts, since they are likely to be relevant;
blanchet
parents:
38749
diff
changeset
|
314 |
|
40418 | 315 |
fun is_odd_const_name s = |
48219 | 316 |
s = pseudo_abs_name orelse String.isPrefix pseudo_skolem_prefix s orelse |
40418 | 317 |
String.isSuffix theory_const_suffix s |
318 |
||
46340 | 319 |
fun fact_weight fudge stature const_tab relevant_consts chained_consts |
320 |
fact_consts = |
|
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40191
diff
changeset
|
321 |
case fact_consts |> List.partition (pconst_hyper_mem I relevant_consts) |
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40191
diff
changeset
|
322 |
||> filter_out (pconst_hyper_mem swap relevant_consts) of |
38827
cf01645cbbce
extended relevance filter with first-order term matching
blanchet
parents:
38825
diff
changeset
|
323 |
([], _) => 0.0 |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
324 |
| (rel, irrel) => |
40418 | 325 |
if forall (forall (is_odd_const_name o fst)) [rel, irrel] then |
40371 | 326 |
0.0 |
327 |
else |
|
328 |
let |
|
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
329 |
val irrel = irrel |> filter_out (pconst_mem swap rel) |
40371 | 330 |
val rel_weight = |
331 |
0.0 |> fold (curry (op +) o rel_pconst_weight fudge const_tab) rel |
|
332 |
val irrel_weight = |
|
46340 | 333 |
~ (stature_bonus fudge stature) |
42735
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
334 |
|> fold (curry (op +) |
1d375de437e9
fine-tuned the relevance filter, so that equations of the form "c = (%x. _)" and constants occurring in chained facts are not unduely penalized
blanchet
parents:
42732
diff
changeset
|
335 |
o irrel_pconst_weight fudge const_tab chained_consts) irrel |
40371 | 336 |
val res = rel_weight / (rel_weight + irrel_weight) |
337 |
in if Real.isFinite res then res else 0.0 end |
|
38747 | 338 |
|
48293 | 339 |
fun take_most_relevant ctxt max_facts remaining_max |
42728
44cd74a419ce
added configuration options for experimental features
blanchet
parents:
42702
diff
changeset
|
340 |
({max_imperfect, max_imperfect_exp, ...} : relevance_fudge) |
51004
5f2788c38127
distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents:
50985
diff
changeset
|
341 |
(candidates : ((raw_fact * (string * ptype) list) * real) list) = |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
342 |
let |
38747 | 343 |
val max_imperfect = |
40070
bdb890782d4a
replaced references with proper record that's threaded through
blanchet
parents:
39958
diff
changeset
|
344 |
Real.ceil (Math.pow (max_imperfect, |
38904 | 345 |
Math.pow (Real.fromInt remaining_max |
48293 | 346 |
/ Real.fromInt max_facts, max_imperfect_exp))) |
38747 | 347 |
val (perfect, imperfect) = |
38889 | 348 |
candidates |> sort (Real.compare o swap o pairself snd) |
349 |
|> take_prefix (fn (_, w) => w > 0.99999) |
|
38747 | 350 |
val ((accepts, more_rejects), rejects) = |
351 |
chop max_imperfect imperfect |>> append perfect |>> chop remaining_max |
|
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
352 |
in |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
353 |
trace_msg ctxt (fn () => |
41491 | 354 |
"Actually passed (" ^ string_of_int (length accepts) ^ " of " ^ |
355 |
string_of_int (length candidates) ^ "): " ^ |
|
38889 | 356 |
(accepts |> map (fn ((((name, _), _), _), weight) => |
38752
6628adcae4a7
consider "locality" when assigning weights to facts
blanchet
parents:
38751
diff
changeset
|
357 |
name () ^ " [" ^ Real.toString weight ^ "]") |
38745
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
358 |
|> commas)); |
38747 | 359 |
(accepts, more_rejects @ rejects) |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
360 |
end |
24287 | 361 |
|
46340 | 362 |
fun if_empty_replace_with_scope thy is_built_in_const facts sc tab = |
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
363 |
if Symtab.is_empty tab then |
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
364 |
Symtab.empty |
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
365 |
|> fold (add_pconsts_in_term thy is_built_in_const false (SOME false)) |
46340 | 366 |
(map_filter (fn ((_, (sc', _)), th) => |
367 |
if sc' = sc then SOME (prop_of th) else NONE) facts) |
|
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
368 |
else |
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
369 |
tab |
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
370 |
|
42702 | 371 |
fun consider_arities is_built_in_const th = |
41158
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
372 |
let |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
373 |
fun aux _ _ NONE = NONE |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
374 |
| aux t args (SOME tab) = |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
375 |
case t of |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
376 |
t1 $ t2 => SOME tab |> aux t1 (t2 :: args) |> aux t2 [] |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
377 |
| Const (x as (s, _)) => |
41336
0ea5b9c7d233
proper handling of the arguments of SMT builtins -- for numerals, ignore the arguments (Pls, Bit0, Bit1, ..), for functions, consider them;
blanchet
parents:
41279
diff
changeset
|
378 |
(if is_built_in_const x args |> fst then |
41158
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
379 |
SOME tab |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
380 |
else case Symtab.lookup tab s of |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
381 |
NONE => SOME (Symtab.update (s, length args) tab) |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
382 |
| SOME n => if n = length args then SOME tab else NONE) |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
383 |
| _ => SOME tab |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
384 |
in aux (prop_of th) [] end |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
385 |
|
44785 | 386 |
(* FIXME: This is currently only useful for polymorphic type encodings. *) |
42702 | 387 |
fun could_benefit_from_ext is_built_in_const facts = |
388 |
fold (consider_arities is_built_in_const o snd) facts (SOME Symtab.empty) |
|
41158
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
389 |
|> is_none |
8c9c31a757f5
make Sledgehammer's relevance filter include the "ext" rule when appropriate
blanchet
parents:
41140
diff
changeset
|
390 |
|
43492
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
391 |
(* High enough so that it isn't wrongly considered as very relevant (e.g., for E |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
392 |
weights), but low enough so that it is unlikely to be truncated away if few |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
393 |
facts are included. *) |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
394 |
val special_fact_index = 75 |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
395 |
|
48293 | 396 |
fun relevance_filter ctxt thres0 decay max_facts is_built_in_const |
48292 | 397 |
(fudge as {threshold_divisor, ridiculous_threshold, ...}) facts hyp_ts |
398 |
concl_t = |
|
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
399 |
let |
42361 | 400 |
val thy = Proof_Context.theory_of ctxt |
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40191
diff
changeset
|
401 |
val const_tab = fold (count_fact_consts thy fudge) facts Symtab.empty |
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
402 |
val add_pconsts = add_pconsts_in_term thy is_built_in_const false o SOME |
48292 | 403 |
val chained_ts = |
404 |
facts |> map_filter (fn ((_, (Chained, _)), th) => SOME (prop_of th) |
|
405 |
| _ => NONE) |
|
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
406 |
val chained_const_tab = Symtab.empty |> fold (add_pconsts true) chained_ts |
38819
71c9f61516cd
if the goal contains no constants or frees, fall back on chained facts, then on local facts, etc., instead of generating a trivial ATP problem
blanchet
parents:
38818
diff
changeset
|
407 |
val goal_const_tab = |
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
408 |
Symtab.empty |> fold (add_pconsts true) hyp_ts |
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
409 |
|> add_pconsts false concl_t |
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
410 |
|> (fn tab => if Symtab.is_empty tab then chained_const_tab else tab) |
46340 | 411 |
|> fold (if_empty_replace_with_scope thy is_built_in_const facts) |
38993
504b9e1efd33
give priority to assumptions in structured proofs
blanchet
parents:
38992
diff
changeset
|
412 |
[Chained, Assum, Local] |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
413 |
fun iter j remaining_max thres rel_const_tab hopeless hopeful = |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
414 |
let |
40191
257d2e06bfb8
put theorems added using "add:" at the beginning of the list returned by the relevance filter, so that they don't get truncated away
blanchet
parents:
40071
diff
changeset
|
415 |
fun relevant [] _ [] = |
38747 | 416 |
(* Nothing has been added this iteration. *) |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
417 |
if j = 0 andalso thres >= ridiculous_threshold then |
38747 | 418 |
(* First iteration? Try again. *) |
48293 | 419 |
iter 0 max_facts (thres / threshold_divisor) rel_const_tab |
38747 | 420 |
hopeless hopeful |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
421 |
else |
40191
257d2e06bfb8
put theorems added using "add:" at the beginning of the list returned by the relevance filter, so that they don't get truncated away
blanchet
parents:
40071
diff
changeset
|
422 |
[] |
38889 | 423 |
| relevant candidates rejects [] = |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
424 |
let |
38747 | 425 |
val (accepts, more_rejects) = |
48293 | 426 |
take_most_relevant ctxt max_facts remaining_max fudge candidates |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
427 |
val rel_const_tab' = |
38745
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
428 |
rel_const_tab |
41066
3890ef4e02f9
pass constant arguments to the built-in check function, cf. d2b1fc1b8e19
blanchet
parents:
40418
diff
changeset
|
429 |
|> fold (add_pconst_to_table false) (maps (snd o fst) accepts) |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
430 |
fun is_dirty (c, _) = |
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
431 |
Symtab.lookup rel_const_tab' c <> Symtab.lookup rel_const_tab c |
38745
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
432 |
val (hopeful_rejects, hopeless_rejects) = |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
433 |
(rejects @ hopeless, ([], [])) |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
434 |
|-> fold (fn (ax as (_, consts), old_weight) => |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
435 |
if exists is_dirty consts then |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
436 |
apfst (cons (ax, NONE)) |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
437 |
else |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
438 |
apsnd (cons (ax, old_weight))) |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
439 |
|>> append (more_rejects |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
440 |
|> map (fn (ax as (_, consts), old_weight) => |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
441 |
(ax, if exists is_dirty consts then NONE |
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
442 |
else SOME old_weight))) |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
443 |
val thres = |
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
444 |
1.0 - (1.0 - thres) |
38822
aa0101e618e2
fix threshold computation + remove "op =" from relevant constants
blanchet
parents:
38821
diff
changeset
|
445 |
* Math.pow (decay, Real.fromInt (length accepts)) |
38747 | 446 |
val remaining_max = remaining_max - length accepts |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
447 |
in |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
448 |
trace_msg ctxt (fn () => "New or updated constants: " ^ |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
449 |
commas (rel_const_tab' |> Symtab.dest |
38822
aa0101e618e2
fix threshold computation + remove "op =" from relevant constants
blanchet
parents:
38821
diff
changeset
|
450 |
|> subtract (op =) (rel_const_tab |> Symtab.dest) |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
451 |
|> map string_of_hyper_pconst)); |
38745
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
452 |
map (fst o fst) accepts @ |
38747 | 453 |
(if remaining_max = 0 then |
40191
257d2e06bfb8
put theorems added using "add:" at the beginning of the list returned by the relevance filter, so that they don't get truncated away
blanchet
parents:
40071
diff
changeset
|
454 |
[] |
38745
ad577fd62ee4
reorganize options regarding to the relevance threshold and decay
blanchet
parents:
38744
diff
changeset
|
455 |
else |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
456 |
iter (j + 1) remaining_max thres rel_const_tab' |
38747 | 457 |
hopeless_rejects hopeful_rejects) |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
458 |
end |
38889 | 459 |
| relevant candidates rejects |
46340 | 460 |
(((ax as (((_, stature), _), fact_consts)), cached_weight) |
38747 | 461 |
:: hopeful) = |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
462 |
let |
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
463 |
val weight = |
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
464 |
case cached_weight of |
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
465 |
SOME w => w |
46340 | 466 |
| NONE => fact_weight fudge stature const_tab rel_const_tab |
42732
86683865278d
no penality for constants that appear in chained facts
blanchet
parents:
42730
diff
changeset
|
467 |
chained_const_tab fact_consts |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
468 |
in |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
469 |
if weight >= thres then |
38889 | 470 |
relevant ((ax, weight) :: candidates) rejects hopeful |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
471 |
else |
38889 | 472 |
relevant candidates ((ax, weight) :: rejects) hopeful |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
473 |
end |
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
474 |
in |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
475 |
trace_msg ctxt (fn () => |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
476 |
"ITERATION " ^ string_of_int j ^ ": current threshold: " ^ |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
477 |
Real.toString thres ^ ", constants: " ^ |
38744
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
478 |
commas (rel_const_tab |> Symtab.dest |
2b6333f78a9e
make relevance filter work in term of a "max_relevant" option + use Vampire SOS;
blanchet
parents:
38743
diff
changeset
|
479 |
|> filter (curry (op <>) [] o snd) |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
480 |
|> map string_of_hyper_pconst)); |
38889 | 481 |
relevant [] [] hopeful |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
482 |
end |
47933
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
483 |
fun uses_const s t = |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
484 |
fold_aterms (curry (fn (Const (s', _), false) => s' = s | (_, b) => b)) t |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
485 |
false |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
486 |
fun uses_const_anywhere accepts s = |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
487 |
exists (uses_const s o prop_of o snd) accepts orelse |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
488 |
exists (uses_const s) (concl_t :: hyp_ts) |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
489 |
fun add_set_const_thms accepts = |
4e8e0245e8be
treat sets specially in relevance filter, as they used to, to avoid cluttering the problem with facts about Set.member and Collect
blanchet
parents:
47904
diff
changeset
|
490 |
exists (uses_const_anywhere accepts) set_consts ? append set_thms |
43492
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
491 |
fun insert_into_facts accepts [] = accepts |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
492 |
| insert_into_facts accepts ths = |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
493 |
let |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
494 |
val add = facts |> filter (member Thm.eq_thm_prop ths o snd) |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
495 |
val (bef, after) = |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
496 |
accepts |> filter_out (member Thm.eq_thm_prop ths o snd) |
48293 | 497 |
|> take (max_facts - length add) |
43492
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
498 |
|> chop special_fact_index |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
499 |
in bef @ add @ after end |
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
500 |
fun insert_special_facts accepts = |
51026 | 501 |
(* FIXME: get rid of "ext" here once it is treated as a helper *) |
502 |
[] |> could_benefit_from_ext is_built_in_const accepts ? cons @{thm ext} |
|
503 |
|> add_set_const_thms accepts |
|
504 |
|> insert_into_facts accepts |
|
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
505 |
in |
40369
53dca3bd4250
use the SMT integration's official list of built-ins
blanchet
parents:
40251
diff
changeset
|
506 |
facts |> map_filter (pair_consts_fact thy is_built_in_const fudge) |
48293 | 507 |
|> iter 0 max_facts thres0 goal_const_tab [] |
43492
43326cadc31a
insert rather than append special facts to make it less likely that they're truncated away
blanchet
parents:
43477
diff
changeset
|
508 |
|> insert_special_facts |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
509 |
|> tap (fn accepts => trace_msg ctxt (fn () => |
41491 | 510 |
"Total relevant: " ^ string_of_int (length accepts))) |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
511 |
end |
24287 | 512 |
|
48406 | 513 |
fun mepo_suggested_facts ctxt |
48293 | 514 |
({fact_thresholds = (thres0, thres1), ...} : params) prover |
515 |
max_facts fudge hyp_ts concl_t facts = |
|
37538
97ab019d5ac8
make sure that theorems passed using "add:" to Sledgehammer are not eliminated on heuristic grounds
blanchet
parents:
37537
diff
changeset
|
516 |
let |
42361 | 517 |
val thy = Proof_Context.theory_of ctxt |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
518 |
val is_built_in_const = |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
519 |
Sledgehammer_Provers.is_built_in_const_of_prover ctxt prover |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
520 |
val fudge = |
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
521 |
case fudge of |
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
522 |
SOME fudge => fudge |
51998
f732a674db1b
renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents:
51026
diff
changeset
|
523 |
| NONE => Sledgehammer_Provers.relevance_fudge_of_prover ctxt prover |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
524 |
val decay = Math.pow ((1.0 - thres1) / (1.0 - thres0), |
48293 | 525 |
1.0 / Real.fromInt (max_facts + 1)) |
37538
97ab019d5ac8
make sure that theorems passed using "add:" to Sledgehammer are not eliminated on heuristic grounds
blanchet
parents:
37537
diff
changeset
|
526 |
in |
42646
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
527 |
trace_msg ctxt (fn () => "Considering " ^ string_of_int (length facts) ^ |
4781fcd53572
replaced some Unsynchronized.refs with Config.Ts
blanchet
parents:
42641
diff
changeset
|
528 |
" facts"); |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
529 |
(if thres1 < 0.0 then |
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40191
diff
changeset
|
530 |
facts |
48288
255c6e1fd505
rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents:
48250
diff
changeset
|
531 |
else if thres0 > 1.0 orelse thres0 > thres1 then |
38739
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
532 |
[] |
8b8ed80b5699
renamed "relevance_convergence" to "relevance_decay"
blanchet
parents:
38738
diff
changeset
|
533 |
else |
48293 | 534 |
relevance_filter ctxt thres0 decay max_facts is_built_in_const fudge |
535 |
facts hyp_ts |
|
44625 | 536 |
(concl_t |> theory_constify fudge (Context.theory_name thy))) |
51004
5f2788c38127
distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents:
50985
diff
changeset
|
537 |
|> map fact_of_raw_fact |
37538
97ab019d5ac8
make sure that theorems passed using "add:" to Sledgehammer are not eliminated on heuristic grounds
blanchet
parents:
37537
diff
changeset
|
538 |
end |
30536
07b4f050e4df
split relevance-filter and writing of problem-files;
immler@in.tum.de
parents:
30364
diff
changeset
|
539 |
|
15347 | 540 |
end; |