| author | blanchet | 
| Sun, 29 Jun 2014 18:28:27 +0200 | |
| changeset 57431 | 02c408aed5ee | 
| parent 57406 | e844dcf57deb | 
| child 57432 | 78d7fbe9b203 | 
| permissions | -rw-r--r-- | 
| 48285 | 1  | 
(* Title: HOL/TPTP/mash_eval.ML  | 
| 48234 | 2  | 
Author: Jasmin Blanchette, TU Muenchen  | 
3  | 
Copyright 2012  | 
|
4  | 
||
| 48285 | 5  | 
Evaluate proof suggestions from MaSh (Machine-learning for Sledgehammer).  | 
| 48234 | 6  | 
*)  | 
7  | 
||
| 48285 | 8  | 
signature MASH_EVAL =  | 
| 48234 | 9  | 
sig  | 
| 55201 | 10  | 
type params = Sledgehammer_Prover.params  | 
| 
48251
 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 
blanchet 
parents: 
48250 
diff
changeset
 | 
11  | 
|
| 51015 | 12  | 
val MePoN : string  | 
| 50953 | 13  | 
val MaSh_IsarN : string  | 
14  | 
val MaSh_ProverN : string  | 
|
15  | 
val MeSh_IsarN : string  | 
|
16  | 
val MeSh_ProverN : string  | 
|
17  | 
val IsarN : string  | 
|
| 57406 | 18  | 
val evaluate_mash_suggestions : Proof.context -> params -> int * int option -> string list ->  | 
19  | 
string option -> string -> string -> string -> string -> string -> string -> unit  | 
|
| 48234 | 20  | 
end;  | 
21  | 
||
| 48285 | 22  | 
structure MaSh_Eval : MASH_EVAL =  | 
| 48234 | 23  | 
struct  | 
| 48235 | 24  | 
|
| 50557 | 25  | 
open Sledgehammer_Util  | 
| 
48315
 
82d6e46c673f
fixed order of accessibles + other tweaks to MaSh
 
blanchet 
parents: 
48313 
diff
changeset
 | 
26  | 
open Sledgehammer_Fact  | 
| 50557 | 27  | 
open Sledgehammer_MePo  | 
| 48381 | 28  | 
open Sledgehammer_MaSh  | 
| 55201 | 29  | 
open Sledgehammer_Prover  | 
| 55212 | 30  | 
open Sledgehammer_Prover_ATP  | 
| 55198 | 31  | 
open Sledgehammer_Commands  | 
| 
57431
 
02c408aed5ee
killed Python version of MaSh, now that the SML version works adequately
 
blanchet 
parents: 
57406 
diff
changeset
 | 
32  | 
open MaSh_Export  | 
| 48240 | 33  | 
|
| 
53980
 
7e6a82c593f4
made SML/NJ happy (NB: toplevel ML environment is unmanaged);
 
wenzelm 
parents: 
53139 
diff
changeset
 | 
34  | 
val prefix = Library.prefix  | 
| 
 
7e6a82c593f4
made SML/NJ happy (NB: toplevel ML environment is unmanaged);
 
wenzelm 
parents: 
53139 
diff
changeset
 | 
35  | 
|
| 51008 | 36  | 
val MaSh_IsarN = MaShN ^ "-Isar"  | 
37  | 
val MaSh_ProverN = MaShN ^ "-Prover"  | 
|
38  | 
val MeSh_IsarN = MeShN ^ "-Isar"  | 
|
39  | 
val MeSh_ProverN = MeShN ^ "-Prover"  | 
|
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
40  | 
val IsarN = "Isar"  | 
| 48241 | 41  | 
|
| 57406 | 42  | 
fun evaluate_mash_suggestions ctxt params range methods prob_dir_name mepo_file_name  | 
43  | 
mash_isar_file_name mash_prover_file_name mesh_isar_file_name mesh_prover_file_name  | 
|
44  | 
report_file_name =  | 
|
| 48235 | 45  | 
let  | 
| 55205 | 46  | 
val thy = Proof_Context.theory_of ctxt  | 
| 51028 | 47  | 
val zeros = [0, 0, 0, 0, 0, 0]  | 
| 
50448
 
0a740d127187
have MaSh evaluator keep all raw problem/solution files in a directory
 
blanchet 
parents: 
50442 
diff
changeset
 | 
48  | 
val report_path = report_file_name |> Path.explode  | 
| 
 
0a740d127187
have MaSh evaluator keep all raw problem/solution files in a directory
 
