| author | paulson | 
| Fri, 18 Sep 1998 15:09:46 +0200 | |
| changeset 5505 | b0856ff6fc69 | 
| parent 5082 | e03460289797 | 
| child 5842 | 1a708aa63ff0 | 
| 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 | 
| 0 | 19 | type simpset | 
| 2503 | 20 | val empty_ss: simpset | 
| 3551 | 21 | val rep_ss: simpset -> | 
| 22 |    {mss: meta_simpset,
 | |
| 23 | subgoal_tac: simpset -> int -> tactic, | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 24 | loop_tacs: (string * (int -> tactic))list, | 
| 3551 | 25 | finish_tac: thm list -> int -> tactic, | 
| 26 | unsafe_finish_tac: thm list -> int -> tactic}; | |
| 27 | val print_ss: simpset -> unit | |
| 4366 | 28 | val print_simpset: theory -> unit | 
| 2629 | 29 | val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset | 
| 30 | val setloop: simpset * (int -> tactic) -> simpset | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 31 | val addloop: simpset * (string * (int -> tactic)) -> simpset | 
| 4682 | 32 | val delloop: simpset * string -> simpset | 
| 2629 | 33 | val setSSolver: simpset * (thm list -> int -> tactic) -> simpset | 
| 34 | val addSSolver: simpset * (thm list -> int -> tactic) -> simpset | |
| 35 | val setSolver: simpset * (thm list -> int -> tactic) -> simpset | |
| 36 | val addSolver: simpset * (thm list -> int -> tactic) -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 37 | val setmksimps: simpset * (thm -> thm list) -> simpset | 
| 4677 | 38 | val setmkeqTrue: simpset * (thm -> thm option) -> simpset | 
| 39 | val setmksym: simpset * (thm -> thm option) -> simpset | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 40 | val settermless: simpset * (term * term -> bool) -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 41 | val addsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 42 | val delsimps: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 43 | val addeqcongs: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 44 | val deleqcongs: simpset * thm list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 45 | val addsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 46 | val delsimprocs: simpset * simproc list -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 47 | val merge_ss: simpset * simpset -> simpset | 
| 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 48 | val prems_of_ss: simpset -> thm list | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 49 | val simpset_ref_of_sg: Sign.sg -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 50 | val simpset_ref_of: theory -> simpset ref | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 51 | val simpset_of_sg: Sign.sg -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 52 | val simpset_of: theory -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 53 | val SIMPSET: (simpset -> tactic) -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 54 | val SIMPSET': (simpset -> 'a -> tactic) -> 'a -> tactic | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 55 | val simpset: unit -> simpset | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 56 | val simpset_ref: unit -> simpset ref | 
| 1243 | 57 | val Addsimps: thm list -> unit | 
| 58 | val Delsimps: thm list -> unit | |
| 2509 | 59 | val Addsimprocs: simproc list -> unit | 
| 60 | val Delsimprocs: simproc list -> unit | |
| 2629 | 61 | val simp_tac: simpset -> int -> tactic | 
| 62 | val asm_simp_tac: simpset -> int -> tactic | |
| 63 | 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 | 64 | val asm_lr_simp_tac: simpset -> int -> tactic | 
| 2629 | 65 | val asm_full_simp_tac: simpset -> int -> tactic | 
| 66 | val safe_asm_full_simp_tac: simpset -> int -> tactic | |
| 67 | val Simp_tac: int -> tactic | |
| 68 | val Asm_simp_tac: int -> tactic | |
| 69 | 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 | 70 | val Asm_lr_simp_tac: int -> tactic | 
| 2629 | 71 | val Asm_full_simp_tac: int -> tactic | 
| 3557 | 72 | val simplify: simpset -> thm -> thm | 
| 73 | val asm_simplify: simpset -> thm -> thm | |
| 74 | val full_simplify: simpset -> thm -> thm | |
| 75 | val asm_full_simplify: simpset -> thm -> thm | |
| 0 | 76 | end; | 
| 77 | ||
| 4795 | 78 | signature SIMPLIFIER = | 
| 79 | sig | |
| 80 | include BASIC_SIMPLIFIER | |
| 5082 | 81 | val rewrite: simpset -> cterm -> thm | 
| 82 | val asm_rewrite: simpset -> cterm -> thm | |
| 83 | val full_rewrite: simpset -> cterm -> thm | |
| 84 | val asm_full_rewrite: simpset -> cterm -> thm | |
| 4855 | 85 | val setup: (theory -> theory) list | 
| 4795 | 86 | val get_local_simpset: local_theory -> simpset | 
| 87 | val put_local_simpset: simpset -> local_theory -> local_theory | |
| 88 | val simp_add: tag | |
| 89 | val simp_del: tag | |
| 4855 | 90 | val simp_add_global: theory attribute | 
| 91 | val simp_del_global: theory attribute | |
| 92 | val simp_add_local: local_theory attribute | |
| 93 | val simp_del_local: local_theory attribute | |
| 4795 | 94 | end; | 
| 2503 | 95 | |
| 96 | structure Simplifier: SIMPLIFIER = | |
| 0 | 97 | struct | 
| 98 | ||
| 2509 | 99 | |
| 100 | (** simplification procedures **) | |
| 101 | ||
| 102 | (* datatype simproc *) | |
| 103 | ||
| 104 | datatype simproc = | |
| 3577 
9715b6e3ec5f
added prems argument to simplification procedures;
 wenzelm parents: 
