| author | lcp | 
| Fri, 16 Dec 1994 17:41:49 +0100 | |
| changeset 800 | 23f55b829ccb | 
| parent 747 | bdc066781063 | 
| child 982 | 4fe0b642b7d5 | 
| permissions | -rw-r--r-- | 
| 0 | 1 | (* Title: Provers/classical | 
| 2 | ID: $Id$ | |
| 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 4 | Copyright 1992 University of Cambridge | |
| 5 | ||
| 6 | Theorem prover for classical reasoning, including predicate calculus, set | |
| 7 | theory, etc. | |
| 8 | ||
| 9 | Rules must be classified as intr, elim, safe, hazardous. | |
| 10 | ||
| 11 | A rule is unsafe unless it can be applied blindly without harmful results. | |
| 12 | For a rule to be safe, its premises and conclusion should be logically | |
| 13 | equivalent. There should be no variables in the premises that are not in | |
| 14 | the conclusion. | |
| 15 | *) | |
| 16 | ||
| 17 | signature CLASSICAL_DATA = | |
| 18 | sig | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 19 | val mp : thm (* [| P-->Q; P |] ==> Q *) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 20 | val not_elim : thm (* [| ~P; P |] ==> R *) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 21 | val classical : thm (* (~P ==> P) ==> P *) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 22 | val sizef : thm -> int (* size function for BEST_FIRST *) | 
| 0 | 23 | val hyp_subst_tacs: (int -> tactic) list | 
| 24 | end; | |
| 25 | ||
| 26 | (*Higher precedence than := facilitates use of references*) | |
| 27 | infix 4 addSIs addSEs addSDs addIs addEs addDs; | |
| 28 | ||
| 29 | ||
| 30 | signature CLASSICAL = | |
| 31 | sig | |
| 32 | type claset | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 33 | val empty_cs : claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 34 | val addDs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 35 | val addEs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 36 | val addIs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 37 | val addSDs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 38 | val addSEs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 39 | val addSIs : claset * thm list -> claset | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 40 | val print_cs : claset -> unit | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 41 |   val rep_claset	: claset -> {safeIs: thm list, safeEs: thm list, 
 | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 42 | hazIs: thm list, hazEs: thm list} | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 43 | val best_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 44 | val contr_tac : int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 45 | val depth_tac : claset -> int -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 46 | val deepen_tac : claset -> int -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 47 | val dup_elim : thm -> thm | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 48 | val dup_intr : thm -> thm | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 49 | val dup_step_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 50 | val eq_mp_tac : int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 51 | val fast_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 52 | val haz_step_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 53 | val joinrules : thm list * thm list -> (bool * thm) list | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 54 | val mp_tac : int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 55 | val safe_tac : claset -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 56 | val safe_step_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 57 | val slow_step_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 58 | val slow_best_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 59 | val slow_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 60 | val step_tac : claset -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 61 | val swap : thm (* ~P ==> (~Q ==> P) ==> Q *) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 62 | val swapify : thm list -> thm list | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 63 | val swap_res_tac : thm list -> int -> tactic | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 64 | val inst_step_tac : claset -> int -> tactic | 
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 65 | val inst0_step_tac : claset -> int -> tactic | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 66 | val instp_step_tac : claset -> int -> tactic | 
| 0 | 67 | end; | 
| 68 | ||
| 69 | ||
| 70 | functor ClassicalFun(Data: CLASSICAL_DATA): CLASSICAL = | |
| 71 | struct | |
| 72 | ||
| 73 | local open Data in | |
| 74 | ||
| 75 | (** Useful tactics for classical reasoning **) | |
| 76 | ||
| 77 | val imp_elim = make_elim mp; | |
| 78 | ||
| 79 | (*Solve goal that assumes both P and ~P. *) | |
| 80 | val contr_tac = eresolve_tac [not_elim] THEN' assume_tac; | |
| 81 | ||
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 82 | (*Finds P-->Q and P in the assumptions, replaces implication by Q. | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 83 | Could do the same thing for P<->Q and P... *) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 84 | fun mp_tac i = eresolve_tac [not_elim, imp_elim] i THEN assume_tac i; | 
| 0 | 85 | |
| 86 | (*Like mp_tac but instantiates no variables*) | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 87 | fun eq_mp_tac i = ematch_tac [not_elim, imp_elim] i THEN eq_assume_tac i; | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 88 | |
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 89 | val swap = rule_by_tactic (etac thin_rl 1) (not_elim RS classical); | 
| 0 | 90 | |
| 91 | (*Creates rules to eliminate ~A, from rules to introduce A*) | |
| 92 | fun swapify intrs = intrs RLN (2, [swap]); | |
| 93 | ||
| 94 | (*Uses introduction rules in the normal way, or on negated assumptions, | |
| 95 | trying rules in order. *) | |
| 96 | fun swap_res_tac rls = | |
| 54 | 97 | let fun addrl (rl,brls) = (false, rl) :: (true, rl RSN (2,swap)) :: brls | 
| 98 | in assume_tac ORELSE' | |
| 99 | contr_tac ORELSE' | |
| 100 | biresolve_tac (foldr addrl (rls,[])) | |
| 0 | 101 | end; | 
| 102 | ||
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 103 | (*Duplication of hazardous rules, for complete provers*) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 104 | fun dup_intr th = standard (th RS classical); | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 105 | |
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 106 | fun dup_elim th = th RSN (2, revcut_rl) |> assumption 2 |> Sequence.hd |> | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 107 | rule_by_tactic (TRYALL (etac revcut_rl)); | 
| 0 | 108 | |
| 109 | (*** Classical rule sets ***) | |
| 110 | ||
| 111 | type netpair = (int*(bool*thm)) Net.net * (int*(bool*thm)) Net.net; | |
| 112 | ||
| 113 | datatype claset = | |
| 114 |   CS of {safeIs		: thm list,
 | |
| 115 | safeEs : thm list, | |
| 116 | hazIs : thm list, | |
| 117 | hazEs : thm list, | |
| 118 | safe0_netpair : netpair, | |
| 119 | safep_netpair : netpair, | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 120 | haz_netpair : netpair, | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 121 | dup_netpair : netpair}; | 
| 0 | 122 | |
| 123 | fun rep_claset (CS{safeIs,safeEs,hazIs,hazEs,...}) = 
 | |