blanchet 
parents: 
50442 
diff
changeset
 | 
49  | 
val _ = File.write report_path ""  | 
| 50589 | 50  | 
fun print s = File.append report_path (s ^ "\n")  | 
| 55205 | 51  | 
    val {provers, max_facts, slice, type_enc, lam_trans, timeout, ...} = default_params thy []
 | 
| 48318 | 52  | 
val prover = hd provers  | 
| 
57108
 
dc0b4f50e288
more generous max number of suggestions, for more safety
 
blanchet 
parents: 
55212 
diff
changeset
 | 
53  | 
val max_suggs = generous_max_suggestions (the max_facts)  | 
| 
50964
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
54  | 
val lines_of = Path.explode #> try File.read_lines #> these  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
55  | 
val file_names =  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
56  | 
[mepo_file_name, mash_isar_file_name, mash_prover_file_name,  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
57  | 
mesh_isar_file_name, mesh_prover_file_name]  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
58  | 
val lines as [mepo_lines, mash_isar_lines, mash_prover_lines,  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
59  | 
mesh_isar_lines, mesh_prover_lines] =  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
60  | 
map lines_of file_names  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
61  | 
val num_lines = fold (Integer.max o length) lines 0  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
62  | 
fun pad lines = lines @ replicate (num_lines - length lines) ""  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
63  | 
val lines =  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
64  | 
pad mepo_lines ~~ pad mash_isar_lines ~~ pad mash_prover_lines ~~  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
65  | 
pad mesh_isar_lines ~~ pad mesh_prover_lines  | 
| 50557 | 66  | 
val css = clasimpset_rule_table_of ctxt  | 
| 
50442
 
4f6a4d32522c
don't blacklist "case" theorems -- this causes problems in MaSh later
 
blanchet 
parents: 
50440 
diff
changeset
 | 
67  | 
val facts = all_facts ctxt true false Symtab.empty [] [] css  | 
| 
50735
 
6b232d76cbc9
refined class handling, to prevent cycles in fact graph
 
blanchet 
parents: 
50633 
diff
changeset
 | 
68  | 
val name_tabs = build_name_tables nickname_of_thm facts  | 
| 48289 | 69  | 
fun with_index facts s = (find_index (curry (op =) s) facts + 1, s)  | 
| 50952 | 70  | 
fun index_str (j, s) = s ^ "@" ^ string_of_int j  | 
| 50953 | 71  | 
val str_of_method = enclose " " ": "  | 
72  | 
    fun str_of_result method facts ({outcome, run_time, used_facts, ...}
 | 
|
| 50952 | 73  | 
: prover_result) =  | 
| 
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: 
50967 
diff
changeset
 | 
74  | 
let val facts = facts |> map (fst o fst) in  | 
| 50953 | 75  | 
str_of_method method ^  | 
| 48289 | 76  | 
(if is_none outcome then  | 
| 
52031
 
9a9238342963
tuning -- renamed '_from_' to '_of_' in Sledgehammer
 
blanchet 
parents: 
51199 
diff
changeset
 | 
77  | 
           "Success (" ^ ATP_Util.string_of_time run_time ^ "): " ^
 | 
| 48289 | 78  | 
(used_facts |> map (with_index facts o fst)  | 
79  | 
|> sort (int_ord o pairself fst)  | 
|
| 50952 | 80  | 
|> map index_str  | 
| 48289 | 81  | 
|> space_implode " ") ^  | 
| 48293 | 82  | 
(if length facts < the max_facts then  | 
| 48289 | 83  | 
" (of " ^ string_of_int (length facts) ^ ")"  | 
84  | 
else  | 
|
85  | 
"")  | 
|
86  | 
else  | 
|
87  | 
"Failure: " ^  | 
|
| 48293 | 88  | 
(facts |> take (the max_facts) |> tag_list 1  | 
| 50952 | 89  | 
|> map index_str  | 
| 48289 | 90  | 
|> space_implode " "))  | 
91  | 
end  | 
|
| 
50964
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
92  | 
fun solve_goal (j, ((((mepo_line, mash_isar_line), mash_prover_line),  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
93  | 
mesh_isar_line), mesh_prover_line)) =  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
94  | 
if in_range range j then  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
95  | 
let  | 
| 
57125
 
2f620ef839ee
added another way of invoking Python code, for experiments
 
blanchet 
parents: 
57108 
diff
changeset
 | 