3557diff
changeset | 105 | Simproc of string * cterm list * (Sign.sg -> thm list -> term -> thm option) * stamp; | 
| 2509 | 106 | |
| 3557 | 107 | fun mk_simproc name lhss proc = | 
| 108 | Simproc (name, map (Thm.cterm_fun Logic.varify) lhss, proc, stamp ()); | |
| 109 | ||
| 3551 | 110 | fun rep_simproc (Simproc args) = args; | 
| 2509 | 111 | |
| 112 | ||
| 113 | ||
| 2503 | 114 | (** simplification sets **) | 
| 115 | ||
| 116 | (* type simpset *) | |
| 117 | ||
| 0 | 118 | datatype simpset = | 
| 2503 | 119 |   Simpset of {
 | 
| 120 | mss: meta_simpset, | |
| 2629 | 121 | subgoal_tac: simpset -> int -> tactic, | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 122 | loop_tacs: (string * (int -> tactic))list, | 
| 2629 | 123 | finish_tac: thm list -> int -> tactic, | 
| 124 | unsafe_finish_tac: thm list -> int -> tactic}; | |
| 2503 | 125 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 126 | fun make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) = | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 127 |   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tacs = loop_tacs,
 | 
| 2629 | 128 | finish_tac = finish_tac, unsafe_finish_tac = unsafe_finish_tac}; | 
| 0 | 129 | |
| 130 | val empty_ss = | |
| 4677 | 131 | let val mss = Thm.set_mk_sym(Thm.empty_mss, Some o symmetric_fun) | 
| 132 | in make_ss (mss, K (K no_tac), [], K (K no_tac), K (K no_tac)) end; | |
| 3551 | 133 | |
| 134 | fun rep_ss (Simpset args) = args; | |
| 135 | fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
 | |
| 136 | ||
| 137 | ||
| 138 | (* print simpsets *) | |
| 2503 | 139 | |
| 3551 | 140 | fun print_ss ss = | 
| 141 | let | |
| 142 |     val Simpset {mss, ...} = ss;
 | |
| 143 |     val {simps, procs, congs} = Thm.dest_mss mss;
 | |
