| author | blanchet | 
| Tue, 04 Dec 2012 23:43:24 +0100 | |
| changeset 50357 | 187ae76a1757 | 
| parent 48615 | d5c9917ff5b6 | 
| child 50358 | b7d3319409b7 | 
| 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 | 
| 48251 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 blanchet parents: 
48250diff
changeset | 10 | type params = Sledgehammer_Provers.params | 
| 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 blanchet parents: 
48250diff
changeset | 11 | |
| 48285 | 12 | val evaluate_mash_suggestions : | 
| 48251 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 blanchet parents: 
48250diff
changeset | 13 | Proof.context -> params -> theory -> string -> unit | 
| 48234 | 14 | end; | 
| 15 | ||
| 48285 | 16 | structure MaSh_Eval : MASH_EVAL = | 
| 48234 | 17 | struct | 
| 48235 | 18 | |
| 48315 
82d6e46c673f
fixed order of accessibles + other tweaks to MaSh
 blanchet parents: 
48313diff
changeset | 19 | open Sledgehammer_Fact | 
| 48381 | 20 | open Sledgehammer_MaSh | 
| 48240 | 21 | |
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 22 | val MePoN = "MePo" | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 23 | val MaShN = "MaSh" | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 24 | val MeshN = "Mesh" | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 25 | val IsarN = "Isar" | 
| 48241 | 26 | |
| 48293 | 27 | val max_facts_slack = 2 | 
| 48235 | 28 | |
| 48438 
3e45c98fe127
distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
 blanchet parents: 
48406diff
changeset | 29 | val all_names = map (rpair () o nickname_of) #> Symtab.make | 
| 48316 
252f45c04042
drastic overhaul of MaSh data structures + fixed a few performance issues
 blanchet parents: 
48315diff
changeset | 30 | |
| 48285 | 31 | fun evaluate_mash_suggestions ctxt params thy file_name = | 
| 48235 | 32 | let | 
| 48293 | 33 |     val {provers, max_facts, slice, type_enc, lam_trans, timeout, ...} =
 | 
| 48239 
0016290f904c
generate Meng--Paulson facts for evaluation purposes
 blanchet parents: 
48236diff
changeset | 34 | Sledgehammer_Isar.default_params ctxt [] | 
| 48318 | 35 | val prover = hd provers | 
| 48313 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 36 | val slack_max_facts = max_facts_slack * the max_facts | 
| 48235 | 37 | val path = file_name |> Path.explode | 
| 38 | val lines = path |> File.read_lines | |
| 48530 
d443166f9520
repaired accessibility chains generated by MaSh exporter + tuned one function out
 blanchet parents: 
48438diff
changeset | 39 | val css = Sledgehammer_Fact.clasimpset_rule_table_of ctxt | 
| 
d443166f9520
repaired accessibility chains generated by MaSh exporter + tuned one function out
 blanchet parents: 
48438diff
changeset | 40 | val facts = | 
| 
d443166f9520
repaired accessibility chains generated by MaSh exporter + tuned one function out
 blanchet parents: 
48438diff
changeset | 41 | all_facts (Proof_Context.init_global thy) false Symtab.empty [] [] css | 
| 48324 | 42 | val all_names = all_names (facts |> map snd) | 
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 43 | val mepo_ok = Unsynchronized.ref 0 | 
| 48241 | 44 | val mash_ok = Unsynchronized.ref 0 | 
| 48298 | 45 | val mesh_ok = Unsynchronized.ref 0 | 
| 48300 | 46 | val isar_ok = Unsynchronized.ref 0 | 
| 48289 | 47 | fun with_index facts s = (find_index (curry (op =) s) facts + 1, s) | 
| 48235 | 48 | fun index_string (j, s) = s ^ "@" ^ string_of_int j | 
| 48615 | 49 |     fun str_of_res label facts ({outcome, run_time, used_facts, ...}: Sledgehammer_Provers.prover_result) =
 | 
| 48289 | 50 | let val facts = facts |> map (fn ((name, _), _) => name ()) in | 
| 51 | " " ^ label ^ ": " ^ | |
| 52 | (if is_none outcome then | |
| 53 |            "Success (" ^ ATP_Util.string_from_time run_time ^ "): " ^
 | |
| 54 | (used_facts |> map (with_index facts o fst) | |
| 55 | |> sort (int_ord o pairself fst) | |
| 56 | |> map index_string | |
| 57 | |> space_implode " ") ^ | |
| 48293 | 58 | (if length facts < the max_facts then | 
| 48289 | 59 | " (of " ^ string_of_int (length facts) ^ ")" | 
| 60 | else | |
| 61 | "") | |
| 62 | else | |
| 63 | "Failure: " ^ | |
| 48293 | 64 | (facts |> take (the max_facts) |> tag_list 1 | 
| 48289 | 65 | |> map index_string | 
| 66 | |> space_implode " ")) | |
| 67 | end | |
| 48311 | 68 | fun solve_goal (j, line) = | 
| 48235 | 69 | let | 
| 48311 | 70 | val (name, suggs) = extract_query line | 
| 48235 | 71 | val th = | 
| 48378 | 72 | case find_first (fn (_, th) => nickname_of th = name) facts of | 
| 48235 | 73 | SOME (_, th) => th | 
| 48530 
d443166f9520
repaired accessibility chains generated by MaSh exporter + tuned one function out
 blanchet parents: 
