src/HOL/Set.ML
changeset 9075 e8521ed7f35b
parent 9041 3730ae0f513a
child 9088 453996655ac2
equal deleted inserted replaced
9074:2313ddc415a1 9075:e8521ed7f35b
   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