96  | 
val get_suggs = extract_suggestions ##> (take max_suggs #> map fst)  | 
| 50965 | 97  | 
val (name1, mepo_suggs) = get_suggs mepo_line  | 
98  | 
val (name2, mash_isar_suggs) = get_suggs mash_isar_line  | 
|
99  | 
val (name3, mash_prover_suggs) = get_suggs mash_prover_line  | 
|
100  | 
val (name4, mesh_isar_suggs) = get_suggs mesh_isar_line  | 
|
101  | 
val (name5, mesh_prover_suggs) = get_suggs mesh_prover_line  | 
|
| 
50964
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
102  | 
val [name] =  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
103  | 
[name1, name2, name3, name4, name5]  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
104  | 
|> filter (curry (op <>) "") |> distinct (op =)  | 
| 
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
105  | 
handle General.Match => error "Input files out of sync."  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
106  | 
val th =  | 
| 
50624
 
4d0997abce79
improved thm order hack, in case the default names are overridden
 
blanchet 
parents: 
50620 
diff
changeset
 | 
107  | 
case find_first (fn (_, th) => nickname_of_thm th = name) facts of  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
108  | 
SOME (_, th) => th  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
109  | 
            | NONE => error ("No fact called \"" ^ name ^ "\".")
 | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
110  | 
val goal = goal_of_thm (Proof_Context.theory_of ctxt) th  | 
| 
52196
 
2281f33e8da6
redid rac7830871177 to avoid duplicate fixed variable (e.g. lemma "P (a::nat)" proof - have "!!a::int. Q a" sledgehammer [e])
 
blanchet 
parents: 
52125 
diff
changeset
 | 
111  | 
val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal goal 1 ctxt  | 
| 
57306
 