| 124 |     {safeIs=safeIs, safeEs=safeEs, hazIs=hazIs, hazEs=hazEs};
 | |
| 125 | ||
| 126 | (*For use with biresolve_tac. Combines intrs with swap to catch negated | |
| 127 | assumptions; pairs elims with true; sorts. *) | |
| 128 | fun joinrules (intrs,elims) = | |
| 129 | sort lessb | |
| 130 | (map (pair true) (elims @ swapify intrs) @ | |
| 131 | map (pair false) intrs); | |
| 132 | ||
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 133 | val build = build_netpair(Net.empty,Net.empty); | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 134 | |
| 0 | 135 | (*Make a claset from the four kinds of rules*) | 
| 136 | fun make_cs {safeIs,safeEs,hazIs,hazEs} =
 | |
| 137 | let val (safe0_brls, safep_brls) = (*0 subgoals vs 1 or more*) | |
| 138 | take_prefix (fn brl => subgoals_of_brl brl=0) | |
| 139 | (joinrules(safeIs, safeEs)) | |
| 140 |   in CS{safeIs = safeIs, 
 | |
| 141 | safeEs = safeEs, | |
| 142 | hazIs = hazIs, | |
| 143 | hazEs = hazEs, | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 144 | safe0_netpair = build safe0_brls, | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 145 | safep_netpair = build safep_brls, | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 146 | haz_netpair = build (joinrules(hazIs, hazEs)), | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 147 | dup_netpair = build (joinrules(map dup_intr hazIs, | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 148 | map dup_elim hazEs))} | 
| 0 | 149 | end; | 
| 150 | ||
| 151 | (*** Manipulation of clasets ***) | |
| 152 | ||
| 153 | val empty_cs = make_cs{safeIs=[], safeEs=[], hazIs=[], hazEs=[]};
 | |
