| author | wenzelm | 
| Tue, 16 Oct 2001 17:51:50 +0200 | |
| changeset 11803 | 30f2104953a1 | 
| parent 11496 | fa8d12b789e1 | 
| child 11902 | db207d68392c | 
| permissions | -rw-r--r-- | 
| 9772 | 1 | (* Title: Provers/clasimp.ML | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 2 | ID: $Id$ | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 3 | Author: David von Oheimb, TU Muenchen | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 4 | |
| 5219 | 5 | Combination of classical reasoner and simplifier (depends on | 
| 8469 | 6 | simplifier.ML, splitter.ML classical.ML, blast.ML). | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 7 | *) | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 8 | |
| 9860 | 9 | infix 4 addSIs2 addSEs2 addSDs2 addIs2 addEs2 addDs2 addsimps2 delsimps2 | 
| 10 | addSss addss addIffs delIffs; | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 11 | |
| 5219 | 12 | signature CLASIMP_DATA = | 
| 13 | sig | |
| 14 | structure Simplifier: SIMPLIFIER | |
| 8469 | 15 | structure Splitter: SPLITTER | 
| 5219 | 16 | structure Classical: CLASSICAL | 
| 17 | structure Blast: BLAST | |
| 18 | sharing type Classical.claset = Blast.claset | |
| 9860 | 19 | val notE: thm | 
| 20 | val iffD1: thm | |
| 21 | val iffD2: thm | |
| 22 | val cla_make_elim: thm -> thm | |
| 5219 | 23 | end | 
| 24 | ||
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 25 | signature CLASIMP = | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 26 | sig | 
| 5219 | 27 | include CLASIMP_DATA | 
| 28 | type claset | |
| 29 | type simpset | |
| 30 | type clasimpset | |
| 10317 | 31 | val clasimpset: unit -> clasimpset | 
| 9860 | 32 | val addSIs2: clasimpset * thm list -> clasimpset | 
| 33 | val addSEs2: clasimpset * thm list -> clasimpset | |
| 34 | val addSDs2: clasimpset * thm list -> clasimpset | |
| 35 | val addIs2: clasimpset * thm list -> clasimpset | |
| 36 | val addEs2: clasimpset * thm list -> clasimpset | |
| 37 | val addDs2: clasimpset * thm list -> clasimpset | |
| 38 | val addsimps2: clasimpset * thm list -> clasimpset | |
| 39 | val delsimps2: clasimpset * thm list -> clasimpset | |
| 40 | val addSss: claset * simpset -> claset | |
| 41 | val addss: claset * simpset -> claset | |
| 42 | val addIffs: clasimpset * thm list -> clasimpset | |
| 43 | val delIffs: clasimpset * thm list -> clasimpset | |
| 44 | val AddIffs: thm list -> unit | |
| 45 | val DelIffs: thm list -> unit | |
| 46 | val CLASIMPSET: (clasimpset -> tactic) -> tactic | |
| 47 | val CLASIMPSET': (clasimpset -> 'a -> tactic) -> 'a -> tactic | |
| 5483 | 48 | val clarsimp_tac: clasimpset -> int -> tactic | 
| 9860 | 49 | val Clarsimp_tac: int -> tactic | 
| 50 | val mk_auto_tac: clasimpset -> int -> int -> tactic | |
| 51 | val auto_tac: clasimpset -> tactic | |
| 52 | val Auto_tac: tactic | |
| 53 | val auto: unit -> unit | |
| 54 | val force_tac: clasimpset -> int -> tactic | |
| 55 | val Force_tac: int -> tactic | |
| 56 | val force: int -> unit | |
| 57 | val fast_simp_tac: clasimpset -> int -> tactic | |
| 58 | val slow_simp_tac: clasimpset -> int -> tactic | |
| 59 | val best_simp_tac: clasimpset -> int -> tactic | |
| 8639 | 60 | val change_global_css: (clasimpset * thm list -> clasimpset) -> theory attribute | 
| 61 | val change_local_css: (clasimpset * thm list -> clasimpset) -> Proof.context attribute | |
| 9506 | 62 | val get_local_clasimpset: Proof.context -> clasimpset | 
| 9860 | 63 | val iff_add_global: theory attribute | 
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 64 | val iff_add_global': theory attribute | 
| 9860 | 65 | val iff_del_global: theory attribute | 
| 66 | val iff_add_local: Proof.context attribute | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 67 | val iff_add_local': Proof.context attribute | 
| 9860 | 68 | val iff_del_local: Proof.context attribute | 
| 69 | val iff_modifiers: (Args.T list -> (Method.modifier * Args.T list)) list | |
| 9506 | 70 | val clasimp_modifiers: (Args.T list -> (Method.modifier * Args.T list)) list | 
| 9860 | 71 | val setup: (theory -> theory) list | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 72 | end; | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 73 | |
| 5219 | 74 | functor ClasimpFun(Data: CLASIMP_DATA): CLASIMP = | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 75 | struct | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 76 | |
| 5219 | 77 | open Data; | 
| 78 | ||
| 79 | type claset = Classical.claset; | |
| 80 | type simpset = Simplifier.simpset; | |
| 81 | type clasimpset = claset * simpset; | |
| 82 | ||
| 10317 | 83 | fun clasimpset () = (Classical.claset (), Simplifier.simpset ()); | 
| 84 | ||
| 5219 | 85 | |
| 86 | (* clasimpset operations *) | |
| 87 | ||
| 88 | (*this interface for updating a clasimpset is rudimentary and just for | |
| 89 | convenience for the most common cases*) | |
| 90 | ||
| 91 | fun pair_upd1 f ((a,b),x) = (f(a,x), b); | |
| 92 | fun pair_upd2 f ((a,b),x) = (a, f(b,x)); | |
| 93 | ||
| 94 | fun op addSIs2 arg = pair_upd1 Classical.addSIs arg; | |
| 95 | fun op addSEs2 arg = pair_upd1 Classical.addSEs arg; | |
| 96 | fun op addSDs2 arg = pair_upd1 Classical.addSDs arg; | |
| 97 | fun op addIs2 arg = pair_upd1 Classical.addIs arg; | |
| 98 | fun op addEs2 arg = pair_upd1 Classical.addEs arg; | |
| 99 | fun op addDs2 arg = pair_upd1 Classical.addDs arg; | |
| 100 | fun op addsimps2 arg = pair_upd2 Simplifier.addsimps arg; | |
| 101 | fun op delsimps2 arg = pair_upd2 Simplifier.delsimps arg; | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 102 | |
| 9402 | 103 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | 
| 104 | val safe_asm_full_simp_tac = Simplifier.generic_simp_tac true (true,true,true); | |
| 105 | ||
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 106 | (*Add a simpset to a classical set!*) | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 107 | (*Caution: only one simpset added can be added by each of addSss and addss*) | 
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
10821diff
changeset | 108 | fun cs addSss ss = Classical.addSafter (cs, ("safe_asm_full_simp_tac",
 | 
| 9772 | 109 | CHANGED o safe_asm_full_simp_tac ss)); | 
| 110 | fun cs addss  ss = Classical.addbefore  (cs, ("asm_full_simp_tac",
 | |
| 111 | CHANGED o Simplifier.asm_full_simp_tac ss)); | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 112 | |
| 9860 | 113 | |
| 114 | (* iffs: addition of rules to simpsets and clasets simultaneously *) | |
| 115 | ||
| 11344 | 116 | (*Takes (possibly conditional) theorems of the form A<->B to | 
| 9860 | 117 | the Safe Intr rule B==>A and | 
| 118 | the Safe Destruct rule A==>B. | |
| 119 | Also ~A goes to the Safe Elim rule A ==> ?R | |
| 11462 | 120 | Failing other cases, A is added as a Safe Intr rule*) | 
| 9860 | 121 | local | 
| 122 | ||
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 123 | fun addIff dest elim intro simp ((cs, ss), th) = | 
| 11344 | 124 | ( dest (intro (cs, [zero_var_indexes (th RS Data.iffD2)]), | 
| 11496 
fa8d12b789e1
corrected semantics of [iff] concerning rules with premises
 oheimb parents: 
11462diff
changeset | 125 | [zero_var_indexes (rotate_prems (nprems_of th) | 
| 
fa8d12b789e1
corrected semantics of [iff] concerning rules with premises
 oheimb parents: 
11462diff
changeset | 126 | (th RS Data.iffD1))]) | 
| 11462 | 127 | handle THM _ => (elim (cs, [zero_var_indexes (th RS Data.notE )]) | 
| 128 | handle THM _ => intro (cs, [th])), | |
| 11344 | 129 | simp (ss, [th])); | 
| 9860 | 130 | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 131 | fun delIff ((cs, ss), th) = | 
| 11462 | 132 | ( Classical.delrules (cs, [zero_var_indexes (th RS Data.iffD2), | 
| 133 | Data.cla_make_elim (zero_var_indexes (th RS Data.iffD1))]) | |
| 134 | handle THM _ => (Classical.delrules (cs, [zero_var_indexes (th RS Data.notE)]) | |
| 135 | handle THM _ => Classical.delrules (cs, [th])), | |
| 11344 | 136 | Simplifier.delsimps (ss, [th])); | 
| 9860 | 137 | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 138 | fun store_clasimp (cs, ss) = | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 139 | (Classical.claset_ref () := cs; Simplifier.simpset_ref () := ss); | 
| 9860 | 140 | |
| 141 | in | |
| 142 | ||
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 143 | val op addIffs = | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 144 | foldl (addIff Classical.addSDs Classical.addSEs Classical.addSIs Simplifier.addsimps); | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 145 | val addIffs' = | 
| 10036 | 146 | foldl (addIff Classical.addXDs Classical.addXEs Classical.addXIs | 
| 147 | ((fn (ss, _) => ss): Simplifier.simpset * thm list -> Simplifier.simpset)); | |
| 9860 | 148 | val op delIffs = foldl delIff; | 
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 149 | |
| 10317 | 150 | fun AddIffs thms = store_clasimp (clasimpset () addIffs thms); | 
| 151 | fun DelIffs thms = store_clasimp (clasimpset () delIffs thms); | |
| 9860 | 152 | |
| 153 | end; | |
| 154 | ||
| 155 | ||
| 5219 | 156 | (* tacticals *) | 
| 157 | ||
| 158 | fun CLASIMPSET tacf state = | |
| 159 | Classical.CLASET (fn cs => Simplifier.SIMPSET (fn ss => tacf (cs, ss))) state; | |
| 160 | ||
| 161 | fun CLASIMPSET' tacf i state = | |
| 162 | Classical.CLASET (fn cs => Simplifier.SIMPSET (fn ss => tacf (cs, ss) i)) state; | |
| 4888 | 163 | |
| 164 | ||
| 9402 | 165 | fun clarsimp_tac (cs, ss) = safe_asm_full_simp_tac ss THEN_ALL_NEW | 
| 9772 | 166 | Classical.clarify_tac (cs addSss ss); | 
| 10317 | 167 | fun Clarsimp_tac i = clarsimp_tac (clasimpset ()) i; | 
| 5483 | 168 | |
| 169 | ||
| 5219 | 170 | (* auto_tac *) | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 171 | |
| 5219 | 172 | fun blast_depth_tac cs m i thm = | 
| 9772 | 173 | Blast.depth_tac cs m i thm | 
| 5554 | 174 |       handle Blast.TRANS s => (warning ("Blast_tac: " ^ s); Seq.empty);
 | 
