| author | wenzelm | 
| Thu, 21 Oct 1999 18:47:33 +0200 | |
| changeset 7907 | 258f136864db | 
| parent 7646 | 1ad3866b86cc | 
| child 8154 | dab09e1ad594 | 
| 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 | |
| 4795 | 5 | Generic simplifier, suitable for most logics. See Pure/thm.ML for the | 
| 6 | actual meta-level rewriting engine. | |
| 1 | 7 | *) | 
| 1260 | 8 | |
| 3551 | 9 | infix 4 | 
| 4682 | 10 | setsubgoaler setloop addloop delloop setSSolver addSSolver setSolver | 
| 4677 | 11 | addSolver addsimps delsimps addeqcongs deleqcongs | 
| 12 | setmksimps setmkeqTrue 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 -> | 
| 24 |    {mss: meta_simpset,
 | |
| 25 | subgoal_tac: simpset -> int -> tactic, | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 26 | loop_tacs: (string * (int -> tactic))list, | 
| 7568 | 27 | unsafe_solvers: solver list, | 
| 28 | solvers: solver list}; | |
| 3551 | 29 | val print_ss: simpset -> unit | 
| 4366 | 30 | val print_simpset: theory -> unit | 
| 2629 | 31 | val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset | 
| 32 | val setloop: simpset * (int -> tactic) -> simpset | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 33 | val addloop: simpset * (string * (int -> tactic)) -> simpset | 
| 4682 | 34 | val delloop: simpset * string -> simpset | 
| 7568 | 35 | val setSSolver: simpset * solver -> simpset | 
| 36 | val addSSolver: simpset * solver -> simpset | |
| 37 | val setSolver: simpset * solver -> simpset | |
| 38 | val addSolver: simpset * solver -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 39 | val setmksimps: simpset * (thm -> thm list) -> simpset | 
| 4677 | 40 | val setmkeqTrue: simpset * (thm -> thm option) -> simpset | 
| 41 | val setmksym: simpset * (thm -> thm option) -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 42 | val settermless: simpset * (term * term -> bool) -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 43 | val addsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 44 | val delsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 45 | val addeqcongs: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 46 | val deleqcongs: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 47 | val addsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 48 | val delsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 49 | val merge_ss: simpset * simpset -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 50 | val prems_of_ss: simpset -> thm list | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 51 | val simpset_ref_of_sg: Sign.sg -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 52 | val simpset_ref_of: theory -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 53 | val simpset_of_sg: Sign.sg -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 54 | val simpset_of: theory -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 55 | val SIMPSET: (simpset -> tactic) -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 56 | val SIMPSET': (simpset -> 'a -> tactic) -> 'a -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 57 | val simpset: unit -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 58 | val simpset_ref: unit -> simpset ref | 
| 1243 | 59 | val Addsimps: thm list -> unit | 
| 60 | val Delsimps: thm list -> unit | |
| 2509 | 61 | val Addsimprocs: simproc list -> unit | 
| 62 | val Delsimprocs: simproc list -> unit | |
| 2629 | 63 | val simp_tac: simpset -> int -> tactic | 
| 64 | val asm_simp_tac: simpset -> int -> tactic | |
| 65 | 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 | 66 | val asm_lr_simp_tac: simpset -> int -> tactic | 
| 2629 | 67 | val asm_full_simp_tac: simpset -> int -> tactic | 
| 68 | val safe_asm_full_simp_tac: simpset -> int -> tactic | |
| 69 | val Simp_tac: int -> tactic | |
| 70 | val Asm_simp_tac: int -> tactic | |
| 71 | 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 | 72 | val Asm_lr_simp_tac: int -> tactic | 
| 2629 | 73 | val Asm_full_simp_tac: int -> tactic | 
| 3557 | 74 | val simplify: simpset -> thm -> thm | 
| 75 | val asm_simplify: simpset -> thm -> thm | |
| 76 | val full_simplify: simpset -> thm -> thm | |
| 77 | val asm_full_simplify: simpset -> thm -> thm | |
| 0 | 78 | end; | 
| 79 | ||
| 4795 | 80 | signature SIMPLIFIER = | 
| 81 | sig | |
| 82 | include BASIC_SIMPLIFIER | |
| 5082 | 83 | val rewrite: simpset -> cterm -> thm | 
| 84 | val asm_rewrite: simpset -> cterm -> thm | |
| 85 | val full_rewrite: simpset -> cterm -> thm | |
| 86 | val asm_full_rewrite: simpset -> cterm -> thm | |
| 5842 | 87 | val print_local_simpset: Proof.context -> unit | 
| 88 | val get_local_simpset: Proof.context -> simpset | |
| 89 | val put_local_simpset: simpset -> Proof.context -> Proof.context | |
| 4855 | 90 | val simp_add_global: theory attribute | 
| 91 | val simp_del_global: theory attribute | |
| 5842 | 92 | val simp_add_local: Proof.context attribute | 
| 93 | val simp_del_local: Proof.context attribute | |
| 7177 | 94 | val change_simpset_of: (simpset * 'a -> simpset) -> 'a -> theory -> theory | 
| 7273 | 95 | val simp_modifiers: (Args.T list -> (Method.modifier * Args.T list)) list | 
| 5842 | 96 | val setup: (theory -> theory) list | 
| 4795 | 97 | end; | 
| 2503 | 98 | |
| 99 | structure Simplifier: SIMPLIFIER = | |
| 0 | 100 | struct | 
| 101 | ||
| 2509 | 102 | |
| 103 | (** simplification procedures **) | |
| 104 | ||
| 105 | (* datatype simproc *) | |
| 106 | ||
| 107 | datatype simproc = | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 108 | Simproc of string * cterm list * (Sign.sg -> thm list -> term -> thm option) * stamp; | 
| 2509 | 109 | |
| 3557 | 110 | fun mk_simproc name lhss proc = | 
| 111 | Simproc (name, map (Thm.cterm_fun Logic.varify) lhss, proc, stamp ()); | |
| 112 | ||
| 3551 | 113 | fun rep_simproc (Simproc args) = args; | 
| 2509 | 114 | |
| 7568 | 115 | (** solvers **) | 
| 2509 | 116 | |
| 7568 | 117 | datatype solver = Solver of string * (thm list -> int -> tactic) * stamp; | 
| 118 | ||
| 119 | fun mk_solver name solver = Solver(name, solver, stamp()); | |
| 120 | ||
| 121 | fun eq_solver (Solver(_,_,s1),Solver(_,_,s2)) = s1=s2; | |
| 122 | ||
| 123 | val merge_solvers = generic_merge eq_solver I I; | |
| 124 | ||
| 125 | fun app_sols [] _ _ = no_tac | |
| 126 | | app_sols (Solver(_,solver,_)::sols) thms i = | |
| 127 | solver thms i ORELSE app_sols sols thms i; | |
| 2509 | 128 | |
| 2503 | 129 | (** simplification sets **) | 
| 130 | ||
| 131 | (* type simpset *) | |
| 132 | ||
| 0 | 133 | datatype simpset = | 
| 2503 | 134 |   Simpset of {
 | 
| 135 | mss: meta_simpset, | |
| 2629 | 136 | subgoal_tac: simpset -> int -> tactic, | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 137 | loop_tacs: (string * (int -> tactic))list, | 
| 7568 | 138 | unsafe_solvers: solver list, | 
| 139 | solvers: solver list}; | |
| 2503 | 140 | |
| 7568 | 141 | fun make_ss (mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers) = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 142 |   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tacs = loop_tacs,
 | 
| 7568 | 143 | unsafe_solvers = unsafe_solvers, solvers = solvers}; | 
| 0 | 144 | |
| 145 | val empty_ss = | |
| 6911 | 146 | let val mss = Thm.set_mk_sym (Thm.empty_mss, Some o symmetric_fun) | 
| 7568 | 147 | in make_ss (mss, K (K no_tac), [], [], []) end; | 
| 3551 | 148 | |
| 149 | fun rep_ss (Simpset args) = args; | |
| 150 | fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
 | |
