| author | wenzelm | 
| Thu, 16 Jul 2009 20:15:57 +0200 | |
| changeset 32017 | e91a3acf8383 | 
| parent 30609 | 983e8b6e4e69 | 
| child 32148 | 253f6808dabe | 
| 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 | Author: David von Oheimb, TU Muenchen | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 3 | |
| 5219 | 4 | Combination of classical reasoner and simplifier (depends on | 
| 16019 | 5 | 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 | 6 | *) | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 7 | |
| 9860 | 8 | infix 4 addSIs2 addSEs2 addSDs2 addIs2 addEs2 addDs2 addsimps2 delsimps2 | 
| 13603 
57f364d1d3b2
Introduced addss', which adds asm_lr_simp_tac as a wrapper to the claset.
 berghofe parents: 
13026diff
changeset | 9 | addSss addss addss' addIffs delIffs; | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 10 | |
| 5219 | 11 | signature CLASIMP_DATA = | 
| 12 | sig | |
| 8469 | 13 | structure Splitter: SPLITTER | 
| 5219 | 14 | structure Classical: CLASSICAL | 
| 15 | structure Blast: BLAST | |
| 16 | sharing type Classical.claset = Blast.claset | |
| 9860 | 17 | val notE: thm | 
| 18 | val iffD1: thm | |
| 19 | val iffD2: thm | |
| 5219 | 20 | end | 
| 21 | ||
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 22 | signature CLASIMP = | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 23 | sig | 
| 5219 | 24 | include CLASIMP_DATA | 
| 25 | type claset | |
| 26 | type clasimpset | |
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 27 | val get_css: Context.generic -> clasimpset | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 28 | val map_css: (clasimpset -> clasimpset) -> Context.generic -> Context.generic | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 29 | val local_clasimpset_of: Proof.context -> clasimpset | 
| 9860 | 30 | val addSIs2: clasimpset * thm list -> clasimpset | 
| 31 | val addSEs2: clasimpset * thm list -> clasimpset | |
| 32 | val addSDs2: clasimpset * thm list -> clasimpset | |
| 33 | val addIs2: clasimpset * thm list -> clasimpset | |
| 34 | val addEs2: clasimpset * thm list -> clasimpset | |
| 35 | val addDs2: clasimpset * thm list -> clasimpset | |
| 36 | val addsimps2: clasimpset * thm list -> clasimpset | |
| 37 | val delsimps2: clasimpset * thm list -> clasimpset | |
| 38 | val addSss: claset * simpset -> claset | |
| 39 | val addss: claset * simpset -> claset | |
| 13603 
57f364d1d3b2
Introduced addss', which adds asm_lr_simp_tac as a wrapper to the claset.
 berghofe parents: 