| 2503 | 144 | |
| 3551 | 145 | val pretty_thms = map Display.pretty_thm; | 
| 146 | fun pretty_proc (name, lhss) = | |
| 147 | Pretty.big_list (name ^ ":") (map Display.pretty_cterm lhss); | |
| 148 | in | |
| 149 | Pretty.writeln (Pretty.big_list "simplification rules:" (pretty_thms simps)); | |
| 150 | Pretty.writeln (Pretty.big_list "simplification procedures:" (map pretty_proc procs)); | |
| 151 | Pretty.writeln (Pretty.big_list "congruences:" (pretty_thms congs)) | |
| 152 | end; | |
| 2503 | 153 | |
| 154 | ||
| 155 | (* extend simpsets *) | |
| 156 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 157 | fun (Simpset {mss, subgoal_tac = _, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 158 | setsubgoaler subgoal_tac = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 159 | make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2629 | 160 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 161 | fun (Simpset {mss, subgoal_tac, loop_tacs = _, finish_tac, unsafe_finish_tac})
 | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 162 | setloop tac = | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 163 |   make_ss (mss, subgoal_tac, [("",tac)], finish_tac, unsafe_finish_tac);
 | 
| 2503 | 164 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 165 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 4741 
7fcd106cb0ed
addloop: added warning in case of overwriting a looper
 oheimb parents: 
4739diff
changeset | 166 | addloop tac = make_ss (mss, subgoal_tac, | 
| 
7fcd106cb0ed
addloop: added warning in case of overwriting a looper
 oheimb parents: 
4739diff
changeset | 167 | (case assoc_string (loop_tacs,(fst tac)) of None => () | Some x => | 
| 
7fcd106cb0ed
addloop: added warning in case of overwriting a looper
 oheimb parents: 
4739diff
changeset | 168 | 	 warning ("overwriting looper "^fst tac); overwrite(loop_tacs,tac)),
 | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 169 | finish_tac, unsafe_finish_tac); | 
| 2567 | 170 | |
| 4682 | 171 | fun (ss as Simpset {mss,subgoal_tac,loop_tacs,finish_tac,unsafe_finish_tac})
 | 
| 172 | delloop name = | |
| 173 | let val (del,rest) = partition (fn (n,_) => n=name) loop_tacs | |
| 174 |   in if null del then (warning ("No such looper in simpset: " ^ name); ss)
 | |
| 175 | else make_ss (mss, subgoal_tac, rest, finish_tac, unsafe_finish_tac) | |
| 176 | end; | |
| 177 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 178 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac = _, unsafe_finish_tac})
 | 
| 3551 | 179 | setSSolver finish_tac = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 180 | make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2503 | 181 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 182 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 183 | addSSolver tac = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 184 | make_ss (mss, subgoal_tac, loop_tacs, fn hyps => finish_tac hyps ORELSE' tac hyps, | 
| 3551 | 185 | unsafe_finish_tac); | 
| 2503 | 186 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 187 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac = _})
 | 
