| author | blanchet | 
| Mon, 09 Sep 2013 14:23:04 +0200 | |
| changeset 53477 | 75a0427df7a8 | 
| parent 52995 | ab98feb66684 | 
| child 53764 | eba0d1c069b8 | 
| permissions | -rw-r--r-- | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 1 | (* Title: HOL/Tools/Sledgehammer/sledgehammer_minimize_isar.ML | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 2 | Author: Jasmin Blanchette, TU Muenchen | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 3 | Author: Steffen Juilf Smolka, TU Muenchen | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 4 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 5 | Minimize dependencies (used facts) of Isar proof steps. | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 6 | *) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 7 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 8 | signature SLEDGEHAMMER_MINIMIZE_ISAR = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 9 | sig | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 10 | type preplay_interface = Sledgehammer_Preplay.preplay_interface | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 11 | type isar_proof = Sledgehammer_Proof.isar_proof | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 12 | val minimize_dependencies_and_remove_unrefed_steps : | 
| 52632 
23393c31c7fe
added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
 smolkas parents: 
52626diff
changeset | 13 | bool -> preplay_interface -> isar_proof -> isar_proof | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 14 | end | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 15 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 16 | structure Sledgehammer_Minimize_Isar : SLEDGEHAMMER_MINIMIZE_ISAR = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 17 | struct | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 18 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 19 | open Sledgehammer_Util | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 20 | open Sledgehammer_Proof | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 21 | open Sledgehammer_Preplay | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 22 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 23 | val slack = 1.3 | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 24 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 25 | fun min_deps_of_step (_ : preplay_interface) (step as Let _) = step | 
| 52626 | 26 |   | min_deps_of_step {get_preplay_time, set_preplay_time, preplay_quietly, ...}
 | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 27 | (step as Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), method))) = | 
| 52626 | 28 | (case get_preplay_time l of | 
| 29 | (* don't touch steps that time out or fail; minimizing won't help *) | |
| 30 | (true, _) => step | |
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 31 | | (false, time) => | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 32 | let | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 33 | fun mk_step_lfs_gfs lfs gfs = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 34 | Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), method)) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 35 | val mk_step_gfs_lfs = curry (swap #> uncurry mk_step_lfs_gfs) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 36 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 37 | fun minimize_facts _ time min_facts [] = (time, min_facts) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 38 | | minimize_facts mk_step time min_facts (f :: facts) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 39 | (case preplay_quietly (time_mult slack time) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 40 | (mk_step (min_facts @ facts)) of | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 41 | (true, _) => minimize_facts mk_step time (f :: min_facts) facts | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 42 | | (false, time) => minimize_facts mk_step time min_facts facts) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 43 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 44 | val (time, min_lfs) = minimize_facts (mk_step_gfs_lfs gfs) time [] lfs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 45 | val (time, min_gfs) = minimize_facts (mk_step_lfs_gfs min_lfs) time [] gfs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 46 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 47 | in | 
| 52626 | 48 | set_preplay_time l (false, time); | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 49 | mk_step_lfs_gfs min_lfs min_gfs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 50 | end) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 51 | |
| 52632 
23393c31c7fe
added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
 smolkas parents: 
52626diff
changeset | 52 | fun minimize_dependencies_and_remove_unrefed_steps | 
| 
23393c31c7fe
added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
 smolkas parents: 
52626diff
changeset | 53 | isar_minimize preplay_interface proof = | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 54 | let | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 55 | fun cons_to xs x = x :: xs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 56 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 57 | val add_lfs = fold (Ord_List.insert label_ord) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 58 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 59 | fun do_proof (Proof (fix, assms, steps)) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 60 | let | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 61 | val (refed, steps) = do_steps steps | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 62 | in | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 63 | (refed, Proof (fix, assms, steps)) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 64 | end | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 65 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 66 | and do_steps steps = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 67 | let | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 68 | (* the last step is always implicitly referenced *) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 69 | val (steps, (refed, concl)) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 70 | split_last steps | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 71 | ||> do_refed_step | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 72 | in | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 73 | fold_rev do_step steps (refed, [concl]) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 74 | end | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 75 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 76 | and do_step step (refed, accu) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 77 | case label_of_step step of | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 78 | NONE => (refed, step :: accu) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 79 | | SOME l => | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 80 | if Ord_List.member label_ord refed l then | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 81 | do_refed_step step | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 82 | |>> Ord_List.union label_ord refed | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 83 | ||> cons_to accu | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 84 | else | 
| 52626 | 85 | (refed, accu) | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 86 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 87 | and do_refed_step step = | 
| 52632 
23393c31c7fe
added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
 smolkas parents: 
52626diff
changeset | 88 | step | 
| 
23393c31c7fe
added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
 smolkas parents: 
52626diff
changeset | 89 | |> isar_minimize ? min_deps_of_step preplay_interface | 
| 52611 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 90 | |> do_refed_step' | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 91 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 92 | and do_refed_step' (Let _) = raise Fail "Sledgehammer_Minimize_Isar" | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 93 | | do_refed_step' (Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), m))) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 94 | let | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 95 | val (refed, subproofs) = | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 96 | map do_proof subproofs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 97 | |> split_list | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 98 | |>> Ord_List.unions label_ord | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 99 | |>> add_lfs lfs | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 100 | val step = Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), m)) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 101 | in | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 102 | (refed, step) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 103 | end | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 104 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 105 | in | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 106 | snd (do_proof proof) | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 107 | end | 
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 108 | |
| 
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
 smolkas parents: diff
changeset | 109 | end |