| 151 | ||
| 152 | ||
| 153 | (* print simpsets *) | |
| 2503 | 154 | |
| 3551 | 155 | fun print_ss ss = | 
| 156 | let | |
| 157 |     val Simpset {mss, ...} = ss;
 | |
| 158 |     val {simps, procs, congs} = Thm.dest_mss mss;
 | |
| 2503 | 159 | |
| 3551 | 160 | val pretty_thms = map Display.pretty_thm; | 
| 161 | fun pretty_proc (name, lhss) = | |
| 162 | Pretty.big_list (name ^ ":") (map Display.pretty_cterm lhss); | |
| 163 | in | |
| 164 | Pretty.writeln (Pretty.big_list "simplification rules:" (pretty_thms simps)); | |
| 165 | Pretty.writeln (Pretty.big_list "simplification procedures:" (map pretty_proc procs)); | |
| 166 | Pretty.writeln (Pretty.big_list "congruences:" (pretty_thms congs)) | |
| 167 | end; | |
| 2503 | 168 | |
| 169 | ||
| 170 | (* extend simpsets *) | |
| 171 | ||
| 7568 | 172 | fun (Simpset {mss, subgoal_tac = _, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 173 | setsubgoaler subgoal_tac = | 
| 7568 | 174 | make_ss (mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 2629 | 175 | |
| 7568 | 176 | fun (Simpset {mss, subgoal_tac, loop_tacs = _, unsafe_solvers, solvers})
 | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 177 | setloop tac = | 
| 7568 | 178 |   make_ss (mss, subgoal_tac, [("",tac)], unsafe_solvers, solvers);
 | 
| 2503 | 179 | |
| 7568 | 180 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 4741 
7fcd106cb0ed
addloop: added warning in case of overwriting a looper
 oheimb parents: 
4739diff
changeset | 181 | addloop tac = make_ss (mss, subgoal_tac, | 
| 5886 | 182 | (case assoc_string (loop_tacs,(fst tac)) of None => () | Some x => | 
| 183 |          warning ("overwriting looper "^fst tac); overwrite(loop_tacs,tac)),
 | |
| 7568 | 184 | unsafe_solvers, solvers); | 
| 2567 | 185 | |
| 7568 | 186 | fun (ss as Simpset {mss, 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 | 187 | delloop name = | 
| 6911 | 188 | let val (del, rest) = partition (fn (n, _) => n = name) loop_tacs in | 
| 189 |     if null del then (warning ("No such looper in simpset: " ^ name); ss)
 | |
| 7568 | 190 | else make_ss (mss, subgoal_tac, rest, unsafe_solvers, solvers) | 
| 4682 | 191 | end; | 
| 192 | ||
| 7568 | 193 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, ...})
 | 
| 194 | setSSolver solver = | |
| 195 | make_ss (mss, subgoal_tac, loop_tacs, unsafe_solvers, [solver]); | |
| 2503 | 196 | |
| 7568 | 197 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 198 | addSSolver sol = | |
| 199 | make_ss (mss, subgoal_tac, loop_tacs, unsafe_solvers, | |
| 200 | merge_solvers solvers [sol]); | |
| 2503 | 201 | |
| 7568 | 202 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers = _, solvers})
 | 
| 203 | setSolver unsafe_solver = | |
| 204 | make_ss (mss, subgoal_tac, loop_tacs, [unsafe_solver], solvers); | |
| 205 | ||
| 206 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | |
| 207 | addSolver sol = | |
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 208 | make_ss (mss, subgoal_tac, loop_tacs, | 
| 7568 | 209 | merge_solvers unsafe_solvers [sol], solvers); | 
| 2503 | 210 | |
| 7568 | 211 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 212 | setmksimps mk_simps = | 
| 7646 
1ad3866b86cc
mk_simps: do *not* include Thm.strip_shyps o Drule.zero_var_indexes
 wenzelm parents: 
7571diff
changeset | 213 | make_ss (Thm.set_mk_rews (mss, mk_simps), subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 2509 | 214 | |
| 7568 | 215 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 4677 | 216 | setmkeqTrue mk_eq_True = | 
| 217 | make_ss (Thm.set_mk_eq_True (mss, mk_eq_True), | |
| 7568 | 218 | subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 4677 | 219 | |
| 7568 | 220 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 4677 | 221 | setmksym mksym = | 
| 222 | make_ss (Thm.set_mk_sym (mss, mksym), | |
| 7568 | 223 | subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 4677 | 224 | |
| 7568 | 225 | fun (Simpset {mss, subgoal_tac, loop_tacs,  unsafe_solvers, solvers})
 | 
| 3551 | 226 | settermless termless = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 227 | make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs, | 
| 7568 | 228 | unsafe_solvers, solvers); | 
| 3551 | 229 | |
| 7568 | 230 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 231 | addsimps rews = | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 232 | make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs, | 
| 7568 | 233 | unsafe_solvers, solvers); | 
| 2503 | 234 | |
| 7568 | 235 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 236 | delsimps rews = | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 237 | make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs, | 
| 7568 | 238 | unsafe_solvers, solvers); | 
| 2503 | 239 | |
| 7568 | 240 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 241 | addeqcongs newcongs = | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 242 | make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs, | 
| 7568 | 243 | unsafe_solvers, solvers); | 
| 2509 | 244 | |
| 7568 | 245 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 246 | deleqcongs oldcongs = | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 247 | make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs, | 
| 7568 | 248 | unsafe_solvers, solvers); | 
| 2629 | 249 | |
| 7568 | 250 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 251 | addsimprocs simprocs = | 
| 252 | make_ss | |
| 253 | (Thm.add_simprocs (mss, map rep_simproc simprocs), | |
| 7568 | 254 | subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 2509 | 255 | |
| 7568 | 256 | fun (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers})
 | 