ff10067b2248
optimized traversal of proof terms by skipping bad apples (e.g. full_exhaustive_int'.pinduct)
 
blanchet 
parents: 
57150 
diff
changeset
 | 
112  | 
val isar_deps = these (isar_dependencies_of name_tabs th)  | 
| 57406 | 113  | 
val facts = facts |> filter (fn (_, th') => thm_less (th', th))  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
114  | 
(* adapted from "mirabelle_sledgehammer.ML" *)  | 
| 50953 | 115  | 
fun set_file_name method (SOME dir) =  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
116  | 
let  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
117  | 
val prob_prefix =  | 
| 50826 | 118  | 
"goal_" ^ string_of_int j ^ "__" ^ encode_str name ^ "__" ^  | 
| 50953 | 119  | 
method  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
120  | 
in  | 
| 55212 | 121  | 
Config.put atp_dest_dir dir  | 
122  | 
#> Config.put atp_problem_prefix (prob_prefix ^ "__")  | 
|
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
123  | 
#> Config.put SMT_Config.debug_files (dir ^ "/" ^ prob_prefix)  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
124  | 
end  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
125  | 
| set_file_name _ NONE = I  | 
| 53139 | 126  | 
fun prove method suggs =  | 
| 50953 | 127  | 
if not (member (op =) methods method) orelse  | 
128  | 
(null facts andalso method <> IsarN) then  | 
|
129  | 
(str_of_method method ^ "Skipped", 0)  | 
|
| 50952 | 130  | 
else  | 
131  | 
let  | 
|
132  | 
fun nickify ((_, stature), th) =  | 
|
133  | 
((K (encode_str (nickname_of_thm th)), stature), th)  | 
|
134  | 
val facts =  | 
|
| 53139 | 135  | 
suggs  | 
136  | 
|> find_suggested_facts ctxt facts  | 
|
137  | 
|> map (fact_of_raw_fact #> nickify)  | 
|
| 50952 | 138  | 
|> maybe_instantiate_inducts ctxt hyp_ts concl_t  | 
139  | 
|> take (the max_facts)  | 
|
| 
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: 
50967 
diff
changeset
 | 
140  | 
|> map fact_of_raw_fact  | 
| 50953 | 141  | 
val ctxt = ctxt |> set_file_name method prob_dir_name  | 
| 50952 | 142  | 
                val res as {outcome, ...} =
 | 
| 
54141
 
f57f8e7a879f
generate a comment storing the goal nickname in "learn_prover"
 
blanchet 
parents: 
53980 
diff
changeset
 | 
143  | 
run_prover_for_mash ctxt params prover name facts goal  | 
| 50952 | 144  | 
val ok = if is_none outcome then 1 else 0  | 
| 50953 | 145  | 
in (str_of_result method facts res, ok) end  | 
| 50591 | 146  | 
val ress =  | 
| 53139 | 147  | 
[fn () => prove MePoN mepo_suggs,  | 
148  | 
fn () => prove MaSh_IsarN mash_isar_suggs,  | 
|
149  | 
fn () => prove MaSh_ProverN mash_prover_suggs,  | 
|
150  | 
fn () => prove MeSh_IsarN mesh_isar_suggs,  | 
|
151  | 
fn () => prove MeSh_ProverN mesh_prover_suggs,  | 
|
152  | 
fn () => prove IsarN isar_deps]  | 
|
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
153  | 
|> (* Par_List. *) map (fn f => f ())  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
154  | 
in  | 
| 50591 | 155  | 
"Goal " ^ string_of_int j ^ ": " ^ name :: map fst ress  | 
| 
50587
 
bd6582be1562
synchronize access to shared reference and print proper total
 
blanchet 
parents: 
50563 
diff
changeset
 | 
156  | 
|> cat_lines |> print;  | 
| 50591 | 157  | 
map snd ress  | 
| 
50559
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
158  | 
end  | 
| 
 
89c0d2f13cca
MaSh exporter can now export subsets of the facts, as consecutive ranges
 
blanchet 
parents: 
50557 
diff
changeset
 | 
159  | 
else  | 
| 51028 | 160  | 
zeros  | 
| 50953 | 161  | 
fun total_of method ok n =  | 
162  | 
      str_of_method method ^ string_of_int ok ^ " (" ^
 | 
|
| 50591 | 163  | 
Real.fmt (StringCvt.FIX (SOME 1))  | 
| 51028 | 164  | 
(100.0 * Real.fromInt ok / Real.fromInt (Int.max (1, n))) ^ "%)"  | 
| 50557 | 165  | 
val inst_inducts = Config.get ctxt instantiate_inducts  | 
| 48245 | 166  | 
val options =  | 
| 50767 | 167  | 
["prover = " ^ prover,  | 
168  | 
"max_facts = " ^ string_of_int (the max_facts),  | 
|
169  | 
"slice" |> not slice ? prefix "dont_",  | 
|
170  | 
"type_enc = " ^ the_default "smart" type_enc,  | 
|
171  | 
"lam_trans = " ^ the_default "smart" lam_trans,  | 
|
| 
54816
 
10d48c2a3e32
made timeouts in Sledgehammer not be 'option's -- simplified lots of code
 
blanchet 
parents: 
54141 
diff
changeset
 | 
172  | 
"timeout = " ^ ATP_Util.string_of_time timeout,  | 
| 48241 | 173  | 
"instantiate_inducts" |> not inst_inducts ? prefix "dont_"]  | 
| 
50587
 
bd6582be1562
synchronize access to shared reference and print proper total
 
blanchet 
parents: 
50563 
diff
changeset
 | 
174  | 
val _ = print " * * *";  | 
| 
 
bd6582be1562
synchronize access to shared reference and print proper total
 
blanchet 
parents: 
50563 
diff
changeset
 | 
175  | 
    val _ = print ("Options: " ^ commas options);
 | 
| 
50964
 
2a990baa09af
use precomputed MaSh/MePo data whenever available
 
blanchet 
parents: 
50953 
diff
changeset
 | 
176  | 
val oks = Par_List.map solve_goal (tag_list 1 lines)  | 
| 50620 | 177  | 
val n = length oks  | 
| 50952 | 178  | 
val [mepo_ok, mash_isar_ok, mash_prover_ok, mesh_isar_ok, mesh_prover_ok,  | 
179  | 
isar_ok] =  | 
|
| 51028 | 180  | 
if n = 0 then zeros else map Integer.sum (map_transpose I oks)  | 
| 48241 | 181  | 
in  | 
182  | 
["Successes (of " ^ string_of_int n ^ " goals)",  | 
|
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
183  | 
total_of MePoN mepo_ok n,  | 
| 50952 | 184  | 
total_of MaSh_IsarN mash_isar_ok n,  | 
185  | 
total_of MaSh_ProverN mash_prover_ok n,  | 
|
186  | 
total_of MeSh_IsarN mesh_isar_ok n,  | 
|
187  | 
total_of MeSh_ProverN mesh_prover_ok n,  | 
|
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
188  | 
total_of IsarN isar_ok n]  | 
| 50437 | 189  | 
|> cat_lines |> print  | 
| 48241 | 190  | 
end  | 
| 48235 | 191  | 
|
| 48234 | 192  | 
end;  |