Set.ML
changeset 171 16c4ea954511
parent 128 89669c58e506
child 179 978854c19b5e
equal deleted inserted replaced
170:3a8d722fd3ff 171:16c4ea954511
     9 open Set;
     9 open Set;
    10 
    10 
    11 val [prem] = goal Set.thy "[| P(a) |] ==> a : {x.P(x)}";
    11 val [prem] = goal Set.thy "[| P(a) |] ==> a : {x.P(x)}";
    12 by (rtac (mem_Collect_eq RS ssubst) 1);
    12 by (rtac (mem_Collect_eq RS ssubst) 1);
    13 by (rtac prem 1);
    13 by (rtac prem 1);
    14 val CollectI = result();
    14 qed "CollectI";
    15 
    15 
    16 val prems = goal Set.thy "[| a : {x.P(x)} |] ==> P(a)";
    16 val prems = goal Set.thy "[| a : {x.P(x)} |] ==> P(a)";
    17 by (resolve_tac (prems RL [mem_Collect_eq  RS subst]) 1);
    17 by (resolve_tac (prems RL [mem_Collect_eq  RS subst]) 1);
    18 val CollectD = result();
    18 qed "CollectD";
    19 
    19 
    20 val [prem] = goal Set.thy "[| !!x. (x:A) = (x:B) |] ==> A = B";
    20 val [prem] = goal Set.thy "[| !!x. (x:A) = (x:B) |] ==> A = B";
    21 by (rtac (prem RS ext RS arg_cong RS box_equals) 1);
    21 by (rtac (prem RS ext RS arg_cong RS box_equals) 1);
    22 by (rtac Collect_mem_eq 1);
    22 by (rtac Collect_mem_eq 1);
    23 by (rtac Collect_mem_eq 1);
    23 by (rtac Collect_mem_eq 1);
    24 val set_ext = result();
    24 qed "set_ext";
    25 
    25 
    26 val [prem] = goal Set.thy "[| !!x. P(x)=Q(x) |] ==> {x. P(x)} = {x. Q(x)}";
    26 val [prem] = goal Set.thy "[| !!x. P(x)=Q(x) |] ==> {x. P(x)} = {x. Q(x)}";
    27 by (rtac (prem RS ext RS arg_cong) 1);
    27 by (rtac (prem RS ext RS arg_cong) 1);
    28 val Collect_cong = result();
    28 qed "Collect_cong";
    29 
    29 
    30 val CollectE = make_elim CollectD;
    30 val CollectE = make_elim CollectD;
    31 
    31 
    32 (*** Bounded quantifiers ***)
    32 (*** Bounded quantifiers ***)
    33 
    33 
    34 val prems = goalw Set.thy [Ball_def]
    34 val prems = goalw Set.thy [Ball_def]
    35     "[| !!x. x:A ==> P(x) |] ==> ! x:A. P(x)";
    35     "[| !!x. x:A ==> P(x) |] ==> ! x:A. P(x)";
    36 by (REPEAT (ares_tac (prems @ [allI,impI]) 1));
    36 by (REPEAT (ares_tac (prems @ [allI,impI]) 1));
    37 val ballI = result();
    37 qed "ballI";
    38 
    38 
    39 val [major,minor] = goalw Set.thy [Ball_def]
    39 val [major,minor] = goalw Set.thy [Ball_def]
    40     "[| ! x:A. P(x);  x:A |] ==> P(x)";
    40     "[| ! x:A. P(x);  x:A |] ==> P(x)";
    41 by (rtac (minor RS (major RS spec RS mp)) 1);
    41 by (rtac (minor RS (major RS spec RS mp)) 1);
    42 val bspec = result();
    42 qed "bspec";
    43 
    43 
    44 val major::prems = goalw Set.thy [Ball_def]
    44 val major::prems = goalw Set.thy [Ball_def]
    45     "[| ! x:A. P(x);  P(x) ==> Q;  x~:A ==> Q |] ==> Q";
    45     "[| ! x:A. P(x);  P(x) ==> Q;  x~:A ==> Q |] ==> Q";
    46 by (rtac (major RS spec RS impCE) 1);
    46 by (rtac (major RS spec RS impCE) 1);
    47 by (REPEAT (eresolve_tac prems 1));
    47 by (REPEAT (eresolve_tac prems 1));
    48 val ballE = result();
    48 qed "ballE";
    49 
    49 
    50 (*Takes assumptions ! x:A.P(x) and a:A; creates assumption P(a)*)
    50 (*Takes assumptions ! x:A.P(x) and a:A; creates assumption P(a)*)
    51 fun ball_tac i = etac ballE i THEN contr_tac (i+1);
    51 fun ball_tac i = etac ballE i THEN contr_tac (i+1);
    52 
    52 
    53 val prems = goalw Set.thy [Bex_def]
    53 val prems = goalw Set.thy [Bex_def]
    54     "[| P(x);  x:A |] ==> ? x:A. P(x)";
    54     "[| P(x);  x:A |] ==> ? x:A. P(x)";
    55 by (REPEAT (ares_tac (prems @ [exI,conjI]) 1));
    55 by (REPEAT (ares_tac (prems @ [exI,conjI]) 1));
    56 val bexI = result();
    56 qed "bexI";
    57 
    57 
    58 val bexCI = prove_goal Set.thy 
    58 val bexCI = prove_goal Set.thy 
    59    "[| ! x:A. ~P(x) ==> P(a);  a:A |] ==> ? x:A.P(x)"
    59    "[| ! x:A. ~P(x) ==> P(a);  a:A |] ==> ? x:A.P(x)"
    60  (fn prems=>
    60  (fn prems=>
    61   [ (rtac classical 1),
    61   [ (rtac classical 1),
    63 
    63 
    64 val major::prems = goalw Set.thy [Bex_def]
    64 val major::prems = goalw Set.thy [Bex_def]
    65     "[| ? x:A. P(x);  !!x. [| x:A; P(x) |] ==> Q  |] ==> Q";
    65     "[| ? x:A. P(x);  !!x. [| x:A; P(x) |] ==> Q  |] ==> Q";
    66 by (rtac (major RS exE) 1);
    66 by (rtac (major RS exE) 1);
    67 by (REPEAT (eresolve_tac (prems @ [asm_rl,conjE]) 1));
    67 by (REPEAT (eresolve_tac (prems @ [asm_rl,conjE]) 1));
    68 val bexE = result();
    68 qed "bexE";
    69 
    69 
    70 (*Trival rewrite rule;   (! x:A.P)=P holds only if A is nonempty!*)
    70 (*Trival rewrite rule;   (! x:A.P)=P holds only if A is nonempty!*)
    71 val prems = goal Set.thy
    71 val prems = goal Set.thy
    72     "(! x:A. True) = True";
    72     "(! x:A. True) = True";
    73 by (REPEAT (ares_tac [TrueI,ballI,iffI] 1));
    73 by (REPEAT (ares_tac [TrueI,ballI,iffI] 1));
    74 val ball_rew = result();
    74 qed "ball_rew";
    75 
    75 
    76 (** Congruence rules **)
    76 (** Congruence rules **)
    77 
    77 
    78 val prems = goal Set.thy
    78 val prems = goal Set.thy
    79     "[| A=B;  !!x. x:B ==> P(x) = Q(x) |] ==> \
    79     "[| A=B;  !!x. x:B ==> P(x) = Q(x) |] ==> \
    80 \    (! x:A. P(x)) = (! x:B. Q(x))";
    80 \    (! x:A. P(x)) = (! x:B. Q(x))";
    81 by (resolve_tac (prems RL [ssubst]) 1);
    81 by (resolve_tac (prems RL [ssubst]) 1);
    82 by (REPEAT (ares_tac [ballI,iffI] 1
    82 by (REPEAT (ares_tac [ballI,iffI] 1
    83      ORELSE eresolve_tac ([make_elim bspec, mp] @ (prems RL [iffE])) 1));
    83      ORELSE eresolve_tac ([make_elim bspec, mp] @ (prems RL [iffE])) 1));
    84 val ball_cong = result();
    84 qed "ball_cong";
    85 
    85 
    86 val prems = goal Set.thy
    86 val prems = goal Set.thy
    87     "[| A=B;  !!x. x:B ==> P(x) = Q(x) |] ==> \
    87     "[| A=B;  !!x. x:B ==> P(x) = Q(x) |] ==> \
    88 \    (? x:A. P(x)) = (? x:B. Q(x))";
    88 \    (? x:A. P(x)) = (? x:B. Q(x))";
    89 by (resolve_tac (prems RL [ssubst]) 1);
    89 by (resolve_tac (prems RL [ssubst]) 1);
    90 by (REPEAT (etac bexE 1
    90 by (REPEAT (etac bexE 1
    91      ORELSE ares_tac ([bexI,iffI] @ (prems RL [iffD1,iffD2])) 1));
    91      ORELSE ares_tac ([bexI,iffI] @ (prems RL [iffD1,iffD2])) 1));
    92 val bex_cong = result();
    92 qed "bex_cong";
    93 
    93 
    94 (*** Subsets ***)
    94 (*** Subsets ***)
    95 
    95 
    96 val prems = goalw Set.thy [subset_def] "(!!x.x:A ==> x:B) ==> A <= B";
    96 val prems = goalw Set.thy [subset_def] "(!!x.x:A ==> x:B) ==> A <= B";
    97 by (REPEAT (ares_tac (prems @ [ballI]) 1));
    97 by (REPEAT (ares_tac (prems @ [ballI]) 1));
    98 val subsetI = result();
    98 qed "subsetI";
    99 
    99 
   100 (*Rule in Modus Ponens style*)
   100 (*Rule in Modus Ponens style*)
   101 val major::prems = goalw Set.thy [subset_def] "[| A <= B;  c:A |] ==> c:B";
   101 val major::prems = goalw Set.thy [subset_def] "[| A <= B;  c:A |] ==> c:B";
   102 by (rtac (major RS bspec) 1);
   102 by (rtac (major RS bspec) 1);
   103 by (resolve_tac prems 1);
   103 by (resolve_tac prems 1);
   104 val subsetD = result();
   104 qed "subsetD";
   105 
   105 
   106 (*The same, with reversed premises for use with etac -- cf rev_mp*)
   106 (*The same, with reversed premises for use with etac -- cf rev_mp*)
   107 val rev_subsetD = prove_goal Set.thy "[| c:A;  A <= B |] ==> c:B"
   107 val rev_subsetD = prove_goal Set.thy "[| c:A;  A <= B |] ==> c:B"
   108  (fn prems=>  [ (REPEAT (resolve_tac (prems@[subsetD]) 1)) ]);
   108  (fn prems=>  [ (REPEAT (resolve_tac (prems@[subsetD]) 1)) ]);
   109 
   109 
   110 (*Classical elimination rule*)
   110 (*Classical elimination rule*)
   111 val major::prems = goalw Set.thy [subset_def] 
   111 val major::prems = goalw Set.thy [subset_def] 
   112     "[| A <= B;  c~:A ==> P;  c:B ==> P |] ==> P";
   112     "[| A <= B;  c~:A ==> P;  c:B ==> P |] ==> P";
   113 by (rtac (major RS ballE) 1);
   113 by (rtac (major RS ballE) 1);
   114 by (REPEAT (eresolve_tac prems 1));
   114 by (REPEAT (eresolve_tac prems 1));
   115 val subsetCE = result();
   115 qed "subsetCE";
   116 
   116 
   117 (*Takes assumptions A<=B; c:A and creates the assumption c:B *)
   117 (*Takes assumptions A<=B; c:A and creates the assumption c:B *)
   118 fun set_mp_tac i = etac subsetCE i  THEN  mp_tac i;
   118 fun set_mp_tac i = etac subsetCE i  THEN  mp_tac i;
   119 
   119 
   120 val subset_refl = prove_goal Set.thy "A <= (A::'a set)"
   120 val subset_refl = prove_goal Set.thy "A <= (A::'a set)"
   121  (fn _=> [ (REPEAT (ares_tac [subsetI] 1)) ]);
   121  (fn _=> [ (REPEAT (ares_tac [subsetI] 1)) ]);
   122 
   122 
   123 val prems = goal Set.thy "[| A<=B;  B<=C |] ==> A<=(C::'a set)";
   123 val prems = goal Set.thy "[| A<=B;  B<=C |] ==> A<=(C::'a set)";
   124 by (cut_facts_tac prems 1);
   124 by (cut_facts_tac prems 1);
   125 by (REPEAT (ares_tac [subsetI] 1 ORELSE set_mp_tac 1));
   125 by (REPEAT (ares_tac [subsetI] 1 ORELSE set_mp_tac 1));
   126 val subset_trans = result();
   126 qed "subset_trans";
   127 
   127 
   128 
   128 
   129 (*** Equality ***)
   129 (*** Equality ***)
   130 
   130 
   131 (*Anti-symmetry of the subset relation*)
   131 (*Anti-symmetry of the subset relation*)
   132 val prems = goal Set.thy "[| A <= B;  B <= A |] ==> A = (B::'a set)";
   132 val prems = goal Set.thy "[| A <= B;  B <= A |] ==> A = (B::'a set)";
   133 by (rtac (iffI RS set_ext) 1);
   133 by (rtac (iffI RS set_ext) 1);
   134 by (REPEAT (ares_tac (prems RL [subsetD]) 1));
   134 by (REPEAT (ares_tac (prems RL [subsetD]) 1));
   135 val subset_antisym = result();
   135 qed "subset_antisym";
   136 val equalityI = subset_antisym;
   136 val equalityI = subset_antisym;
   137 
   137 
   138 (* Equality rules from ZF set theory -- are they appropriate here? *)
   138 (* Equality rules from ZF set theory -- are they appropriate here? *)
   139 val prems = goal Set.thy "A = B ==> A<=(B::'a set)";
   139 val prems = goal Set.thy "A = B ==> A<=(B::'a set)";
   140 by (resolve_tac (prems RL [subst]) 1);
   140 by (resolve_tac (prems RL [subst]) 1);
   141 by (rtac subset_refl 1);
   141 by (rtac subset_refl 1);
   142 val equalityD1 = result();
   142 qed "equalityD1";
   143 
   143 
   144 val prems = goal Set.thy "A = B ==> B<=(A::'a set)";
   144 val prems = goal Set.thy "A = B ==> B<=(A::'a set)";
   145 by (resolve_tac (prems RL [subst]) 1);
   145 by (resolve_tac (prems RL [subst]) 1);
   146 by (rtac subset_refl 1);
   146 by (rtac subset_refl 1);
   147 val equalityD2 = result();
   147 qed "equalityD2";
   148 
   148 
   149 val prems = goal Set.thy
   149 val prems = goal Set.thy
   150     "[| A = B;  [| A<=B; B<=(A::'a set) |] ==> P |]  ==>  P";
   150     "[| A = B;  [| A<=B; B<=(A::'a set) |] ==> P |]  ==>  P";
   151 by (resolve_tac prems 1);
   151 by (resolve_tac prems 1);
   152 by (REPEAT (resolve_tac (prems RL [equalityD1,equalityD2]) 1));
   152 by (REPEAT (resolve_tac (prems RL [equalityD1,equalityD2]) 1));
   153 val equalityE = result();
   153 qed "equalityE";
   154 
   154 
   155 val major::prems = goal Set.thy
   155 val major::prems = goal Set.thy
   156     "[| A = B;  [| c:A; c:B |] ==> P;  [| c~:A; c~:B |] ==> P |]  ==>  P";
   156     "[| A = B;  [| c:A; c:B |] ==> P;  [| c~:A; c~:B |] ==> P |]  ==>  P";
   157 by (rtac (major RS equalityE) 1);
   157 by (rtac (major RS equalityE) 1);
   158 by (REPEAT (contr_tac 1 ORELSE eresolve_tac ([asm_rl,subsetCE]@prems) 1));
   158 by (REPEAT (contr_tac 1 ORELSE eresolve_tac ([asm_rl,subsetCE]@prems) 1));
   159 val equalityCE = result();
   159 qed "equalityCE";
   160 
   160 
   161 (*Lemma for creating induction formulae -- for "pattern matching" on p
   161 (*Lemma for creating induction formulae -- for "pattern matching" on p
   162   To make the induction hypotheses usable, apply "spec" or "bspec" to
   162   To make the induction hypotheses usable, apply "spec" or "bspec" to
   163   put universal quantifiers over the free variables in p. *)
   163   put universal quantifiers over the free variables in p. *)
   164 val prems = goal Set.thy 
   164 val prems = goal Set.thy 
   165     "[| p:A;  !!z. z:A ==> p=z --> R |] ==> R";
   165     "[| p:A;  !!z. z:A ==> p=z --> R |] ==> R";
   166 by (rtac mp 1);
   166 by (rtac mp 1);
   167 by (REPEAT (resolve_tac (refl::prems) 1));
   167 by (REPEAT (resolve_tac (refl::prems) 1));
   168 val setup_induction = result();
   168 qed "setup_induction";
   169 
   169 
   170 
   170 
   171 (*** Set complement -- Compl ***)
   171 (*** Set complement -- Compl ***)
   172 
   172 
   173 val prems = goalw Set.thy [Compl_def]
   173 val prems = goalw Set.thy [Compl_def]
   174     "[| c:A ==> False |] ==> c : Compl(A)";
   174     "[| c:A ==> False |] ==> c : Compl(A)";
   175 by (REPEAT (ares_tac (prems @ [CollectI,notI]) 1));
   175 by (REPEAT (ares_tac (prems @ [CollectI,notI]) 1));
   176 val ComplI = result();
   176 qed "ComplI";
   177 
   177 
   178 (*This form, with negated conclusion, works well with the Classical prover.
   178 (*This form, with negated conclusion, works well with the Classical prover.
   179   Negated assumptions behave like formulae on the right side of the notional
   179   Negated assumptions behave like formulae on the right side of the notional
   180   turnstile...*)
   180   turnstile...*)
   181 val major::prems = goalw Set.thy [Compl_def]
   181 val major::prems = goalw Set.thy [Compl_def]
   182     "[| c : Compl(A) |] ==> c~:A";
   182     "[| c : Compl(A) |] ==> c~:A";
   183 by (rtac (major RS CollectD) 1);
   183 by (rtac (major RS CollectD) 1);
   184 val ComplD = result();
   184 qed "ComplD";
   185 
   185 
   186 val ComplE = make_elim ComplD;
   186 val ComplE = make_elim ComplD;
   187 
   187 
   188 
   188 
   189 (*** Binary union -- Un ***)
   189 (*** Binary union -- Un ***)
   190 
   190 
   191 val prems = goalw Set.thy [Un_def] "c:A ==> c : A Un B";
   191 val prems = goalw Set.thy [Un_def] "c:A ==> c : A Un B";
   192 by (REPEAT (resolve_tac (prems @ [CollectI,disjI1]) 1));
   192 by (REPEAT (resolve_tac (prems @ [CollectI,disjI1]) 1));
   193 val UnI1 = result();
   193 qed "UnI1";
   194 
   194 
   195 val prems = goalw Set.thy [Un_def] "c:B ==> c : A Un B";
   195 val prems = goalw Set.thy [Un_def] "c:B ==> c : A Un B";
   196 by (REPEAT (resolve_tac (prems @ [CollectI,disjI2]) 1));
   196 by (REPEAT (resolve_tac (prems @ [CollectI,disjI2]) 1));
   197 val UnI2 = result();
   197 qed "UnI2";
   198 
   198 
   199 (*Classical introduction rule: no commitment to A vs B*)
   199 (*Classical introduction rule: no commitment to A vs B*)
   200 val UnCI = prove_goal Set.thy "(c~:B ==> c:A) ==> c : A Un B"
   200 val UnCI = prove_goal Set.thy "(c~:B ==> c:A) ==> c : A Un B"
   201  (fn prems=>
   201  (fn prems=>
   202   [ (rtac classical 1),
   202   [ (rtac classical 1),
   205 
   205 
   206 val major::prems = goalw Set.thy [Un_def]
   206 val major::prems = goalw Set.thy [Un_def]
   207     "[| c : A Un B;  c:A ==> P;  c:B ==> P |] ==> P";
   207     "[| c : A Un B;  c:A ==> P;  c:B ==> P |] ==> P";
   208 by (rtac (major RS CollectD RS disjE) 1);
   208 by (rtac (major RS CollectD RS disjE) 1);
   209 by (REPEAT (eresolve_tac prems 1));
   209 by (REPEAT (eresolve_tac prems 1));
   210 val UnE = result();
   210 qed "UnE";
   211 
   211 
   212 
   212 
   213 (*** Binary intersection -- Int ***)
   213 (*** Binary intersection -- Int ***)
   214 
   214 
   215 val prems = goalw Set.thy [Int_def]
   215 val prems = goalw Set.thy [Int_def]
   216     "[| c:A;  c:B |] ==> c : A Int B";
   216     "[| c:A;  c:B |] ==> c : A Int B";
   217 by (REPEAT (resolve_tac (prems @ [CollectI,conjI]) 1));
   217 by (REPEAT (resolve_tac (prems @ [CollectI,conjI]) 1));
   218 val IntI = result();
   218 qed "IntI";
   219 
   219 
   220 val [major] = goalw Set.thy [Int_def] "c : A Int B ==> c:A";
   220 val [major] = goalw Set.thy [Int_def] "c : A Int B ==> c:A";
   221 by (rtac (major RS CollectD RS conjunct1) 1);
   221 by (rtac (major RS CollectD RS conjunct1) 1);
   222 val IntD1 = result();
   222 qed "IntD1";
   223 
   223 
   224 val [major] = goalw Set.thy [Int_def] "c : A Int B ==> c:B";
   224 val [major] = goalw Set.thy [Int_def] "c : A Int B ==> c:B";
   225 by (rtac (major RS CollectD RS conjunct2) 1);
   225 by (rtac (major RS CollectD RS conjunct2) 1);
   226 val IntD2 = result();
   226 qed "IntD2";
   227 
   227 
   228 val [major,minor] = goal Set.thy
   228 val [major,minor] = goal Set.thy
   229     "[| c : A Int B;  [| c:A; c:B |] ==> P |] ==> P";
   229     "[| c : A Int B;  [| c:A; c:B |] ==> P |] ==> P";
   230 by (rtac minor 1);
   230 by (rtac minor 1);
   231 by (rtac (major RS IntD1) 1);
   231 by (rtac (major RS IntD1) 1);
   232 by (rtac (major RS IntD2) 1);
   232 by (rtac (major RS IntD2) 1);
   233 val IntE = result();
   233 qed "IntE";
   234 
   234 
   235 
   235 
   236 (*** Set difference ***)
   236 (*** Set difference ***)
   237 
   237 
   238 val DiffI = prove_goalw Set.thy [set_diff_def]
   238 val DiffI = prove_goalw Set.thy [set_diff_def]
   309   [ (rtac (major RS insertE) 1),
   309   [ (rtac (major RS insertE) 1),
   310     (REPEAT (eresolve_tac (prems @ [emptyE]) 1)) ]);
   310     (REPEAT (eresolve_tac (prems @ [emptyE]) 1)) ]);
   311 
   311 
   312 goalw Set.thy [insert_def] "!!a. b : {a} ==> b=a";
   312 goalw Set.thy [insert_def] "!!a. b : {a} ==> b=a";
   313 by(fast_tac (HOL_cs addSEs [emptyE,CollectE,UnE]) 1);
   313 by(fast_tac (HOL_cs addSEs [emptyE,CollectE,UnE]) 1);
   314 val singletonD = result();
   314 qed "singletonD";
   315 
   315 
   316 val singletonE = make_elim singletonD;
   316 val singletonE = make_elim singletonD;
   317 
   317 
   318 val [major] = goal Set.thy "{a}={b} ==> a=b";
   318 val [major] = goal Set.thy "{a}={b} ==> a=b";
   319 by (rtac (major RS equalityD1 RS subsetD RS singletonD) 1);
   319 by (rtac (major RS equalityD1 RS subsetD RS singletonD) 1);
   320 by (rtac singletonI 1);
   320 by (rtac singletonI 1);
   321 val singleton_inject = result();
   321 qed "singleton_inject";
   322 
   322 
   323 (*** Unions of families -- UNION x:A. B(x) is Union(B``A)  ***)
   323 (*** Unions of families -- UNION x:A. B(x) is Union(B``A)  ***)
   324 
   324 
   325 (*The order of the premises presupposes that A is rigid; b may be flexible*)
   325 (*The order of the premises presupposes that A is rigid; b may be flexible*)
   326 val prems = goalw Set.thy [UNION_def]
   326 val prems = goalw Set.thy [UNION_def]
   327     "[| a:A;  b: B(a) |] ==> b: (UN x:A. B(x))";
   327     "[| a:A;  b: B(a) |] ==> b: (UN x:A. B(x))";
   328 by (REPEAT (resolve_tac (prems @ [bexI,CollectI]) 1));
   328 by (REPEAT (resolve_tac (prems @ [bexI,CollectI]) 1));
   329 val UN_I = result();
   329 qed "UN_I";
   330 
   330 
   331 val major::prems = goalw Set.thy [UNION_def]
   331 val major::prems = goalw Set.thy [UNION_def]
   332     "[| b : (UN x:A. B(x));  !!x.[| x:A;  b: B(x) |] ==> R |] ==> R";
   332     "[| b : (UN x:A. B(x));  !!x.[| x:A;  b: B(x) |] ==> R |] ==> R";
   333 by (rtac (major RS CollectD RS bexE) 1);
   333 by (rtac (major RS CollectD RS bexE) 1);
   334 by (REPEAT (ares_tac prems 1));
   334 by (REPEAT (ares_tac prems 1));
   335 val UN_E = result();
   335 qed "UN_E";
   336 
   336 
   337 val prems = goal Set.thy
   337 val prems = goal Set.thy
   338     "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==> \
   338     "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==> \
   339 \    (UN x:A. C(x)) = (UN x:B. D(x))";
   339 \    (UN x:A. C(x)) = (UN x:B. D(x))";
   340 by (REPEAT (etac UN_E 1
   340 by (REPEAT (etac UN_E 1
   341      ORELSE ares_tac ([UN_I,equalityI,subsetI] @ 
   341      ORELSE ares_tac ([UN_I,equalityI,subsetI] @ 
   342 		      (prems RL [equalityD1,equalityD2] RL [subsetD])) 1));
   342 		      (prems RL [equalityD1,equalityD2] RL [subsetD])) 1));
   343 val UN_cong = result();
   343 qed "UN_cong";
   344 
   344 
   345 
   345 
   346 (*** Intersections of families -- INTER x:A. B(x) is Inter(B``A) *)
   346 (*** Intersections of families -- INTER x:A. B(x) is Inter(B``A) *)
   347 
   347 
   348 val prems = goalw Set.thy [INTER_def]
   348 val prems = goalw Set.thy [INTER_def]
   349     "(!!x. x:A ==> b: B(x)) ==> b : (INT x:A. B(x))";
   349     "(!!x. x:A ==> b: B(x)) ==> b : (INT x:A. B(x))";
   350 by (REPEAT (ares_tac ([CollectI,ballI] @ prems) 1));
   350 by (REPEAT (ares_tac ([CollectI,ballI] @ prems) 1));
   351 val INT_I = result();
   351 qed "INT_I";
   352 
   352 
   353 val major::prems = goalw Set.thy [INTER_def]
   353 val major::prems = goalw Set.thy [INTER_def]
   354     "[| b : (INT x:A. B(x));  a:A |] ==> b: B(a)";
   354     "[| b : (INT x:A. B(x));  a:A |] ==> b: B(a)";
   355 by (rtac (major RS CollectD RS bspec) 1);
   355 by (rtac (major RS CollectD RS bspec) 1);
   356 by (resolve_tac prems 1);
   356 by (resolve_tac prems 1);
   357 val INT_D = result();
   357 qed "INT_D";
   358 
   358 
   359 (*"Classical" elimination -- by the Excluded Middle on a:A *)
   359 (*"Classical" elimination -- by the Excluded Middle on a:A *)
   360 val major::prems = goalw Set.thy [INTER_def]
   360 val major::prems = goalw Set.thy [INTER_def]
   361     "[| b : (INT x:A. B(x));  b: B(a) ==> R;  a~:A ==> R |] ==> R";
   361     "[| b : (INT x:A. B(x));  b: B(a) ==> R;  a~:A ==> R |] ==> R";
   362 by (rtac (major RS CollectD RS ballE) 1);
   362 by (rtac (major RS CollectD RS ballE) 1);
   363 by (REPEAT (eresolve_tac prems 1));
   363 by (REPEAT (eresolve_tac prems 1));
   364 val INT_E = result();
   364 qed "INT_E";
   365 
   365 
   366 val prems = goal Set.thy
   366 val prems = goal Set.thy
   367     "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==> \
   367     "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==> \
   368 \    (INT x:A. C(x)) = (INT x:B. D(x))";
   368 \    (INT x:A. C(x)) = (INT x:B. D(x))";
   369 by (REPEAT_FIRST (resolve_tac [INT_I,equalityI,subsetI]));
   369 by (REPEAT_FIRST (resolve_tac [INT_I,equalityI,subsetI]));
   370 by (REPEAT (dtac INT_D 1
   370 by (REPEAT (dtac INT_D 1
   371      ORELSE ares_tac (prems RL [equalityD1,equalityD2] RL [subsetD]) 1));
   371      ORELSE ares_tac (prems RL [equalityD1,equalityD2] RL [subsetD]) 1));
   372 val INT_cong = result();
   372 qed "INT_cong";
   373 
   373 
   374 
   374 
   375 (*** Unions over a type; UNION1(B) = Union(range(B)) ***)
   375 (*** Unions over a type; UNION1(B) = Union(range(B)) ***)
   376 
   376 
   377 (*The order of the premises presupposes that A is rigid; b may be flexible*)
   377 (*The order of the premises presupposes that A is rigid; b may be flexible*)
   378 val prems = goalw Set.thy [UNION1_def]
   378 val prems = goalw Set.thy [UNION1_def]
   379     "b: B(x) ==> b: (UN x. B(x))";
   379     "b: B(x) ==> b: (UN x. B(x))";
   380 by (REPEAT (resolve_tac (prems @ [TrueI, CollectI RS UN_I]) 1));
   380 by (REPEAT (resolve_tac (prems @ [TrueI, CollectI RS UN_I]) 1));
   381 val UN1_I = result();
   381 qed "UN1_I";
   382 
   382 
   383 val major::prems = goalw Set.thy [UNION1_def]
   383 val major::prems = goalw Set.thy [UNION1_def]
   384     "[| b : (UN x. B(x));  !!x. b: B(x) ==> R |] ==> R";
   384     "[| b : (UN x. B(x));  !!x. b: B(x) ==> R |] ==> R";
   385 by (rtac (major RS UN_E) 1);
   385 by (rtac (major RS UN_E) 1);
   386 by (REPEAT (ares_tac prems 1));
   386 by (REPEAT (ares_tac prems 1));
   387 val UN1_E = result();
   387 qed "UN1_E";
   388 
   388 
   389 
   389 
   390 (*** Intersections over a type; INTER1(B) = Inter(range(B)) *)
   390 (*** Intersections over a type; INTER1(B) = Inter(range(B)) *)
   391 
   391 
   392 val prems = goalw Set.thy [INTER1_def]
   392 val prems = goalw Set.thy [INTER1_def]
   393     "(!!x. b: B(x)) ==> b : (INT x. B(x))";
   393     "(!!x. b: B(x)) ==> b : (INT x. B(x))";
   394 by (REPEAT (ares_tac (INT_I::prems) 1));
   394 by (REPEAT (ares_tac (INT_I::prems) 1));
   395 val INT1_I = result();
   395 qed "INT1_I";
   396 
   396 
   397 val [major] = goalw Set.thy [INTER1_def]
   397 val [major] = goalw Set.thy [INTER1_def]
   398     "b : (INT x. B(x)) ==> b: B(a)";
   398     "b : (INT x. B(x)) ==> b: B(a)";
   399 by (rtac (TrueI RS (CollectI RS (major RS INT_D))) 1);
   399 by (rtac (TrueI RS (CollectI RS (major RS INT_D))) 1);
   400 val INT1_D = result();
   400 qed "INT1_D";
   401 
   401 
   402 (*** Unions ***)
   402 (*** Unions ***)
   403 
   403 
   404 (*The order of the premises presupposes that C is rigid; A may be flexible*)
   404 (*The order of the premises presupposes that C is rigid; A may be flexible*)
   405 val prems = goalw Set.thy [Union_def]
   405 val prems = goalw Set.thy [Union_def]
   406     "[| X:C;  A:X |] ==> A : Union(C)";
   406     "[| X:C;  A:X |] ==> A : Union(C)";
   407 by (REPEAT (resolve_tac (prems @ [UN_I]) 1));
   407 by (REPEAT (resolve_tac (prems @ [UN_I]) 1));
   408 val UnionI = result();
   408 qed "UnionI";
   409 
   409 
   410 val major::prems = goalw Set.thy [Union_def]
   410 val major::prems = goalw Set.thy [Union_def]
   411     "[| A : Union(C);  !!X.[| A:X;  X:C |] ==> R |] ==> R";
   411     "[| A : Union(C);  !!X.[| A:X;  X:C |] ==> R |] ==> R";
   412 by (rtac (major RS UN_E) 1);
   412 by (rtac (major RS UN_E) 1);
   413 by (REPEAT (ares_tac prems 1));
   413 by (REPEAT (ares_tac prems 1));
   414 val UnionE = result();
   414 qed "UnionE";
   415 
   415 
   416 (*** Inter ***)
   416 (*** Inter ***)
   417 
   417 
   418 val prems = goalw Set.thy [Inter_def]
   418 val prems = goalw Set.thy [Inter_def]
   419     "[| !!X. X:C ==> A:X |] ==> A : Inter(C)";
   419     "[| !!X. X:C ==> A:X |] ==> A : Inter(C)";
   420 by (REPEAT (ares_tac ([INT_I] @ prems) 1));
   420 by (REPEAT (ares_tac ([INT_I] @ prems) 1));
   421 val InterI = result();
   421 qed "InterI";
   422 
   422 
   423 (*A "destruct" rule -- every X in C contains A as an element, but
   423 (*A "destruct" rule -- every X in C contains A as an element, but
   424   A:X can hold when X:C does not!  This rule is analogous to "spec". *)
   424   A:X can hold when X:C does not!  This rule is analogous to "spec". *)
   425 val major::prems = goalw Set.thy [Inter_def]
   425 val major::prems = goalw Set.thy [Inter_def]
   426     "[| A : Inter(C);  X:C |] ==> A:X";
   426     "[| A : Inter(C);  X:C |] ==> A:X";
   427 by (rtac (major RS INT_D) 1);
   427 by (rtac (major RS INT_D) 1);
   428 by (resolve_tac prems 1);
   428 by (resolve_tac prems 1);
   429 val InterD = result();
   429 qed "InterD";
   430 
   430 
   431 (*"Classical" elimination rule -- does not require proving X:C *)
   431 (*"Classical" elimination rule -- does not require proving X:C *)
   432 val major::prems = goalw Set.thy [Inter_def]
   432 val major::prems = goalw Set.thy [Inter_def]
   433     "[| A : Inter(C);  A:X ==> R;  X~:C ==> R |] ==> R";
   433     "[| A : Inter(C);  A:X ==> R;  X~:C ==> R |] ==> R";
   434 by (rtac (major RS INT_E) 1);
   434 by (rtac (major RS INT_E) 1);
   435 by (REPEAT (eresolve_tac prems 1));
   435 by (REPEAT (eresolve_tac prems 1));
   436 val InterE = result();
   436 qed "InterE";
   437 
   437 
   438 (*** Powerset ***)
   438 (*** Powerset ***)
   439 
   439 
   440 val PowI = prove_goalw Set.thy [Pow_def] "!!A B. A <= B ==> A : Pow(B)"
   440 val PowI = prove_goalw Set.thy [Pow_def] "!!A B. A <= B ==> A : Pow(B)"
   441  (fn _ => [ (etac CollectI 1) ]);
   441  (fn _ => [ (etac CollectI 1) ]);