255 "[| P(a); !!x. P(x) ==> Q(x) |] ==> Q(@x.P(x))" |
255 "[| P(a); !!x. P(x) ==> Q(x) |] ==> Q(@x.P(x))" |
256 (fn prems => [ resolve_tac prems 1, |
256 (fn prems => [ resolve_tac prems 1, |
257 rtac selectI 1, |
257 rtac selectI 1, |
258 resolve_tac prems 1 ]); |
258 resolve_tac prems 1 ]); |
259 |
259 |
|
260 (*Easier to apply than selectI2 if witness ?a comes from an EX-formula*) |
|
261 qed_goal "selectI2EX" HOL.thy |
|
262 "[| ? a.P a; !!x. P x ==> Q x |] ==> Q(Eps P)" |
|
263 (fn [major,minor] => [rtac (major RS exE) 1, etac selectI2 1, etac minor 1]); |
|
264 |
260 qed_goal "select_equality" HOL.thy |
265 qed_goal "select_equality" HOL.thy |
261 "[| P(a); !!x. P(x) ==> x=a |] ==> (@x.P(x)) = a" |
266 "[| P(a); !!x. P(x) ==> x=a |] ==> (@x.P(x)) = a" |
262 (fn prems => [ rtac selectI2 1, |
267 (fn prems => [ rtac selectI2 1, |
263 REPEAT (ares_tac prems 1) ]); |
268 REPEAT (ares_tac prems 1) ]); |
264 |
269 |
265 (*Easier to apply than selectI2 if witness ?a comes from an EX-formula*) |
270 qed_goalw "select1_equality" HOL.thy [Ex1_def] |
266 qed_goal "selectI2EX" HOL.thy |
271 "!!P. [| ?!x.P(x); P(a) |] ==> (@x.P(x)) = a" |
267 "[| ? a.P a; !!x. P x ==> Q x |] ==> Q(Eps P)" |
272 (fn _ => [rtac select_equality 1, atac 1, |
268 (fn [major,minor] => [rtac (major RS exE) 1, etac selectI2 1, etac minor 1]); |
273 etac exE 1, etac conjE 1, |
|
274 rtac allE 1, atac 1, |
|
275 etac impE 1, atac 1, etac ssubst 1, |
|
276 etac allE 1, etac impE 1, atac 1, etac ssubst 1, |
|
277 rtac refl 1]); |
269 |
278 |
270 qed_goal "select_eq_Ex" HOL.thy "P (@ x. P x) = (? x. P x)" (fn prems => [ |
279 qed_goal "select_eq_Ex" HOL.thy "P (@ x. P x) = (? x. P x)" (fn prems => [ |
271 rtac iffI 1, |
280 rtac iffI 1, |
272 etac exI 1, |
281 etac exI 1, |
273 etac exE 1, |
282 etac exE 1, |