diff -r f2094906e491 -r e44d86131648 src/ZF/Epsilon.thy --- a/src/ZF/Epsilon.thy Tue Sep 27 13:34:54 2022 +0200 +++ b/src/ZF/Epsilon.thy Tue Sep 27 16:51:35 2022 +0100 @@ -9,19 +9,19 @@ definition eclose :: "i=>i" where - "eclose(A) == \n\nat. nat_rec(n, A, %m r. \(r))" + "eclose(A) \ \n\nat. nat_rec(n, A, %m r. \(r))" definition transrec :: "[i, [i,i]=>i] =>i" where - "transrec(a,H) == wfrec(Memrel(eclose({a})), a, H)" + "transrec(a,H) \ wfrec(Memrel(eclose({a})), a, H)" definition rank :: "i=>i" where - "rank(a) == transrec(a, %x f. \y\x. succ(f`y))" + "rank(a) \ transrec(a, %x f. \y\x. succ(f`y))" definition transrec2 :: "[i, i, [i,i]=>i] =>i" where - "transrec2(k, a, b) == + "transrec2(k, a, b) \ transrec(k, %i r. if(i=0, a, if(\j. i=succ(j), @@ -30,11 +30,11 @@ definition recursor :: "[i, [i,i]=>i, i]=>i" where - "recursor(a,b,k) == transrec(k, %n f. nat_case(a, %m. b(m, f`m), n))" + "recursor(a,b,k) \ transrec(k, %n f. nat_case(a, %m. b(m, f`m), n))" definition rec :: "[i, i, [i,i]=>i]=>i" where - "rec(k,a,b) == recursor(a,b,k)" + "rec(k,a,b) \ recursor(a,b,k)" subsection\Basic Closure Properties\ @@ -56,19 +56,19 @@ apply (erule UnionI, assumption) done -(* @{term"x \ eclose(A) ==> x \ eclose(A)"} *) +(* @{term"x \ eclose(A) \ x \ eclose(A)"} *) lemmas eclose_subset = Transset_eclose [unfolded Transset_def, THEN bspec] -(* @{term"[| A \ eclose(B); c \ A |] ==> c \ eclose(B)"} *) +(* @{term"\A \ eclose(B); c \ A\ \ c \ eclose(B)"} *) lemmas ecloseD = eclose_subset [THEN subsetD] lemmas arg_in_eclose_sing = arg_subset_eclose [THEN singleton_subsetD] lemmas arg_into_eclose_sing = arg_in_eclose_sing [THEN ecloseD] (* This is epsilon-induction for eclose(A); see also eclose_induct_down... - [| a \ eclose(A); !!x. [| x \ eclose(A); \y\x. P(y) |] ==> P(x) - |] ==> P(a) + \a \ eclose(A); \x. \x \ eclose(A); \y\x. P(y)\ \ P(x) +\ \ P(a) *) lemmas eclose_induct = Transset_induct [OF _ Transset_eclose, induct set: eclose] @@ -76,7 +76,7 @@ (*Epsilon induction*) lemma eps_induct: - "[| !!x. \y\x. P(y) ==> P(x) |] ==> P(a)" + "\\x. \y\x. P(y) \ P(x)\ \ P(a)" by (rule arg_in_eclose_sing [THEN eclose_induct], blast) @@ -85,7 +85,7 @@ (** eclose(A) is the least transitive set including A as a subset. **) lemma eclose_least_lemma: - "[| Transset(X); A<=X; n \ nat |] ==> nat_rec(n, A, %m r. \(r)) \ X" + "\Transset(X); A<=X; n \ nat\ \ nat_rec(n, A, %m r. \(r)) \ X" apply (unfold Transset_def) apply (erule nat_induct) apply (simp add: nat_rec_0) @@ -93,17 +93,17 @@ done lemma eclose_least: - "[| Transset(X); A<=X |] ==> eclose(A) \ X" + "\Transset(X); A<=X\ \ eclose(A) \ X" apply (unfold eclose_def) apply (rule eclose_least_lemma [THEN UN_least], assumption+) done -(*COMPLETELY DIFFERENT induction principle from eclose_induct!!*) +(*COMPLETELY DIFFERENT induction principle from eclose_induct\*) lemma eclose_induct_down [consumes 1]: - "[| a \ eclose(b); - !!y. [| y \ b |] ==> P(y); - !!y z. [| y \ eclose(b); P(y); z \ y |] ==> P(z) - |] ==> P(a)" + "\a \ eclose(b); + \y. \y \ b\ \ P(y); + \y z. \y \ eclose(b); P(y); z \ y\ \ P(z) +\ \ P(a)" apply (rule eclose_least [THEN subsetD, THEN CollectD2, of "eclose(b)"]) prefer 3 apply assumption apply (unfold Transset_def) @@ -111,49 +111,49 @@ apply (blast intro: arg_subset_eclose [THEN subsetD]) done -lemma Transset_eclose_eq_arg: "Transset(X) ==> eclose(X) = X" +lemma Transset_eclose_eq_arg: "Transset(X) \ eclose(X) = X" apply (erule equalityI [OF eclose_least arg_subset_eclose]) apply (rule subset_refl) done text\A transitive set either is empty or contains the empty set.\ -lemma Transset_0_lemma [rule_format]: "Transset(A) ==> x\A \ 0\A" +lemma Transset_0_lemma [rule_format]: "Transset(A) \ x\A \ 0\A" apply (simp add: Transset_def) apply (rule_tac a=x in eps_induct, clarify) apply (drule bspec, assumption) apply (case_tac "x=0", auto) done -lemma Transset_0_disj: "Transset(A) ==> A=0 | 0\A" +lemma Transset_0_disj: "Transset(A) \ A=0 | 0\A" by (blast dest: Transset_0_lemma) subsection\Epsilon Recursion\ (*Unused...*) -lemma mem_eclose_trans: "[| A \ eclose(B); B \ eclose(C) |] ==> A \ eclose(C)" +lemma mem_eclose_trans: "\A \ eclose(B); B \ eclose(C)\ \ A \ eclose(C)" by (rule eclose_least [OF Transset_eclose eclose_subset, THEN subsetD], assumption+) (*Variant of the previous lemma in a useable form for the sequel*) lemma mem_eclose_sing_trans: - "[| A \ eclose({B}); B \ eclose({C}) |] ==> A \ eclose({C})" + "\A \ eclose({B}); B \ eclose({C})\ \ A \ eclose({C})" by (rule eclose_least [OF Transset_eclose singleton_subsetI, THEN subsetD], assumption+) -lemma under_Memrel: "[| Transset(i); j \ i |] ==> Memrel(i)-``{j} = j" +lemma under_Memrel: "\Transset(i); j \ i\ \ Memrel(i)-``{j} = j" by (unfold Transset_def, blast) -lemma lt_Memrel: "j < i ==> Memrel(i) -`` {j} = j" +lemma lt_Memrel: "j < i \ Memrel(i) -`` {j} = j" by (simp add: lt_def Ord_def under_Memrel) -(* @{term"j \ eclose(A) ==> Memrel(eclose(A)) -`` j = j"} *) +(* @{term"j \ eclose(A) \ Memrel(eclose(A)) -`` j = j"} *) lemmas under_Memrel_eclose = Transset_eclose [THEN under_Memrel] lemmas wfrec_ssubst = wf_Memrel [THEN wfrec, THEN ssubst] lemma wfrec_eclose_eq: - "[| k \ eclose({j}); j \ eclose({i}) |] ==> + "\k \ eclose({j}); j \ eclose({i})\ \ wfrec(Memrel(eclose({i})), k, H) = wfrec(Memrel(eclose({j})), k, H)" apply (erule eclose_induct) apply (rule wfrec_ssubst) @@ -162,7 +162,7 @@ done lemma wfrec_eclose_eq2: - "k \ i ==> wfrec(Memrel(eclose({i})),k,H) = wfrec(Memrel(eclose({k})),k,H)" + "k \ i \ wfrec(Memrel(eclose({i})),k,H) = wfrec(Memrel(eclose({k})),k,H)" apply (rule arg_in_eclose_sing [THEN wfrec_eclose_eq]) apply (erule arg_into_eclose_sing) done @@ -175,20 +175,20 @@ (*Avoids explosions in proofs; resolve it with a meta-level definition.*) lemma def_transrec: - "[| !!x. f(x)==transrec(x,H) |] ==> f(a) = H(a, \x\a. f(x))" + "\\x. f(x)\transrec(x,H)\ \ f(a) = H(a, \x\a. f(x))" apply simp apply (rule transrec) done lemma transrec_type: - "[| !!x u. [| x \ eclose({a}); u \ Pi(x,B) |] ==> H(x,u) \ B(x) |] - ==> transrec(a,H) \ B(a)" + "\\x u. \x \ eclose({a}); u \ Pi(x,B)\ \ H(x,u) \ B(x)\ + \ transrec(a,H) \ B(a)" apply (rule_tac i = a in arg_in_eclose_sing [THEN eclose_induct]) apply (subst transrec) apply (simp add: lam_type) done -lemma eclose_sing_Ord: "Ord(i) ==> eclose({i}) \ succ(i)" +lemma eclose_sing_Ord: "Ord(i) \ eclose({i}) \ succ(i)" apply (erule Ord_is_Transset [THEN Transset_succ, THEN eclose_least]) apply (rule succI1 [THEN singleton_subsetI]) done @@ -198,7 +198,7 @@ apply (frule eclose_subset, blast) done -lemma eclose_sing_Ord_eq: "Ord(i) ==> eclose({i}) = succ(i)" +lemma eclose_sing_Ord_eq: "Ord(i) \ eclose({i}) = succ(i)" apply (rule equalityI) apply (erule eclose_sing_Ord) apply (rule succ_subset_eclose_sing) @@ -207,7 +207,7 @@ lemma Ord_transrec_type: assumes jini: "j \ i" and ordi: "Ord(i)" - and minor: " !!x u. [| x \ i; u \ Pi(x,B) |] ==> H(x,u) \ B(x)" + and minor: " \x u. \x \ i; u \ Pi(x,B)\ \ H(x,u) \ B(x)" shows "transrec(j,H) \ B(j)" apply (rule transrec_type) apply (insert jini ordi) @@ -229,25 +229,25 @@ apply (erule bspec, assumption) done -lemma rank_of_Ord: "Ord(i) ==> rank(i) = i" +lemma rank_of_Ord: "Ord(i) \ rank(i) = i" apply (erule trans_induct) apply (subst rank) apply (simp add: Ord_equality) done -lemma rank_lt: "a \ b ==> rank(a) < rank(b)" +lemma rank_lt: "a \ b \ rank(a) < rank(b)" apply (rule_tac a1 = b in rank [THEN ssubst]) apply (erule UN_I [THEN ltI]) apply (rule_tac [2] Ord_UN, auto) done -lemma eclose_rank_lt: "a \ eclose(b) ==> rank(a) < rank(b)" +lemma eclose_rank_lt: "a \ eclose(b) \ rank(a) < rank(b)" apply (erule eclose_induct_down) apply (erule rank_lt) apply (erule rank_lt [THEN lt_trans], assumption) done -lemma rank_mono: "a<=b ==> rank(a) \ rank(b)" +lemma rank_mono: "a<=b \ rank(a) \ rank(b)" apply (rule subset_imp_le) apply (auto simp add: rank [of a] rank [of b]) done @@ -305,14 +305,14 @@ (*Not clear how to remove the P(a) condition, since the "then" part must refer to "a"*) lemma the_equality_if: - "P(a) ==> (THE x. P(x)) = (if (\!x. P(x)) then a else 0)" + "P(a) \ (THE x. P(x)) = (if (\!x. P(x)) then a else 0)" by (simp add: the_0 the_equality2) (*The first premise not only fixs i but ensures @{term"f\0"}. The second premise is now essential. Consider otherwise the relation r = {<0,0>,<0,1>,<0,2>,...}. Then f`0 = \(f``{0}) = \(nat) = nat, whose rank equals that of r.*) -lemma rank_apply: "[|i \ domain(f); function(f)|] ==> rank(f`i) < rank(f)" +lemma rank_apply: "\i \ domain(f); function(f)\ \ rank(f`i) < rank(f)" apply clarify apply (simp add: function_apply_equality) apply (blast intro: lt_trans rank_lt rank_pair2) @@ -321,12 +321,12 @@ subsection\Corollaries of Leastness\ -lemma mem_eclose_subset: "A \ B ==> eclose(A)<=eclose(B)" +lemma mem_eclose_subset: "A \ B \ eclose(A)<=eclose(B)" apply (rule Transset_eclose [THEN eclose_least]) apply (erule arg_into_eclose [THEN eclose_subset]) done -lemma eclose_mono: "A<=B ==> eclose(A) \ eclose(B)" +lemma eclose_mono: "A<=B \ eclose(A) \ eclose(B)" apply (rule Transset_eclose [THEN eclose_least]) apply (erule subset_trans) apply (rule arg_subset_eclose) @@ -352,14 +352,14 @@ done lemma transrec2_Limit: - "Limit(i) ==> transrec2(i,a,b) = (\j transrec2(i,a,b) = (\j f(0) = a & + "(\x. f(x)\transrec2(x,a,b)) + \ f(0) = a & f(succ(i)) = b(i, f(i)) & (Limit(K) \ f(K) = (\j nat; + "\n \ nat; a \ C(0); - !!m z. [| m \ nat; z \ C(m) |] ==> b(m,z): C(succ(m)) |] - ==> rec(n,a,b) \ C(n)" + \m z. \m \ nat; z \ C(m)\ \ b(m,z): C(succ(m))\ + \ rec(n,a,b) \ C(n)" by (erule nat_induct, auto) end