134 end; |
134 end; |
135 |
135 |
136 |
136 |
137 (* extend simpsets *) |
137 (* extend simpsets *) |
138 |
138 |
139 fun (Simpset {mss, subgoal_tac = _, loop_tac, finish_tac, unsafe_finish_tac}) |
139 fun (Simpset {mss, subgoal_tac = _, loop_tacs, finish_tac, unsafe_finish_tac}) |
140 setsubgoaler subgoal_tac = |
140 setsubgoaler subgoal_tac = |
141 make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
141 make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
142 |
142 |
143 fun (Simpset {mss, subgoal_tac, loop_tac = _, finish_tac, unsafe_finish_tac}) |
143 fun (Simpset {mss, subgoal_tac, loop_tacs = _, finish_tac, unsafe_finish_tac}) |
144 setloop loop_tac = |
144 setloop tac = |
145 make_ss (mss, subgoal_tac, DETERM o loop_tac, finish_tac, unsafe_finish_tac); |
145 make_ss (mss, subgoal_tac, [("",tac)], finish_tac, unsafe_finish_tac); |
146 |
146 |
147 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
147 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
148 addloop tac = |
148 addloop atac = |
149 make_ss (mss, subgoal_tac, loop_tac ORELSE' (DETERM o tac), finish_tac, unsafe_finish_tac); |
149 make_ss (mss, subgoal_tac, overwrite(loop_tacs,atac), |
150 |
150 finish_tac, unsafe_finish_tac); |
151 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac = _, unsafe_finish_tac}) |
151 |
|
152 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac = _, unsafe_finish_tac}) |
152 setSSolver finish_tac = |
153 setSSolver finish_tac = |
153 make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
154 make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
154 |
155 |
155 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
156 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
156 addSSolver tac = |
157 addSSolver tac = |
157 make_ss (mss, subgoal_tac, loop_tac, fn hyps => finish_tac hyps ORELSE' tac hyps, |
158 make_ss (mss, subgoal_tac, loop_tacs, fn hyps => finish_tac hyps ORELSE' tac hyps, |
158 unsafe_finish_tac); |
159 unsafe_finish_tac); |
159 |
160 |
160 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac = _}) |
161 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac = _}) |
161 setSolver unsafe_finish_tac = |
162 setSolver unsafe_finish_tac = |
162 make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
163 make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
163 |
164 |
164 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
165 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
165 addSolver tac = |
166 addSolver tac = |
166 make_ss (mss, subgoal_tac, loop_tac, finish_tac, |
167 make_ss (mss, subgoal_tac, loop_tacs, finish_tac, |
167 fn hyps => unsafe_finish_tac hyps ORELSE' tac hyps); |
168 fn hyps => unsafe_finish_tac hyps ORELSE' tac hyps); |
168 |
169 |
169 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
170 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
170 setmksimps mk_simps = |
171 setmksimps mk_simps = |
171 make_ss (Thm.set_mk_rews (mss, map (Thm.strip_shyps o Drule.zero_var_indexes) o mk_simps), |
172 make_ss (Thm.set_mk_rews (mss, map (Thm.strip_shyps o Drule.zero_var_indexes) o mk_simps), |
172 subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
173 subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
173 |
174 |
174 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
175 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
175 settermless termless = |
176 settermless termless = |
176 make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tac, |
177 make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs, |
177 finish_tac, unsafe_finish_tac); |
178 finish_tac, unsafe_finish_tac); |
178 |
179 |
179 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
180 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
180 addsimps rews = |
181 addsimps rews = |
181 let val rews' = flat (map (Thm.mk_rews_of_mss mss) rews) in |
182 make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs, |
182 make_ss (Thm.add_simps (mss, rews'), subgoal_tac, loop_tac, |
183 finish_tac, unsafe_finish_tac); |
183 finish_tac, unsafe_finish_tac) |
184 |
184 end; |
185 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
185 |
|
186 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
|
187 delsimps rews = |
186 delsimps rews = |
188 let val rews' = flat (map (Thm.mk_rews_of_mss mss) rews) in |
187 make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs, |
189 make_ss (Thm.del_simps (mss, rews'), subgoal_tac, loop_tac, |
188 finish_tac, unsafe_finish_tac); |
190 finish_tac, unsafe_finish_tac) |
189 |
191 end; |
190 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
192 |
|
193 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
|
194 addeqcongs newcongs = |
191 addeqcongs newcongs = |
195 make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tac, |
192 make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs, |
196 finish_tac, unsafe_finish_tac); |
193 finish_tac, unsafe_finish_tac); |
197 |
194 |
198 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
195 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
199 deleqcongs oldcongs = |
196 deleqcongs oldcongs = |
200 make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tac, |
197 make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs, |
201 finish_tac, unsafe_finish_tac); |
198 finish_tac, unsafe_finish_tac); |
202 |
199 |
203 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
200 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
204 addsimprocs simprocs = |
201 addsimprocs simprocs = |
205 make_ss |
202 make_ss |
206 (Thm.add_simprocs (mss, map rep_simproc simprocs), |
203 (Thm.add_simprocs (mss, map rep_simproc simprocs), |
207 subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
204 subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
208 |
205 |
209 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) |
206 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) |
210 delsimprocs simprocs = |
207 delsimprocs simprocs = |
211 make_ss |
208 make_ss |
212 (Thm.del_simprocs (mss, map rep_simproc simprocs), |
209 (Thm.del_simprocs (mss, map rep_simproc simprocs), |
213 subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
210 subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac); |
214 |
211 |
215 |
212 |
216 (* merge simpsets *) (*NOTE: ignores tactics of 2nd simpset*) |
213 (* merge simpsets *) (*NOTE: ignores tactics of 2nd simpset*) |
217 |
214 |
218 fun merge_ss |
215 fun merge_ss |
219 (Simpset {mss = mss1, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}, |
216 (Simpset {mss = mss1, loop_tacs = loop_tacs1, |
220 Simpset {mss = mss2, ...}) = |
217 subgoal_tac, finish_tac, unsafe_finish_tac}, |
221 make_ss (Thm.merge_mss (mss1, mss2), |
218 Simpset {mss = mss2, loop_tacs = loop_tacs2, ...}) = |
222 subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac); |
219 make_ss (Thm.merge_mss (mss1, mss2), subgoal_tac, |
|
220 foldl overwrite (loop_tacs1,loop_tacs2), |
|
221 finish_tac, unsafe_finish_tac); |
223 |
222 |
224 |
223 |
225 |
224 |
226 (** simpset theory data **) |
225 (** simpset theory data **) |
227 |
226 |