| 3551 | 257 | delsimprocs simprocs = | 
| 258 | make_ss | |
| 259 | (Thm.del_simprocs (mss, map rep_simproc simprocs), | |
| 7568 | 260 | subgoal_tac, loop_tacs, unsafe_solvers, solvers); | 
| 2503 | 261 | |
| 7568 | 262 | fun clear_ss (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers}) =
 | 
| 263 | make_ss (Thm.clear_mss mss, subgoal_tac, loop_tacs, unsafe_solvers, solvers); | |
| 6911 | 264 | |
| 2503 | 265 | |
| 7568 | 266 | (* merge simpsets *) | 
| 267 | (*NOTE: ignores subgoal_tac of 2nd simpset *) | |
| 2503 | 268 | |
| 3551 | 269 | fun merge_ss | 
| 7568 | 270 |    (Simpset {mss = mss1, loop_tacs = loop_tacs1, subgoal_tac,
 | 
| 271 | unsafe_solvers = unsafe_solvers1, solvers = solvers1}, | |
| 272 |     Simpset {mss = mss2, loop_tacs = loop_tacs2,
 | |
| 273 | unsafe_solvers = unsafe_solvers2, solvers = solvers2, ...}) = | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 274 | make_ss (Thm.merge_mss (mss1, mss2), subgoal_tac, | 
| 7568 | 275 | merge_alists loop_tacs1 loop_tacs2, | 
| 276 | merge_solvers unsafe_solvers1 unsafe_solvers2, | |
| 277 | merge_solvers solvers1 solvers2); | |
| 2503 | 278 | |
| 3557 | 279 | |
| 5024 | 280 | (** global and local simpset data **) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 281 | |
| 5842 | 282 | (* theory data kind 'Provers/simpset' *) | 
| 4795 | 283 | |
| 5842 | 284 | structure GlobalSimpsetArgs = | 
| 5024 | 285 | struct | 
| 5842 | 286 | val name = "Provers/simpset"; | 
| 5024 | 287 | type T = simpset ref; | 
| 0 | 288 | |
| 5024 | 289 | val empty = ref empty_ss; | 
| 6556 | 290 | fun copy (ref ss) = (ref ss): T; (*create new reference!*) | 
| 291 | val prep_ext = copy; | |
| 5024 | 292 | fun merge (ref ss1, ref ss2) = ref (merge_ss (ss1, ss2)); | 
| 293 | fun print _ (ref ss) = print_ss ss; | |
| 294 | end; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 295 | |
| 5842 | 296 | structure GlobalSimpset = TheoryDataFun(GlobalSimpsetArgs); | 
| 297 | val print_simpset = GlobalSimpset.print; | |
| 298 | val simpset_ref_of_sg = GlobalSimpset.get_sg; | |
| 299 | val simpset_ref_of = GlobalSimpset.get; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 300 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 301 | |
| 4795 | 302 | (* access global simpset *) | 
| 0 | 303 | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 304 | val simpset_of_sg = ! o simpset_ref_of_sg; | 
| 6391 | 305 | 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 | 306 | |
| 6391 | 307 | fun SIMPSET tacf state = tacf (simpset_of_sg (Thm.sign_of_thm state)) state; | 
| 308 | fun SIMPSET' tacf i state = tacf (simpset_of_sg (Thm.sign_of_thm state)) i state; | |
| 0 | 309 | |
| 5028 | 310 | val simpset = simpset_of o Context.the_context; | 
| 6391 | 311 | 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 | 312 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 313 | |
| 4795 | 314 | (* change global simpset *) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 315 | |
| 7177 | 316 | fun change_simpset_of f x thy = | 
| 317 | let val r = simpset_ref_of thy | |
| 318 | in r := f (! r, x); thy end; | |
| 319 | ||
| 320 | 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 | 321 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 322 | val Addsimps = change_simpset (op addsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 323 | val Delsimps = change_simpset (op delsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 324 | val Addsimprocs = change_simpset (op addsimprocs); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 325 | val Delsimprocs = change_simpset (op delsimprocs); | 
| 2509 | 326 | |
| 0 | 327 | |
| 5842 | 328 | (* proof data kind 'Provers/simpset' *) | 
| 4795 | 329 | |
| 5842 | 330 | structure LocalSimpsetArgs = | 
| 331 | struct | |
| 332 | val name = "Provers/simpset"; | |
| 333 | type T = simpset; | |
| 334 | val init = simpset_of; | |
| 335 | fun print _ ss = print_ss ss; | |
| 336 | end; | |
| 4795 | 337 | |
| 5842 | 338 | structure LocalSimpset = ProofDataFun(LocalSimpsetArgs); | 
| 339 | val print_local_simpset = LocalSimpset.print; | |
| 340 | val get_local_simpset = LocalSimpset.get; | |
| 341 | val put_local_simpset = LocalSimpset.put; | |
| 7273 | 342 | fun map_local_simpset f ctxt = put_local_simpset (f (get_local_simpset ctxt)) ctxt; | 
| 4795 | 343 | |
| 344 | ||
| 5886 | 345 | (* attributes *) | 
| 346 | ||
| 347 | fun change_global_ss f (thy, th) = | |
| 348 | let val r = simpset_ref_of thy | |
| 6096 | 349 | in r := f (! r, [th]); (thy, th) end; | 
| 5886 | 350 | |
| 351 | fun change_local_ss f (ctxt, th) = | |
| 6096 | 352 | let val ss = f (get_local_simpset ctxt, [th]) | 
| 5886 | 353 | in (put_local_simpset ss ctxt, th) end; | 
| 354 | ||
| 355 | val simp_add_global = change_global_ss (op addsimps); | |
| 356 | val simp_del_global = change_global_ss (op delsimps); | |
| 357 | val simp_add_local = change_local_ss (op addsimps); | |
| 358 | val simp_del_local = change_local_ss (op delsimps); | |
| 359 | ||
| 360 | ||
| 3557 | 361 | |
| 2503 | 362 | (** simplification tactics **) | 
| 0 | 363 | |
| 7568 | 364 | fun solve_all_tac (subgoal_tac, loop_tacs, unsafe_solvers) mss = | 
| 3557 | 365 | let | 
| 366 | val ss = | |
| 7568 | 367 | make_ss (mss, subgoal_tac, loop_tacs,unsafe_solvers,unsafe_solvers); | 
| 4612 | 368 | val solve1_tac = (subgoal_tac ss THEN_ALL_NEW (K no_tac)) 1 | 
| 3557 | 369 | in DEPTH_SOLVE solve1_tac end; | 
| 370 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 371 | fun loop_tac loop_tacs = FIRST'(map snd loop_tacs); | 
| 3557 | 372 | |
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 373 | (*unsafe: may instantiate unknowns that appear also in other subgoals*) | 
| 7568 | 374 | fun basic_gen_simp_tac mode solvers = | 
| 375 |   fn (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, ...}) =>
 | |
| 3551 | 376 | let | 
| 4612 | 377 | fun simp_loop_tac i = | 
| 378 | asm_rewrite_goal_tac mode | |
| 7568 | 379 | (solve_all_tac (subgoal_tac,loop_tacs,unsafe_solvers)) | 
| 4612 | 380 | mss i | 
| 7568 | 381 | THEN (solvers (prems_of_mss mss) i ORELSE | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 382 | TRY ((loop_tac loop_tacs THEN_ALL_NEW simp_loop_tac) i)) | 
| 4612 | 383 | in simp_loop_tac end; | 
| 0 | 384 | |
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 385 | fun gen_simp_tac mode | 
| 7568 | 386 |       (ss as Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, ...}) =
 | 