13026diff
changeset | 40 | val addss': claset * simpset -> claset | 
| 9860 | 41 | val addIffs: clasimpset * thm list -> clasimpset | 
| 42 | val delIffs: clasimpset * thm list -> clasimpset | |
| 5483 | 43 | val clarsimp_tac: clasimpset -> int -> tactic | 
| 9860 | 44 | val mk_auto_tac: clasimpset -> int -> int -> tactic | 
| 45 | val auto_tac: clasimpset -> tactic | |
| 46 | val force_tac: clasimpset -> int -> tactic | |
| 47 | val fast_simp_tac: clasimpset -> int -> tactic | |
| 48 | val slow_simp_tac: clasimpset -> int -> tactic | |
| 49 | val best_simp_tac: clasimpset -> int -> tactic | |
| 18728 | 50 | val attrib: (clasimpset * thm list -> clasimpset) -> attribute | 
| 51 | val iff_add: attribute | |
| 52 | val iff_add': attribute | |
| 53 | val iff_del: attribute | |
| 30513 | 54 | val iff_modifiers: Method.modifier parser list | 
| 55 | val clasimp_modifiers: Method.modifier parser list | |
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 56 | val clasimp_setup: theory -> theory | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 57 | end; | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 58 | |
| 5219 | 59 | 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 | 60 | struct | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 61 | |
| 5219 | 62 | open Data; | 
| 63 | ||
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 64 | |
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 65 | (* type clasimpset *) | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 66 | |
| 5219 | 67 | type claset = Classical.claset; | 
| 68 | type clasimpset = claset * simpset; | |
| 69 | ||
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 70 | fun get_css context = (Classical.get_cs context, Simplifier.get_ss context); | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 71 | |
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 72 | fun map_css f context = | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 73 | let val (cs', ss') = f (get_css context) | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 74 | in context |> Classical.map_cs (K cs') |> Simplifier.map_ss (K ss') end; | 
| 17879 | 75 | |
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 76 | fun local_clasimpset_of ctxt = | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 77 | (Classical.local_claset_of ctxt, Simplifier.local_simpset_of ctxt); | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 78 | |
| 5219 | 79 | |
| 80 | (* clasimpset operations *) | |
| 81 | ||
| 82 | (*this interface for updating a clasimpset is rudimentary and just for | |
| 83 | convenience for the most common cases*) | |
| 84 | ||
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 85 | fun pair_upd1 f ((a, b), x) = (f (a, x), b); | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 86 | fun pair_upd2 f ((a, b), x) = (a, f (b, x)); | 
| 5219 | 87 | |
| 88 | fun op addSIs2 arg = pair_upd1 Classical.addSIs arg; | |
| 89 | fun op addSEs2 arg = pair_upd1 Classical.addSEs arg; | |
| 90 | fun op addSDs2 arg = pair_upd1 Classical.addSDs arg; | |
| 91 | fun op addIs2 arg = pair_upd1 Classical.addIs arg; | |
| 92 | fun op addEs2 arg = pair_upd1 Classical.addEs arg; | |
| 93 | fun op addDs2 arg = pair_upd1 Classical.addDs arg; | |
| 94 | fun op addsimps2 arg = pair_upd2 Simplifier.addsimps arg; | |
| 95 | 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 | 96 | |
| 9402 | 97 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | 
| 98 | val safe_asm_full_simp_tac = Simplifier.generic_simp_tac true (true,true,true); | |
| 99 | ||
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 100 | (*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 | 101 | (*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 | 102 | fun cs addSss ss = Classical.addSafter (cs, ("safe_asm_full_simp_tac",
 | 
| 9772 | 103 | CHANGED o safe_asm_full_simp_tac ss)); | 
| 104 | fun cs addss  ss = Classical.addbefore  (cs, ("asm_full_simp_tac",
 | |
| 105 | CHANGED o Simplifier.asm_full_simp_tac ss)); | |
| 13603 
57f364d1d3b2
Introduced addss', which adds asm_lr_simp_tac as a wrapper to the claset.
 berghofe parents: 
13026diff
changeset | 106 | fun cs addss' ss = Classical.addbefore  (cs, ("asm_full_simp_tac",
 | 
| 
57f364d1d3b2
Introduced addss', which adds asm_lr_simp_tac as a wrapper to the claset.
 berghofe parents: 
13026diff
changeset | 107 | CHANGED o Simplifier.asm_lr_simp_tac ss)); | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 108 | |
| 9860 | 109 | (* iffs: addition of rules to simpsets and clasets simultaneously *) | 
| 110 | ||
| 11344 | 111 | (*Takes (possibly conditional) theorems of the form A<->B to | 
| 9860 | 112 | the Safe Intr rule B==>A and | 
| 113 | the Safe Destruct rule A==>B. | |
| 114 | Also ~A goes to the Safe Elim rule A ==> ?R | |
| 11462 | 115 | Failing other cases, A is added as a Safe Intr rule*) | 
| 9860 | 116 | local | 
| 117 | ||
| 13026 | 118 | fun addIff decls1 decls2 simp ((cs, ss), th) = | 
| 119 | let | |
| 120 | val n = nprems_of th; | |
| 17084 
fb0a80aef0be
classical rules must have names for ATP integration
 paulson parents: 
16019diff
changeset | 121 | val (elim, intro) = if n = 0 then decls1 else decls2; | 
| 13026 | 122 | val zero_rotate = zero_var_indexes o rotate_prems n; | 
| 123 | in | |
| 21709 
9cfd9eb9faec
removed use of put_name_hint, as the ATP linkup no longer needs this
 paulson parents: 