| 9772 | 175 | |
| 176 | (* a variant of depth_tac that avoids interference of the simplifier | |
| 5219 | 177 | with dup_step_tac when they are combined by auto_tac *) | 
| 5756 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 178 | local | 
| 9772 | 179 | fun slow_step_tac' cs = Classical.appWrappers cs | 
| 180 | (Classical.instp_step_tac cs APPEND' Classical.haz_step_tac cs); | |
| 181 | in fun nodup_depth_tac cs m i state = SELECT_GOAL | |
| 182 | (Classical.safe_steps_tac cs 1 THEN_ELSE | |
| 183 | (DEPTH_SOLVE (nodup_depth_tac cs m 1), | |
| 184 | Classical.inst0_step_tac cs 1 APPEND COND (K (m=0)) no_tac | |
| 185 | (slow_step_tac' cs 1 THEN DEPTH_SOLVE (nodup_depth_tac cs (m-1) 1)) | |
| 5756 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 186 | )) i state; | 
| 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 187 | end; | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 188 | |
| 9402 | 189 | (*Designed to be idempotent, except if blast_depth_tac instantiates variables | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 190 | in some of the subgoals*) | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 191 | fun mk_auto_tac (cs, ss) m n = | 
| 5219 | 192 | let val cs' = cs addss ss | 
| 9772 | 193 | val maintac = | 
| 194 | blast_depth_tac cs m (* fast but can't use wrappers *) | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 195 | ORELSE' | 
| 5756 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 196 | (CHANGED o nodup_depth_tac cs' n); (* slower but more general *) | 
| 5219 | 197 | in EVERY [ALLGOALS (Simplifier.asm_full_simp_tac ss), | 
| 9772 | 198 | TRY (Classical.safe_tac cs), | 
| 199 | REPEAT (FIRSTGOAL maintac), | |
| 5219 | 200 | TRY (Classical.safe_tac (cs addSss ss)), | 
| 9772 | 201 | prune_params_tac] | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 202 | end; | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 203 | |
| 9772 | 204 | fun auto_tac css = mk_auto_tac css 4 2; | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 205 | |
| 10317 | 206 | fun Auto_tac st = auto_tac (clasimpset ()) st; | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 207 | |
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 208 | fun auto () = by Auto_tac; | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 209 | |
| 9772 | 210 | |
| 5219 | 211 | (* force_tac *) | 
| 212 | ||
| 4659 | 213 | (* aimed to solve the given subgoal totally, using whatever tools possible *) | 
| 4717 
1370ad043564
renamed smart_tac to force_tac, slight improvement of force_tac
 oheimb parents: 
4659diff
changeset | 214 | fun force_tac (cs,ss) = let val cs' = cs addss ss in SELECT_GOAL (EVERY [ | 
| 9772 | 215 | Classical.clarify_tac cs' 1, | 
| 216 | IF_UNSOLVED (Simplifier.asm_full_simp_tac ss 1), | |
| 217 | ALLGOALS (Classical.first_best_tac cs')]) end; | |
| 10317 | 218 | fun Force_tac i = force_tac (clasimpset ()) i; | 
| 4717 
1370ad043564
renamed smart_tac to force_tac, slight improvement of force_tac
 oheimb parents: 
4659diff
changeset | 219 | fun force i = by (Force_tac i); | 
| 4659 | 220 | |
| 5219 | 221 | |
| 9805 | 222 | (* basic combinations *) | 
| 223 | ||
| 224 | fun ADDSS tac (cs, ss) = let val cs' = cs addss ss in tac cs' end; | |
| 9591 | 225 | |
| 9805 | 226 | val fast_simp_tac = ADDSS Classical.fast_tac; | 
| 227 | val slow_simp_tac = ADDSS Classical.slow_tac; | |
| 228 | val best_simp_tac = ADDSS Classical.best_tac; | |
| 9591 | 229 | |
| 230 | ||
| 9860 | 231 | (* access clasimpset *) | 
| 8639 | 232 | |
| 233 | fun change_global_css f (thy, th) = | |
| 234 | let | |
| 235 | val cs_ref = Classical.claset_ref_of thy; | |
| 236 | val ss_ref = Simplifier.simpset_ref_of thy; | |
| 237 | val (cs', ss') = f ((! cs_ref, ! ss_ref), [th]); | |
| 238 | in cs_ref := cs'; ss_ref := ss'; (thy, th) end; | |
| 239 | ||
| 240 | fun change_local_css f (ctxt, th) = | |
| 241 | let | |
| 242 | val cs = Classical.get_local_claset ctxt; | |
| 243 | val ss = Simplifier.get_local_simpset ctxt; | |
| 244 | val (cs', ss') = f ((cs, ss), [th]); | |
| 245 | val ctxt' = | |
| 246 | ctxt | |
| 247 | |> Classical.put_local_claset cs' | |
| 248 | |> Simplifier.put_local_simpset ss'; | |
| 249 | in (ctxt', th) end; | |
| 250 | ||
| 7153 | 251 | fun get_local_clasimpset ctxt = | 
| 252 | (Classical.get_local_claset ctxt, Simplifier.get_local_simpset ctxt); | |
| 5926 | 253 | |
| 9860 | 254 | |
| 255 | (* attributes *) | |
| 256 | ||
| 257 | val iff_add_global = change_global_css (op addIffs); | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 258 | val iff_add_global' = change_global_css (op addIffs'); | 
| 9860 | 259 | val iff_del_global = change_global_css (op delIffs); | 
| 260 | val iff_add_local = change_local_css (op addIffs); | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 261 | val iff_add_local' = change_local_css (op addIffs'); | 
| 9860 | 262 | val iff_del_local = change_local_css (op delIffs); | 
| 263 | ||
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 264 | fun iff_att add add' del = Attrib.syntax (Scan.lift | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 265 | (Args.del >> K del || | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 266 | Scan.option Args.add -- Args.query >> K add' || | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 267 | Scan.option Args.add >> K add)); | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 268 | |
| 9860 | 269 | val iff_attr = | 
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 270 | (iff_att iff_add_global iff_add_global' iff_del_global, | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 271 | iff_att iff_add_local iff_add_local' iff_del_local); | 
| 9860 | 272 | |
| 273 | ||
| 274 | (* method modifiers *) | |
| 275 | ||
| 276 | val iffN = "iff"; | |
| 277 | ||
| 278 | val iff_modifiers = | |
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 279 | [Args.$$$ iffN -- Scan.option Args.add -- Args.colon >> K ((I, iff_add_local): Method.modifier), | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 280 | Args.$$$ iffN -- Scan.option Args.add -- Args.query_colon >> K (I, iff_add_local'), | 
| 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 281 | Args.$$$ iffN -- Args.del -- Args.colon >> K (I, iff_del_local)]; | 
| 9860 | 282 | |
| 8469 | 283 | val clasimp_modifiers = | 
| 9860 | 284 | Simplifier.simp_modifiers @ Splitter.split_modifiers @ | 
| 285 | Classical.cla_modifiers @ iff_modifiers; | |
| 286 | ||
| 287 | ||
| 288 | (* methods *) | |
| 5926 | 289 | |
| 7559 | 290 | fun clasimp_meth tac prems ctxt = Method.METHOD (fn facts => | 
| 291 | ALLGOALS (Method.insert_tac (prems @ facts)) THEN tac (get_local_clasimpset ctxt)); | |
| 7132 | 292 | |
| 7559 | 293 | fun clasimp_meth' tac prems ctxt = Method.METHOD (fn facts => | 
| 8168 | 294 | HEADGOAL (Method.insert_tac (prems @ facts) THEN' tac (get_local_clasimpset ctxt))); | 
| 5926 | 295 | |
| 7559 | 296 | val clasimp_method = Method.bang_sectioned_args clasimp_modifiers o clasimp_meth; | 
| 297 | val clasimp_method' = Method.bang_sectioned_args clasimp_modifiers o clasimp_meth'; | |
| 5926 | 298 | |
| 299 | ||
| 9772 | 300 | fun auto_args m = | 
| 301 | Method.bang_sectioned_args' clasimp_modifiers (Scan.lift (Scan.option (Args.nat -- Args.nat))) m; | |
| 302 | ||
| 10821 | 303 | fun auto_meth None = clasimp_meth (CHANGED_PROP o auto_tac) | 
| 304 | | auto_meth (Some (m, n)) = clasimp_meth (CHANGED_PROP o (fn css => mk_auto_tac css m n)); | |
| 9772 | 305 | |
| 306 | ||
| 307 | (* theory setup *) | |
| 308 | ||
| 5926 | 309 | val setup = | 
| 9860 | 310 | [Attrib.add_attributes | 
| 9893 | 311 |   [("iff", iff_attr, "declaration of Simplifier / Classical rules")],
 | 
| 9860 | 312 | Method.add_methods | 
| 9591 | 313 |    [("fastsimp", clasimp_method' fast_simp_tac, "combined fast and simp"),
 | 
| 9805 | 314 |     ("slowsimp", clasimp_method' slow_simp_tac, "combined slow and simp"),
 | 
| 315 |     ("bestsimp", clasimp_method' best_simp_tac, "combined best and simp"),
 | |
| 9591 | 316 |     ("force", clasimp_method' force_tac, "force"),
 | 
| 9772 | 317 |     ("auto", auto_args auto_meth, "auto"),
 | 
| 10821 | 318 |     ("clarsimp", clasimp_method' (CHANGED_PROP oo clarsimp_tac), "clarify simplified goal")]];
 | 
| 5926 | 319 | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 320 | end; |