| author | streckem | 
| Mon, 26 May 2003 18:36:15 +0200 | |
| changeset 14045 | a34d89ce6097 | 
| parent 13605 | 528f7489a403 | 
| child 14814 | c6b91c8aee1d | 
| permissions | -rw-r--r-- | 
| 1243 | 1 | (* Title: Provers/simplifier.ML | 
| 1 | 2 | ID: $Id$ | 
| 3557 | 3 | Author: Tobias Nipkow and Markus Wenzel, TU Muenchen | 
| 1 | 4 | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 5 | Generic simplifier, suitable for most logics. See Pure/meta_simplifier.ML | 
| 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 6 | for the actual meta-level rewriting engine. | 
| 1 | 7 | *) | 
| 1260 | 8 | |
| 3551 | 9 | infix 4 | 
| 4682 | 10 | setsubgoaler setloop addloop delloop setSSolver addSSolver setSolver | 
| 9715 | 11 | addSolver addsimps delsimps addeqcongs deleqcongs addcongs delcongs | 
| 12 | setmksimps setmkeqTrue setmkcong setmksym settermless addsimprocs delsimprocs; | |
| 2567 | 13 | |
| 4795 | 14 | signature BASIC_SIMPLIFIER = | 
| 0 | 15 | sig | 
| 2509 | 16 | type simproc | 
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 17 | val mk_simproc: string -> cterm list | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 18 | -> (Sign.sg -> thm list -> term -> thm option) -> simproc | 
| 7568 | 19 | type solver | 
| 20 | val mk_solver: string -> (thm list -> int -> tactic) -> solver | |
| 0 | 21 | type simpset | 
| 2503 | 22 | val empty_ss: simpset | 
| 3551 | 23 | val rep_ss: simpset -> | 
| 11669 | 24 |    {mss: MetaSimplifier.meta_simpset,
 | 
| 9715 | 25 | mk_cong: thm -> thm, | 
| 26 | subgoal_tac: simpset -> int -> tactic, | |
| 27 | loop_tacs: (string * (int -> tactic)) list, | |
| 7568 | 28 | unsafe_solvers: solver list, | 
| 9715 | 29 | solvers: solver list}; | 
| 3551 | 30 | val print_ss: simpset -> unit | 
| 4366 | 31 | val print_simpset: theory -> unit | 
| 2629 | 32 | val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset | 
| 33 | val setloop: simpset * (int -> tactic) -> simpset | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 34 | val addloop: simpset * (string * (int -> tactic)) -> simpset | 
| 4682 | 35 | val delloop: simpset * string -> simpset | 
| 7568 | 36 | val setSSolver: simpset * solver -> simpset | 
| 37 | val addSSolver: simpset * solver -> simpset | |
| 38 | val setSolver: simpset * solver -> simpset | |
| 39 | val addSolver: simpset * solver -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 40 | val setmksimps: simpset * (thm -> thm list) -> simpset | 
| 4677 | 41 | val setmkeqTrue: simpset * (thm -> thm option) -> simpset | 
| 9715 | 42 | val setmkcong: simpset * (thm -> thm) -> simpset | 
| 4677 | 43 | val setmksym: simpset * (thm -> thm option) -> simpset | 
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 44 | val settermless: simpset * (term * term -> bool) -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 45 | val addsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 46 | val delsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 47 | val addeqcongs: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 48 | val deleqcongs: simpset * thm list -> simpset | 
| 9715 | 49 | val addcongs: simpset * thm list -> simpset | 
| 50 | val delcongs: simpset * thm list -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 51 | val addsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 52 | val delsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 53 | val merge_ss: simpset * simpset -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 54 | val prems_of_ss: simpset -> thm list | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 55 | val simpset_ref_of_sg: Sign.sg -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 56 | val simpset_ref_of: theory -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 57 | val simpset_of_sg: Sign.sg -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 58 | val simpset_of: theory -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 59 | val SIMPSET: (simpset -> tactic) -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 60 | val SIMPSET': (simpset -> 'a -> tactic) -> 'a -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 61 | val simpset: unit -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 62 | val simpset_ref: unit -> simpset ref | 
| 1243 | 63 | val Addsimps: thm list -> unit | 
| 64 | val Delsimps: thm list -> unit | |
| 2509 | 65 | val Addsimprocs: simproc list -> unit | 
| 66 | val Delsimprocs: simproc list -> unit | |
| 9715 | 67 | val Addcongs: thm list -> unit | 
| 68 | val Delcongs: thm list -> unit | |
| 8879 | 69 | val generic_simp_tac: bool -> bool * bool * bool -> simpset -> int -> tactic | 
| 10004 | 70 | val safe_asm_full_simp_tac: simpset -> int -> tactic | 
| 2629 | 71 | val simp_tac: simpset -> int -> tactic | 
| 72 | val asm_simp_tac: simpset -> int -> tactic | |
| 73 | val full_simp_tac: simpset -> int -> tactic | |
| 4722 
d2e44673c21e
The new asm_lr_simp_tac is the old asm_full_simp_tac.
 nipkow parents: 