21646diff
changeset | 124 | (elim (intro (cs, [zero_rotate (th RS iffD2)]), | 
| 
9cfd9eb9faec
removed use of put_name_hint, as the ATP linkup no longer needs this
 paulson parents: 
21646diff
changeset | 125 | [Tactic.make_elim (zero_rotate (th RS iffD1))]) | 
| 
9cfd9eb9faec
removed use of put_name_hint, as the ATP linkup no longer needs this
 paulson parents: 
21646diff
changeset | 126 | handle THM _ => (elim (cs, [zero_rotate (th RS notE)]) | 
| 11902 | 127 | handle THM _ => intro (cs, [th])), | 
| 128 | simp (ss, [th])) | |
| 129 | end; | |
| 9860 | 130 | |
| 12375 | 131 | fun delIff delcs delss ((cs, ss), th) = | 
| 11902 | 132 | let val zero_rotate = zero_var_indexes o rotate_prems (nprems_of th) in | 
| 18688 | 133 | (delcs (cs, [zero_rotate (th RS iffD2), | 
| 134 | Tactic.make_elim (zero_rotate (th RS iffD1))]) | |
| 135 | handle THM _ => (delcs (cs, [zero_rotate (th RS notE)]) | |
| 12375 | 136 | handle THM _ => delcs (cs, [th])), | 
| 137 | delss (ss, [th])) | |
| 11902 | 138 | end; | 
| 9860 | 139 | |
| 18630 | 140 | fun modifier att (x, ths) = | 
| 30190 | 141 | fst (Library.foldl_map (Library.apply [att]) (x, rev ths)); | 
| 18630 | 142 | |
| 18688 | 143 | val addXIs = modifier (ContextRules.intro_query NONE); | 
| 144 | val addXEs = modifier (ContextRules.elim_query NONE); | |
| 145 | val addXDs = modifier (ContextRules.dest_query NONE); | |
| 146 | val delXs = modifier ContextRules.rule_del; | |
| 18630 | 147 | |
| 9860 | 148 | in | 
| 149 | ||
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 150 | val op addIffs = | 
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 151 | Library.foldl | 
| 17084 
fb0a80aef0be
classical rules must have names for ATP integration
 paulson parents: 