| 387 | basic_gen_simp_tac mode (app_sols unsafe_solvers) ss; | |
| 3551 | 388 | |
| 4713 | 389 | val simp_tac = gen_simp_tac (false, false, false); | 
| 390 | val asm_simp_tac = gen_simp_tac (false, true, false); | |
| 391 | val full_simp_tac = gen_simp_tac (true, false, false); | |
| 4722 
d2e44673c21e
The new asm_lr_simp_tac is the old asm_full_simp_tac.
 nipkow parents: 
4713diff
changeset | 392 | val asm_lr_simp_tac = gen_simp_tac (true, true, false); | 
| 
d2e44673c21e
The new asm_lr_simp_tac is the old asm_full_simp_tac.
 nipkow parents: 
4713diff
changeset | 393 | val asm_full_simp_tac = gen_simp_tac (true, true, true); | 
| 0 | 394 | |
| 2629 | 395 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | 
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 396 | fun safe_asm_full_simp_tac (ss as Simpset {mss, subgoal_tac, loop_tacs, 
 | 
| 7568 | 397 | unsafe_solvers, solvers}) = | 
| 398 | basic_gen_simp_tac (true, true, true) (app_sols solvers) ss; | |
| 2629 | 399 | |
| 4795 | 400 | (*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 | 401 | 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 | 402 | 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 | 403 | 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 | 404 | 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 | 405 | fun Asm_full_simp_tac i st = asm_full_simp_tac (simpset ()) i st; | 
| 406 | 406 | |
| 3557 | 407 | |
| 4795 | 408 | |
| 5082 | 409 | (** simplification rules and conversions **) | 
| 3557 | 410 | |
| 7214 
381d6987f68d
exchanged finish_tac and unsafe_finish_tac (the more important one) in simpset
 oheimb parents: 
7177diff
changeset | 411 | fun simp rew mode | 
| 7568 | 412 |      (Simpset {mss, subgoal_tac, loop_tacs, unsafe_solvers, ...}) thm =
 | 
| 3557 | 413 | let | 
| 7568 | 414 | val tacf = solve_all_tac (subgoal_tac, loop_tacs, unsafe_solvers); | 
| 4271 
3a82492e70c5
changed Pure/Sequence interface -- isatool fixseq;
 wenzelm parents: 
4259diff
changeset | 415 | fun prover m th = apsome fst (Seq.pull (tacf m th)); | 
| 5082 | 416 | in rew mode prover mss thm end; | 
| 417 | ||
| 418 | val simp_thm = simp Drule.rewrite_thm; | |
| 419 | val simp_cterm = simp Drule.rewrite_cterm; | |
| 3557 | 420 | |
| 5082 | 421 | val simplify = simp_thm (false, false, false); | 
| 422 | val asm_simplify = simp_thm (false, true, false); | |
| 423 | val full_simplify = simp_thm (true, false, false); | |
| 424 | val asm_full_simplify = simp_thm (true, true, false); | |
| 425 | ||
| 426 | val rewrite = simp_cterm (false, false, false); | |
| 427 | val asm_rewrite = simp_cterm (false, true, false); | |
| 428 | val full_rewrite = simp_cterm (true, false, false); | |
| 429 | val asm_full_rewrite = simp_cterm (true, true, false); | |
| 3557 | 430 | |
| 431 | ||
| 4795 | 432 | |
| 5886 | 433 | (** concrete syntax of attributes **) | 
| 5842 | 434 | |
| 5886 | 435 | (* add / del *) | 
| 5842 | 436 | |
| 5928 | 437 | val simpN = "simp"; | 
| 438 | val addN = "add"; | |
| 439 | val delN = "del"; | |
| 6911 | 440 | val onlyN = "only"; | 
| 5928 | 441 | val otherN = "other"; | 
| 5842 | 442 | |
| 5886 | 443 | fun simp_att change = | 
| 5928 | 444 | (Args.$$$ addN >> K (op addsimps) || | 
| 445 | Args.$$$ delN >> K (op delsimps) || | |
| 5886 | 446 | Scan.succeed (op addsimps)) | 
| 447 | >> change | |
| 448 | |> Scan.lift | |
| 449 | |> Attrib.syntax; | |
| 5842 | 450 | |
| 5886 | 451 | val simp_attr = (simp_att change_global_ss, simp_att change_local_ss); | 
| 5842 | 452 | |
| 453 | ||
| 454 | (* conversions *) | |
| 455 | ||
| 456 | fun conv_attr f = | |
| 6096 | 457 | (Attrib.no_args (Drule.rule_attribute (f o simpset_of)), | 
| 458 | Attrib.no_args (Drule.rule_attribute (f o get_local_simpset))); | |
| 5842 | 459 | |
| 460 | ||
| 461 | (* setup_attrs *) | |
| 462 | ||
| 463 | val setup_attrs = Attrib.add_attributes | |
| 5928 | 464 | [(simpN, simp_attr, "simplification rule"), | 
| 5842 | 465 |   ("simplify",          conv_attr simplify, "simplify rule"),
 | 
| 466 |   ("asm_simplify",      conv_attr asm_simplify, "simplify rule, using assumptions"),
 | |
| 467 |   ("full_simplify",     conv_attr full_simplify, "fully simplify rule"),
 | |
| 468 |   ("asm_full_simplify", conv_attr asm_full_simplify, "fully simplify rule, using assumptions")];
 | |
| 469 | ||
| 470 | ||
| 471 | ||
| 472 | (** proof methods **) | |
| 473 | ||
| 474 | (* simplification *) | |
| 475 | ||
| 5928 | 476 | val simp_modifiers = | 
| 7273 | 477 | [Args.$$$ simpN -- Args.$$$ addN >> K (I, simp_add_local), | 
| 478 | Args.$$$ simpN -- Args.$$$ delN >> K (I, simp_del_local), | |
| 479 | Args.$$$ simpN -- Args.$$$ onlyN >> K (map_local_simpset clear_ss, simp_add_local), | |
| 480 | Args.$$$ otherN >> K (I, I)]; | |
| 5928 | 481 | |
| 482 | val simp_modifiers' = | |
| 7273 | 483 | [Args.$$$ addN >> K (I, simp_add_local), | 
| 484 | Args.$$$ delN >> K (I, simp_del_local), | |
| 485 | Args.$$$ onlyN >> K (map_local_simpset clear_ss, simp_add_local), | |
| 486 | Args.$$$ otherN >> K (I, I)]; | |
| 5928 | 487 | |
| 7558 | 488 | fun simp_method tac = | 
| 489 | (fn prems => fn ctxt => Method.METHOD (fn facts => | |
| 490 | FIRSTGOAL (Method.insert_tac (prems @ facts) THEN' tac (get_local_simpset ctxt)))) | |
| 491 | |> Method.bang_sectioned_args simp_modifiers'; | |
| 7568 | 492 | |
| 5842 | 493 | |
| 494 | (* setup_methods *) | |
| 495 | ||
| 496 | val setup_methods = Method.add_methods | |
| 7571 | 497 | [(simpN, simp_method (CHANGED oo asm_full_simp_tac), "full simplification"), | 
| 498 |   ("simp_tac",          simp_method simp_tac, "simp_tac (improper!)"),
 | |
| 499 |   ("asm_simp_tac",      simp_method asm_simp_tac, "asm_simp_tac (improper!)"),
 | |
| 500 |   ("full_simp_tac",     simp_method full_simp_tac, "full_simp_tac (improper!)"),
 | |
| 501 |   ("asm_full_simp_tac", simp_method asm_full_simp_tac, "asm_full_simp_tac (improper!)"),
 | |
| 502 |   ("asm_lr_simp_tac",   simp_method asm_lr_simp_tac, "asm_lr_simp_tac (improper!)")];
 | |
| 5842 | 503 | |
| 504 | ||
| 505 | ||
| 4795 | 506 | (** theory setup **) | 
| 507 | ||
| 5842 | 508 | val setup = [GlobalSimpset.init, LocalSimpset.init, setup_attrs, setup_methods]; | 
| 4795 | 509 | |
| 510 | ||
| 1243 | 511 | end; | 
| 4795 | 512 | |
| 513 | ||
| 514 | structure BasicSimplifier: BASIC_SIMPLIFIER = Simplifier; | |
| 515 | open BasicSimplifier; |