| 3551 | 188 | setSolver unsafe_finish_tac = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 189 | make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2503 | 190 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 191 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 192 | addSolver tac = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 193 | make_ss (mss, subgoal_tac, loop_tacs, finish_tac, | 
| 3551 | 194 | fn hyps => unsafe_finish_tac hyps ORELSE' tac hyps); | 
| 2503 | 195 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 196 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 197 | setmksimps mk_simps = | 
| 2645 
9d3a3e62bf34
mk_rews: automatically includes strip_shyps, zero_var_indexes;
 wenzelm parents: 
2629diff
changeset | 198 | make_ss (Thm.set_mk_rews (mss, map (Thm.strip_shyps o Drule.zero_var_indexes) o mk_simps), | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 199 | subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2509 | 200 | |
| 4677 | 201 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 202 | setmkeqTrue mk_eq_True = | |
| 203 | make_ss (Thm.set_mk_eq_True (mss, mk_eq_True), | |
| 204 | subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | |
| 205 | ||
| 206 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | |
| 207 | setmksym mksym = | |
| 208 | make_ss (Thm.set_mk_sym (mss, mksym), | |
| 209 | subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | |
| 210 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 211 | fun (Simpset {mss, subgoal_tac, loop_tacs,  finish_tac, unsafe_finish_tac})
 | 
| 3551 | 212 | settermless termless = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 213 | make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs, | 
| 3551 | 214 | finish_tac, unsafe_finish_tac); | 
| 215 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 216 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 217 | addsimps rews = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 218 | make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs, | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 219 | finish_tac, unsafe_finish_tac); | 
| 2503 | 220 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 221 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 222 | delsimps rews = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 223 | make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs, | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 224 | finish_tac, unsafe_finish_tac); | 
| 2503 | 225 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 226 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 227 | addeqcongs newcongs = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 228 | make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs, | 
| 3551 | 229 | finish_tac, unsafe_finish_tac); | 
| 2509 | 230 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 231 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 232 | deleqcongs oldcongs = | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 233 | make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs, | 
| 3551 | 234 | finish_tac, unsafe_finish_tac); | 
| 2629 | 235 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 236 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 237 | addsimprocs simprocs = | 
| 238 | make_ss | |
| 239 | (Thm.add_simprocs (mss, map rep_simproc simprocs), | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 240 | subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2509 | 241 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 242 | fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
 | 
| 3551 | 243 | delsimprocs simprocs = | 
| 244 | make_ss | |
| 245 | (Thm.del_simprocs (mss, map rep_simproc simprocs), | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 246 | subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 2503 | 247 | |
| 248 | ||
| 4795 | 249 | (* merge simpsets *) (*NOTE: ignores tactics of 2nd simpset (except loopers)*) | 
| 2503 | 250 | |
| 3551 | 251 | fun merge_ss | 
| 4795 | 252 |    (Simpset {mss = mss1, loop_tacs = loop_tacs1, subgoal_tac, finish_tac, unsafe_finish_tac},
 | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 253 |     Simpset {mss = mss2, loop_tacs = loop_tacs2, ...}) =
 | 
| 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 254 | make_ss (Thm.merge_mss (mss1, mss2), subgoal_tac, | 
| 4795 | 255 | merge_alists loop_tacs1 loop_tacs2, finish_tac, unsafe_finish_tac); | 
| 2503 | 256 | |
| 257 | ||
| 3557 | 258 | |
| 5024 | 259 | (** global and local simpset data **) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 260 | |
| 5001 | 261 | val simpsetN = "Provers/simpset"; | 
| 4795 | 262 | |
| 263 | ||
| 5024 | 264 | (* data kind 'Provers/simpset' *) | 
| 4795 | 265 | |
| 5024 | 266 | structure SimpsetDataArgs = | 
| 267 | struct | |
| 268 | val name = simpsetN; | |
| 269 | type T = simpset ref; | |
| 0 | 270 | |
| 5024 | 271 | val empty = ref empty_ss; | 
| 272 | fun prep_ext (ref ss) = (ref ss): T; (*create new reference!*) | |
| 273 | fun merge (ref ss1, ref ss2) = ref (merge_ss (ss1, ss2)); | |
| 274 | fun print _ (ref ss) = print_ss ss; | |
| 275 | end; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 276 | |
| 5024 | 277 | structure SimpsetData = TheoryDataFun(SimpsetDataArgs); | 
| 278 | val print_simpset = SimpsetData.print; | |
| 279 | val simpset_ref_of_sg = SimpsetData.get_sg; | |
| 280 | val simpset_ref_of = SimpsetData.get; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 281 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 282 | |
| 4795 | 283 | (* access global simpset *) | 
| 0 | 284 | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 285 | val simpset_of_sg = ! o simpset_ref_of_sg; | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 286 | val simpset_of = simpset_of_sg o sign_of; | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 287 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 288 | fun SIMPSET tacf state = tacf (simpset_of_sg (sign_of_thm state)) state; | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 289 | fun SIMPSET' tacf i state = tacf (simpset_of_sg (sign_of_thm state)) i state; | 
| 0 | 290 | |
| 5028 | 291 | val simpset = simpset_of o Context.the_context; | 
| 292 | val simpset_ref = simpset_ref_of_sg o sign_of o Context.the_context; | |
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 293 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 294 | |
| 4795 | 295 | (* change global simpset *) | 
| 4080 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 296 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 297 | fun change_simpset f x = simpset_ref () := (f (simpset (), x)); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 298 | |
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 299 | val Addsimps = change_simpset (op addsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 300 | val Delsimps = change_simpset (op delsimps); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 301 | val Addsimprocs = change_simpset (op addsimprocs); | 
| 
7dce11095b0a
new implicit simpset mechanism based on Sign.sg anytype data;
 wenzelm parents: 
3728diff
changeset | 302 | val Delsimprocs = change_simpset (op delsimprocs); | 
| 2509 | 303 | |
| 0 | 304 | |
| 4795 | 305 | (* local simpset *) | 
| 306 | ||
| 307 | exception SimpsetLocal of simpset; | |
| 5024 | 308 | val simpset_localK = Object.kind simpsetN; | 
| 4795 | 309 | |
| 310 | fun get_local_simpset (thy, data) = | |
| 5001 | 311 | (case Symtab.lookup (data, simpsetN) of | 
| 4795 | 312 | Some (SimpsetLocal ss) => ss | 
| 313 | | None => simpset_of thy | |
| 5024 | 314 | | _ => Object.kind_error simpset_localK); | 
| 4795 | 315 | |
| 316 | fun put_local_simpset ss (thy, data) = | |
| 5001 | 317 | (thy, Symtab.update ((simpsetN, SimpsetLocal ss), data)); | 
| 4795 | 318 | |
| 319 | ||
| 320 | ||
| 321 | (** simplifier attributes **) | |
| 322 | ||
| 323 | (* tags *) | |
| 324 | ||
| 4855 | 325 | val simpN = "simp"; | 
| 326 | val simp_addN = "add"; | |
| 327 | val simp_delN = "del"; | |
| 328 | ||
| 329 | val simp_tag = (simpN, []); | |
| 330 | val simp_add = (simpN, [simp_addN]); | |
| 331 | val simp_del = (simpN, [simp_delN]); | |
| 4795 | 332 | |
| 333 | ||
| 4855 | 334 | (* attributes *) | 
| 4795 | 335 | |
| 4855 | 336 | local | 
| 337 | fun simp_attr change args (x, tth) = | |
| 338 | if null args orelse args = [simp_addN] then change (op addsimps) (x, tth) | |
| 339 | else if args = [simp_delN] then change (op delsimps) (x, tth) | |
| 340 |     else Attribute.fail simpN ("bad argument(s) " ^ commas_quote args);
 | |
| 341 | ||
| 342 | fun change_global_ss f (thy, tth) = | |
| 343 | let val r = simpset_ref_of thy | |
| 344 | in r := f (! r, [Attribute.thm_of tth]); (thy, tth) end; | |
| 4795 | 345 | |
| 4855 | 346 | fun change_local_ss f (lthy, tth) = | 
| 347 | let val ss = f (get_local_simpset lthy, [Attribute.thm_of tth]) | |
| 348 | in (put_local_simpset ss lthy, tth) end; | |
| 4795 | 349 | |
| 4855 | 350 | val simp_attr_global = simp_attr change_global_ss; | 
| 351 | val simp_attr_local = simp_attr change_local_ss; | |
| 352 | in | |
| 5024 | 353 | (* FIXME | 
| 354 | val setup_attrs = IsarThy.add_attributes | |
| 5001 | 355 | [(simpN, simp_attr_global, simp_attr_local, "simplifier")]; | 
| 5024 | 356 | *) | 
| 357 | val setup_attrs = I; | |
| 4795 | 358 | |
| 4855 | 359 | val simp_add_global = simp_attr_global [simp_addN]; | 
| 360 | val simp_del_global = simp_attr_global [simp_delN]; | |
| 361 | val simp_add_local = simp_attr_local [simp_addN]; | |
| 362 | val simp_del_local = simp_attr_local [simp_delN]; | |
| 363 | end; | |
| 4795 | 364 | |
| 365 | ||
| 3557 | 366 | |
| 2503 | 367 | (** simplification tactics **) | 
| 0 | 368 | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 369 | fun solve_all_tac (subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) mss = | 
| 3557 | 370 | let | 
| 371 | val ss = | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 372 | make_ss (mss, subgoal_tac, loop_tacs, unsafe_finish_tac, unsafe_finish_tac); | 
| 4612 | 373 | val solve1_tac = (subgoal_tac ss THEN_ALL_NEW (K no_tac)) 1 | 
| 3557 | 374 | in DEPTH_SOLVE solve1_tac end; | 
| 375 | ||
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 376 | fun loop_tac loop_tacs = FIRST'(map snd loop_tacs); | 
| 3557 | 377 | |
| 2629 | 378 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | 
| 379 | fun basic_gen_simp_tac mode = | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 380 |   fn (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) =>
 | 
| 3551 | 381 | let | 
| 4612 | 382 | fun simp_loop_tac i = | 
| 383 | asm_rewrite_goal_tac mode | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 384 | (solve_all_tac (subgoal_tac,loop_tacs,finish_tac,unsafe_finish_tac)) | 
| 4612 | 385 | mss i | 
| 386 | THEN (finish_tac (prems_of_mss mss) i ORELSE | |
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 387 | TRY ((loop_tac loop_tacs THEN_ALL_NEW simp_loop_tac) i)) | 
| 4612 | 388 | in simp_loop_tac end; | 
| 0 | 389 | |
| 3551 | 390 | fun gen_simp_tac mode (ss as Simpset {unsafe_finish_tac, ...}) =
 | 
| 391 | basic_gen_simp_tac mode (ss setSSolver unsafe_finish_tac); | |
| 392 | ||
| 4713 | 393 | val simp_tac = gen_simp_tac (false, false, false); | 
| 394 | val asm_simp_tac = gen_simp_tac (false, true, false); | |
| 395 | 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 | 396 | 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 | 397 | val asm_full_simp_tac = gen_simp_tac (true, true, true); | 
| 0 | 398 | |
| 2629 | 399 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | 
| 4713 | 400 | val safe_asm_full_simp_tac = basic_gen_simp_tac (true, true, false); | 
| 2629 | 401 | |
| 4795 | 402 | (*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 | 403 | 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 | 404 | 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 | 405 | 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 | 406 | 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 | 407 | fun Asm_full_simp_tac i st = asm_full_simp_tac (simpset ()) i st; | 
| 406 | 408 | |
| 3557 | 409 | |
| 4795 | 410 | |
| 5082 | 411 | (** simplification rules and conversions **) | 
| 3557 | 412 | |
| 5082 | 413 | fun simp rew mode (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) thm =
 | 
| 3557 | 414 | let | 
| 4668 
131989b78417
Little reorganization. Loop tactics have names now.
 nipkow parents: 
4612diff
changeset | 415 | val tacf = solve_all_tac (subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); | 
| 4271 
3a82492e70c5
changed Pure/Sequence interface -- isatool fixseq;
 wenzelm parents: 
4259diff
changeset | 416 | fun prover m th = apsome fst (Seq.pull (tacf m th)); | 
| 5082 | 417 | in rew mode prover mss thm end; | 
| 418 | ||
| 419 | val simp_thm = simp Drule.rewrite_thm; | |
| 420 | val simp_cterm = simp Drule.rewrite_cterm; | |
| 3557 | 421 | |
| 5082 | 422 | val simplify = simp_thm (false, false, false); | 
| 423 | val asm_simplify = simp_thm (false, true, false); | |
| 424 | val full_simplify = simp_thm (true, false, false); | |
| 425 | val asm_full_simplify = simp_thm (true, true, false); | |
| 426 | ||
| 427 | val rewrite = simp_cterm (false, false, false); | |
| 428 | val asm_rewrite = simp_cterm (false, true, false); | |
| 429 | val full_rewrite = simp_cterm (true, false, false); | |
| 430 | val asm_full_rewrite = simp_cterm (true, true, false); | |
| 3557 | 431 | |
| 432 | ||
| 4795 | 433 | |
| 434 | (** theory setup **) | |
| 435 | ||
| 5024 | 436 | val setup = [SimpsetData.init, setup_attrs]; | 
| 4795 | 437 | |
| 438 | ||
| 1243 | 439 | end; | 
| 4795 | 440 | |
| 441 | ||
| 442 | structure BasicSimplifier: BASIC_SIMPLIFIER = Simplifier; | |
| 443 | open BasicSimplifier; |