205 |
205 |
206 val if_ss = FOL_ss addsimps [if_true,if_false]; |
206 val if_ss = FOL_ss addsimps [if_true,if_false]; |
207 |
207 |
208 val expand_if = prove_goal ZF.thy |
208 val expand_if = prove_goal ZF.thy |
209 "P(if(Q,x,y)) <-> ((Q --> P(x)) & (~Q --> P(y)))" |
209 "P(if(Q,x,y)) <-> ((Q --> P(x)) & (~Q --> P(y)))" |
210 (fn _=> [ (res_inst_tac [("Q","Q")] (excluded_middle RS disjE) 1), |
210 (fn _=> [ (excluded_middle_tac "Q" 1), |
211 (asm_simp_tac if_ss 1), |
211 (asm_simp_tac if_ss 1), |
212 (asm_simp_tac if_ss 1) ]); |
212 (asm_simp_tac if_ss 1) ]); |
213 |
213 |
214 val prems = goal ZF.thy |
214 val prems = goal ZF.thy |
215 "[| P ==> a: A; ~P ==> b: A |] ==> if(P,a,b): A"; |
215 "[| P ==> a: A; ~P ==> b: A |] ==> if(P,a,b): A"; |
216 by (res_inst_tac [("Q","P")] (excluded_middle RS disjE) 1); |
216 by (excluded_middle_tac "P" 1); |
217 by (ALLGOALS (asm_simp_tac (if_ss addsimps prems))); |
217 by (ALLGOALS (asm_simp_tac (if_ss addsimps prems))); |
218 val if_type = result(); |
218 val if_type = result(); |
219 |
219 |
220 |
220 |
221 (*** Foundation lemmas ***) |
221 (*** Foundation lemmas ***) |
222 |
222 |
223 val mem_anti_sym = prove_goal ZF.thy "[| a:b; b:a |] ==> P" |
223 (*was called mem_anti_sym*) |
|
224 val mem_asym = prove_goal ZF.thy "[| a:b; b:a |] ==> P" |
224 (fn prems=> |
225 (fn prems=> |
225 [ (rtac disjE 1), |
226 [ (rtac disjE 1), |
226 (res_inst_tac [("A","{a,b}")] foundation 1), |
227 (res_inst_tac [("A","{a,b}")] foundation 1), |
227 (etac equals0D 1), |
228 (etac equals0D 1), |
228 (rtac consI1 1), |
229 (rtac consI1 1), |
229 (fast_tac (lemmas_cs addIs (prems@[consI1,consI2]) |
230 (fast_tac (lemmas_cs addIs (prems@[consI1,consI2]) |
230 addSEs [consE,equalityE]) 1) ]); |
231 addSEs [consE,equalityE]) 1) ]); |
231 |
232 |
232 val mem_anti_refl = prove_goal ZF.thy "a:a ==> P" |
233 (*was called mem_anti_refl*) |
233 (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]); |
234 val mem_irrefl = prove_goal ZF.thy "a:a ==> P" |
234 |
235 (fn [major]=> [ (rtac (major RS (major RS mem_asym)) 1) ]); |
235 val mem_not_refl = prove_goal ZF.thy "a~:a" |
236 |
236 (K [ (rtac notI 1), (etac mem_anti_refl 1) ]); |
237 val mem_not_refl = prove_goal ZF.thy "a ~: a" |
|
238 (K [ (rtac notI 1), (etac mem_irrefl 1) ]); |
237 |
239 |
238 (*Good for proving inequalities by rewriting*) |
240 (*Good for proving inequalities by rewriting*) |
239 val mem_imp_not_eq = prove_goal ZF.thy "!!a A. a:A ==> a ~= A" |
241 val mem_imp_not_eq = prove_goal ZF.thy "!!a A. a:A ==> a ~= A" |
240 (fn _=> [ fast_tac (lemmas_cs addSEs [mem_anti_refl]) 1 ]); |
242 (fn _=> [ fast_tac (lemmas_cs addSEs [mem_irrefl]) 1 ]); |
241 |
243 |
242 (*** Rules for succ ***) |
244 (*** Rules for succ ***) |
243 |
245 |
244 val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)" |
246 val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)" |
245 (fn _=> [ (rtac consI1 1) ]); |
247 (fn _=> [ (rtac consI1 1) ]); |
277 |
279 |
278 val succ_inject = prove_goal ZF.thy "succ(m) = succ(n) ==> m=n" |
280 val succ_inject = prove_goal ZF.thy "succ(m) = succ(n) ==> m=n" |
279 (fn [major]=> |
281 (fn [major]=> |
280 [ (rtac (major RS equalityE) 1), |
282 [ (rtac (major RS equalityE) 1), |
281 (REPEAT (eresolve_tac [asm_rl, sym, succE, make_elim succ_subsetD, |
283 (REPEAT (eresolve_tac [asm_rl, sym, succE, make_elim succ_subsetD, |
282 mem_anti_sym] 1)) ]); |
284 mem_asym] 1)) ]); |
283 |
285 |
284 val succ_inject_iff = prove_goal ZF.thy "succ(m) = succ(n) <-> m=n" |
286 val succ_inject_iff = prove_goal ZF.thy "succ(m) = succ(n) <-> m=n" |
285 (fn _=> [ (fast_tac (FOL_cs addSEs [succ_inject]) 1) ]); |
287 (fn _=> [ (fast_tac (FOL_cs addSEs [succ_inject]) 1) ]); |
286 |
288 |
287 (*UpairI1/2 should become UpairCI; mem_anti_refl as a hazE? *) |
289 (*UpairI1/2 should become UpairCI; mem_irrefl as a hazE? *) |
288 val upair_cs = lemmas_cs |
290 val upair_cs = lemmas_cs |
289 addSIs [singletonI, DiffI, IntI, UnCI, consCI, succCI, UpairI1,UpairI2] |
291 addSIs [singletonI, DiffI, IntI, UnCI, consCI, succCI, UpairI1,UpairI2] |
290 addSEs [singletonE, DiffE, IntE, UnE, consE, succE, UpairE]; |
292 addSEs [singletonE, DiffE, IntE, UnE, consE, succE, UpairE]; |
291 |
293 |