4713diff
changeset | 74 | val asm_lr_simp_tac: simpset -> int -> tactic | 
| 2629 | 75 | val asm_full_simp_tac: simpset -> int -> tactic | 
| 76 | val Simp_tac: int -> tactic | |
| 77 | val Asm_simp_tac: int -> tactic | |
| 78 | val Full_simp_tac: int -> tactic | |
| 4722 
d2e44673c21e
The new asm_lr_simp_tac is the old asm_full_simp_tac.
 nipkow parents: 
4713diff
changeset | 79 | val Asm_lr_simp_tac: int -> tactic | 
| 2629 | 80 | val Asm_full_simp_tac: int -> tactic | 
| 3557 | 81 | val simplify: simpset -> thm -> thm | 
| 82 | val asm_simplify: simpset -> thm -> thm | |
| 83 | val full_simplify: simpset -> thm -> thm | |
| 84 | val asm_full_simplify: simpset -> thm -> thm | |
| 0 | 85 | end; | 
| 86 | ||
| 4795 | 87 | signature SIMPLIFIER = | 
| 88 | sig | |
| 89 | include BASIC_SIMPLIFIER | |
| 13475 | 90 | val simproc: Sign.sg -> string -> string list | 
| 91 | -> (Sign.sg -> thm list -> term -> thm option) -> simproc | |
| 92 | val simproc_i: Sign.sg -> string -> term list | |
| 93 | -> (Sign.sg -> thm list -> term -> thm option) -> simproc | |
| 5082 | 94 | val rewrite: simpset -> cterm -> thm | 
| 95 | val asm_rewrite: simpset -> cterm -> thm | |
| 96 | val full_rewrite: simpset -> cterm -> thm | |
| 97 | val asm_full_rewrite: simpset -> cterm -> thm | |
| 5842 | 98 | val print_local_simpset: Proof.context -> unit | 
| 99 | val get_local_simpset: Proof.context -> simpset | |
| 100 | val put_local_simpset: simpset -> Proof.context -> Proof.context | |
| 8467 | 101 | val change_global_ss: (simpset * thm list -> simpset) -> theory attribute | 
| 102 | val change_local_ss: (simpset * thm list -> simpset) -> Proof.context attribute | |
| 4855 | 103 | val simp_add_global: theory attribute | 
| 104 | val simp_del_global: theory attribute | |
| 5842 | 105 | val simp_add_local: Proof.context attribute | 
| 106 | val simp_del_local: Proof.context attribute | |
| 9715 | 107 | val cong_add_global: theory attribute | 
| 108 | val cong_del_global: theory attribute | |
| 109 | val cong_add_local: Proof.context attribute | |
| 110 | val cong_del_local: Proof.context attribute | |
| 7177 | 111 | val change_simpset_of: (simpset * 'a -> simpset) -> 'a -> theory -> theory | 
| 7273 | 112 | val simp_modifiers: (Args.T list -> (Method.modifier * Args.T list)) list | 
| 5842 | 113 | val setup: (theory -> theory) list | 
| 8467 | 114 | val method_setup: (Args.T list -> (Method.modifier * Args.T list)) list | 
| 115 | -> (theory -> theory) list | |
| 8228 | 116 | val easy_setup: thm -> thm list -> (theory -> theory) list | 
| 4795 | 117 | end; | 
| 2503 | 118 | |
| 119 | structure Simplifier: SIMPLIFIER = | |
| 0 | 120 | struct | 
| 121 | ||
| 2509 | 122 | |
| 123 | (** simplification procedures **) | |
| 124 | ||
| 125 | (* datatype simproc *) | |
| 126 | ||
| 127 | datatype simproc = | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 128 | Simproc of string * cterm list * (Sign.sg -> thm list -> term -> thm option) * stamp; | 
| 2509 | 129 | |
| 3557 | 130 | fun mk_simproc name lhss proc = | 
| 131 | Simproc (name, map (Thm.cterm_fun Logic.varify) lhss, proc, stamp ()); | |
| 132 | ||
| 13462 | 133 | fun simproc sg name ss = | 
| 134 | mk_simproc name (map (fn s => Thm.read_cterm sg (s, TypeInfer.logicT)) ss); | |
| 135 | fun simproc_i sg name = mk_simproc name o map (Thm.cterm_of sg); | |
| 136 | ||
| 3551 | 137 | fun rep_simproc (Simproc args) = args; | 
| 2509 | 138 | |
| 8467 | 139 | |
| 140 | ||
| 7568 | 141 | (** solvers **) | 
| 2509 | 142 | |
| 7568 | 143 | datatype solver = Solver of string * (thm list -> int -> tactic) * stamp; | 
| 144 | ||
| 12282 | 145 | fun mk_solver name solver = Solver (name, solver, stamp()); | 
| 146 | fun eq_solver (Solver (_, _, s1), Solver(_, _, s2)) = s1 = s2; | |
| 7568 | 147 | |
| 12282 | 148 | val merge_solvers = gen_merge_lists eq_solver; | 
| 7568 | 149 | |
| 150 | fun app_sols [] _ _ = no_tac | |
| 151 | | app_sols (Solver(_,solver,_)::sols) thms i = | |
| 152 | solver thms i ORELSE app_sols sols thms i; | |
| 2509 | 153 | |
| 8467 | 154 | |
| 155 | ||
| 2503 | 156 | (** simplification sets **) | 
| 157 | ||
| 158 | (* type simpset *) | |
| 159 | ||
| 0 | 160 | datatype simpset = | 
| 2503 | 161 |   Simpset of {
 | 
| 11669 | 162 | mss: MetaSimplifier.meta_simpset, | 
| 9715 | 163 | mk_cong: thm -> thm, | 
| 164 | subgoal_tac: simpset -> int -> tactic, | |
| 165 | loop_tacs: (string * (int -> tactic)) list, | |
| 7568 | 166 | unsafe_solvers: solver list, | 
| 9715 | 167 | solvers: solver list}; | 
| 2503 | 168 | |
| 9715 | 169 | fun make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers solvers = | 
| 170 |   Simpset {mss = mss, mk_cong = mk_cong, subgoal_tac = subgoal_tac,
 | |
| 171 | loop_tacs = loop_tacs, unsafe_solvers = unsafe_solvers, solvers = solvers}; | |
| 0 | 172 | |
| 173 | val empty_ss = | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 174 | let val mss = MetaSimplifier.set_mk_sym (MetaSimplifier.empty_mss, Some o symmetric_fun) | 
| 9715 | 175 | in make_ss mss I (K (K no_tac)) [] [] [] end; | 
| 3551 | 176 | |
| 177 | fun rep_ss (Simpset args) = args; | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 178 | fun prems_of_ss (Simpset {mss, ...}) = MetaSimplifier.prems_of_mss mss;
 | 
| 3551 | 179 | |
| 180 | ||
| 181 | (* print simpsets *) | |
| 2503 | 182 | |
| 3551 | 183 | fun print_ss ss = | 
| 184 | let | |
| 185 |     val Simpset {mss, ...} = ss;
 | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 186 |     val {simps, procs, congs} = MetaSimplifier.dest_mss mss;
 | 
| 2503 | 187 | |
| 3551 | 188 | val pretty_thms = map Display.pretty_thm; | 
| 189 | fun pretty_proc (name, lhss) = | |
| 190 | Pretty.big_list (name ^ ":") (map Display.pretty_cterm lhss); | |
| 191 | in | |
| 8727 | 192 | [Pretty.big_list "simplification rules:" (pretty_thms simps), | 
| 193 | Pretty.big_list "simplification procedures:" (map pretty_proc procs), | |
| 194 | Pretty.big_list "congruences:" (pretty_thms congs)] | |
| 195 | |> Pretty.chunks |> Pretty.writeln | |
| 3551 | 196 | end; | 
| 2503 | 197 | |
| 198 | ||
| 199 | (* extend simpsets *) | |
| 200 | ||
| 9715 | 201 | fun (Simpset {mss, mk_cong, subgoal_tac = _, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 202 | setsubgoaler subgoal_tac = | 
| 9715 | 203 | make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 2629 | 204 | |
| 9715 | 205 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs = _, unsafe_solvers, solvers})
 | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 206 | setloop tac = | 
| 9715 | 207 |   make_ss mss mk_cong subgoal_tac [("", tac)] unsafe_solvers solvers;
 | 
| 2503 | 208 | |
| 9715 | 209 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 210 | addloop tac = make_ss mss mk_cong subgoal_tac | |
| 211 | (case assoc_string (loop_tacs, (#1 tac)) of None => () | Some x => | |
| 212 |         warning ("overwriting looper " ^ quote (#1 tac)); overwrite (loop_tacs, tac))
 | |
| 213 | unsafe_solvers solvers; | |
| 2567 | 214 | |
| 9715 | 215 | fun (ss as Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 216 | delloop name = | 
| 6911 | 217 | let val (del, rest) = partition (fn (n, _) => n = name) loop_tacs in | 
| 218 |     if null del then (warning ("No such looper in simpset: " ^ name); ss)
 | |
| 9715 | 219 | else make_ss mss mk_cong subgoal_tac rest unsafe_solvers solvers | 
| 4682 | 220 | end; | 
| 221 | ||
| 9715 | 222 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, ...})
 | 
| 7568 | 223 | setSSolver solver = | 
| 9715 | 224 | make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers [solver]; | 
| 2503 | 225 | |
| 9715 | 226 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 7568 | 227 | addSSolver sol = | 
| 9715 | 228 | make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers (merge_solvers solvers [sol]); | 
| 2503 | 229 | |
| 9715 | 230 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers = _, solvers})
 | 
| 7568 | 231 | setSolver unsafe_solver = | 
| 9715 | 232 | make_ss mss mk_cong subgoal_tac loop_tacs [unsafe_solver] solvers; | 
| 7568 | 233 | |
| 9715 | 234 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 7568 | 235 | addSolver sol = | 
| 9715 | 236 | make_ss mss mk_cong subgoal_tac loop_tacs (merge_solvers unsafe_solvers [sol]) solvers; | 
| 2503 | 237 | |
| 9715 | 238 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 239 | setmksimps mk_simps = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 240 | make_ss (MetaSimplifier.set_mk_rews (mss, mk_simps)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 2509 | 241 | |
| 9715 | 242 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 4677 | 243 | setmkeqTrue mk_eq_True = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 244 | make_ss (MetaSimplifier.set_mk_eq_True (mss, mk_eq_True)) mk_cong subgoal_tac loop_tacs | 
| 9715 | 245 | unsafe_solvers solvers; | 
| 4677 | 246 | |
| 9715 | 247 | fun (Simpset {mss, mk_cong = _, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 248 | setmkcong mk_cong = | |
| 249 | make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | |
| 250 | ||
| 251 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | |
| 4677 | 252 | setmksym mksym = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 253 | make_ss (MetaSimplifier.set_mk_sym (mss, mksym)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 4677 | 254 | |
| 9715 | 255 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs,  unsafe_solvers, solvers})
 | 
| 3551 | 256 | settermless termless = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 257 | make_ss (MetaSimplifier.set_termless (mss, termless)) mk_cong subgoal_tac loop_tacs | 
| 9715 | 258 | unsafe_solvers solvers; | 
| 3551 | 259 | |
| 9715 | 260 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 261 | addsimps rews = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 262 | make_ss (MetaSimplifier.add_simps (mss, rews)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 2503 | 263 | |
| 9715 | 264 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 265 | delsimps rews = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 266 | make_ss (MetaSimplifier.del_simps (mss, rews)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 2503 | 267 | |
| 9715 | 268 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 269 | addeqcongs newcongs = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 270 | make_ss (MetaSimplifier.add_congs (mss, newcongs)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 9715 | 271 | |
| 272 | fun (Simpset {mss, subgoal_tac, mk_cong, loop_tacs, unsafe_solvers, solvers})
 | |
| 273 | deleqcongs oldcongs = | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 274 | make_ss (MetaSimplifier.del_congs (mss, oldcongs)) mk_cong subgoal_tac loop_tacs unsafe_solvers solvers; | 
| 2509 | 275 | |
| 9715 | 276 | fun (ss as Simpset {mk_cong, ...}) addcongs newcongs =
 | 
| 277 | ss addeqcongs map mk_cong newcongs; | |
| 2629 | 278 | |
| 9715 | 279 | fun (ss as Simpset {mk_cong, ...}) delcongs oldcongs =
 | 
| 280 | ss deleqcongs map mk_cong oldcongs; | |
| 281 | ||
| 282 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | |
| 3551 | 283 | addsimprocs simprocs = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 284 | make_ss (MetaSimplifier.add_simprocs (mss, map rep_simproc simprocs)) mk_cong subgoal_tac loop_tacs | 
| 9715 | 285 | unsafe_solvers solvers; | 
| 2509 | 286 | |
| 9715 | 287 | fun (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 288 | delsimprocs simprocs = | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 289 | make_ss (MetaSimplifier.del_simprocs (mss, map rep_simproc simprocs)) mk_cong subgoal_tac | 
| 9715 | 290 | loop_tacs unsafe_solvers solvers; | 
| 2503 | 291 | |
| 9715 | 292 | fun clear_ss (Simpset {mss, mk_cong, subgoal_tac, loop_tacs = _, unsafe_solvers, solvers}) =
 | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 293 | make_ss (MetaSimplifier.clear_mss mss) mk_cong subgoal_tac [] unsafe_solvers solvers; | 
| 6911 | 294 | |
| 2503 | 295 | |
| 7568 | 296 | (* merge simpsets *) | 
| 8467 | 297 | |
| 298 | (*ignores subgoal_tac of 2nd simpset!*) | |
| 2503 | 299 | |
| 3551 | 300 | fun merge_ss | 
| 9715 | 301 |    (Simpset {mss = mss1, mk_cong, loop_tacs = loop_tacs1, subgoal_tac,
 | 
| 7568 | 302 | unsafe_solvers = unsafe_solvers1, solvers = solvers1}, | 
| 9715 | 303 |     Simpset {mss = mss2, mk_cong = _, loop_tacs = loop_tacs2, subgoal_tac = _,
 | 
| 304 | unsafe_solvers = unsafe_solvers2, solvers = solvers2}) = | |
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 305 | make_ss (MetaSimplifier.merge_mss (mss1, mss2)) mk_cong subgoal_tac | 
| 9715 | 306 | (merge_alists loop_tacs1 loop_tacs2) | 
| 307 | (merge_solvers unsafe_solvers1 unsafe_solvers2) | |
| 308 | (merge_solvers solvers1 solvers2); | |
| 2503 | 309 | |
| 3557 | 310 | |
| 8467 | 311 | |
| 5024 | 312 | (** global and local simpset data **) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 313 | |
| 5842 | 314 | (* theory data kind 'Provers/simpset' *) | 
| 4795 | 315 | |
| 5842 | 316 | structure GlobalSimpsetArgs = | 
| 5024 | 317 | struct | 
| 5842 | 318 | val name = "Provers/simpset"; | 
| 5024 | 319 | type T = simpset ref; | 
| 0 | 320 | |
| 5024 | 321 | val empty = ref empty_ss; | 
| 6556 | 322 | fun copy (ref ss) = (ref ss): T; (*create new reference!*) | 
| 323 | val prep_ext = copy; | |
| 5024 | 324 | fun merge (ref ss1, ref ss2) = ref (merge_ss (ss1, ss2)); | 
| 325 | fun print _ (ref ss) = print_ss ss; | |
| 326 | end; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 327 | |
| 5842 | 328 | structure GlobalSimpset = TheoryDataFun(GlobalSimpsetArgs); | 
| 329 | val print_simpset = GlobalSimpset.print; | |
| 330 | val simpset_ref_of_sg = GlobalSimpset.get_sg; | |
| 331 | val simpset_ref_of = GlobalSimpset.get; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 332 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 333 | |
| 4795 | 334 | (* access global simpset *) | 
| 0 | 335 | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 336 | val simpset_of_sg = ! o simpset_ref_of_sg; | 
| 6391 | 337 | val simpset_of = simpset_of_sg o Theory.sign_of; | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 338 | |
| 6391 | 339 | fun SIMPSET tacf state = tacf (simpset_of_sg (Thm.sign_of_thm state)) state; | 
| 340 | fun SIMPSET' tacf i state = tacf (simpset_of_sg (Thm.sign_of_thm state)) i state; | |
| 0 | 341 | |
| 5028 | 342 | val simpset = simpset_of o Context.the_context; | 
| 6391 | 343 | val simpset_ref = simpset_ref_of_sg o Theory.sign_of o Context.the_context; | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 344 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 345 | |
| 4795 | 346 | (* change global simpset *) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 347 | |
| 7177 | 348 | fun change_simpset_of f x thy = | 
| 349 | let val r = simpset_ref_of thy | |
| 350 | in r := f (! r, x); thy end; | |
| 351 | ||
| 352 | fun change_simpset f x = (change_simpset_of f x (Context.the_context ()); ()); | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 353 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 354 | val Addsimps = change_simpset (op addsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 355 | val Delsimps = change_simpset (op delsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 356 | val Addsimprocs = change_simpset (op addsimprocs); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 357 | val Delsimprocs = change_simpset (op delsimprocs); | 
| 9715 | 358 | val Addcongs = change_simpset (op addcongs); | 
| 359 | val Delcongs = change_simpset (op delcongs); | |
| 2509 | 360 | |
| 0 | 361 | |
| 5842 | 362 | (* proof data kind 'Provers/simpset' *) | 
| 4795 | 363 | |
| 5842 | 364 | structure LocalSimpsetArgs = | 
| 365 | struct | |
| 366 | val name = "Provers/simpset"; | |
| 367 | type T = simpset; | |
| 368 | val init = simpset_of; | |
| 369 | fun print _ ss = print_ss ss; | |
| 370 | end; | |
| 4795 | 371 | |
| 5842 | 372 | structure LocalSimpset = ProofDataFun(LocalSimpsetArgs); | 
| 373 | val print_local_simpset = LocalSimpset.print; | |
| 374 | val get_local_simpset = LocalSimpset.get; | |
| 375 | val put_local_simpset = LocalSimpset.put; | |
| 7273 | 376 | fun map_local_simpset f ctxt = put_local_simpset (f (get_local_simpset ctxt)) ctxt; | 
| 4795 | 377 | |
| 378 | ||
| 5886 | 379 | (* attributes *) | 
| 380 | ||
| 381 | fun change_global_ss f (thy, th) = | |
| 382 | let val r = simpset_ref_of thy | |
| 6096 | 383 | in r := f (! r, [th]); (thy, th) end; | 
| 5886 | 384 | |
| 385 | fun change_local_ss f (ctxt, th) = | |
| 6096 | 386 | let val ss = f (get_local_simpset ctxt, [th]) | 
| 5886 | 387 | in (put_local_simpset ss ctxt, th) end; | 
| 388 | ||
| 389 | val simp_add_global = change_global_ss (op addsimps); | |
| 390 | val simp_del_global = change_global_ss (op delsimps); | |
| 391 | val simp_add_local = change_local_ss (op addsimps); | |
| 392 | val simp_del_local = change_local_ss (op delsimps); | |
| 393 | ||
| 9715 | 394 | val cong_add_global = change_global_ss (op addcongs); | 
| 395 | val cong_del_global = change_global_ss (op delcongs); | |
| 396 | val cong_add_local = change_local_ss (op addcongs); | |
| 397 | val cong_del_local = change_local_ss (op delcongs); | |
| 398 | ||
| 5886 | 399 | |
| 3557 | 400 | |
| 2503 | 401 | (** simplification tactics **) | 
| 0 | 402 | |
| 9715 | 403 | fun solve_all_tac (mk_cong, subgoal_tac, loop_tacs, unsafe_solvers) mss = | 
| 3557 | 404 | let | 
| 405 | val ss = | |
| 9715 | 406 | make_ss mss mk_cong subgoal_tac loop_tacs unsafe_solvers unsafe_solvers; | 
| 4612 | 407 | val solve1_tac = (subgoal_tac ss THEN_ALL_NEW (K no_tac)) 1 | 
| 3557 | 408 | in DEPTH_SOLVE solve1_tac end; | 
| 409 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 410 | fun loop_tac loop_tacs = FIRST'(map snd loop_tacs); | 
| 3557 | 411 | |
| 8879 | 412 | (*note: may instantiate unknowns that appear also in other subgoals*) | 
| 413 | fun generic_simp_tac safe mode = | |
| 9715 | 414 |   fn (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, solvers, ...}) =>
 | 
| 3551 | 415 | let | 
| 8879 | 416 | val solvs = app_sols (if safe then solvers else unsafe_solvers); | 
| 4612 | 417 | fun simp_loop_tac i = | 
| 418 | asm_rewrite_goal_tac mode | |
| 9715 | 419 | (solve_all_tac (mk_cong, subgoal_tac, loop_tacs, unsafe_solvers)) | 
| 4612 | 420 | mss i | 
| 11669 | 421 | THEN (solvs (MetaSimplifier.prems_of_mss mss) i ORELSE | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 422 | TRY ((loop_tac loop_tacs THEN_ALL_NEW simp_loop_tac) i)) | 
| 4612 | 423 | in simp_loop_tac end; | 
| 0 | 424 | |
| 10004 | 425 | val simp_tac = generic_simp_tac false (false, false, false); | 
| 426 | val asm_simp_tac = generic_simp_tac false (false, true, false); | |
| 427 | val full_simp_tac = generic_simp_tac false (true, false, false); | |
| 428 | val asm_lr_simp_tac = generic_simp_tac false (true, true, false); | |
| 429 | val asm_full_simp_tac = generic_simp_tac false (true, true, true); | |
| 430 | val safe_asm_full_simp_tac = generic_simp_tac true (true, true, true); | |
| 0 | 431 | |
| 2629 | 432 | |
| 4795 | 433 | (*the abstraction over the proof state delays the dereferencing*) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 434 | fun Simp_tac i st = simp_tac (simpset ()) i st; | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 435 | fun Asm_simp_tac i st = asm_simp_tac (simpset ()) i st; | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 436 | fun Full_simp_tac i st = full_simp_tac (simpset ()) i st; | 
| 4722 
d2e44673c21e
The new asm_lr_simp_tac is the old asm_full_simp_tac.
 nipkow parents: 
4713diff
changeset | 437 | fun Asm_lr_simp_tac i st = asm_lr_simp_tac (simpset ()) i st; | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 438 | fun Asm_full_simp_tac i st = asm_full_simp_tac (simpset ()) i st; | 
| 406 | 439 | |
| 3557 | 440 | |
| 4795 | 441 | |
| 5082 | 442 | (** simplification rules and conversions **) | 
| 3557 | 443 | |
| 9715 | 444 | fun simp rew mode | 
| 445 |      (Simpset {mss, mk_cong, subgoal_tac, loop_tacs, unsafe_solvers, ...}) thm =
 | |
| 3557 | 446 | let | 
| 9715 | 447 | val tacf = solve_all_tac (mk_cong, subgoal_tac, loop_tacs, unsafe_solvers); | 
| 4271 
3a82492e70c5
changed Pure/Sequence interface -- isatool fixseq;
 wenzelm parents: 
4259diff
changeset | 448 | fun prover m th = apsome fst (Seq.pull (tacf m th)); | 
| 5082 | 449 | in rew mode prover mss thm end; | 
| 450 | ||
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 451 | val simp_thm = simp MetaSimplifier.rewrite_thm; | 
| 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 452 | val simp_cterm = simp MetaSimplifier.rewrite_cterm; | 
| 3557 | 453 | |
| 5082 | 454 | val simplify = simp_thm (false, false, false); | 
| 455 | val asm_simplify = simp_thm (false, true, false); | |
| 456 | val full_simplify = simp_thm (true, false, false); | |
| 457 | val asm_full_simplify = simp_thm (true, true, false); | |
| 458 | ||
| 459 | val rewrite = simp_cterm (false, false, false); | |
| 460 | val asm_rewrite = simp_cterm (false, true, false); | |
| 461 | val full_rewrite = simp_cterm (true, false, false); | |
| 462 | val asm_full_rewrite = simp_cterm (true, true, false); | |
| 3557 | 463 | |
| 464 | ||
| 4795 | 465 | |
| 5886 | 466 | (** concrete syntax of attributes **) | 
| 5842 | 467 | |
| 5886 | 468 | (* add / del *) | 
| 5842 | 469 | |
| 5928 | 470 | val simpN = "simp"; | 
| 9715 | 471 | val congN = "cong"; | 
| 10412 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 472 | val addN = "add"; | 
| 
1a1b4c1b2b7c
Moved meta simplification stuff from Thm to MetaSimplifier.
 berghofe parents: 
10034diff
changeset | 473 | val delN = "del"; | 
| 6911 | 474 | val onlyN = "only"; | 
| 9899 | 475 | val no_asmN = "no_asm"; | 
| 476 | val no_asm_useN = "no_asm_use"; | |
| 477 | val no_asm_simpN = "no_asm_simp"; | |
| 13605 | 478 | val asm_lrN = "asm_lr"; | 
| 5842 | 479 | |
| 8634 | 480 | val simp_attr = | 
| 481 | (Attrib.add_del_args simp_add_global simp_del_global, | |
| 482 | Attrib.add_del_args simp_add_local simp_del_local); | |
| 5842 | 483 | |
| 9715 | 484 | val cong_attr = | 
| 485 | (Attrib.add_del_args cong_add_global cong_del_global, | |
| 486 | Attrib.add_del_args cong_add_local cong_del_local); | |
| 487 | ||
| 5842 | 488 | |
| 489 | (* conversions *) | |
| 490 | ||
| 9899 | 491 | local | 
| 492 | ||
| 493 | fun conv_mode x = | |
| 494 | ((Args.parens (Args.$$$ no_asmN) >> K simplify || | |
| 495 | Args.parens (Args.$$$ no_asm_simpN) >> K asm_simplify || | |
| 496 | Args.parens (Args.$$$ no_asm_useN) >> K full_simplify || | |
| 497 | Scan.succeed asm_full_simplify) |> Scan.lift) x; | |
| 498 | ||
| 11938 | 499 | fun simplified_att get args = | 
| 500 | Attrib.syntax (conv_mode -- args >> (fn (f, ths) => | |
| 501 | Drule.rule_attribute (fn x => f ((if null ths then I else clear_ss) (get x) addsimps ths)))); | |
| 9899 | 502 | |
| 503 | in | |
| 504 | ||
| 505 | val simplified_attr = | |
| 11938 | 506 | (simplified_att simpset_of Attrib.global_thmss, | 
| 507 | simplified_att get_local_simpset Attrib.local_thmss); | |
| 9899 | 508 | |
| 509 | end; | |
| 5842 | 510 | |
| 511 | ||
| 512 | (* setup_attrs *) | |
| 513 | ||
| 514 | val setup_attrs = Attrib.add_attributes | |
| 9899 | 515 | [(simpN, simp_attr, "declaration of simplification rule"), | 
| 516 | (congN, cong_attr, "declaration of Simplifier congruence rule"), | |
| 517 |   ("simplified", simplified_attr, "simplified rule")];
 | |
| 5842 | 518 | |
| 519 | ||
| 520 | ||
| 521 | (** proof methods **) | |
| 522 | ||
| 523 | (* simplification *) | |
| 524 | ||
| 8700 | 525 | val simp_options = | 
| 9899 | 526 | (Args.parens (Args.$$$ no_asmN) >> K simp_tac || | 
| 527 | Args.parens (Args.$$$ no_asm_simpN) >> K asm_simp_tac || | |
| 528 | Args.parens (Args.$$$ no_asm_useN) >> K full_simp_tac || | |
| 13605 | 529 | Args.parens (Args.$$$ asm_lrN) >> K asm_lr_simp_tac || | 
| 8700 | 530 | Scan.succeed asm_full_simp_tac); | 
| 531 | ||
| 9715 | 532 | val cong_modifiers = | 
| 9720 | 533 | [Args.$$$ congN -- Args.colon >> K ((I, cong_add_local):Method.modifier), | 
| 10034 | 534 | Args.$$$ congN -- Args.add -- Args.colon >> K (I, cong_add_local), | 
| 535 | Args.$$$ congN -- Args.del -- Args.colon >> K (I, cong_del_local)]; | |
| 9715 | 536 | |
| 5928 | 537 | val simp_modifiers = | 
| 8815 | 538 | [Args.$$$ simpN -- Args.colon >> K (I, simp_add_local), | 
| 10034 | 539 | Args.$$$ simpN -- Args.add -- Args.colon >> K (I, simp_add_local), | 
| 540 | Args.$$$ simpN -- Args.del -- Args.colon >> K (I, simp_del_local), | |
| 9861 | 541 | Args.$$$ simpN -- Args.$$$ onlyN -- Args.colon >> K (map_local_simpset clear_ss, simp_add_local)] | 
| 542 | @ cong_modifiers; | |
| 5928 | 543 | |
| 544 | val simp_modifiers' = | |
| 10034 | 545 | [Args.add -- Args.colon >> K (I, simp_add_local), | 
| 546 | Args.del -- Args.colon >> K (I, simp_del_local), | |
| 9861 | 547 | Args.$$$ onlyN -- Args.colon >> K (map_local_simpset clear_ss, simp_add_local)] | 
| 548 | @ cong_modifiers; | |
| 5928 | 549 | |
| 8700 | 550 | fun simp_args more_mods = | 
| 551 | Method.sectioned_args (Args.bang_facts -- Scan.lift simp_options) (more_mods @ simp_modifiers'); | |
| 552 | ||
| 8170 | 553 | |
| 8700 | 554 | fun simp_method (prems, tac) ctxt = Method.METHOD (fn facts => | 
| 555 | ALLGOALS (Method.insert_tac (prems @ facts)) THEN | |
| 10821 | 556 | (CHANGED_PROP o ALLGOALS o tac) (get_local_simpset ctxt)); | 
| 8700 | 557 | |
| 558 | fun simp_method' (prems, tac) ctxt = Method.METHOD (fn facts => | |
| 10821 | 559 | HEADGOAL (Method.insert_tac (prems @ facts) THEN' | 
| 560 | (CHANGED_PROP oo tac) (get_local_simpset ctxt))); | |
| 9715 | 561 | |
| 5842 | 562 | |
| 563 | (* setup_methods *) | |
| 564 | ||
| 8467 | 565 | fun setup_methods more_mods = Method.add_methods | 
| 8700 | 566 | [(simpN, simp_args more_mods simp_method', "simplification"), | 
| 567 |   ("simp_all", simp_args more_mods simp_method, "simplification (all goals)")];
 | |
| 5842 | 568 | |
| 569 | ||
| 570 | ||
| 4795 | 571 | (** theory setup **) | 
| 572 | ||
| 8467 | 573 | val setup = [GlobalSimpset.init, LocalSimpset.init, setup_attrs]; | 
| 574 | fun method_setup mods = [setup_methods mods]; | |
| 4795 | 575 | |
| 8228 | 576 | fun easy_setup reflect trivs = | 
| 577 | let | |
| 578 | val trivialities = Drule.reflexive_thm :: trivs; | |
| 579 | ||
| 580 | fun unsafe_solver_tac prems = FIRST' [resolve_tac (trivialities @ prems), assume_tac]; | |
| 581 | val unsafe_solver = mk_solver "easy unsafe" unsafe_solver_tac; | |
| 582 | ||
| 583 | (*no premature instantiation of variables during simplification*) | |
| 584 | fun safe_solver_tac prems = FIRST' [match_tac (trivialities @ prems), eq_assume_tac]; | |
| 585 | val safe_solver = mk_solver "easy safe" safe_solver_tac; | |
| 586 | ||
| 8243 | 587 | fun mk_eq thm = | 
| 8228 | 588 | if Logic.is_equals (Thm.concl_of thm) then [thm] | 
| 589 | else [thm RS reflect] handle THM _ => []; | |
| 590 | ||
| 8243 | 591 | fun mksimps thm = mk_eq (Drule.forall_elim_vars (#maxidx (Thm.rep_thm thm) + 1) thm); | 
| 592 | ||
| 8228 | 593 | fun init_ss thy = | 
| 594 | (simpset_ref_of thy := | |
| 595 | empty_ss setsubgoaler asm_simp_tac | |
| 596 | setSSolver safe_solver | |
| 597 | setSolver unsafe_solver | |
| 598 | setmksimps mksimps; thy); | |
| 8467 | 599 | in setup @ method_setup [] @ [init_ss] end; | 
| 8228 | 600 | |
| 4795 | 601 | |
| 8667 | 602 | |
| 603 | (** outer syntax **) | |
| 604 | ||
| 605 | val print_simpsetP = | |
| 606 | OuterSyntax.improper_command "print_simpset" "print context of Simplifier" | |
| 607 | OuterSyntax.Keyword.diag | |
| 9513 | 608 | (Scan.succeed (Toplevel.no_timing o Toplevel.unknown_context o (Toplevel.keep | 
| 9010 | 609 | (Toplevel.node_case print_simpset (print_local_simpset o Proof.context_of))))); | 
| 8667 | 610 | |
| 611 | val _ = OuterSyntax.add_parsers [print_simpsetP]; | |
| 612 | ||
| 1243 | 613 | end; | 
| 4795 | 614 | |
| 615 | ||
| 616 | structure BasicSimplifier: BASIC_SIMPLIFIER = Simplifier; | |
| 617 | open BasicSimplifier; |