16019diff
changeset | 152 | (addIff (Classical.addSEs, Classical.addSIs) | 
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 153 | (Classical.addEs, Classical.addIs) | 
| 17084 
fb0a80aef0be
classical rules must have names for ATP integration
 paulson parents: 
16019diff
changeset | 154 | Simplifier.addsimps); | 
| 15570 | 155 | val op delIffs = Library.foldl (delIff Classical.delrules Simplifier.delsimps); | 
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 156 | |
| 18688 | 157 | fun addIffs_generic (x, ths) = | 
| 158 | Library.foldl (addIff (addXEs, addXIs) (addXEs, addXIs) #1) ((x, ()), ths) |> #1; | |
| 12375 | 159 | |
| 18688 | 160 | fun delIffs_generic (x, ths) = | 
| 161 | Library.foldl (delIff delXs #1) ((x, ()), ths) |> #1; | |
| 12375 | 162 | |
| 9860 | 163 | end; | 
| 164 | ||
| 165 | ||
| 5219 | 166 | (* tacticals *) | 
| 167 | ||
| 12375 | 168 | fun clarsimp_tac (cs, ss) = | 
| 169 | safe_asm_full_simp_tac ss THEN_ALL_NEW | |
| 170 | Classical.clarify_tac (cs addSss ss); | |
| 171 | ||
| 5483 | 172 | |
| 5219 | 173 | (* auto_tac *) | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 174 | |
| 5219 | 175 | fun blast_depth_tac cs m i thm = | 
| 9772 | 176 | Blast.depth_tac cs m i thm | 
| 5554 | 177 |       handle Blast.TRANS s => (warning ("Blast_tac: " ^ s); Seq.empty);
 | 
| 9772 | 178 | |
| 179 | (* a variant of depth_tac that avoids interference of the simplifier | |
| 5219 | 180 | with dup_step_tac when they are combined by auto_tac *) | 
| 5756 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 181 | local | 
| 9772 | 182 | fun slow_step_tac' cs = Classical.appWrappers cs | 
| 183 | (Classical.instp_step_tac cs APPEND' Classical.haz_step_tac cs); | |
| 184 | in fun nodup_depth_tac cs m i state = SELECT_GOAL | |
| 185 | (Classical.safe_steps_tac cs 1 THEN_ELSE | |
| 186 | (DEPTH_SOLVE (nodup_depth_tac cs m 1), | |
| 187 | Classical.inst0_step_tac cs 1 APPEND COND (K (m=0)) no_tac | |
| 188 | (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 | 189 | )) i state; | 
| 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 190 | end; | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 191 | |
| 9402 | 192 | (*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 | 193 | in some of the subgoals*) | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 194 | fun mk_auto_tac (cs, ss) m n = | 
| 5219 | 195 | let val cs' = cs addss ss | 
| 9772 | 196 | val maintac = | 
| 197 | 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 | 198 | ORELSE' | 
| 5756 
8ef5288c24b0
corrected auto_tac (applications of unsafe wrappers)
 oheimb parents: 
5567diff
changeset | 199 | (CHANGED o nodup_depth_tac cs' n); (* slower but more general *) | 
| 5219 | 200 | in EVERY [ALLGOALS (Simplifier.asm_full_simp_tac ss), | 
| 9772 | 201 | TRY (Classical.safe_tac cs), | 
| 202 | REPEAT (FIRSTGOAL maintac), | |
| 5219 | 203 | TRY (Classical.safe_tac (cs addSss ss)), | 
| 9772 | 204 | prune_params_tac] | 
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 205 | end; | 
| 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 206 | |
| 9772 | 207 | 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 | 208 | |
| 9772 | 209 | |
| 5219 | 210 | (* force_tac *) | 
| 211 | ||
| 4659 | 212 | (* 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 | 213 | fun force_tac (cs,ss) = let val cs' = cs addss ss in SELECT_GOAL (EVERY [ | 
| 9772 | 214 | Classical.clarify_tac cs' 1, | 
| 215 | IF_UNSOLVED (Simplifier.asm_full_simp_tac ss 1), | |
| 216 | ALLGOALS (Classical.first_best_tac cs')]) end; | |
| 4659 | 217 | |
| 5219 | 218 | |
| 9805 | 219 | (* basic combinations *) | 
| 220 | ||
| 221 | fun ADDSS tac (cs, ss) = let val cs' = cs addss ss in tac cs' end; | |
| 9591 | 222 | |
| 9805 | 223 | val fast_simp_tac = ADDSS Classical.fast_tac; | 
| 224 | val slow_simp_tac = ADDSS Classical.slow_tac; | |
| 225 | val best_simp_tac = ADDSS Classical.best_tac; | |
| 9591 | 226 | |
| 227 | ||
| 9860 | 228 | (* access clasimpset *) | 
| 8639 | 229 | |
| 15032 | 230 | |
| 9860 | 231 | |
| 232 | (* attributes *) | |
| 233 | ||
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 234 | fun attrib f = Thm.declaration_attribute (fn th => map_css (fn css => f (css, [th]))); | 
| 18688 | 235 | fun attrib' f (x, th) = (f (x, [th]), th); | 
| 10033 
fc4e7432b2b1
added iff_add_global', iff_add_local' (syntax "iff?");
 wenzelm parents: 
9952diff
changeset | 236 | |
| 18688 | 237 | val iff_add = attrib (op addIffs); | 
| 238 | val iff_add' = attrib' addIffs_generic; | |
| 239 | val iff_del = attrib (op delIffs) o attrib' delIffs_generic; | |
| 240 | ||
| 30528 | 241 | fun iff_att x = (Scan.lift | 
| 18688 | 242 | (Args.del >> K iff_del || | 
| 243 | Scan.option Args.add -- Args.query >> K iff_add' || | |
| 30528 | 244 | Scan.option Args.add >> K iff_add)) x; | 
| 9860 | 245 | |
| 246 | ||
| 247 | (* method modifiers *) | |
| 248 | ||
| 249 | val iffN = "iff"; | |
| 250 | ||
| 251 | val iff_modifiers = | |
| 18728 | 252 | [Args.$$$ iffN -- Scan.option Args.add -- Args.colon >> K ((I, iff_add): Method.modifier), | 
| 253 | Args.$$$ iffN -- Scan.option Args.add -- Args.query_colon >> K (I, iff_add'), | |
| 254 | Args.$$$ iffN -- Args.del -- Args.colon >> K (I, iff_del)]; | |
| 9860 | 255 | |
| 8469 | 256 | val clasimp_modifiers = | 
| 9860 | 257 | Simplifier.simp_modifiers @ Splitter.split_modifiers @ | 
| 258 | Classical.cla_modifiers @ iff_modifiers; | |
| 259 | ||
| 260 | ||
| 261 | (* methods *) | |
| 5926 | 262 | |
| 30510 
4120fc59dd85
unified type Proof.method and pervasive METHOD combinators;
 wenzelm parents: 
30190diff
changeset | 263 | fun clasimp_meth tac prems ctxt = METHOD (fn facts => | 
| 15032 | 264 | ALLGOALS (Method.insert_tac (prems @ facts)) THEN tac (local_clasimpset_of ctxt)); | 
| 7132 | 265 | |
| 30510 
4120fc59dd85
unified type Proof.method and pervasive METHOD combinators;
 wenzelm parents: 
30190diff
changeset | 266 | fun clasimp_meth' tac prems ctxt = METHOD (fn facts => | 
| 15032 | 267 | HEADGOAL (Method.insert_tac (prems @ facts) THEN' tac (local_clasimpset_of ctxt))); | 
| 5926 | 268 | |
| 269 | ||
| 30541 | 270 | fun clasimp_method tac = | 
| 271 | Args.bang_facts --| Method.sections clasimp_modifiers >> (clasimp_meth tac); | |
| 5926 | 272 | |
| 30541 | 273 | fun clasimp_method' tac = | 
| 274 | Args.bang_facts --| Method.sections clasimp_modifiers >> (clasimp_meth' tac); | |
| 9772 | 275 | |
| 30541 | 276 | val auto_method = | 
| 277 | Args.bang_facts -- Scan.lift (Scan.option (OuterParse.nat -- OuterParse.nat)) --| | |
| 278 | Method.sections clasimp_modifiers >> | |
| 279 | (fn (prems, NONE) => clasimp_meth (CHANGED_PROP o auto_tac) prems | |
| 280 | | (prems, SOME (m, n)) => clasimp_meth (CHANGED_PROP o (fn css => mk_auto_tac css m n)) prems); | |
| 9772 | 281 | |
| 282 | ||
| 283 | (* theory setup *) | |
| 284 | ||
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26425diff
changeset | 285 | val clasimp_setup = | 
| 30541 | 286 |   Attrib.setup @{binding iff} iff_att "declaration of Simplifier / Classical rules" #>
 | 
| 287 |   Method.setup @{binding fastsimp} (clasimp_method' fast_simp_tac) "combined fast and simp" #>
 | |
| 288 |   Method.setup @{binding slowsimp} (clasimp_method' slow_simp_tac) "combined slow and simp" #>
 | |
| 289 |   Method.setup @{binding bestsimp} (clasimp_method' best_simp_tac) "combined best and simp" #>
 | |
| 290 |   Method.setup @{binding force} (clasimp_method' force_tac) "force" #>
 | |
| 291 |   Method.setup @{binding auto} auto_method "auto" #>
 | |
| 292 |   Method.setup @{binding clarsimp} (clasimp_method' (CHANGED_PROP oo clarsimp_tac))
 | |
| 293 | "clarify simplified goal"; | |
| 5926 | 294 | |
| 4652 
d24cca140eeb
factored out common code of HOL/simpdata.ML and FOL/simpdata.ML concerning
 oheimb parents: diff
changeset | 295 | end; |