| 154 | ||
| 155 | fun print_cs (CS{safeIs,safeEs,hazIs,hazEs,...}) =
 | |
| 156 | (writeln"Introduction rules"; prths hazIs; | |
| 157 | writeln"Safe introduction rules"; prths safeIs; | |
| 158 | writeln"Elimination rules"; prths hazEs; | |
| 159 | writeln"Safe elimination rules"; prths safeEs; | |
| 160 | ()); | |
| 161 | ||
| 162 | fun (CS{safeIs,safeEs,hazIs,hazEs,...}) addSIs ths =
 | |
| 163 |   make_cs {safeIs=ths@safeIs, safeEs=safeEs, hazIs=hazIs, hazEs=hazEs};
 | |
| 164 | ||
| 165 | fun (CS{safeIs,safeEs,hazIs,hazEs,...}) addSEs ths =
 | |
| 166 |   make_cs {safeIs=safeIs, safeEs=ths@safeEs, hazIs=hazIs, hazEs=hazEs};
 | |
| 167 | ||
| 168 | fun cs addSDs ths = cs addSEs (map make_elim ths); | |
| 169 | ||
| 170 | fun (CS{safeIs,safeEs,hazIs,hazEs,...}) addIs ths =
 | |
| 171 |   make_cs {safeIs=safeIs, safeEs=safeEs, hazIs=ths@hazIs, hazEs=hazEs};
 | |
| 172 | ||
| 173 | fun (CS{safeIs,safeEs,hazIs,hazEs,...}) addEs ths =
 | |
| 174 |   make_cs {safeIs=safeIs, safeEs=safeEs, hazIs=hazIs, hazEs=ths@hazEs};
 | |
| 175 | ||
| 176 | fun cs addDs ths = cs addEs (map make_elim ths); | |
| 177 | ||
| 178 | (*** Simple tactics for theorem proving ***) | |
| 179 | ||
| 180 | (*Attack subgoals using safe inferences -- matching, not resolution*) | |
| 181 | fun safe_step_tac (CS{safe0_netpair,safep_netpair,...}) = 
 | |
