Set.ML
changeset 5 968d2dccf2de
parent 0 7949f97df77a
child 90 5c7a69cef18b
equal deleted inserted replaced
4:d199410f1db1 5:968d2dccf2de
    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 val bspec = result();
    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 val ballE = result();
    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)*)
   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 val subsetCE = result();
   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 *)
   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 val equalityE = result();
   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 val equalityCE = result();
   160 
   160 
   161 (*Lemma for creating induction formulae -- for "pattern matching" on p
   161 (*Lemma for creating induction formulae -- for "pattern matching" on p
   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 val ComplD = result();
   185 
   185 
   186 val ComplE = make_elim ComplD;
   186 val ComplE = make_elim ComplD;
   187 
   187 
   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 val UnI2 = result();
   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),
   203     (REPEAT (ares_tac (prems@[UnI1,notI]) 1)),
   203     (REPEAT (ares_tac (prems@[UnI1,notI]) 1)),
   204     (REPEAT (ares_tac (prems@[UnI2,notE]) 1)) ]);
   204     (REPEAT (ares_tac (prems@[UnI2,notE]) 1)) ]);
   205 
   205 
   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]
   239     "[| c : A;  ~ c : B |] ==> c : A - B"
   239     "[| c : A;  c ~: B |] ==> c : A - B"
   240  (fn prems=> [ (REPEAT (resolve_tac (prems @ [CollectI,conjI]) 1)) ]);
   240  (fn prems=> [ (REPEAT (resolve_tac (prems @ [CollectI,conjI]) 1)) ]);
   241 
   241 
   242 val DiffD1 = prove_goalw Set.thy [set_diff_def]
   242 val DiffD1 = prove_goalw Set.thy [set_diff_def]
   243     "c : A - B ==> c : A"
   243     "c : A - B ==> c : A"
   244  (fn [major]=> [ (rtac (major RS CollectD RS conjunct1) 1) ]);
   244  (fn [major]=> [ (rtac (major RS CollectD RS conjunct1) 1) ]);
   247     "[| c : A - B;  c : B |] ==> P"
   247     "[| c : A - B;  c : B |] ==> P"
   248  (fn [major,minor]=>
   248  (fn [major,minor]=>
   249      [rtac (minor RS (major RS CollectD RS conjunct2 RS notE)) 1]);
   249      [rtac (minor RS (major RS CollectD RS conjunct2 RS notE)) 1]);
   250 
   250 
   251 val DiffE = prove_goal Set.thy
   251 val DiffE = prove_goal Set.thy
   252     "[| c : A - B;  [| c:A; ~ c:B |] ==> P |] ==> P"
   252     "[| c : A - B;  [| c:A; c~:B |] ==> P |] ==> P"
   253  (fn prems=>
   253  (fn prems=>
   254   [ (resolve_tac prems 1),
   254   [ (resolve_tac prems 1),
   255     (REPEAT (ares_tac (prems RL [DiffD1, DiffD2 RS notI]) 1)) ]);
   255     (REPEAT (ares_tac (prems RL [DiffD1, DiffD2 RS notI]) 1)) ]);
   256 
   256 
   257 val Diff_iff = prove_goal Set.thy "(c : A-B) = (c:A & ~ c:B)"
   257 val Diff_iff = prove_goal Set.thy "(c : A-B) = (c:A & c~:B)"
   258  (fn _ => [ (fast_tac (HOL_cs addSIs [DiffI] addSEs [DiffE]) 1) ]);
   258  (fn _ => [ (fast_tac (HOL_cs addSIs [DiffI] addSEs [DiffE]) 1) ]);
   259 
   259 
   260 
   260 
   261 (*** The empty set -- {} ***)
   261 (*** The empty set -- {} ***)
   262 
   262 
   292 
   292 
   293 val insert_iff = prove_goal Set.thy "a : insert(b,A) = (a=b | a:A)"
   293 val insert_iff = prove_goal Set.thy "a : insert(b,A) = (a=b | a:A)"
   294  (fn _ => [fast_tac (HOL_cs addIs [insertI1,insertI2] addSEs [insertE]) 1]);
   294  (fn _ => [fast_tac (HOL_cs addIs [insertI1,insertI2] addSEs [insertE]) 1]);
   295 
   295 
   296 (*Classical introduction rule*)
   296 (*Classical introduction rule*)
   297 val insertCI = prove_goal Set.thy "(~a:B ==> a=b) ==> a: insert(b,B)"
   297 val insertCI = prove_goal Set.thy "(a~:B ==> a=b) ==> a: insert(b,B)"
   298  (fn [prem]=>
   298  (fn [prem]=>
   299   [ (rtac (disjCI RS (insert_iff RS iffD2)) 1),
   299   [ (rtac (disjCI RS (insert_iff RS iffD2)) 1),
   300     (etac prem 1) ]);
   300     (etac prem 1) ]);
   301 
   301 
   302 (*** Singletons, using insert ***)
   302 (*** Singletons, using insert ***)
   356 by (resolve_tac prems 1);
   356 by (resolve_tac prems 1);
   357 val INT_D = result();
   357 val INT_D = result();
   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 val INT_E = result();
   365 
   365 
   366 val prems = goal Set.thy
   366 val prems = goal Set.thy
   428 by (resolve_tac prems 1);
   428 by (resolve_tac prems 1);
   429 val InterD = result();
   429 val InterD = result();
   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 val InterE = result();