equal
deleted
inserted
replaced
210 "[| A = B; [| A<=B; B<=(A::'a set) |] ==> P |] ==> P"; |
210 "[| A = B; [| A<=B; B<=(A::'a set) |] ==> P |] ==> P"; |
211 by (resolve_tac prems 1); |
211 by (resolve_tac prems 1); |
212 by (REPEAT (resolve_tac (prems RL [equalityD1,equalityD2]) 1)); |
212 by (REPEAT (resolve_tac (prems RL [equalityD1,equalityD2]) 1)); |
213 qed "equalityE"; |
213 qed "equalityE"; |
214 |
214 |
215 (*This could be tried. Most things build fine with it. However, some proofs |
215 AddEs [equalityE]; |
216 become very slow or even fail. |
|
217 AddEs [equalityE]; |
|
218 *) |
|
219 |
216 |
220 val major::prems = Goal |
217 val major::prems = Goal |
221 "[| A = B; [| c:A; c:B |] ==> P; [| c~:A; c~:B |] ==> P |] ==> P"; |
218 "[| A = B; [| c:A; c:B |] ==> P; [| c~:A; c~:B |] ==> P |] ==> P"; |
222 by (rtac (major RS equalityE) 1); |
219 by (rtac (major RS equalityE) 1); |
223 by (REPEAT (contr_tac 1 ORELSE eresolve_tac ([asm_rl,subsetCE]@prems) 1)); |
220 by (REPEAT (contr_tac 1 ORELSE eresolve_tac ([asm_rl,subsetCE]@prems) 1)); |
292 |
289 |
293 (*Use for reasoning about disjointness: A Int B = {} *) |
290 (*Use for reasoning about disjointness: A Int B = {} *) |
294 Goal "A={} ==> a ~: A"; |
291 Goal "A={} ==> a ~: A"; |
295 by (Blast_tac 1) ; |
292 by (Blast_tac 1) ; |
296 qed "equals0D"; |
293 qed "equals0D"; |
297 |
|
298 (* [| A = {}; a : A |] ==> R *) |
|
299 AddDs [equals0D, sym RS equals0D]; |
|
300 |
294 |
301 Goalw [Ball_def] "Ball {} P = True"; |
295 Goalw [Ball_def] "Ball {} P = True"; |
302 by (Simp_tac 1); |
296 by (Simp_tac 1); |
303 qed "ball_empty"; |
297 qed "ball_empty"; |
304 |
298 |