# HG changeset patch # User lcp # Date 772385892 -7200 # Node ID 435875e4b21d2d6a725423f20f6ff4dfa7c497db # Parent 0cdc840297bbcbfacb3c9ab717ddbc05f8d4d612 modifications for cardinal arithmetic diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Arith.ML --- a/src/ZF/Arith.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Arith.ML Thu Jun 23 17:38:12 1994 +0200 @@ -156,19 +156,17 @@ (ALLGOALS (asm_simp_tac (arith_ss addsimps [add_0_right, add_succ_right]))) ]); +(*for a/c rewriting*) val add_left_commute = prove_goal Arith.thy - "!!m n k. [| m:nat; n:nat; k:nat |] ==> m#+(n#+k)=n#+(m#+k)" - (fn _ => [rtac (add_commute RS trans) 1, - rtac (add_assoc RS trans) 3, - rtac (add_commute RS subst_context) 4, - REPEAT (ares_tac [add_type] 1)]); + "!!m n k. [| m:nat; n:nat |] ==> m#+(n#+k)=n#+(m#+k)" + (fn _ => [asm_simp_tac (ZF_ss addsimps [add_assoc RS sym, add_commute]) 1]); (*Addition is an AC-operator*) val add_ac = [add_assoc, add_commute, add_left_commute]; (*Cancellation law on the left*) -val [knat,eqn] = goal Arith.thy - "[| k:nat; k #+ m = k #+ n |] ==> m=n"; +val [eqn,knat] = goal Arith.thy + "[| k #+ m = k #+ n; k:nat |] ==> m=n"; by (rtac (eqn RS rev_mp) 1); by (nat_ind_tac "k" [knat] 1); by (ALLGOALS (simp_tac arith_ss)); @@ -221,6 +219,16 @@ [ (etac nat_induct 1), (ALLGOALS (asm_simp_tac (arith_ss addsimps [add_mult_distrib]))) ]); +(*for a/c rewriting*) +val mult_left_commute = prove_goal Arith.thy + "!!m n k. [| m:nat; n:nat; k:nat |] ==> m #* (n #* k) = n #* (m #* k)" + (fn _ => [rtac (mult_commute RS trans) 1, + rtac (mult_assoc RS trans) 3, + rtac (mult_commute RS subst_context) 6, + REPEAT (ares_tac [mult_type] 1)]); + +val mult_ac = [mult_assoc,mult_commute,mult_left_commute]; + (*** Difference ***) @@ -241,11 +249,17 @@ (*Subtraction is the inverse of addition. *) val [mnat,nnat] = goal Arith.thy - "[| m:nat; n:nat |] ==> (n#+m) #-n = m"; + "[| m:nat; n:nat |] ==> (n#+m) #- n = m"; by (rtac (nnat RS nat_induct) 1); by (ALLGOALS (asm_simp_tac (arith_ss addsimps [mnat]))); val diff_add_inverse = result(); +goal Arith.thy + "!!m n. [| m:nat; n:nat |] ==> (m#+n) #- n = m"; +by (res_inst_tac [("m1","m")] (add_commute RS ssubst) 1); +by (REPEAT (ares_tac [diff_add_inverse] 1)); +val diff_add_inverse2 = result(); + val [mnat,nnat] = goal Arith.thy "[| m:nat; n:nat |] ==> n #- (n#+m) = 0"; by (rtac (nnat RS nat_induct) 1); @@ -311,7 +325,7 @@ goal Arith.thy "!!m n. [| 0 (m div n)#*n #+ m mod n = m"; by (etac complete_induct 1); -by (res_inst_tac [("Q","x Y eqpoll X"; @@ -71,8 +71,8 @@ (** Le-pollence is a partial ordering **) goalw Cardinal.thy [lepoll_def] "!!X Y. X<=Y ==> X lepoll Y"; -br exI 1; -be id_subset_inj 1; +by (rtac exI 1); +by (etac id_subset_inj 1); val subset_imp_lepoll = result(); val lepoll_refl = subset_refl RS subset_imp_lepoll; @@ -97,7 +97,7 @@ val [major,minor] = goal Cardinal.thy "[| X eqpoll Y; [| X lepoll Y; Y lepoll X |] ==> P |] ==> P"; -br minor 1; +by (rtac minor 1); by (REPEAT (resolve_tac [major, eqpoll_imp_lepoll, eqpoll_sym] 1)); val eqpollE = result(); @@ -113,7 +113,7 @@ by (rtac the_equality 1); by (fast_tac (ZF_cs addSIs [premP,premOrd,premNot]) 1); by (REPEAT (etac conjE 1)); -be (premOrd RS Ord_linear_lt) 1; +by (etac (premOrd RS Ord_linear_lt) 1); by (ALLGOALS (fast_tac (ZF_cs addSIs [premP] addSDs [premNot]))); val Least_equality = result(); @@ -140,18 +140,24 @@ (*LEAST really is the smallest*) goal Cardinal.thy "!!i. [| P(i); i < (LEAST x.P(x)) |] ==> Q"; -br (Least_le RSN (2,lt_trans2) RS lt_anti_refl) 1; +by (rtac (Least_le RSN (2,lt_trans2) RS lt_irrefl) 1); by (REPEAT (eresolve_tac [asm_rl, ltE] 1)); val less_LeastE = result(); +(*If there is no such P then LEAST is vacuously 0*) +goalw Cardinal.thy [Least_def] + "!!P. [| ~ (EX i. Ord(i) & P(i)) |] ==> (LEAST x.P(x)) = 0"; +by (rtac the_0 1); +by (fast_tac ZF_cs 1); +val Least_0 = result(); + goal Cardinal.thy "Ord(LEAST x.P(x))"; -by (res_inst_tac [("Q","EX i. Ord(i) & P(i)")] (excluded_middle RS disjE) 1); +by (excluded_middle_tac "EX i. Ord(i) & P(i)" 1); by (safe_tac ZF_cs); -br (Least_le RS ltE) 2; +by (rtac (Least_le RS ltE) 2); by (REPEAT_SOME assume_tac); -bw Least_def; -by (rtac (the_0 RS ssubst) 1 THEN rtac Ord_0 2); -by (fast_tac FOL_cs 1); +by (etac (Least_0 RS ssubst) 1); +by (rtac Ord_0 1); val Ord_Least = result(); @@ -165,17 +171,17 @@ (*Need AC to prove X lepoll Y ==> |X| le |Y| ; see well_ord_lepoll_imp_le *) goalw Cardinal.thy [eqpoll_def,cardinal_def] "!!X Y. X eqpoll Y ==> |X| = |Y|"; -br Least_cong 1; +by (rtac Least_cong 1); by (fast_tac (ZF_cs addEs [comp_bij,bij_converse_bij]) 1); val cardinal_cong = result(); (*Under AC, the premise becomes trivial; one consequence is ||A|| = |A|*) goalw Cardinal.thy [eqpoll_def, cardinal_def] "!!A. well_ord(A,r) ==> |A| eqpoll A"; -br LeastI 1; -be Ord_ordertype 2; -br exI 1; -be (ordertype_bij RS bij_converse_bij) 1; +by (rtac LeastI 1); +by (etac Ord_ordertype 2); +by (rtac exI 1); +by (etac (ordertype_bij RS bij_converse_bij) 1); val well_ord_cardinal_eqpoll = result(); val Ord_cardinal_eqpoll = well_ord_Memrel RS well_ord_cardinal_eqpoll @@ -183,8 +189,8 @@ goal Cardinal.thy "!!X Y. [| well_ord(X,r); well_ord(Y,s); |X| = |Y| |] ==> X eqpoll Y"; -br (eqpoll_sym RS eqpoll_trans) 1; -be well_ord_cardinal_eqpoll 1; +by (rtac (eqpoll_sym RS eqpoll_trans) 1); +by (etac well_ord_cardinal_eqpoll 1); by (asm_simp_tac (ZF_ss addsimps [well_ord_cardinal_eqpoll]) 1); val well_ord_cardinal_eqE = result(); @@ -192,55 +198,71 @@ (** Observations from Kunen, page 28 **) goalw Cardinal.thy [cardinal_def] "!!i. Ord(i) ==> |i| le i"; -be (eqpoll_refl RS Least_le) 1; +by (etac (eqpoll_refl RS Least_le) 1); val Ord_cardinal_le = result(); goalw Cardinal.thy [Card_def] "!!i. Card(i) ==> |i| = i"; -be sym 1; +by (etac sym 1); val Card_cardinal_eq = result(); val prems = goalw Cardinal.thy [Card_def,cardinal_def] "[| Ord(i); !!j. j ~(j eqpoll i) |] ==> Card(i)"; -br (Least_equality RS ssubst) 1; +by (rtac (Least_equality RS ssubst) 1); by (REPEAT (ares_tac ([refl,eqpoll_refl]@prems) 1)); val CardI = result(); goalw Cardinal.thy [Card_def, cardinal_def] "!!i. Card(i) ==> Ord(i)"; -be ssubst 1; -br Ord_Least 1; +by (etac ssubst 1); +by (rtac Ord_Least 1); val Card_is_Ord = result(); -goalw Cardinal.thy [cardinal_def] "Ord( |i| )"; -br Ord_Least 1; +goalw Cardinal.thy [cardinal_def] "Ord( |A| )"; +by (rtac Ord_Least 1); val Ord_cardinal = result(); +goal Cardinal.thy "Card(0)"; +by (rtac (Ord_0 RS CardI) 1); +by (fast_tac (ZF_cs addSEs [ltE]) 1); +val Card_0 = result(); + +goalw Cardinal.thy [cardinal_def] "Card( |A| )"; +by (excluded_middle_tac "EX i. Ord(i) & i eqpoll A" 1); +by (etac (Least_0 RS ssubst) 1 THEN rtac Card_0 1); +by (rtac (Ord_Least RS CardI) 1); +by (safe_tac ZF_cs); +by (rtac less_LeastE 1); +by (assume_tac 2); +by (etac eqpoll_trans 1); +by (REPEAT (ares_tac [LeastI] 1)); +val Card_cardinal = result(); + (*Kunen's Lemma 10.5*) goal Cardinal.thy "!!i j. [| |i| le j; j le i |] ==> |j| = |i|"; -br (eqpollI RS cardinal_cong) 1; -be (le_imp_subset RS subset_imp_lepoll) 1; -br lepoll_trans 1; -be (le_imp_subset RS subset_imp_lepoll) 2; -br (eqpoll_sym RS eqpoll_imp_lepoll) 1; -br Ord_cardinal_eqpoll 1; +by (rtac (eqpollI RS cardinal_cong) 1); +by (etac (le_imp_subset RS subset_imp_lepoll) 1); +by (rtac lepoll_trans 1); +by (etac (le_imp_subset RS subset_imp_lepoll) 2); +by (rtac (eqpoll_sym RS eqpoll_imp_lepoll) 1); +by (rtac Ord_cardinal_eqpoll 1); by (REPEAT (eresolve_tac [ltE, Ord_succD] 1)); val cardinal_eq_lemma = result(); goal Cardinal.thy "!!i j. i le j ==> |i| le |j|"; by (res_inst_tac [("i","|i|"),("j","|j|")] Ord_linear_le 1); by (REPEAT_FIRST (ares_tac [Ord_cardinal, le_eqI])); -br cardinal_eq_lemma 1; -ba 2; -be le_trans 1; -be ltE 1; -be Ord_cardinal_le 1; +by (rtac cardinal_eq_lemma 1); +by (assume_tac 2); +by (etac le_trans 1); +by (etac ltE 1); +by (etac Ord_cardinal_le 1); val cardinal_mono = result(); (*Since we have |succ(nat)| le |nat|, the converse of cardinal_mono fails!*) goal Cardinal.thy "!!i j. [| |i| < |j|; Ord(i); Ord(j) |] ==> i < j"; -br Ord_linear2 1; +by (rtac Ord_linear2 1); by (REPEAT_SOME assume_tac); -be (lt_trans2 RS lt_anti_refl) 1; -be cardinal_mono 1; +by (etac (lt_trans2 RS lt_irrefl) 1); +by (etac cardinal_mono 1); val cardinal_lt_imp_lt = result(); goal Cardinal.thy "!!i j. [| |i| < k; Ord(i); Card(k) |] ==> i < k"; @@ -262,7 +284,7 @@ val swap_swap_identity = result(); goal Cardinal.thy "!!A. [| x:A; y:A |] ==> swap(A,x,y) : bij(A,A)"; -br nilpotent_imp_bijective 1; +by (rtac nilpotent_imp_bijective 1); by (REPEAT (ares_tac [swap_type, comp_eq_id_iff RS iffD2, ballI, swap_swap_identity] 1)); val swap_bij = result(); @@ -272,24 +294,24 @@ (*Lemma suggested by Mike Fourman*) val [prem] = goalw Cardinal.thy [inj_def] "f: inj(succ(m), succ(n)) ==> (lam x:m. if(f`x=n, f`m, f`x)) : inj(m,n)"; -br CollectI 1; +by (rtac CollectI 1); (*Proving it's in the function space m->n*) by (cut_facts_tac [prem] 1); -br (if_type RS lam_type) 1; -by (fast_tac (ZF_cs addSEs [mem_anti_refl] addEs [apply_funtype RS succE]) 1); -by (fast_tac (ZF_cs addSEs [mem_anti_refl] addEs [apply_funtype RS succE]) 1); +by (rtac (if_type RS lam_type) 1); +by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [apply_funtype RS succE]) 1); +by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [apply_funtype RS succE]) 1); (*Proving it's injective*) by (asm_simp_tac (ZF_ss setloop split_tac [expand_if]) 1); (*Adding prem earlier would cause the simplifier to loop*) by (cut_facts_tac [prem] 1); -by (fast_tac (ZF_cs addSEs [mem_anti_refl]) 1); +by (fast_tac (ZF_cs addSEs [mem_irrefl]) 1); val inj_succ_succD = result(); val [prem] = goalw Cardinal.thy [lepoll_def] "m:nat ==> ALL n: nat. m lepoll n --> m le n"; by (nat_ind_tac "m" [prem] 1); by (fast_tac (ZF_cs addSIs [nat_0_le]) 1); -br ballI 1; +by (rtac ballI 1); by (eres_inst_tac [("n","n")] natE 1); by (asm_simp_tac (ZF_ss addsimps [inj_def, succI1 RS Pi_empty2]) 1); by (fast_tac (ZF_cs addSIs [succ_leI] addSDs [inj_succ_succD]) 1); @@ -298,24 +320,23 @@ goal Cardinal.thy "!!m n. [| m:nat; n: nat |] ==> m eqpoll n <-> m = n"; -br iffI 1; +by (rtac iffI 1); by (asm_simp_tac (ZF_ss addsimps [eqpoll_refl]) 2); -by (fast_tac (ZF_cs addIs [nat_lepoll_imp_le, le_asym] addSEs [eqpollE]) 1); +by (fast_tac (ZF_cs addIs [nat_lepoll_imp_le, le_anti_sym] + addSEs [eqpollE]) 1); val nat_eqpoll_iff = result(); goalw Cardinal.thy [Card_def,cardinal_def] "!!n. n: nat ==> Card(n)"; -br (Least_equality RS ssubst) 1; +by (rtac (Least_equality RS ssubst) 1); by (REPEAT_FIRST (ares_tac [eqpoll_refl, nat_into_Ord, refl])); by (asm_simp_tac (ZF_ss addsimps [lt_nat_in_nat RS nat_eqpoll_iff]) 1); -by (fast_tac (ZF_cs addSEs [lt_anti_refl]) 1); +by (fast_tac (ZF_cs addSEs [lt_irrefl]) 1); val nat_into_Card = result(); -val Card_0 = nat_0I RS nat_into_Card; - (*Part of Kunen's Lemma 10.6*) goal Cardinal.thy "!!n. [| succ(n) lepoll n; n:nat |] ==> P"; -br (nat_lepoll_imp_le RS lt_anti_refl) 1; +by (rtac (nat_lepoll_imp_le RS lt_irrefl) 1); by (REPEAT (ares_tac [nat_succI] 1)); val succ_lepoll_natE = result(); @@ -324,29 +345,34 @@ (*This implies Kunen's Lemma 10.6*) goal Cardinal.thy "!!n. [| n ~ i lepoll n"; -br notI 1; +by (rtac notI 1); by (rtac succ_lepoll_natE 1 THEN assume_tac 2); by (rtac lepoll_trans 1 THEN assume_tac 2); -be ltE 1; +by (etac ltE 1); by (REPEAT (ares_tac [Ord_succ_subsetI RS subset_imp_lepoll] 1)); val lt_not_lepoll = result(); -goalw Cardinal.thy [Card_def,cardinal_def] "Card(nat)"; -br (Least_equality RS ssubst) 1; -by (REPEAT_FIRST (ares_tac [eqpoll_refl, Ord_nat, refl])); -be ltE 1; -by (asm_simp_tac (ZF_ss addsimps [eqpoll_iff, lt_not_lepoll, ltI]) 1); -val Card_nat = result(); - goal Cardinal.thy "!!i n. [| Ord(i); n:nat |] ==> i eqpoll n <-> i=n"; -br iffI 1; +by (rtac iffI 1); by (asm_simp_tac (ZF_ss addsimps [eqpoll_refl]) 2); by (rtac Ord_linear_lt 1); by (REPEAT_SOME (eresolve_tac [asm_rl, nat_into_Ord])); by (etac (lt_nat_in_nat RS nat_eqpoll_iff RS iffD1) 1 THEN REPEAT (assume_tac 1)); by (rtac (lt_not_lepoll RS notE) 1 THEN (REPEAT (assume_tac 1))); -be eqpoll_imp_lepoll 1; +by (etac eqpoll_imp_lepoll 1); val Ord_nat_eqpoll_iff = result(); +goalw Cardinal.thy [Card_def,cardinal_def] "Card(nat)"; +by (rtac (Least_equality RS ssubst) 1); +by (REPEAT_FIRST (ares_tac [eqpoll_refl, Ord_nat, refl])); +by (etac ltE 1); +by (asm_simp_tac (ZF_ss addsimps [eqpoll_iff, lt_not_lepoll, ltI]) 1); +val Card_nat = result(); +(*Allows showing that |i| is a limit cardinal*) +goal Cardinal.thy "!!i. nat le i ==> nat le |i|"; +by (rtac (Card_nat RS Card_cardinal_eq RS subst) 1); +by (etac cardinal_mono 1); +val nat_le_cardinal = result(); + diff -r 0cdc840297bb -r 435875e4b21d src/ZF/CardinalArith.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ZF/CardinalArith.ML Thu Jun 23 17:38:12 1994 +0200 @@ -0,0 +1,508 @@ +(* Title: ZF/CardinalArith.ML + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + Copyright 1994 University of Cambridge + +Cardinal arithmetic -- WITHOUT the Axiom of Choice +*) + +open CardinalArith; + +(*Use AC to discharge first premise*) +goal CardinalArith.thy + "!!A B. [| well_ord(B,r); A lepoll B |] ==> |A| le |B|"; +by (res_inst_tac [("i","|A|"),("j","|B|")] Ord_linear_le 1); +by (REPEAT_FIRST (ares_tac [Ord_cardinal, le_eqI])); +by (rtac (eqpollI RS cardinal_cong) 1 THEN assume_tac 1); +by (rtac lepoll_trans 1); +by (rtac (well_ord_cardinal_eqpoll RS eqpoll_sym RS eqpoll_imp_lepoll) 1); +by (assume_tac 1); +by (etac (le_imp_subset RS subset_imp_lepoll RS lepoll_trans) 1); +by (rtac eqpoll_imp_lepoll 1); +by (rewtac lepoll_def); +by (etac exE 1); +by (rtac well_ord_cardinal_eqpoll 1); +by (etac well_ord_rvimage 1); +by (assume_tac 1); +val well_ord_lepoll_imp_le = result(); + +val case_ss = ZF_ss addsimps [Inl_iff, Inl_Inr_iff, Inr_iff, Inr_Inl_iff, + case_Inl, case_Inr, InlI, InrI]; + + +(** Congruence laws for successor, cardinal addition and multiplication **) + +val bij_inverse_ss = + case_ss addsimps [bij_is_fun RS apply_type, + bij_converse_bij RS bij_is_fun RS apply_type, + left_inverse_bij, right_inverse_bij]; + + +(*Congruence law for succ under equipollence*) +goalw CardinalArith.thy [eqpoll_def] + "!!A B. A eqpoll B ==> succ(A) eqpoll succ(B)"; +by (safe_tac ZF_cs); +by (rtac exI 1); +by (res_inst_tac [("c", "%z.if(z=A,B,f`z)"), + ("d", "%z.if(z=B,A,converse(f)`z)")] lam_bijective 1); +by (ALLGOALS + (asm_simp_tac (bij_inverse_ss addsimps [succI2, mem_imp_not_eq] + setloop etac succE ))); +val succ_eqpoll_cong = result(); + +(*Congruence law for + under equipollence*) +goalw CardinalArith.thy [eqpoll_def] + "!!A B C D. [| A eqpoll C; B eqpoll D |] ==> A+B eqpoll C+D"; +by (safe_tac ZF_cs); +by (rtac exI 1); +by (res_inst_tac [("c", "case(%x. Inl(f`x), %y. Inr(fa`y))"), + ("d", "case(%x. Inl(converse(f)`x), %y. Inr(converse(fa)`y))")] + lam_bijective 1); +by (safe_tac (ZF_cs addSEs [sumE])); +by (ALLGOALS (asm_simp_tac bij_inverse_ss)); +val sum_eqpoll_cong = result(); + +(*Congruence law for * under equipollence*) +goalw CardinalArith.thy [eqpoll_def] + "!!A B C D. [| A eqpoll C; B eqpoll D |] ==> A*B eqpoll C*D"; +by (safe_tac ZF_cs); +by (rtac exI 1); +by (res_inst_tac [("c", "split(%x y. )"), + ("d", "split(%x y. )")] + lam_bijective 1); +by (safe_tac ZF_cs); +by (ALLGOALS (asm_simp_tac bij_inverse_ss)); +val prod_eqpoll_cong = result(); + + +(*** Cardinal addition ***) + +(** Cardinal addition is commutative **) + +(*Easier to prove the two directions separately*) +goalw CardinalArith.thy [eqpoll_def] "A+B eqpoll B+A"; +by (rtac exI 1); +by (res_inst_tac [("c", "case(Inr, Inl)"), ("d", "case(Inr, Inl)")] + lam_bijective 1); +by (safe_tac (ZF_cs addSEs [sumE])); +by (ALLGOALS (asm_simp_tac case_ss)); +val sum_commute_eqpoll = result(); + +goalw CardinalArith.thy [cadd_def] "i |+| j = j |+| i"; +by (rtac (sum_commute_eqpoll RS cardinal_cong) 1); +val cadd_commute = result(); + +(** Cardinal addition is associative **) + +goalw CardinalArith.thy [eqpoll_def] "(A+B)+C eqpoll A+(B+C)"; +by (rtac exI 1); +by (res_inst_tac [("c", "case(case(Inl, %y.Inr(Inl(y))), %y. Inr(Inr(y)))"), + ("d", "case(%x.Inl(Inl(x)), case(%x.Inl(Inr(x)), Inr))")] + lam_bijective 1); +by (ALLGOALS (asm_simp_tac (case_ss setloop etac sumE))); +val sum_assoc_eqpoll = result(); + +(*Unconditional version requires AC*) +goalw CardinalArith.thy [cadd_def] + "!!i j k. [| Ord(i); Ord(j); Ord(k) |] ==> \ +\ (i |+| j) |+| k = i |+| (j |+| k)"; +by (rtac cardinal_cong 1); +br ([well_ord_cardinal_eqpoll, eqpoll_refl] MRS sum_eqpoll_cong RS + eqpoll_trans) 1; +by (rtac (sum_assoc_eqpoll RS eqpoll_trans) 2); +br ([eqpoll_refl, well_ord_cardinal_eqpoll] MRS sum_eqpoll_cong RS + eqpoll_sym) 2; +by (REPEAT (ares_tac [well_ord_radd, well_ord_Memrel] 1)); +val Ord_cadd_assoc = result(); + +(** 0 is the identity for addition **) + +goalw CardinalArith.thy [eqpoll_def] "0+A eqpoll A"; +by (rtac exI 1); +by (res_inst_tac [("c", "case(%x.x, %y.y)"), ("d", "Inr")] + lam_bijective 1); +by (ALLGOALS (asm_simp_tac (case_ss setloop eresolve_tac [sumE,emptyE]))); +val sum_0_eqpoll = result(); + +goalw CardinalArith.thy [cadd_def] "!!i. Card(i) ==> 0 |+| i = i"; +by (asm_simp_tac (ZF_ss addsimps [sum_0_eqpoll RS cardinal_cong, + Card_cardinal_eq]) 1); +val cadd_0 = result(); + +(** Addition of finite cardinals is "ordinary" addition **) + +goalw CardinalArith.thy [eqpoll_def] "succ(A)+B eqpoll succ(A+B)"; +by (rtac exI 1); +by (res_inst_tac [("c", "%z.if(z=Inl(A),A+B,z)"), + ("d", "%z.if(z=A+B,Inl(A),z)")] + lam_bijective 1); +by (ALLGOALS + (asm_simp_tac (case_ss addsimps [succI2, mem_imp_not_eq] + setloop eresolve_tac [sumE,succE]))); +val sum_succ_eqpoll = result(); + +(*Pulling the succ(...) outside the |...| requires m, n: nat *) +(*Unconditional version requires AC*) +goalw CardinalArith.thy [cadd_def] + "!!m n. [| Ord(m); Ord(n) |] ==> succ(m) |+| n = |succ(m |+| n)|"; +by (rtac (sum_succ_eqpoll RS cardinal_cong RS trans) 1); +by (rtac (succ_eqpoll_cong RS cardinal_cong) 1); +by (rtac (well_ord_cardinal_eqpoll RS eqpoll_sym) 1); +by (REPEAT (ares_tac [well_ord_radd, well_ord_Memrel] 1)); +val cadd_succ_lemma = result(); + +val [mnat,nnat] = goal CardinalArith.thy + "[| m: nat; n: nat |] ==> m |+| n = m#+n"; +by (cut_facts_tac [nnat] 1); +by (nat_ind_tac "m" [mnat] 1); +by (asm_simp_tac (arith_ss addsimps [nat_into_Card RS cadd_0]) 1); +by (asm_simp_tac (arith_ss addsimps [nat_into_Ord, cadd_succ_lemma, + nat_into_Card RS Card_cardinal_eq]) 1); +val nat_cadd_eq_add = result(); + + +(*** Cardinal multiplication ***) + +(** Cardinal multiplication is commutative **) + +(*Easier to prove the two directions separately*) +goalw CardinalArith.thy [eqpoll_def] "A*B eqpoll B*A"; +by (rtac exI 1); +by (res_inst_tac [("c", "split(%x y.)"), ("d", "split(%x y.)")] + lam_bijective 1); +by (safe_tac ZF_cs); +by (ALLGOALS (asm_simp_tac ZF_ss)); +val prod_commute_eqpoll = result(); + +goalw CardinalArith.thy [cmult_def] "i |*| j = j |*| i"; +by (rtac (prod_commute_eqpoll RS cardinal_cong) 1); +val cmult_commute = result(); + +(** Cardinal multiplication is associative **) + +goalw CardinalArith.thy [eqpoll_def] "(A*B)*C eqpoll A*(B*C)"; +by (rtac exI 1); +by (res_inst_tac [("c", "split(%w z. split(%x y. >, w))"), + ("d", "split(%x. split(%y z. <, z>))")] + lam_bijective 1); +by (safe_tac ZF_cs); +by (ALLGOALS (asm_simp_tac ZF_ss)); +val prod_assoc_eqpoll = result(); + +(*Unconditional version requires AC*) +goalw CardinalArith.thy [cmult_def] + "!!i j k. [| Ord(i); Ord(j); Ord(k) |] ==> \ +\ (i |*| j) |*| k = i |*| (j |*| k)"; +by (rtac cardinal_cong 1); +br ([well_ord_cardinal_eqpoll, eqpoll_refl] MRS prod_eqpoll_cong RS + eqpoll_trans) 1; +by (rtac (prod_assoc_eqpoll RS eqpoll_trans) 2); +br ([eqpoll_refl, well_ord_cardinal_eqpoll] MRS prod_eqpoll_cong RS + eqpoll_sym) 2; +by (REPEAT (ares_tac [well_ord_rmult, well_ord_Memrel] 1)); +val Ord_cmult_assoc = result(); + +(** Cardinal multiplication distributes over addition **) + +goalw CardinalArith.thy [eqpoll_def] "(A+B)*C eqpoll (A*C)+(B*C)"; +by (rtac exI 1); +by (res_inst_tac + [("c", "split(%x z. case(%y.Inl(), %y.Inr(), x))"), + ("d", "case(split(%x y.), split(%x y.))")] + lam_bijective 1); +by (safe_tac (ZF_cs addSEs [sumE])); +by (ALLGOALS (asm_simp_tac case_ss)); +val sum_prod_distrib_eqpoll = result(); + +goalw CardinalArith.thy [lepoll_def, inj_def] "A lepoll A*A"; +by (res_inst_tac [("x", "lam x:A. ")] exI 1); +by (simp_tac (ZF_ss addsimps [lam_type]) 1); +val prod_square_lepoll = result(); + +goalw CardinalArith.thy [cmult_def] "!!k. Card(k) ==> k le k |*| k"; +by (rtac le_trans 1); +by (rtac well_ord_lepoll_imp_le 2); +by (rtac prod_square_lepoll 3); +by (REPEAT (ares_tac [well_ord_rmult, well_ord_Memrel, Card_is_Ord] 2)); +by (asm_simp_tac (ZF_ss addsimps [le_refl, Card_is_Ord, Card_cardinal_eq]) 1); +val cmult_square_le = result(); + +(** Multiplication by 0 yields 0 **) + +goalw CardinalArith.thy [eqpoll_def] "0*A eqpoll 0"; +by (rtac exI 1); +by (rtac lam_bijective 1); +by (safe_tac ZF_cs); +val prod_0_eqpoll = result(); + +goalw CardinalArith.thy [cmult_def] "0 |*| i = 0"; +by (asm_simp_tac (ZF_ss addsimps [prod_0_eqpoll RS cardinal_cong, + Card_0 RS Card_cardinal_eq]) 1); +val cmult_0 = result(); + +(** 1 is the identity for multiplication **) + +goalw CardinalArith.thy [eqpoll_def] "{x}*A eqpoll A"; +by (rtac exI 1); +by (res_inst_tac [("c", "snd"), ("d", "%z.")] lam_bijective 1); +by (safe_tac ZF_cs); +by (ALLGOALS (asm_simp_tac ZF_ss)); +val prod_singleton_eqpoll = result(); + +goalw CardinalArith.thy [cmult_def, succ_def] "!!i. Card(i) ==> 1 |*| i = i"; +by (asm_simp_tac (ZF_ss addsimps [prod_singleton_eqpoll RS cardinal_cong, + Card_cardinal_eq]) 1); +val cmult_1 = result(); + +(** Multiplication of finite cardinals is "ordinary" multiplication **) + +goalw CardinalArith.thy [eqpoll_def] "succ(A)*B eqpoll B + A*B"; +by (rtac exI 1); +by (res_inst_tac [("c", "split(%x y. if(x=A, Inl(y), Inr()))"), + ("d", "case(%y. , %z.z)")] + lam_bijective 1); +by (safe_tac (ZF_cs addSEs [sumE])); +by (ALLGOALS + (asm_simp_tac (case_ss addsimps [succI2, if_type, mem_imp_not_eq]))); +val prod_succ_eqpoll = result(); + + +(*Unconditional version requires AC*) +goalw CardinalArith.thy [cmult_def, cadd_def] + "!!m n. [| Ord(m); Ord(n) |] ==> succ(m) |*| n = n |+| (m |*| n)"; +by (rtac (prod_succ_eqpoll RS cardinal_cong RS trans) 1); +by (rtac (cardinal_cong RS sym) 1); +by (rtac ([eqpoll_refl, well_ord_cardinal_eqpoll] MRS sum_eqpoll_cong) 1); +by (REPEAT (ares_tac [well_ord_rmult, well_ord_Memrel] 1)); +val cmult_succ_lemma = result(); + +val [mnat,nnat] = goal CardinalArith.thy + "[| m: nat; n: nat |] ==> m |*| n = m#*n"; +by (cut_facts_tac [nnat] 1); +by (nat_ind_tac "m" [mnat] 1); +by (asm_simp_tac (arith_ss addsimps [cmult_0]) 1); +by (asm_simp_tac (arith_ss addsimps [nat_into_Ord, cmult_succ_lemma, + nat_cadd_eq_add]) 1); +val nat_cmult_eq_mult = result(); + + +(*** Infinite Cardinals are Limit Ordinals ***) + +goalw CardinalArith.thy [lepoll_def, inj_def] + "!!i. nat <= A ==> succ(A) lepoll A"; +by (res_inst_tac [("x", + "lam z:succ(A). if(z=A, 0, if(z:nat, succ(z), z))")] exI 1); +by (rtac (lam_type RS CollectI) 1); +by (rtac if_type 1); +by (etac ([asm_rl, nat_0I] MRS subsetD) 1); +by (etac succE 1); +by (contr_tac 1); +by (rtac if_type 1); +by (assume_tac 2); +by (etac ([asm_rl, nat_succI] MRS subsetD) 1 THEN assume_tac 1); +by (REPEAT (rtac ballI 1)); +by (asm_simp_tac + (ZF_ss addsimps [succ_inject_iff, succ_not_0, succ_not_0 RS not_sym] + setloop split_tac [expand_if]) 1); +by (safe_tac (ZF_cs addSIs [nat_0I, nat_succI])); +val nat_succ_lepoll = result(); + +goal CardinalArith.thy "!!i. nat <= A ==> succ(A) eqpoll A"; +by (etac (nat_succ_lepoll RS eqpollI) 1); +by (rtac (subset_succI RS subset_imp_lepoll) 1); +val nat_succ_eqpoll = result(); + +goalw CardinalArith.thy [InfCard_def] "!!i. InfCard(i) ==> Card(i)"; +by (etac conjunct1 1); +val InfCard_is_Card = result(); + +(*Kunen's Lemma 10.11*) +goalw CardinalArith.thy [InfCard_def] "!!i. InfCard(i) ==> Limit(i)"; +by (etac conjE 1); +by (rtac (ltI RS non_succ_LimitI) 1); +by (etac ([asm_rl, nat_0I] MRS (le_imp_subset RS subsetD)) 1); +by (etac Card_is_Ord 1); +by (safe_tac (ZF_cs addSDs [Limit_nat RS Limit_le_succD])); +by (forward_tac [Card_is_Ord RS Ord_succD] 1); +by (rewtac Card_def); +by (res_inst_tac [("i", "succ(y)")] lt_irrefl 1); +by (dtac (le_imp_subset RS nat_succ_eqpoll RS cardinal_cong) 1); +(*Tricky combination of substitutions; backtracking needed*) +by (etac ssubst 1 THEN etac ssubst 1 THEN rtac Ord_cardinal_le 1); +by (assume_tac 1); +val InfCard_is_Limit = result(); + + + +(*** An infinite cardinal equals its square (Kunen, Thm 10.12, page 29) ***) + +(*A general fact about ordermap*) +goalw Cardinal.thy [eqpoll_def] + "!!A. [| well_ord(A,r); x:A |] ==> ordermap(A,r)`x eqpoll pred(A,x,r)"; +by (rtac exI 1); +by (asm_simp_tac (ZF_ss addsimps [ordermap_eq_image, well_ord_is_wf]) 1); +by (etac (ordertype_bij RS bij_is_inj RS restrict_bij RS bij_converse_bij) 1); +by (rtac pred_subset 1); +val ordermap_eqpoll_pred = result(); + +(** Establishing the well-ordering **) + +goalw CardinalArith.thy [inj_def] + "!!k. Ord(k) ==> \ +\ (lam z:k*k. split(%x y. >, z)) : inj(k*k, k*k*k)"; +by (safe_tac ZF_cs); +by (fast_tac (ZF_cs addIs [lam_type, Un_least_lt RS ltD, ltI] + addSEs [split_type]) 1); +by (asm_full_simp_tac ZF_ss 1); +val csquare_lam_inj = result(); + +goalw CardinalArith.thy [csquare_rel_def] + "!!k. Ord(k) ==> well_ord(k*k, csquare_rel(k))"; +by (rtac (csquare_lam_inj RS well_ord_rvimage) 1); +by (REPEAT (ares_tac [well_ord_rmult, well_ord_Memrel] 1)); +val well_ord_csquare = result(); + +(** Characterising initial segments of the well-ordering **) + +goalw CardinalArith.thy [csquare_rel_def] + "!!k. [| x \ +\ <, > : csquare_rel(k) --> x le z & y le z"; +by (REPEAT (etac ltE 1)); +by (asm_simp_tac (ZF_ss addsimps [rvimage_iff, rmult_iff, Memrel_iff, + Un_absorb, Un_least_mem_iff, ltD]) 1); +by (safe_tac (ZF_cs addSEs [mem_irrefl] + addSIs [Un_upper1_le, Un_upper2_le])); +by (ALLGOALS (asm_simp_tac (ZF_ss addsimps [lt_def, succI2, Ord_succ]))); +val csquareD_lemma = result(); +val csquareD = csquareD_lemma RS mp |> standard; + +goalw CardinalArith.thy [pred_def] + "!!k. z pred(k*k, , csquare_rel(k)) <= succ(z)*succ(z)"; +by (safe_tac (lemmas_cs addSEs [SigmaE])); (*avoids using succCI*) +by (rtac (csquareD RS conjE) 1); +by (rewtac lt_def); +by (assume_tac 4); +by (ALLGOALS (fast_tac ZF_cs)); +val pred_csquare_subset = result(); + +goalw CardinalArith.thy [csquare_rel_def] + "!!k. [| x \ +\ <, > : csquare_rel(k)"; +by (subgoals_tac ["x \ +\ <, > : csquare_rel(k) | x=z & y=z"; +by (subgoals_tac ["x \ +\ ordermap(k*k, csquare_rel(k)) ` lepoll \ +\ ordermap(k*k, csquare_rel(k)) ` "; +by (subgoals_tac ["z: k*k has no more than z*z predecessors..." (page 29) *) +goalw CardinalArith.thy [cmult_def] + "!!k. [| InfCard(k); x \ +\ | ordermap(k*k, csquare_rel(k)) ` | le |succ(z)| |*| |succ(z)|"; +by (rtac (well_ord_rmult RS well_ord_lepoll_imp_le) 1); +by (REPEAT (ares_tac [Ord_cardinal, well_ord_Memrel] 1)); +by (subgoals_tac ["z y |*| y = y |] ==> \ +\ ordertype(k*k, csquare_rel(k)) le k"; +by (forward_tac [InfCard_is_Card RS Card_is_Ord] 1); +by (rtac all_lt_imp_le 1); +by (assume_tac 1); +by (etac (well_ord_csquare RS Ord_ordertype) 1); +by (rtac Card_lt_imp_lt 1); +by (etac InfCard_is_Card 3); +by (etac ltE 2 THEN assume_tac 2); +by (asm_full_simp_tac (ZF_ss addsimps [ordertype_unfold]) 1); +by (safe_tac (ZF_cs addSEs [ltE])); +by (subgoals_tac ["Ord(xb)", "Ord(y)"] 1); +by (REPEAT (eresolve_tac [asm_rl, Ord_in_Ord] 2)); +by (rtac (ordermap_csquare_le RS lt_trans1) 1 THEN + REPEAT (ares_tac [refl] 1 ORELSE etac ltI 1)); +by (res_inst_tac [("i","xb Un y"), ("j","nat")] Ord_linear2 1 THEN + REPEAT (ares_tac [Ord_Un, Ord_nat] 1)); +(*the finite case: xb Un y < nat *) +by (res_inst_tac [("j", "nat")] lt_trans2 1); +by (asm_full_simp_tac (FOL_ss addsimps [InfCard_def]) 2); +by (asm_full_simp_tac + (ZF_ss addsimps [lt_def, nat_cmult_eq_mult, nat_succI, mult_type, + nat_into_Card RS Card_cardinal_eq, Ord_nat]) 1); +(*case nat le (xb Un y), equivalently InfCard(xb Un y) *) +by (asm_full_simp_tac + (ZF_ss addsimps [le_imp_subset RS nat_succ_eqpoll RS cardinal_cong, + le_succ_iff, InfCard_def, Card_cardinal, Un_least_lt, + Ord_Un, ltI, nat_le_cardinal, + Ord_cardinal_le RS lt_trans1 RS ltD]) 1); +val ordertype_csquare_le = result(); + +(*This lemma can easily be generalized to premise well_ord(A*A,r) *) +goalw CardinalArith.thy [cmult_def] + "!!k. Ord(k) ==> k |*| k = |ordertype(k*k, csquare_rel(k))|"; +by (rtac cardinal_cong 1); +by (rewtac eqpoll_def); +by (rtac exI 1); +by (etac (well_ord_csquare RS ordertype_bij) 1); +val csquare_eq_ordertype = result(); + +(*Main result: Kunen's Theorem 10.12*) +goal CardinalArith.thy + "!!k. InfCard(k) ==> k |*| k = k"; +by (forward_tac [InfCard_is_Card RS Card_is_Ord] 1); +by (etac rev_mp 1); +by (trans_ind_tac "k" [] 1); +by (rtac impI 1); +by (rtac le_anti_sym 1); +by (etac (InfCard_is_Card RS cmult_square_le) 2); +by (rtac (ordertype_csquare_le RSN (2, le_trans)) 1); +by (assume_tac 2); +by (assume_tac 2); +by (asm_simp_tac + (ZF_ss addsimps [csquare_eq_ordertype, Ord_cardinal_le, + well_ord_csquare RS Ord_ordertype]) 1); +val InfCard_csquare_eq = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/CardinalArith.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ZF/CardinalArith.thy Thu Jun 23 17:38:12 1994 +0200 @@ -0,0 +1,29 @@ +(* Title: ZF/CardinalArith.thy + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + Copyright 1994 University of Cambridge + +Cardinal Arithmetic +*) + +CardinalArith = Cardinal + OrderArith + Arith + +consts + InfCard :: "i=>o" + "|*|" :: "[i,i]=>i" (infixl 70) + "|+|" :: "[i,i]=>i" (infixl 65) + csquare_rel :: "i=>i" + +rules + + InfCard_def "InfCard(i) == Card(i) & nat le i" + + cadd_def "i |+| j == | i+j |" + + cmult_def "i |*| j == | i*j |" + + csquare_rel_def + "csquare_rel(k) == rvimage(k*k, lam z:k*k. split(%x y. >, z), \ +\ rmult(k,Memrel(k), k*k, \ +\ rmult(k,Memrel(k), k,Memrel(k))))" + +end diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Epsilon.ML --- a/src/ZF/Epsilon.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Epsilon.ML Thu Jun 23 17:38:12 1994 +0200 @@ -219,7 +219,7 @@ goal Epsilon.thy "rank(Pow(a)) = succ(rank(a))"; by (rtac (rank RS trans) 1); -by (rtac le_asym 1); +by (rtac le_anti_sym 1); by (DO_GOAL [rtac (Ord_rank RS Ord_succ RS UN_least_le), etac (PowD RS rank_mono RS succ_leI)] 1); by (DO_GOAL [rtac ([Pow_top, le_refl] MRS UN_upper_le), @@ -252,7 +252,7 @@ val rank_Union = result(); goal Epsilon.thy "rank(eclose(a)) = rank(a)"; -by (rtac le_asym 1); +by (rtac le_anti_sym 1); by (rtac (arg_subset_eclose RS rank_mono) 2); by (res_inst_tac [("a1","eclose(a)")] (rank RS ssubst) 1); by (rtac (Ord_rank RS UN_least_le) 1); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Fin.ML --- a/src/ZF/Fin.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Fin.ML Thu Jun 23 17:38:12 1994 +0200 @@ -48,7 +48,7 @@ \ !!x y. [| x: A; y: Fin(A); x~:y; P(y) |] ==> P(cons(x,y)) \ \ |] ==> P(b)"; by (rtac (major RS Fin.induct) 1); -by (res_inst_tac [("Q","a:b")] (excluded_middle RS disjE) 2); +by (excluded_middle_tac "a:b" 2); by (etac (cons_absorb RS ssubst) 3 THEN assume_tac 3); (*backtracking!*) by (REPEAT (ares_tac prems 1)); val Fin_induct = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Order.ML --- a/src/ZF/Order.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Order.ML Thu Jun 23 17:38:12 1994 +0200 @@ -6,9 +6,6 @@ For Order.thy. Orders in Zermelo-Fraenkel Set Theory *) -(*TO PURE/TACTIC.ML*) -fun subgoals_tac sprops = EVERY' (map subgoal_tac sprops); - open Order; @@ -44,8 +41,8 @@ goalw Order.thy [ord_iso_def] "!!f. [| f: ord_iso(A,r,B,s); : s; x:B; y:B |] ==> \ \ : r"; -be CollectE 1; -be (bspec RS bspec RS iffD2) 1; +by (etac CollectE 1); +by (etac (bspec RS bspec RS iffD2) 1); by (REPEAT (eresolve_tac [asm_rl, bij_converse_bij RS bij_is_fun RS apply_type] 1)); by (asm_simp_tac (ZF_ss addsimps [right_inverse_bij]) 1); @@ -142,10 +139,10 @@ goal Order.thy "!!r. [| well_ord(A,r); well_ord(B,s); \ \ f: ord_iso(A,r, B,s); g: ord_iso(A,r, B,s) |] ==> f = g"; -br fun_extension 1; -be (ord_iso_is_bij RS bij_is_fun) 1; -be (ord_iso_is_bij RS bij_is_fun) 1; -br well_ord_iso_unique_lemma 1; +by (rtac fun_extension 1); +by (etac (ord_iso_is_bij RS bij_is_fun) 1); +by (etac (ord_iso_is_bij RS bij_is_fun) 1); +by (rtac well_ord_iso_unique_lemma 1); by (REPEAT_SOME assume_tac); val well_ord_iso_unique = result(); @@ -157,7 +154,7 @@ by (safe_tac ZF_cs); by (linear_case_tac 1); (*case x=xb*) -by (fast_tac (ZF_cs addSEs [wf_on_anti_sym]) 1); +by (fast_tac (ZF_cs addSEs [wf_on_asym]) 1); (*case x:r |] ==> P |] ==> P"; -br (major RS CollectE) 1; +by (rtac (major RS CollectE) 1); by (REPEAT (ares_tac [minor] 1)); val predE = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/OrderArith.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ZF/OrderArith.ML Thu Jun 23 17:38:12 1994 +0200 @@ -0,0 +1,246 @@ +(* Title: ZF/OrderArith.ML + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + Copyright 1994 University of Cambridge + +Towards ordinal arithmetic +*) + +(*for deleting an unwanted assumption*) +val thin = prove_goal pure_thy "[| PROP P; PROP Q |] ==> PROP Q" + (fn prems => [resolve_tac prems 1]); + +open OrderArith; + + +(**** Addition of relations -- disjoint sum ****) + +(** Rewrite rules. Can be used to obtain introduction rules **) + +goalw OrderArith.thy [radd_def] + " : radd(A,r,B,s) <-> a:A & b:B"; +by (fast_tac sum_cs 1); +val radd_Inl_Inr_iff = result(); + +goalw OrderArith.thy [radd_def] + " : radd(A,r,B,s) <-> :r & a':A & a:A"; +by (fast_tac sum_cs 1); +val radd_Inl_iff = result(); + +goalw OrderArith.thy [radd_def] + " : radd(A,r,B,s) <-> :s & b':B & b:B"; +by (fast_tac sum_cs 1); +val radd_Inr_iff = result(); + +goalw OrderArith.thy [radd_def] + " : radd(A,r,B,s) <-> False"; +by (fast_tac sum_cs 1); +val radd_Inr_Inl_iff = result(); + +(** Elimination Rule **) + +val major::prems = goalw OrderArith.thy [radd_def] + "[| : radd(A,r,B,s); \ +\ !!x y. [| p'=Inl(x); x:A; p=Inr(y); y:B |] ==> Q; \ +\ !!x' x. [| p'=Inl(x'); p=Inl(x); : r; x':A; x:A |] ==> Q; \ +\ !!y' y. [| p'=Inr(y'); p=Inr(y); : s; y':B; y:B |] ==> Q \ +\ |] ==> Q"; +by (cut_facts_tac [major] 1); +(*Split into the three cases*) +by (REPEAT_FIRST + (eresolve_tac [CollectE, Pair_inject, conjE, exE, SigmaE, disjE])); +(*Apply each premise to correct subgoal; can't just use fast_tac + because hyp_subst_tac would delete equalities too quickly*) +by (EVERY (map (fn prem => + EVERY1 [rtac prem, assume_tac, REPEAT o fast_tac sum_cs]) + prems)); +val raddE = result(); + +(** Type checking **) + +goalw OrderArith.thy [radd_def] "radd(A,r,B,s) <= (A+B) * (A+B)"; +by (rtac Collect_subset 1); +val radd_type = result(); + +val field_radd = standard (radd_type RS field_rel_subset); + +(** Linearity **) + +val sum_ss = ZF_ss addsimps [Pair_iff, InlI, InrI, Inl_iff, Inr_iff, + Inl_Inr_iff, Inr_Inl_iff]; + +val radd_ss = sum_ss addsimps [radd_Inl_iff, radd_Inr_iff, + radd_Inl_Inr_iff, radd_Inr_Inl_iff]; + +goalw OrderArith.thy [linear_def] + "!!r s. [| linear(A,r); linear(B,s) |] ==> linear(A+B,radd(A,r,B,s))"; +by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac sumE)); +by (ALLGOALS (asm_simp_tac radd_ss)); +val linear_radd = result(); + + +(** Well-foundedness **) + +goal OrderArith.thy + "!!r s. [| wf[A](r); wf[B](s) |] ==> wf[A+B](radd(A,r,B,s))"; +by (rtac wf_onI2 1); +by (subgoal_tac "ALL x:A. Inl(x): Ba" 1); +(*Proving the lemma, which is needed twice!*) +by (eres_inst_tac [("P", "y : A + B")] thin 2); +by (rtac ballI 2); +by (eres_inst_tac [("r","r"),("a","x")] wf_on_induct 2 THEN assume_tac 2); +by (etac (bspec RS mp) 2); +by (fast_tac sum_cs 2); +by (best_tac (sum_cs addSEs [raddE]) 2); +(*Returning to main part of proof*) +by (REPEAT_FIRST (eresolve_tac [sumE, ssubst])); +by (best_tac sum_cs 1); +by (eres_inst_tac [("r","s"),("a","ya")] wf_on_induct 1 THEN assume_tac 1); +by (etac (bspec RS mp) 1); +by (fast_tac sum_cs 1); +by (best_tac (sum_cs addSEs [raddE]) 1); +val wf_on_radd = result(); + +goal OrderArith.thy + "!!r s. [| wf(r); wf(s) |] ==> wf(radd(field(r),r,field(s),s))"; +by (asm_full_simp_tac (ZF_ss addsimps [wf_iff_wf_on_field]) 1); +by (rtac (field_radd RSN (2, wf_on_subset_A)) 1); +by (REPEAT (ares_tac [wf_on_radd] 1)); +val wf_radd = result(); + +goal OrderArith.thy + "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ +\ well_ord(A+B, radd(A,r,B,s))"; +by (rtac well_ordI 1); +by (asm_full_simp_tac (ZF_ss addsimps [well_ord_def, wf_on_radd]) 1); +by (asm_full_simp_tac + (ZF_ss addsimps [well_ord_def, tot_ord_def, linear_radd]) 1); +val well_ord_radd = result(); + + +(**** Multiplication of relations -- lexicographic product ****) + +(** Rewrite rule. Can be used to obtain introduction rules **) + +goalw OrderArith.thy [rmult_def] + "!!r s. <, > : rmult(A,r,B,s) <-> \ +\ (: r & a':A & a:A & b': B & b: B) | \ +\ (: s & a'=a & a:A & b': B & b: B)"; +by (fast_tac ZF_cs 1); +val rmult_iff = result(); + +val major::prems = goal OrderArith.thy + "[| <, > : rmult(A,r,B,s); \ +\ [| : r; a':A; a:A; b':B; b:B |] ==> Q; \ +\ [| : s; a:A; a'=a; b':B; b:B |] ==> Q \ +\ |] ==> Q"; +by (rtac (major RS (rmult_iff RS iffD1) RS disjE) 1); +by (DEPTH_SOLVE (eresolve_tac ([asm_rl, conjE] @ prems) 1)); +val rmultE = result(); + +(** Type checking **) + +goalw OrderArith.thy [rmult_def] "rmult(A,r,B,s) <= (A*B) * (A*B)"; +by (rtac Collect_subset 1); +val rmult_type = result(); + +val field_rmult = standard (rmult_type RS field_rel_subset); + +(** Linearity **) + +val [lina,linb] = goal OrderArith.thy + "[| linear(A,r); linear(B,s) |] ==> linear(A*B,rmult(A,r,B,s))"; +by (rewtac linear_def); (*Note! the premises are NOT rewritten*) +by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac SigmaE)); +by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1); +by (res_inst_tac [("x","xa"), ("y","xb")] (lina RS linearE) 1); +by (res_inst_tac [("x","ya"), ("y","yb")] (linb RS linearE) 4); +by (REPEAT_SOME (fast_tac ZF_cs)); +val linear_rmult = result(); + + +(** Well-foundedness **) + +goal OrderArith.thy + "!!r s. [| wf[A](r); wf[B](s) |] ==> wf[A*B](rmult(A,r,B,s))"; +by (rtac wf_onI2 1); +by (etac SigmaE 1); +by (etac ssubst 1); +by (subgoal_tac "ALL b:B. : Ba" 1); +by (fast_tac ZF_cs 1); +by (eres_inst_tac [("a","x")] wf_on_induct 1 THEN assume_tac 1); +by (rtac ballI 1); +by (eres_inst_tac [("a","b")] wf_on_induct 1 THEN assume_tac 1); +by (etac (bspec RS mp) 1); +by (fast_tac ZF_cs 1); +by (best_tac (ZF_cs addSEs [rmultE]) 1); +val wf_on_rmult = result(); + + +goal OrderArith.thy + "!!r s. [| wf(r); wf(s) |] ==> wf(rmult(field(r),r,field(s),s))"; +by (asm_full_simp_tac (ZF_ss addsimps [wf_iff_wf_on_field]) 1); +by (rtac (field_rmult RSN (2, wf_on_subset_A)) 1); +by (REPEAT (ares_tac [wf_on_rmult] 1)); +val wf_rmult = result(); + +goal OrderArith.thy + "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ +\ well_ord(A*B, rmult(A,r,B,s))"; +by (rtac well_ordI 1); +by (asm_full_simp_tac (ZF_ss addsimps [well_ord_def, wf_on_rmult]) 1); +by (asm_full_simp_tac + (ZF_ss addsimps [well_ord_def, tot_ord_def, linear_rmult]) 1); +val well_ord_rmult = result(); + + +(**** Inverse image of a relation ****) + +(** Rewrite rule **) + +goalw OrderArith.thy [rvimage_def] + " : rvimage(A,f,r) <-> : r & a:A & b:A"; +by (fast_tac ZF_cs 1); +val rvimage_iff = result(); + +(** Type checking **) + +goalw OrderArith.thy [rvimage_def] "rvimage(A,f,r) <= A*A"; +by (rtac Collect_subset 1); +val rvimage_type = result(); + +val field_rvimage = standard (rvimage_type RS field_rel_subset); + + +(** Linearity **) + +val [finj,lin] = goalw OrderArith.thy [inj_def] + "[| f: inj(A,B); linear(B,r) |] ==> linear(A,rvimage(A,f,r))"; +by (rewtac linear_def); (*Note! the premises are NOT rewritten*) +by (REPEAT_FIRST (ares_tac [ballI])); +by (asm_simp_tac (ZF_ss addsimps [rvimage_iff]) 1); +by (cut_facts_tac [finj] 1); +by (res_inst_tac [("x","f`x"), ("y","f`y")] (lin RS linearE) 1); +by (REPEAT_SOME (fast_tac (ZF_cs addSIs [apply_type]))); +val linear_rvimage = result(); + + +(** Well-foundedness **) + +goal OrderArith.thy + "!!r. [| f: A->B; wf[B](r) |] ==> wf[A](rvimage(A,f,r))"; +by (rtac wf_onI2 1); +by (subgoal_tac "ALL z:A. f`z=f`y --> z: Ba" 1); +by (fast_tac ZF_cs 1); +by (eres_inst_tac [("a","f`y")] wf_on_induct 1); +by (fast_tac (ZF_cs addSIs [apply_type]) 1); +by (best_tac (ZF_cs addSIs [apply_type] addSDs [rvimage_iff RS iffD1]) 1); +val wf_on_rvimage = result(); + +goal OrderArith.thy + "!!r. [| f: inj(A,B); well_ord(B,r) |] ==> well_ord(A, rvimage(A,f,r))"; +by (rtac well_ordI 1); +by (rewrite_goals_tac [well_ord_def, tot_ord_def]); +by (fast_tac (ZF_cs addSIs [wf_on_rvimage, inj_is_fun]) 1); +by (fast_tac (ZF_cs addSIs [linear_rvimage]) 1); +val well_ord_rvimage = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/OrderArith.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ZF/OrderArith.thy Thu Jun 23 17:38:12 1994 +0200 @@ -0,0 +1,31 @@ +(* Title: ZF/OrderArith.thy + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + Copyright 1994 University of Cambridge + +Towards ordinal arithmetic +*) + +OrderArith = Order + Sum + +consts + radd, rmult :: "[i,i,i,i]=>i" + rvimage :: "[i,i,i]=>i" + +rules + (*disjoint sum of two relations; underlies ordinal addition*) + radd_def "radd(A,r,B,s) == \ +\ {z: (A+B) * (A+B). \ +\ (EX x y. z = ) | \ +\ (EX x' x. z = & :r) | \ +\ (EX y' y. z = & :s)}" + + (*lexicographic product of two relations; underlies ordinal multiplication*) + rmult_def "rmult(A,r,B,s) == \ +\ {z: (A*B) * (A*B). \ +\ EX x' y' x y. z = <, > & \ +\ (: r | (x'=x & : s))}" + + (*inverse image of a relation*) + rvimage_def "rvimage(A,f,r) == {z: A*A. EX x y. z = & : r}" + +end diff -r 0cdc840297bb -r 435875e4b21d src/ZF/OrderType.ML --- a/src/ZF/OrderType.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/OrderType.ML Thu Jun 23 17:38:12 1994 +0200 @@ -9,8 +9,8 @@ (*Requires Ordinal.thy as parent; otherwise could be in Order.ML*) goal OrderType.thy "!!i. Ord(i) ==> well_ord(i, Memrel(i))"; -br well_ordI 1; -br (wf_Memrel RS wf_imp_wf_on) 1; +by (rtac well_ordI 1); +by (rtac (wf_Memrel RS wf_imp_wf_on) 1); by (asm_simp_tac (ZF_ss addsimps [linear_def, Memrel_iff]) 1); by (REPEAT (resolve_tac [ballI, Ord_linear] 1));; by (REPEAT (eresolve_tac [asm_rl, Ord_in_Ord] 1));; @@ -18,28 +18,36 @@ open OrderType; +goalw OrderType.thy [ordermap_def,ordertype_def] + "ordermap(A,r) : A -> ordertype(A,r)"; +by (rtac lam_type 1); +by (rtac (lamI RS imageI) 1); +by (REPEAT (assume_tac 1)); +val ordermap_type = result(); + (** Unfolding of ordermap **) +(*Useful for cardinality reasoning; see CardinalArith.ML*) goalw OrderType.thy [ordermap_def, pred_def] "!!r. [| wf[A](r); x:A |] ==> \ +\ ordermap(A,r) ` x = ordermap(A,r) `` pred(A,x,r)"; +by (asm_simp_tac ZF_ss 1); +by (etac (wfrec_on RS trans) 1); +by (assume_tac 1); +by (asm_simp_tac (ZF_ss addsimps [subset_iff, image_lam, + vimage_singleton_iff]) 1); +val ordermap_eq_image = result(); + +goal OrderType.thy + "!!r. [| wf[A](r); x:A |] ==> \ \ ordermap(A,r) ` x = {ordermap(A,r)`y . y : pred(A,x,r)}"; -by (asm_simp_tac ZF_ss 1); -be (wfrec_on RS trans) 1; -ba 1; -by (asm_simp_tac (ZF_ss addsimps [subset_iff, image_lam, - vimage_singleton_iff]) 1); +by (asm_simp_tac (ZF_ss addsimps [ordermap_eq_image, pred_subset, + ordermap_type RS image_fun]) 1); val ordermap_pred_unfold = result(); (*pred-unfolded version. NOT suitable for rewriting -- loops!*) val ordermap_unfold = rewrite_rule [pred_def] ordermap_pred_unfold; -goalw OrderType.thy [ordermap_def,ordertype_def] - "ordermap(A,r) : A -> ordertype(A,r)"; -br lam_type 1; -by (rtac (lamI RS imageI) 1); -by (REPEAT (assume_tac 1)); -val ordermap_type = result(); - (** Showing that ordermap, ordertype yield ordinals **) fun ordermap_elim_tac i = @@ -53,7 +61,7 @@ by (wf_on_ind_tac "x" [] 1); by (asm_simp_tac (ZF_ss addsimps [ordermap_pred_unfold]) 1); by (rtac (Ord_is_Transset RSN (2,OrdI)) 1); -bws [pred_def,Transset_def]; +by (rewrite_goals_tac [pred_def,Transset_def]); by (fast_tac ZF_cs 2); by (safe_tac ZF_cs); by (ordermap_elim_tac 1); @@ -65,7 +73,7 @@ by (rtac ([ordermap_type, subset_refl] MRS image_fun RS ssubst) 1); by (rtac (Ord_is_Transset RSN (2,OrdI)) 1); by (fast_tac (ZF_cs addIs [Ord_ordermap]) 2); -bws [Transset_def,well_ord_def]; +by (rewrite_goals_tac [Transset_def,well_ord_def]); by (safe_tac ZF_cs); by (ordermap_elim_tac 1); by (fast_tac ZF_cs 1); @@ -77,7 +85,7 @@ "!!r. [| : r; wf[A](r); w: A; x: A |] ==> \ \ ordermap(A,r)`w : ordermap(A,r)`x"; by (eres_inst_tac [("x1", "x")] (ordermap_unfold RS ssubst) 1); -ba 1; +by (assume_tac 1); by (fast_tac ZF_cs 1); val less_imp_ordermap_in = result(); @@ -88,10 +96,10 @@ by (safe_tac ZF_cs); by (linear_case_tac 1); by (fast_tac (ZF_cs addSEs [mem_not_refl RS notE]) 1); -bd less_imp_ordermap_in 1; +by (dtac less_imp_ordermap_in 1); by (REPEAT_SOME assume_tac); -be mem_anti_sym 1; -ba 1; +by (etac mem_asym 1); +by (assume_tac 1); val ordermap_in_imp_less = result(); val ordermap_surj = @@ -102,8 +110,8 @@ goalw OrderType.thy [well_ord_def, tot_ord_def, bij_def, inj_def] "!!r. well_ord(A,r) ==> ordermap(A,r) : bij(A, ordertype(A,r))"; by (safe_tac ZF_cs); -br ordermap_type 1; -br ordermap_surj 2; +by (rtac ordermap_type 1); +by (rtac ordermap_surj 2); by (linear_case_tac 1); (*The two cases yield similar contradictions*) by (ALLGOALS (dtac less_imp_ordermap_in)); @@ -115,10 +123,10 @@ "!!r. well_ord(A,r) ==> \ \ ordermap(A,r) : ord_iso(A,r, ordertype(A,r), Memrel(ordertype(A,r)))"; by (safe_tac ZF_cs); -br ordertype_bij 1; -ba 1; +by (rtac ordertype_bij 1); +by (assume_tac 1); by (fast_tac (ZF_cs addSEs [MemrelE, ordermap_in_imp_less]) 2); -bw well_ord_def; +by (rewtac well_ord_def); by (fast_tac (ZF_cs addSIs [MemrelI, less_imp_ordermap_in, ordermap_type RS apply_type]) 1); val ordertype_ord_iso = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Ordinal.ML --- a/src/ZF/Ordinal.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Ordinal.ML Thu Jun 23 17:38:12 1994 +0200 @@ -185,10 +185,10 @@ goal Ordinal.thy "~ (ALL i. i:X <-> Ord(i))"; by (rtac notI 1); by (forw_inst_tac [("x", "X")] spec 1); -by (safe_tac (ZF_cs addSEs [mem_anti_refl])); +by (safe_tac (ZF_cs addSEs [mem_irrefl])); by (swap_res_tac [Ord_is_Transset RSN (2,OrdI)] 1); by (fast_tac ZF_cs 2); -bw Transset_def; +by (rewtac Transset_def); by (safe_tac ZF_cs); by (asm_full_simp_tac ZF_ss 1); by (REPEAT (eresolve_tac [asm_rl, Ord_in_Ord] 1)); @@ -223,14 +223,14 @@ val lt_trans = result(); goalw Ordinal.thy [lt_def] "!!i j. [| i P"; -by (REPEAT (eresolve_tac [asm_rl, conjE, mem_anti_sym] 1)); -val lt_anti_sym = result(); +by (REPEAT (eresolve_tac [asm_rl, conjE, mem_asym] 1)); +val lt_asym = result(); -val lt_anti_refl = prove_goal Ordinal.thy "i P" - (fn [major]=> [ (rtac (major RS (major RS lt_anti_sym)) 1) ]); +val lt_irrefl = prove_goal Ordinal.thy "i P" + (fn [major]=> [ (rtac (major RS (major RS lt_asym)) 1) ]); val lt_not_refl = prove_goal Ordinal.thy "~ i [ (rtac notI 1), (etac lt_anti_refl 1) ]); + (fn _=> [ (rtac notI 1), (etac lt_irrefl 1) ]); (** le is less than or equals; recall i le j abbrevs i i=j"; by (asm_full_simp_tac (ZF_ss addsimps [le_iff]) 1); -by (fast_tac (ZF_cs addEs [lt_anti_sym]) 1); -val le_asym = result(); +by (fast_tac (ZF_cs addEs [lt_asym]) 1); +val le_anti_sym = result(); goal Ordinal.thy "i le 0 <-> i=0"; by (fast_tac (ZF_cs addSIs [Ord_0 RS le_refl] addSEs [leE, lt0E]) 1); @@ -273,7 +273,7 @@ val lt_cs = ZF_cs addSIs [le_refl, leCI] addSDs [le0D] - addSEs [lt_anti_refl, lt0E, leE]; + addSEs [lt_irrefl, lt0E, leE]; (*** Natural Deduction rules for Memrel ***) @@ -394,13 +394,13 @@ val Ord_linear_le = result(); goal Ordinal.thy "!!i j. j le i ==> ~ i j le i"; by (res_inst_tac [("i","i"),("j","j")] Ord_linear2 1); by (REPEAT (SOMEGOAL assume_tac)); -by (fast_tac (lt_cs addEs [lt_anti_sym]) 1); +by (fast_tac (lt_cs addEs [lt_asym]) 1); val not_lt_imp_le = result(); goal Ordinal.thy "!!i j. [| Ord(i); Ord(j) |] ==> ~ i j le i"; @@ -430,7 +430,7 @@ by (rtac (not_lt_iff_le RS iffD1) 1); by (assume_tac 1); by (assume_tac 1); -by (fast_tac (ZF_cs addEs [ltE, mem_anti_refl]) 1); +by (fast_tac (ZF_cs addEs [ltE, mem_irrefl]) 1); val subset_imp_le = result(); goal Ordinal.thy "!!i j. i le j ==> i<=j"; @@ -453,7 +453,7 @@ val [ordi,ordj,minor] = goal Ordinal.thy "[| Ord(i); Ord(j); !!x. x x j le i"; by (REPEAT_FIRST (ares_tac [notI RS not_lt_imp_le, ordi, ordj])); -be (minor RS lt_anti_refl) 1; +by (etac (minor RS lt_irrefl) 1); val all_lt_imp_le = result(); (** Transitive laws **) @@ -472,13 +472,13 @@ goal Ordinal.thy "!!i j. i succ(i) le j"; by (rtac (not_lt_iff_le RS iffD1) 1); -by (fast_tac (lt_cs addEs [lt_anti_sym]) 3); +by (fast_tac (lt_cs addEs [lt_asym]) 3); by (ALLGOALS (fast_tac (ZF_cs addEs [ltE] addIs [Ord_succ]))); val succ_leI = result(); goal Ordinal.thy "!!i j. succ(i) le j ==> i i Un j < k <-> i Limit(i)"; by (safe_tac subset_cs); by (rtac (not_le_iff_lt RS iffD1) 2); -by (fast_tac (lt_cs addEs [lt_anti_sym]) 4); +by (fast_tac (lt_cs addEs [lt_asym]) 4); by (REPEAT (eresolve_tac [asm_rl, ltE, Ord_succ] 1)); val non_succ_LimitI = result(); goal Ordinal.thy "!!i. Limit(succ(i)) ==> P"; -br lt_anti_refl 1; -br Limit_has_succ 1; -ba 1; -be (Limit_is_Ord RS Ord_succD RS le_refl) 1; +by (rtac lt_irrefl 1); +by (rtac Limit_has_succ 1); +by (assume_tac 1); +by (etac (Limit_is_Ord RS Ord_succD RS le_refl) 1); val succ_LimitE = result(); goal Ordinal.thy "!!i. [| Limit(i); i le succ(j) |] ==> i le j"; diff -r 0cdc840297bb -r 435875e4b21d src/ZF/Perm.ML --- a/src/ZF/Perm.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/Perm.ML Thu Jun 23 17:38:12 1994 +0200 @@ -142,7 +142,7 @@ val prems = goal Perm.thy "f: inj(A,B) ==> converse(f): inj(range(f), A)"; -bw inj_def; (*rewrite subgoal but not prems!!*) +by (rewtac inj_def); (*rewrite subgoal but not prems!!*) by (cut_facts_tac prems 1); by (safe_tac ZF_cs); (*apply f to both sides and simplify using right_inverse @@ -359,7 +359,7 @@ by (safe_tac ZF_cs); by (dres_inst_tac [("t", "%h.h`y ")] subst_context 1); by (asm_full_simp_tac (ZF_ss addsimps [comp_fun_apply]) 1); -br fun_extension 1; +by (rtac fun_extension 1); by (REPEAT (ares_tac [comp_fun, lam_type] 1)); by (asm_simp_tac (ZF_ss addsimps [comp_fun_apply]) 1); val comp_eq_id_iff = result(); @@ -475,7 +475,7 @@ by (assume_tac 1); by (dtac apply_equality 1); by (assume_tac 1); -by (res_inst_tac [("a","m")] mem_anti_refl 1); +by (res_inst_tac [("a","m")] mem_irrefl 1); by (fast_tac ZF_cs 1); val inj_succ_restrict = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/WF.ML --- a/src/ZF/WF.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/WF.ML Thu Jun 23 17:38:12 1994 +0200 @@ -62,7 +62,7 @@ "[| !!y B. [| ALL x:A. (ALL y:A. :r --> y:B) --> x:B; y:A \ \ |] ==> y:B |] \ \ ==> wf[A](r)"; -br wf_onI 1; +by (rtac wf_onI 1); by (res_inst_tac [ ("c", "u") ] (prem RS DiffE) 1); by (contr_tac 3); by (fast_tac ZF_cs 2); @@ -131,7 +131,7 @@ \ !!y B. [| ALL x:A. (ALL y:A. :r --> y:B) --> x:B; y:A \ \ |] ==> y:B |] \ \ ==> wf(r)"; -br ([wf_onI2, subs] MRS (wf_on_subset_A RS wf_on_field_imp_wf)) 1; +by (rtac ([wf_onI2, subs] MRS (wf_on_subset_A RS wf_on_field_imp_wf)) 1); by (REPEAT (ares_tac [indhyp] 1)); val wfI2 = result(); @@ -148,7 +148,7 @@ by (wf_ind_tac "a" [] 2); by (fast_tac ZF_cs 2); by (fast_tac FOL_cs 1); -val wf_anti_sym = result(); +val wf_asym = result(); goal WF.thy "!!r. [| wf[A](r); a: A |] ==> ~: r"; by (wf_on_ind_tac "a" [] 1); @@ -160,7 +160,7 @@ by (wf_on_ind_tac "a" [] 2); by (fast_tac ZF_cs 2); by (fast_tac ZF_cs 1); -val wf_on_anti_sym = result(); +val wf_on_asym = result(); (*Needed to prove well_ordI. Could also reason that wf[A](r) means wf(r Int A*A); thus wf( (r Int A*A)^+ ) and use wf_not_refl *) @@ -180,7 +180,7 @@ (*transitive closure of a WF relation is WF provided A is downwards closed*) val [wfr,subs] = goal WF.thy "[| wf[A](r); r-``A <= A |] ==> wf[A](r^+)"; -br wf_onI2 1; +by (rtac wf_onI2 1); by (bchain_tac 1); by (eres_inst_tac [("a","y")] (wfr RS wf_on_induct) 1); by (rtac (impI RS ballI) 1); @@ -194,8 +194,8 @@ goal WF.thy "!!r. wf(r) ==> wf(r^+)"; by (asm_full_simp_tac (ZF_ss addsimps [wf_iff_wf_on_field]) 1); -br (trancl_type RS field_rel_subset RSN (2, wf_on_subset_A)) 1; -be wf_on_trancl 1; +by (rtac (trancl_type RS field_rel_subset RSN (2, wf_on_subset_A)) 1); +by (etac wf_on_trancl 1); by (fast_tac ZF_cs 1); val wf_trancl = result(); @@ -342,7 +342,7 @@ goalw WF.thy [wf_on_def, wfrec_on_def] "!!A r. [| wf[A](r); a: A |] ==> \ \ wfrec[A](r,a,H) = H(a, lam x: (r-``{a}) Int A. wfrec[A](r,x,H))"; -be (wfrec RS trans) 1; +by (etac (wfrec RS trans) 1); by (asm_simp_tac (ZF_ss addsimps [vimage_Int_square, cons_subset_iff]) 1); val wfrec_on = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/func.ML --- a/src/ZF/func.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/func.ML Thu Jun 23 17:38:12 1994 +0200 @@ -230,7 +230,7 @@ val image_lam = result(); goal ZF.thy "!!C A. [| f : Pi(A,B); C <= A |] ==> f``C = {f`x. x:C}"; -be (eta RS subst) 1; +by (etac (eta RS subst) 1); by (asm_full_simp_tac (FOL_ss addsimps [beta, image_lam, subset_iff] addcongs [RepFun_cong]) 1); val image_fun = result(); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/pair.ML --- a/src/ZF/pair.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/pair.ML Thu Jun 23 17:38:12 1994 +0200 @@ -35,13 +35,13 @@ val Pair_neq_fst = prove_goalw ZF.thy [Pair_def] "=a ==> P" (fn [major]=> - [ (rtac (consI1 RS mem_anti_sym RS FalseE) 1), + [ (rtac (consI1 RS mem_asym RS FalseE) 1), (rtac (major RS subst) 1), (rtac consI1 1) ]); val Pair_neq_snd = prove_goalw ZF.thy [Pair_def] "=b ==> P" (fn [major]=> - [ (rtac (consI1 RS consI2 RS mem_anti_sym RS FalseE) 1), + [ (rtac (consI1 RS consI2 RS mem_asym RS FalseE) 1), (rtac (major RS subst) 1), (rtac (consI1 RS consI2) 1) ]); diff -r 0cdc840297bb -r 435875e4b21d src/ZF/upair.ML --- a/src/ZF/upair.ML Thu Jun 23 16:44:57 1994 +0200 +++ b/src/ZF/upair.ML Thu Jun 23 17:38:12 1994 +0200 @@ -207,20 +207,21 @@ val expand_if = prove_goal ZF.thy "P(if(Q,x,y)) <-> ((Q --> P(x)) & (~Q --> P(y)))" - (fn _=> [ (res_inst_tac [("Q","Q")] (excluded_middle RS disjE) 1), + (fn _=> [ (excluded_middle_tac "Q" 1), (asm_simp_tac if_ss 1), (asm_simp_tac if_ss 1) ]); val prems = goal ZF.thy "[| P ==> a: A; ~P ==> b: A |] ==> if(P,a,b): A"; -by (res_inst_tac [("Q","P")] (excluded_middle RS disjE) 1); +by (excluded_middle_tac "P" 1); by (ALLGOALS (asm_simp_tac (if_ss addsimps prems))); val if_type = result(); (*** Foundation lemmas ***) -val mem_anti_sym = prove_goal ZF.thy "[| a:b; b:a |] ==> P" +(*was called mem_anti_sym*) +val mem_asym = prove_goal ZF.thy "[| a:b; b:a |] ==> P" (fn prems=> [ (rtac disjE 1), (res_inst_tac [("A","{a,b}")] foundation 1), @@ -229,15 +230,16 @@ (fast_tac (lemmas_cs addIs (prems@[consI1,consI2]) addSEs [consE,equalityE]) 1) ]); -val mem_anti_refl = prove_goal ZF.thy "a:a ==> P" - (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]); +(*was called mem_anti_refl*) +val mem_irrefl = prove_goal ZF.thy "a:a ==> P" + (fn [major]=> [ (rtac (major RS (major RS mem_asym)) 1) ]); -val mem_not_refl = prove_goal ZF.thy "a~:a" - (K [ (rtac notI 1), (etac mem_anti_refl 1) ]); +val mem_not_refl = prove_goal ZF.thy "a ~: a" + (K [ (rtac notI 1), (etac mem_irrefl 1) ]); (*Good for proving inequalities by rewriting*) val mem_imp_not_eq = prove_goal ZF.thy "!!a A. a:A ==> a ~= A" - (fn _=> [ fast_tac (lemmas_cs addSEs [mem_anti_refl]) 1 ]); + (fn _=> [ fast_tac (lemmas_cs addSEs [mem_irrefl]) 1 ]); (*** Rules for succ ***) @@ -279,12 +281,12 @@ (fn [major]=> [ (rtac (major RS equalityE) 1), (REPEAT (eresolve_tac [asm_rl, sym, succE, make_elim succ_subsetD, - mem_anti_sym] 1)) ]); + mem_asym] 1)) ]); val succ_inject_iff = prove_goal ZF.thy "succ(m) = succ(n) <-> m=n" (fn _=> [ (fast_tac (FOL_cs addSEs [succ_inject]) 1) ]); -(*UpairI1/2 should become UpairCI; mem_anti_refl as a hazE? *) +(*UpairI1/2 should become UpairCI; mem_irrefl as a hazE? *) val upair_cs = lemmas_cs addSIs [singletonI, DiffI, IntI, UnCI, consCI, succCI, UpairI1,UpairI2] addSEs [singletonE, DiffE, IntE, UnE, consE, succE, UpairE];