| 182 | FIRST' [eq_assume_tac, | |
| 183 | eq_mp_tac, | |
| 184 | bimatch_from_nets_tac safe0_netpair, | |
| 185 | FIRST' hyp_subst_tacs, | |
| 186 | bimatch_from_nets_tac safep_netpair] ; | |
| 187 | ||
| 188 | (*Repeatedly attack subgoals using safe inferences -- it's deterministic!*) | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 189 | fun safe_tac cs = REPEAT_DETERM_FIRST (safe_step_tac cs); | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 190 | |
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 191 | (*But these unsafe steps at least solve a subgoal!*) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 192 | fun inst0_step_tac (CS{safe0_netpair,safep_netpair,...}) =
 | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 193 | assume_tac APPEND' | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 194 | contr_tac APPEND' | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 195 | biresolve_from_nets_tac safe0_netpair; | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 196 | |
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 197 | (*These are much worse since they could generate more and more subgoals*) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 198 | fun instp_step_tac (CS{safep_netpair,...}) =
 | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 199 | biresolve_from_nets_tac safep_netpair; | 
| 0 | 200 | |
| 201 | (*These steps could instantiate variables and are therefore unsafe.*) | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 202 | fun inst_step_tac cs = inst0_step_tac cs APPEND' instp_step_tac cs; | 
| 0 | 203 | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 204 | fun haz_step_tac (cs as (CS{haz_netpair,...})) = 
 | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 205 | biresolve_from_nets_tac haz_netpair; | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 206 | |
| 0 | 207 | (*Single step for the prover. FAILS unless it makes progress. *) | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 208 | fun step_tac cs i = | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 209 | FIRST [safe_tac cs, inst_step_tac cs i, haz_step_tac cs i]; | 
| 0 | 210 | |
| 211 | (*Using a "safe" rule to instantiate variables is unsafe. This tactic | |
| 212 | allows backtracking from "safe" rules to "unsafe" rules here.*) | |
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 213 | fun slow_step_tac cs i = | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 214 | safe_tac cs ORELSE (inst_step_tac cs i APPEND haz_step_tac cs i); | 
| 0 | 215 | |
| 216 | (*** The following tactics all fail unless they solve one goal ***) | |
| 217 | ||
| 218 | (*Dumb but fast*) | |
| 219 | fun fast_tac cs = SELECT_GOAL (DEPTH_SOLVE (step_tac cs 1)); | |
| 220 | ||
| 221 | (*Slower but smarter than fast_tac*) | |
| 222 | fun best_tac cs = | |
| 223 | SELECT_GOAL (BEST_FIRST (has_fewer_prems 1, sizef) (step_tac cs 1)); | |
| 224 | ||
| 225 | fun slow_tac cs = SELECT_GOAL (DEPTH_SOLVE (slow_step_tac cs 1)); | |
| 226 | ||
| 227 | fun slow_best_tac cs = | |
| 228 | SELECT_GOAL (BEST_FIRST (has_fewer_prems 1, sizef) (slow_step_tac cs 1)); | |
| 229 | ||
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 230 | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 231 | (*** Complete tactic, loosely based upon LeanTaP This tactic is the outcome | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 232 | of much experimentation! Changing APPEND to ORELSE below would prove | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 233 | easy theorems faster, but loses completeness -- and many of the harder | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 234 | theorems such as 43. ***) | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 235 | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 236 | (*Non-deterministic! Could always expand the first unsafe connective. | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 237 | That's hard to implement and did not perform better in experiments, due to | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 238 | greater search depth required.*) | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 239 | fun dup_step_tac (cs as (CS{dup_netpair,...})) = 
 | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 240 | biresolve_from_nets_tac dup_netpair; | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 241 | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 242 | (*Searching to depth m.*) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 243 | fun depth_tac cs m i = STATE(fn state => | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 244 | SELECT_GOAL | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 245 | (REPEAT_DETERM1 (safe_step_tac cs 1) THEN_ELSE | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 246 | (DEPTH_SOLVE (depth_tac cs m 1), | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 247 | inst0_step_tac cs 1 APPEND | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 248 | COND (K(m=0)) no_tac | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 249 | ((instp_step_tac cs 1 APPEND dup_step_tac cs 1) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 250 | THEN DEPTH_SOLVE (depth_tac cs (m-1) 1)))) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 251 | i); | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 252 | |
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 253 | (*Iterative deepening tactical. Allows us to "deepen" any search tactic*) | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 254 | fun DEEPEN tacf m i = STATE(fn state => | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 255 | if has_fewer_prems i state then no_tac | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 256 |    else (writeln ("Depth = " ^ string_of_int m);
 | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 257 | tacf m i ORELSE DEEPEN tacf (m+2) i)); | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 258 | |
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 259 | fun safe_depth_tac cs m = | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 260 | SUBGOAL | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 261 | (fn (prem,i) => | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 262 | let val deti = | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 263 | (*No Vars in the goal? No need to backtrack between goals.*) | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 264 | case term_vars prem of | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 265 | [] => DETERM | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 266 | | _::_ => I | 
| 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 267 | in SELECT_GOAL (TRY (safe_tac cs) THEN | 
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 268 | DEPTH_SOLVE (deti (depth_tac cs m 1))) i | 
| 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 269 | end); | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 270 | |
| 747 
bdc066781063
deepen_tac: modified due to outcome of experiments.  Its
 lcp parents: 
681diff
changeset | 271 | fun deepen_tac cs = DEEPEN (safe_depth_tac cs); | 
| 681 
9b02474744ca
Provers/classical: now takes theorem "classical" as argument, proves "swap"
 lcp parents: 
469diff
changeset | 272 | |
| 0 | 273 | end; | 
| 274 | end; |