equal
deleted
inserted
replaced
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(); |