src/ZF/Constructible/Datatype_absolute.thy
changeset 13564 1500a2e48d44
parent 13557 6061d0045409
child 13615 449a70d88b38
equal deleted inserted replaced
13563:7d6c9817c432 13564:1500a2e48d44
   124   iterates_replacement :: "[i=>o, [i,i]=>o, i] => o"
   124   iterates_replacement :: "[i=>o, [i,i]=>o, i] => o"
   125    "iterates_replacement(M,isF,v) ==
   125    "iterates_replacement(M,isF,v) ==
   126       \<forall>n[M]. n\<in>nat --> 
   126       \<forall>n[M]. n\<in>nat --> 
   127          wfrec_replacement(M, iterates_MH(M,isF,v), Memrel(succ(n)))"
   127          wfrec_replacement(M, iterates_MH(M,isF,v), Memrel(succ(n)))"
   128 
   128 
   129 lemma (in M_axioms) iterates_MH_abs:
   129 lemma (in M_basic) iterates_MH_abs:
   130   "[| relativize1(M,isF,F); M(n); M(g); M(z) |] 
   130   "[| relativize1(M,isF,F); M(n); M(g); M(z) |] 
   131    ==> iterates_MH(M,isF,v,n,g,z) <-> z = nat_case(v, \<lambda>m. F(g`m), n)"
   131    ==> iterates_MH(M,isF,v,n,g,z) <-> z = nat_case(v, \<lambda>m. F(g`m), n)"
   132 by (simp add: nat_case_abs [of _ "\<lambda>m. F(g ` m)"]
   132 by (simp add: nat_case_abs [of _ "\<lambda>m. F(g ` m)"]
   133               relativize1_def iterates_MH_def)  
   133               relativize1_def iterates_MH_def)  
   134 
   134 
   135 lemma (in M_axioms) iterates_imp_wfrec_replacement:
   135 lemma (in M_basic) iterates_imp_wfrec_replacement:
   136   "[|relativize1(M,isF,F); n \<in> nat; iterates_replacement(M,isF,v)|] 
   136   "[|relativize1(M,isF,F); n \<in> nat; iterates_replacement(M,isF,v)|] 
   137    ==> wfrec_replacement(M, \<lambda>n f z. z = nat_case(v, \<lambda>m. F(f`m), n), 
   137    ==> wfrec_replacement(M, \<lambda>n f z. z = nat_case(v, \<lambda>m. F(f`m), n), 
   138                        Memrel(succ(n)))" 
   138                        Memrel(succ(n)))" 
   139 by (simp add: iterates_replacement_def iterates_MH_abs)
   139 by (simp add: iterates_replacement_def iterates_MH_abs)
   140 
   140 
   208   is_list_functor :: "[i=>o,i,i,i] => o"
   208   is_list_functor :: "[i=>o,i,i,i] => o"
   209     "is_list_functor(M,A,X,Z) == 
   209     "is_list_functor(M,A,X,Z) == 
   210         \<exists>n1[M]. \<exists>AX[M]. 
   210         \<exists>n1[M]. \<exists>AX[M]. 
   211          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   211          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   212 
   212 
   213 lemma (in M_axioms) list_functor_abs [simp]: 
   213 lemma (in M_basic) list_functor_abs [simp]: 
   214      "[| M(A); M(X); M(Z) |] ==> is_list_functor(M,A,X,Z) <-> (Z = {0} + A*X)"
   214      "[| M(A); M(X); M(Z) |] ==> is_list_functor(M,A,X,Z) <-> (Z = {0} + A*X)"
   215 by (simp add: is_list_functor_def singleton_0 nat_into_M)
   215 by (simp add: is_list_functor_def singleton_0 nat_into_M)
   216 
   216 
   217 
   217 
   218 subsection {*formulas without univ*}
   218 subsection {*formulas without univ*}
   264           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   264           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   265           is_sum(M,natnat,natnat,natnatsum) &
   265           is_sum(M,natnat,natnat,natnatsum) &
   266           cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & 
   266           cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & 
   267           is_sum(M,natnatsum,X3,Z)"
   267           is_sum(M,natnatsum,X3,Z)"
   268 
   268 
   269 lemma (in M_axioms) formula_functor_abs [simp]: 
   269 lemma (in M_basic) formula_functor_abs [simp]: 
   270      "[| M(X); M(Z) |] 
   270      "[| M(X); M(Z) |] 
   271       ==> is_formula_functor(M,X,Z) <-> 
   271       ==> is_formula_functor(M,X,Z) <-> 
   272           Z = ((nat*nat) + (nat*nat)) + (X*X + X)"
   272           Z = ((nat*nat) + (nat*nat)) + (X*X + X)"
   273 by (simp add: is_formula_functor_def) 
   273 by (simp add: is_formula_functor_def) 
   274 
   274 
   321 apply (blast intro: list_imp_list_N) 
   321 apply (blast intro: list_imp_list_N) 
   322 done
   322 done
   323   
   323   
   324 text{*Express @{term list_rec} without using @{term rank} or @{term Vset},
   324 text{*Express @{term list_rec} without using @{term rank} or @{term Vset},
   325 neither of which is absolute.*}
   325 neither of which is absolute.*}
   326 lemma (in M_triv_axioms) list_rec_eq:
   326 lemma (in M_trivial) list_rec_eq:
   327   "l \<in> list(A) ==>
   327   "l \<in> list(A) ==>
   328    list_rec(a,g,l) = 
   328    list_rec(a,g,l) = 
   329    transrec (succ(length(l)),
   329    transrec (succ(length(l)),
   330       \<lambda>x h. Lambda (list(A),
   330       \<lambda>x h. Lambda (list(A),
   331                     list_case' (a, 
   331                     list_case' (a, 
   726 apply (blast intro: list_imp_list_N nat_into_Ord list_N_imp_eq_length
   726 apply (blast intro: list_imp_list_N nat_into_Ord list_N_imp_eq_length
   727              dest: list_N_imp_length_lt)
   727              dest: list_N_imp_length_lt)
   728 done
   728 done
   729 
   729 
   730 text{*Proof is trivial since @{term length} returns natural numbers.*}
   730 text{*Proof is trivial since @{term length} returns natural numbers.*}
   731 lemma (in M_triv_axioms) length_closed [intro,simp]:
   731 lemma (in M_trivial) length_closed [intro,simp]:
   732      "l \<in> list(A) ==> M(length(l))"
   732      "l \<in> list(A) ==> M(length(l))"
   733 by (simp add: nat_into_M) 
   733 by (simp add: nat_into_M) 
   734 
   734 
   735 
   735 
   736 subsection {*Absoluteness for @{term nth}*}
   736 subsection {*Absoluteness for @{term nth}*}
   742 apply (erule natE)
   742 apply (erule natE)
   743 apply (simp add: hd'_Cons) 
   743 apply (simp add: hd'_Cons) 
   744 apply (simp add: tl'_Cons iterates_commute) 
   744 apply (simp add: tl'_Cons iterates_commute) 
   745 done
   745 done
   746 
   746 
   747 lemma (in M_axioms) iterates_tl'_closed:
   747 lemma (in M_basic) iterates_tl'_closed:
   748      "[|n \<in> nat; M(x)|] ==> M(tl'^n (x))"
   748      "[|n \<in> nat; M(x)|] ==> M(tl'^n (x))"
   749 apply (induct_tac n, simp) 
   749 apply (induct_tac n, simp) 
   750 apply (simp add: tl'_Cons tl'_closed) 
   750 apply (simp add: tl'_Cons tl'_closed) 
   751 done
   751 done
   752 
   752 
   783   is_Member :: "[i=>o,i,i,i] => o"
   783   is_Member :: "[i=>o,i,i,i] => o"
   784      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   784      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   785     "is_Member(M,x,y,Z) ==
   785     "is_Member(M,x,y,Z) ==
   786 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)"
   786 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)"
   787 
   787 
   788 lemma (in M_triv_axioms) Member_abs [simp]:
   788 lemma (in M_trivial) Member_abs [simp]:
   789      "[|M(x); M(y); M(Z)|] ==> is_Member(M,x,y,Z) <-> (Z = Member(x,y))"
   789      "[|M(x); M(y); M(Z)|] ==> is_Member(M,x,y,Z) <-> (Z = Member(x,y))"
   790 by (simp add: is_Member_def Member_def)
   790 by (simp add: is_Member_def Member_def)
   791 
   791 
   792 lemma (in M_triv_axioms) Member_in_M_iff [iff]:
   792 lemma (in M_trivial) Member_in_M_iff [iff]:
   793      "M(Member(x,y)) <-> M(x) & M(y)"
   793      "M(Member(x,y)) <-> M(x) & M(y)"
   794 by (simp add: Member_def) 
   794 by (simp add: Member_def) 
   795 
   795 
   796 constdefs
   796 constdefs
   797   is_Equal :: "[i=>o,i,i,i] => o"
   797   is_Equal :: "[i=>o,i,i,i] => o"
   798      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   798      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   799     "is_Equal(M,x,y,Z) ==
   799     "is_Equal(M,x,y,Z) ==
   800 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)"
   800 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)"
   801 
   801 
   802 lemma (in M_triv_axioms) Equal_abs [simp]:
   802 lemma (in M_trivial) Equal_abs [simp]:
   803      "[|M(x); M(y); M(Z)|] ==> is_Equal(M,x,y,Z) <-> (Z = Equal(x,y))"
   803      "[|M(x); M(y); M(Z)|] ==> is_Equal(M,x,y,Z) <-> (Z = Equal(x,y))"
   804 by (simp add: is_Equal_def Equal_def)
   804 by (simp add: is_Equal_def Equal_def)
   805 
   805 
   806 lemma (in M_triv_axioms) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   806 lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   807 by (simp add: Equal_def) 
   807 by (simp add: Equal_def) 
   808 
   808 
   809 constdefs
   809 constdefs
   810   is_Nand :: "[i=>o,i,i,i] => o"
   810   is_Nand :: "[i=>o,i,i,i] => o"
   811      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   811      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   812     "is_Nand(M,x,y,Z) ==
   812     "is_Nand(M,x,y,Z) ==
   813 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)"
   813 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)"
   814 
   814 
   815 lemma (in M_triv_axioms) Nand_abs [simp]:
   815 lemma (in M_trivial) Nand_abs [simp]:
   816      "[|M(x); M(y); M(Z)|] ==> is_Nand(M,x,y,Z) <-> (Z = Nand(x,y))"
   816      "[|M(x); M(y); M(Z)|] ==> is_Nand(M,x,y,Z) <-> (Z = Nand(x,y))"
   817 by (simp add: is_Nand_def Nand_def)
   817 by (simp add: is_Nand_def Nand_def)
   818 
   818 
   819 lemma (in M_triv_axioms) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   819 lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   820 by (simp add: Nand_def) 
   820 by (simp add: Nand_def) 
   821 
   821 
   822 constdefs
   822 constdefs
   823   is_Forall :: "[i=>o,i,i] => o"
   823   is_Forall :: "[i=>o,i,i] => o"
   824      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
   824      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
   825     "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)"
   825     "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)"
   826 
   826 
   827 lemma (in M_triv_axioms) Forall_abs [simp]:
   827 lemma (in M_trivial) Forall_abs [simp]:
   828      "[|M(x); M(Z)|] ==> is_Forall(M,x,Z) <-> (Z = Forall(x))"
   828      "[|M(x); M(Z)|] ==> is_Forall(M,x,Z) <-> (Z = Forall(x))"
   829 by (simp add: is_Forall_def Forall_def)
   829 by (simp add: is_Forall_def Forall_def)
   830 
   830 
   831 lemma (in M_triv_axioms) Forall_in_M_iff [iff]: "M(Forall(x)) <-> M(x)"
   831 lemma (in M_trivial) Forall_in_M_iff [iff]: "M(Forall(x)) <-> M(x)"
   832 by (simp add: Forall_def)
   832 by (simp add: Forall_def)
   833 
   833 
   834 
   834 
   835 subsection {*Absoluteness for @{term formula_rec}*}
   835 subsection {*Absoluteness for @{term formula_rec}*}
   836 
   836 
   888 apply (blast intro: formula_imp_formula_N nat_into_Ord formula_N_imp_eq_depth
   888 apply (blast intro: formula_imp_formula_N nat_into_Ord formula_N_imp_eq_depth
   889              dest: formula_N_imp_depth_lt)
   889              dest: formula_N_imp_depth_lt)
   890 done
   890 done
   891 
   891 
   892 text{*Proof is trivial since @{term depth} returns natural numbers.*}
   892 text{*Proof is trivial since @{term depth} returns natural numbers.*}
   893 lemma (in M_triv_axioms) depth_closed [intro,simp]:
   893 lemma (in M_trivial) depth_closed [intro,simp]:
   894      "p \<in> formula ==> M(depth(p))"
   894      "p \<in> formula ==> M(depth(p))"
   895 by (simp add: nat_into_M) 
   895 by (simp add: nat_into_M) 
   896 
   896 
   897 
   897 
   898 subsection {*Absoluteness for @{term formula_rec}*}
   898 subsection {*Absoluteness for @{term formula_rec}*}
   914              successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)"
   914              successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)"
   915 
   915 
   916 text{*Unfold @{term formula_rec} to @{term formula_rec_case}.
   916 text{*Unfold @{term formula_rec} to @{term formula_rec_case}.
   917      Express @{term formula_rec} without using @{term rank} or @{term Vset},
   917      Express @{term formula_rec} without using @{term rank} or @{term Vset},
   918 neither of which is absolute.*}
   918 neither of which is absolute.*}
   919 lemma (in M_triv_axioms) formula_rec_eq:
   919 lemma (in M_trivial) formula_rec_eq:
   920   "p \<in> formula ==>
   920   "p \<in> formula ==>
   921    formula_rec(a,b,c,d,p) = 
   921    formula_rec(a,b,c,d,p) = 
   922    transrec (succ(depth(p)),
   922    transrec (succ(depth(p)),
   923              \<lambda>x h. Lambda (formula, formula_rec_case(a,b,c,d,h))) ` p"
   923              \<lambda>x h. Lambda (formula, formula_rec_case(a,b,c,d,h))) ` p"
   924 apply (simp add: formula_rec_case_def)
   924 apply (simp add: formula_rec_case_def)