54 |
54 |
55 val Un_iff = prove_goal ZF.thy "c : A Un B <-> (c:A | c:B)" |
55 val Un_iff = prove_goal ZF.thy "c : A Un B <-> (c:A | c:B)" |
56 (fn _ => [ (fast_tac (lemmas_cs addIs [UnI1,UnI2] addSEs [UnE]) 1) ]); |
56 (fn _ => [ (fast_tac (lemmas_cs addIs [UnI1,UnI2] addSEs [UnE]) 1) ]); |
57 |
57 |
58 (*Classical introduction rule: no commitment to A vs B*) |
58 (*Classical introduction rule: no commitment to A vs B*) |
59 val UnCI = prove_goal ZF.thy "(~c : B ==> c : A) ==> c : A Un B" |
59 val UnCI = prove_goal ZF.thy "(c ~: B ==> c : A) ==> c : A Un B" |
60 (fn [prem]=> |
60 (fn [prem]=> |
61 [ (rtac (disjCI RS (Un_iff RS iffD2)) 1), |
61 [ (rtac (disjCI RS (Un_iff RS iffD2)) 1), |
62 (etac prem 1) ]); |
62 (etac prem 1) ]); |
63 |
63 |
64 |
64 |
89 |
89 |
90 |
90 |
91 (*** Rules for set difference -- defined via Upair ***) |
91 (*** Rules for set difference -- defined via Upair ***) |
92 |
92 |
93 val DiffI = prove_goalw ZF.thy [Diff_def] |
93 val DiffI = prove_goalw ZF.thy [Diff_def] |
94 "[| c : A; ~ c : B |] ==> c : A - B" |
94 "[| c : A; c ~: B |] ==> c : A - B" |
95 (fn prems=> [ (REPEAT (resolve_tac (prems @ [CollectI]) 1)) ]); |
95 (fn prems=> [ (REPEAT (resolve_tac (prems @ [CollectI]) 1)) ]); |
96 |
96 |
97 val DiffD1 = prove_goalw ZF.thy [Diff_def] |
97 val DiffD1 = prove_goalw ZF.thy [Diff_def] |
98 "c : A - B ==> c : A" |
98 "c : A - B ==> c : A" |
99 (fn [major]=> [ (rtac (major RS CollectD1) 1) ]); |
99 (fn [major]=> [ (rtac (major RS CollectD1) 1) ]); |
101 val DiffD2 = prove_goalw ZF.thy [Diff_def] |
101 val DiffD2 = prove_goalw ZF.thy [Diff_def] |
102 "[| c : A - B; c : B |] ==> P" |
102 "[| c : A - B; c : B |] ==> P" |
103 (fn [major,minor]=> [ (rtac (minor RS (major RS CollectD2 RS notE)) 1) ]); |
103 (fn [major,minor]=> [ (rtac (minor RS (major RS CollectD2 RS notE)) 1) ]); |
104 |
104 |
105 val DiffE = prove_goal ZF.thy |
105 val DiffE = prove_goal ZF.thy |
106 "[| c : A - B; [| c:A; ~ c:B |] ==> P |] ==> P" |
106 "[| c : A - B; [| c:A; c~:B |] ==> P |] ==> P" |
107 (fn prems=> |
107 (fn prems=> |
108 [ (resolve_tac prems 1), |
108 [ (resolve_tac prems 1), |
109 (REPEAT (ares_tac (prems RL [DiffD1, DiffD2 RS notI]) 1)) ]); |
109 (REPEAT (ares_tac (prems RL [DiffD1, DiffD2 RS notI]) 1)) ]); |
110 |
110 |
111 val Diff_iff = prove_goal ZF.thy "c : A-B <-> (c:A & ~ c:B)" |
111 val Diff_iff = prove_goal ZF.thy "c : A-B <-> (c:A & c~:B)" |
112 (fn _ => [ (fast_tac (lemmas_cs addSIs [DiffI] addSEs [DiffE]) 1) ]); |
112 (fn _ => [ (fast_tac (lemmas_cs addSIs [DiffI] addSEs [DiffE]) 1) ]); |
113 |
113 |
114 (*** Rules for cons -- defined via Un and Upair ***) |
114 (*** Rules for cons -- defined via Un and Upair ***) |
115 |
115 |
116 val consI1 = prove_goalw ZF.thy [cons_def] "a : cons(a,B)" |
116 val consI1 = prove_goalw ZF.thy [cons_def] "a : cons(a,B)" |
127 |
127 |
128 val cons_iff = prove_goal ZF.thy "a : cons(b,A) <-> (a=b | a:A)" |
128 val cons_iff = prove_goal ZF.thy "a : cons(b,A) <-> (a=b | a:A)" |
129 (fn _ => [ (fast_tac (lemmas_cs addIs [consI1,consI2] addSEs [consE]) 1) ]); |
129 (fn _ => [ (fast_tac (lemmas_cs addIs [consI1,consI2] addSEs [consE]) 1) ]); |
130 |
130 |
131 (*Classical introduction rule*) |
131 (*Classical introduction rule*) |
132 val consCI = prove_goal ZF.thy "(~ a:B ==> a=b) ==> a: cons(b,B)" |
132 val consCI = prove_goal ZF.thy "(a~:B ==> a=b) ==> a: cons(b,B)" |
133 (fn [prem]=> |
133 (fn [prem]=> |
134 [ (rtac (disjCI RS (cons_iff RS iffD2)) 1), |
134 [ (rtac (disjCI RS (cons_iff RS iffD2)) 1), |
135 (etac prem 1) ]); |
135 (etac prem 1) ]); |
136 |
136 |
137 (*** Singletons - using cons ***) |
137 (*** Singletons - using cons ***) |
221 addSEs [consE,equalityE]) 1) ]); |
221 addSEs [consE,equalityE]) 1) ]); |
222 |
222 |
223 val mem_anti_refl = prove_goal ZF.thy "a:a ==> P" |
223 val mem_anti_refl = prove_goal ZF.thy "a:a ==> P" |
224 (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]); |
224 (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]); |
225 |
225 |
226 val mem_not_refl = prove_goal ZF.thy "~ a:a" |
226 val mem_not_refl = prove_goal ZF.thy "a~:a" |
227 (K [ (rtac notI 1), (etac mem_anti_refl 1) ]); |
227 (K [ (rtac notI 1), (etac mem_anti_refl 1) ]); |
228 |
228 |
229 (*** Rules for succ ***) |
229 (*** Rules for succ ***) |
230 |
230 |
231 val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)" |
231 val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)" |
243 |
243 |
244 val succ_iff = prove_goal ZF.thy "i : succ(j) <-> i=j | i:j" |
244 val succ_iff = prove_goal ZF.thy "i : succ(j) <-> i=j | i:j" |
245 (fn _ => [ (fast_tac (lemmas_cs addIs [succI1,succI2] addSEs [succE]) 1) ]); |
245 (fn _ => [ (fast_tac (lemmas_cs addIs [succI1,succI2] addSEs [succE]) 1) ]); |
246 |
246 |
247 (*Classical introduction rule*) |
247 (*Classical introduction rule*) |
248 val succCI = prove_goal ZF.thy "(~ i:j ==> i=j) ==> i: succ(j)" |
248 val succCI = prove_goal ZF.thy "(i~:j ==> i=j) ==> i: succ(j)" |
249 (fn [prem]=> |
249 (fn [prem]=> |
250 [ (rtac (disjCI RS (succ_iff RS iffD2)) 1), |
250 [ (rtac (disjCI RS (succ_iff RS iffD2)) 1), |
251 (etac prem 1) ]); |
251 (etac prem 1) ]); |
252 |
252 |
253 val succ_neq_0 = prove_goal ZF.thy "succ(n)=0 ==> P" |
253 val succ_neq_0 = prove_goal ZF.thy "succ(n)=0 ==> P" |
254 (fn [major]=> |
254 (fn [major]=> |
255 [ (rtac (major RS equalityD1 RS subsetD RS emptyE) 1), |
255 [ (rtac (major RS equalityD1 RS subsetD RS emptyE) 1), |
256 (rtac succI1 1) ]); |
256 (rtac succI1 1) ]); |
257 |
257 |
258 (*Useful for rewriting*) |
258 (*Useful for rewriting*) |
259 val succ_not_0 = prove_goal ZF.thy "~ succ(n)=0" |
259 val succ_not_0 = prove_goal ZF.thy "succ(n) ~= 0" |
260 (fn _=> [ (rtac notI 1), (etac succ_neq_0 1) ]); |
260 (fn _=> [ (rtac notI 1), (etac succ_neq_0 1) ]); |
261 |
261 |
262 (* succ(c) <= B ==> c : B *) |
262 (* succ(c) <= B ==> c : B *) |
263 val succ_subsetD = succI1 RSN (2,subsetD); |
263 val succ_subsetD = succI1 RSN (2,subsetD); |
264 |
264 |