48438diff
changeset | 74 |           | NONE => error ("No fact called \"" ^ name ^ "\".")
 | 
| 48250 
1065c307fafe
further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
 blanchet parents: 
48245diff
changeset | 75 | val goal = goal_of_thm thy th | 
| 48245 | 76 | val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1 | 
| 48404 | 77 | val isar_deps = isar_dependencies_of all_names th |> these | 
| 48235 | 78 | val facts = facts |> filter (fn (_, th') => thm_ord (th', th) = LESS) | 
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 79 | val mepo_facts = | 
| 48406 | 80 | Sledgehammer_MePo.mepo_suggested_facts ctxt params prover | 
| 48381 | 81 | slack_max_facts NONE hyp_ts concl_t facts | 
| 48406 | 82 | |> Sledgehammer_MePo.weight_mepo_facts | 
| 83 | val mash_facts = suggested_facts suggs facts | |
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 84 | val mess = [(mepo_facts, []), (mash_facts, [])] | 
| 48313 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 85 | val mesh_facts = mesh_facts slack_max_facts mess | 
| 48406 | 86 | val isar_facts = suggested_facts (map (rpair 1.0) isar_deps) facts | 
| 87 | fun prove ok heading get facts = | |
| 48313 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 88 | let | 
| 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 89 | val facts = | 
| 48406 | 90 | facts |> map get | 
| 91 | |> Sledgehammer_Fact.maybe_instantiate_inducts ctxt hyp_ts | |
| 92 | concl_t | |
| 93 | |> take (the max_facts) | |
| 48321 | 94 |             val res as {outcome, ...} =
 | 
| 95 | run_prover_for_mash ctxt params prover facts goal | |
| 48313 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 96 | val _ = if is_none outcome then ok := !ok + 1 else () | 
| 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 blanchet parents: 
48312diff
changeset | 97 | in str_of_res heading facts res end | 
| 48406 | 98 | val mepo_s = prove mepo_ok MePoN fst mepo_facts | 
| 99 | val mash_s = prove mash_ok MaShN fst mash_facts | |
| 100 | val mesh_s = prove mesh_ok MeshN I mesh_facts | |
| 101 | val isar_s = prove isar_ok IsarN fst isar_facts | |
| 48235 | 102 | in | 
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 103 | ["Goal " ^ string_of_int j ^ ": " ^ name, mepo_s, mash_s, mesh_s, | 
| 48300 | 104 | isar_s] | 
| 48241 | 105 | |> cat_lines |> tracing | 
| 48235 | 106 | end | 
| 48241 | 107 | fun total_of heading ok n = | 
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 108 |       "  " ^ heading ^ ": " ^ string_of_int (!ok) ^ " (" ^
 | 
| 48241 | 109 | Real.fmt (StringCvt.FIX (SOME 1)) | 
| 110 | (100.0 * Real.fromInt (!ok) / Real.fromInt n) ^ "%)" | |
| 48250 
1065c307fafe
further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
 blanchet parents: 
48245diff
changeset | 111 | val inst_inducts = Config.get ctxt Sledgehammer_Fact.instantiate_inducts | 
| 48245 | 112 | val options = | 
| 48318 | 113 | [prover, string_of_int (the max_facts) ^ " facts", | 
| 48241 | 114 | "slice" |> not slice ? prefix "dont_", the_default "smart" type_enc, | 
| 115 | the_default "smart" lam_trans, ATP_Util.string_from_time timeout, | |
| 116 | "instantiate_inducts" |> not inst_inducts ? prefix "dont_"] | |
| 117 | val n = length lines | |
| 118 | in | |
| 119 | tracing " * * *"; | |
| 48245 | 120 |     tracing ("Options: " ^ commas options);
 | 
| 48311 | 121 | List.app solve_goal (tag_list 1 lines); | 
| 48241 | 122 | ["Successes (of " ^ string_of_int n ^ " goals)", | 
| 48379 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 123 | total_of MePoN mepo_ok n, | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 124 | total_of MaShN mash_ok n, | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 125 | total_of MeshN mesh_ok n, | 
| 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 blanchet parents: 
48378diff
changeset | 126 | total_of IsarN isar_ok n] | 
| 48241 | 127 | |> cat_lines |> tracing | 
| 128 | end | |
| 48235 | 129 | |
| 48234 | 130 | end; |