src/ZF/Constructible/Datatype_absolute.thy
changeset 21233 5a5c8ea5f66a
parent 16417 9bc16273c2d4
child 21404 eb85850d3eb7
equal deleted inserted replaced
21232:faacfd4392b5 21233:5a5c8ea5f66a
     8 theory Datatype_absolute imports Formula WF_absolute begin
     8 theory Datatype_absolute imports Formula WF_absolute begin
     9 
     9 
    10 
    10 
    11 subsection{*The lfp of a continuous function can be expressed as a union*}
    11 subsection{*The lfp of a continuous function can be expressed as a union*}
    12 
    12 
    13 constdefs
    13 definition
    14   directed :: "i=>o"
    14   directed :: "i=>o"
    15    "directed(A) == A\<noteq>0 & (\<forall>x\<in>A. \<forall>y\<in>A. x \<union> y \<in> A)"
    15    "directed(A) == A\<noteq>0 & (\<forall>x\<in>A. \<forall>y\<in>A. x \<union> y \<in> A)"
    16 
    16 
    17   contin :: "(i=>i) => o"
    17   contin :: "(i=>i) => o"
    18    "contin(h) == (\<forall>A. directed(A) --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))"
    18    "contin(h) == (\<forall>A. directed(A) --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))"
   111 
   111 
   112 
   112 
   113 
   113 
   114 subsection {*Absoluteness for "Iterates"*}
   114 subsection {*Absoluteness for "Iterates"*}
   115 
   115 
   116 constdefs
   116 definition
   117 
   117 
   118   iterates_MH :: "[i=>o, [i,i]=>o, i, i, i, i] => o"
   118   iterates_MH :: "[i=>o, [i,i]=>o, i, i, i, i] => o"
   119    "iterates_MH(M,isF,v,n,g,z) ==
   119    "iterates_MH(M,isF,v,n,g,z) ==
   120         is_nat_case(M, v, \<lambda>m u. \<exists>gm[M]. fun_apply(M,g,m,gm) & isF(gm,u),
   120         is_nat_case(M, v, \<lambda>m u. \<exists>gm[M]. fun_apply(M,g,m,gm) & isF(gm,u),
   121                     n, z)"
   121                     n, z)"
   205 lemma list_eq_Union:
   205 lemma list_eq_Union:
   206      "list(A) = (\<Union>n\<in>nat. (\<lambda>X. {0} + A*X) ^ n (0))"
   206      "list(A) = (\<Union>n\<in>nat. (\<lambda>X. {0} + A*X) ^ n (0))"
   207 by (simp add: list_eq_lfp2 lfp_eq_Union list_fun_bnd_mono list_fun_contin)
   207 by (simp add: list_eq_lfp2 lfp_eq_Union list_fun_bnd_mono list_fun_contin)
   208 
   208 
   209 
   209 
   210 constdefs
   210 definition
   211   is_list_functor :: "[i=>o,i,i,i] => o"
   211   is_list_functor :: "[i=>o,i,i,i] => o"
   212     "is_list_functor(M,A,X,Z) == 
   212     "is_list_functor(M,A,X,Z) == 
   213         \<exists>n1[M]. \<exists>AX[M]. 
   213         \<exists>n1[M]. \<exists>AX[M]. 
   214          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   214          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   215 
   215 
   258       (\<Union>n\<in>nat. (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0))"
   258       (\<Union>n\<in>nat. (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0))"
   259 by (simp add: formula_eq_lfp2 lfp_eq_Union formula_fun_bnd_mono 
   259 by (simp add: formula_eq_lfp2 lfp_eq_Union formula_fun_bnd_mono 
   260               formula_fun_contin)
   260               formula_fun_contin)
   261 
   261 
   262 
   262 
   263 constdefs
   263 definition
   264   is_formula_functor :: "[i=>o,i,i] => o"
   264   is_formula_functor :: "[i=>o,i,i] => o"
   265     "is_formula_functor(M,X,Z) == 
   265     "is_formula_functor(M,X,Z) == 
   266         \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. 
   266         \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. 
   267           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   267           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   268           is_sum(M,natnat,natnat,natnatsum) &
   268           is_sum(M,natnat,natnat,natnatsum) &
   276 by (simp add: is_formula_functor_def) 
   276 by (simp add: is_formula_functor_def) 
   277 
   277 
   278 
   278 
   279 subsection{*@{term M} Contains the List and Formula Datatypes*}
   279 subsection{*@{term M} Contains the List and Formula Datatypes*}
   280 
   280 
   281 constdefs
   281 definition
   282   list_N :: "[i,i] => i"
   282   list_N :: "[i,i] => i"
   283     "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)"
   283     "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)"
   284 
   284 
   285 lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))"
   285 lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))"
   286 by (simp add: list_N_def Nil_def)
   286 by (simp add: list_N_def Nil_def)
   337 apply (subst transrec, simp) 
   337 apply (subst transrec, simp) 
   338 apply (subst transrec) 
   338 apply (subst transrec) 
   339 apply (simp add: list_imp_list_N) 
   339 apply (simp add: list_imp_list_N) 
   340 done
   340 done
   341 
   341 
   342 constdefs
   342 definition
   343   is_list_N :: "[i=>o,i,i,i] => o"
   343   is_list_N :: "[i=>o,i,i,i] => o"
   344     "is_list_N(M,A,n,Z) == 
   344     "is_list_N(M,A,n,Z) == 
   345       \<exists>zero[M]. empty(M,zero) & 
   345       \<exists>zero[M]. empty(M,zero) & 
   346                 is_iterates(M, is_list_functor(M,A), zero, n, Z)"
   346                 is_iterates(M, is_list_functor(M,A), zero, n, Z)"
   347   
   347   
   364 
   364 
   365 lemma depth_type [TC]: "p \<in> formula ==> depth(p) \<in> nat"
   365 lemma depth_type [TC]: "p \<in> formula ==> depth(p) \<in> nat"
   366 by (induct_tac p, simp_all) 
   366 by (induct_tac p, simp_all) 
   367 
   367 
   368 
   368 
   369 constdefs
   369 definition
   370   formula_N :: "i => i"
   370   formula_N :: "i => i"
   371     "formula_N(n) == (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0)"
   371     "formula_N(n) == (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0)"
   372 
   372 
   373 lemma Member_in_formula_N [simp]:
   373 lemma Member_in_formula_N [simp]:
   374      "Member(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat"
   374      "Member(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat"
   439 apply (rule_tac i = m and j = n in Ord_linear_le, auto) 
   439 apply (rule_tac i = m and j = n in Ord_linear_le, auto) 
   440 apply (simp_all add: subset_Un_iff [THEN iffD1] subset_Un_iff2 [THEN iffD1] 
   440 apply (simp_all add: subset_Un_iff [THEN iffD1] subset_Un_iff2 [THEN iffD1] 
   441                      le_imp_subset formula_N_mono)
   441                      le_imp_subset formula_N_mono)
   442 done
   442 done
   443 
   443 
   444 constdefs
   444 definition
   445   is_formula_N :: "[i=>o,i,i] => o"
   445   is_formula_N :: "[i=>o,i,i] => o"
   446     "is_formula_N(M,n,Z) == 
   446     "is_formula_N(M,n,Z) == 
   447       \<exists>zero[M]. empty(M,zero) & 
   447       \<exists>zero[M]. empty(M,zero) & 
   448                 is_iterates(M, is_formula_functor(M), zero, n, Z)"
   448                 is_iterates(M, is_formula_functor(M), zero, n, Z)"
   449 
   449 
   450 
   450 
   451 constdefs
   451 definition
   452   
   452   
   453   mem_formula :: "[i=>o,i] => o"
   453   mem_formula :: "[i=>o,i] => o"
   454     "mem_formula(M,p) == 
   454     "mem_formula(M,p) == 
   455       \<exists>n[M]. \<exists>formn[M]. 
   455       \<exists>n[M]. \<exists>formn[M]. 
   456        finite_ordinal(M,n) & is_formula_N(M,n,formn) & p \<in> formn"
   456        finite_ordinal(M,n) & is_formula_N(M,n,formn) & p \<in> formn"
   582 apply (induct_tac n)
   582 apply (induct_tac n)
   583 apply (simp add: nat_rec_0)
   583 apply (simp add: nat_rec_0)
   584 apply (simp add: nat_rec_succ)
   584 apply (simp add: nat_rec_succ)
   585 done
   585 done
   586 
   586 
   587 constdefs
   587 definition
   588   is_eclose_n :: "[i=>o,i,i,i] => o"
   588   is_eclose_n :: "[i=>o,i,i,i] => o"
   589     "is_eclose_n(M,A,n,Z) == is_iterates(M, big_union(M), A, n, Z)"
   589     "is_eclose_n(M,A,n,Z) == is_iterates(M, big_union(M), A, n, Z)"
   590 
   590 
   591   mem_eclose :: "[i=>o,i,i] => o"
   591   mem_eclose :: "[i=>o,i,i] => o"
   592     "mem_eclose(M,A,l) ==
   592     "mem_eclose(M,A,l) ==
   641 
   641 
   642 
   642 
   643 subsection {*Absoluteness for @{term transrec}*}
   643 subsection {*Absoluteness for @{term transrec}*}
   644 
   644 
   645 text{* @{term "transrec(a,H) \<equiv> wfrec(Memrel(eclose({a})), a, H)"} *}
   645 text{* @{term "transrec(a,H) \<equiv> wfrec(Memrel(eclose({a})), a, H)"} *}
   646 constdefs
   646 definition
   647 
   647 
   648   is_transrec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   648   is_transrec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   649    "is_transrec(M,MH,a,z) ==
   649    "is_transrec(M,MH,a,z) ==
   650       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   650       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   651        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   651        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   689 
   689 
   690 
   690 
   691 subsection{*Absoluteness for the List Operator @{term length}*}
   691 subsection{*Absoluteness for the List Operator @{term length}*}
   692 text{*But it is never used.*}
   692 text{*But it is never used.*}
   693 
   693 
   694 constdefs
   694 definition
   695   is_length :: "[i=>o,i,i,i] => o"
   695   is_length :: "[i=>o,i,i,i] => o"
   696     "is_length(M,A,l,n) ==
   696     "is_length(M,A,l,n) ==
   697        \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M].
   697        \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M].
   698         is_list_N(M,A,n,list_n) & l \<notin> list_n &
   698         is_list_N(M,A,n,list_n) & l \<notin> list_n &
   699         successor(M,n,sn) & is_list_N(M,A,sn,list_sn) & l \<in> list_sn"
   699         successor(M,n,sn) & is_list_N(M,A,sn,list_sn) & l \<in> list_sn"
   737 apply (case_tac "n < length(xs)")
   737 apply (case_tac "n < length(xs)")
   738  apply (blast intro: nth_type transM)
   738  apply (blast intro: nth_type transM)
   739 apply (simp add: not_lt_iff_le nth_eq_0)
   739 apply (simp add: not_lt_iff_le nth_eq_0)
   740 done
   740 done
   741 
   741 
   742 constdefs
   742 definition
   743   is_nth :: "[i=>o,i,i,i] => o"
   743   is_nth :: "[i=>o,i,i,i] => o"
   744     "is_nth(M,n,l,Z) ==
   744     "is_nth(M,n,l,Z) ==
   745       \<exists>X[M]. is_iterates(M, is_tl(M), l, n, X) & is_hd(M,X,Z)"
   745       \<exists>X[M]. is_iterates(M, is_tl(M), l, n, X) & is_hd(M,X,Z)"
   746 
   746 
   747 lemma (in M_datatypes) nth_abs [simp]:
   747 lemma (in M_datatypes) nth_abs [simp]:
   755 done
   755 done
   756 
   756 
   757 
   757 
   758 subsection{*Relativization and Absoluteness for the @{term formula} Constructors*}
   758 subsection{*Relativization and Absoluteness for the @{term formula} Constructors*}
   759 
   759 
   760 constdefs
   760 definition
   761   is_Member :: "[i=>o,i,i,i] => o"
   761   is_Member :: "[i=>o,i,i,i] => o"
   762      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   762      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   763     "is_Member(M,x,y,Z) ==
   763     "is_Member(M,x,y,Z) ==
   764 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)"
   764 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)"
   765 
   765 
   769 
   769 
   770 lemma (in M_trivial) Member_in_M_iff [iff]:
   770 lemma (in M_trivial) Member_in_M_iff [iff]:
   771      "M(Member(x,y)) <-> M(x) & M(y)"
   771      "M(Member(x,y)) <-> M(x) & M(y)"
   772 by (simp add: Member_def)
   772 by (simp add: Member_def)
   773 
   773 
   774 constdefs
   774 definition
   775   is_Equal :: "[i=>o,i,i,i] => o"
   775   is_Equal :: "[i=>o,i,i,i] => o"
   776      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   776      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   777     "is_Equal(M,x,y,Z) ==
   777     "is_Equal(M,x,y,Z) ==
   778 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)"
   778 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)"
   779 
   779 
   782 by (simp add: is_Equal_def Equal_def)
   782 by (simp add: is_Equal_def Equal_def)
   783 
   783 
   784 lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   784 lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   785 by (simp add: Equal_def)
   785 by (simp add: Equal_def)
   786 
   786 
   787 constdefs
   787 definition
   788   is_Nand :: "[i=>o,i,i,i] => o"
   788   is_Nand :: "[i=>o,i,i,i] => o"
   789      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   789      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   790     "is_Nand(M,x,y,Z) ==
   790     "is_Nand(M,x,y,Z) ==
   791 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)"
   791 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)"
   792 
   792 
   795 by (simp add: is_Nand_def Nand_def)
   795 by (simp add: is_Nand_def Nand_def)
   796 
   796 
   797 lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   797 lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   798 by (simp add: Nand_def)
   798 by (simp add: Nand_def)
   799 
   799 
   800 constdefs
   800 definition
   801   is_Forall :: "[i=>o,i,i] => o"
   801   is_Forall :: "[i=>o,i,i] => o"
   802      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
   802      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
   803     "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)"
   803     "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)"
   804 
   804 
   805 lemma (in M_trivial) Forall_abs [simp]:
   805 lemma (in M_trivial) Forall_abs [simp]:
   811 
   811 
   812 
   812 
   813 
   813 
   814 subsection {*Absoluteness for @{term formula_rec}*}
   814 subsection {*Absoluteness for @{term formula_rec}*}
   815 
   815 
   816 constdefs
   816 definition
   817 
   817 
   818   formula_rec_case :: "[[i,i]=>i, [i,i]=>i, [i,i,i,i]=>i, [i,i]=>i, i, i] => i"
   818   formula_rec_case :: "[[i,i]=>i, [i,i]=>i, [i,i,i,i]=>i, [i,i]=>i, i, i] => i"
   819     --{* the instance of @{term formula_case} in @{term formula_rec}*}
   819     --{* the instance of @{term formula_case} in @{term formula_rec}*}
   820    "formula_rec_case(a,b,c,d,h) ==
   820    "formula_rec_case(a,b,c,d,h) ==
   821         formula_case (a, b,
   821         formula_case (a, b,
   845 apply (simp add: formula_imp_formula_N formula.intros)
   845 apply (simp add: formula_imp_formula_N formula.intros)
   846 done
   846 done
   847 
   847 
   848 
   848 
   849 subsubsection{*Absoluteness for the Formula Operator @{term depth}*}
   849 subsubsection{*Absoluteness for the Formula Operator @{term depth}*}
   850 constdefs
   850 definition
   851 
   851 
   852   is_depth :: "[i=>o,i,i] => o"
   852   is_depth :: "[i=>o,i,i] => o"
   853     "is_depth(M,p,n) ==
   853     "is_depth(M,p,n) ==
   854        \<exists>sn[M]. \<exists>formula_n[M]. \<exists>formula_sn[M].
   854        \<exists>sn[M]. \<exists>formula_n[M]. \<exists>formula_sn[M].
   855         is_formula_N(M,n,formula_n) & p \<notin> formula_n &
   855         is_formula_N(M,n,formula_n) & p \<notin> formula_n &
   871 by (simp add: nat_into_M)
   871 by (simp add: nat_into_M)
   872 
   872 
   873 
   873 
   874 subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*}
   874 subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*}
   875 
   875 
   876 constdefs
   876 definition
   877 
   877 
   878  is_formula_case ::
   878  is_formula_case ::
   879     "[i=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i]=>o, i, i] => o"
   879     "[i=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i]=>o, i, i] => o"
   880   --{*no constraint on non-formulas*}
   880   --{*no constraint on non-formulas*}
   881   "is_formula_case(M, is_a, is_b, is_c, is_d, p, z) ==
   881   "is_formula_case(M, is_a, is_b, is_c, is_d, p, z) ==
   907 by (erule formula.cases, simp_all)
   907 by (erule formula.cases, simp_all)
   908 
   908 
   909 
   909 
   910 subsubsection {*Absoluteness for @{term formula_rec}: Final Results*}
   910 subsubsection {*Absoluteness for @{term formula_rec}: Final Results*}
   911 
   911 
   912 constdefs
   912 definition
   913   is_formula_rec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   913   is_formula_rec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   914     --{* predicate to relativize the functional @{term formula_rec}*}
   914     --{* predicate to relativize the functional @{term formula_rec}*}
   915    "is_formula_rec(M,MH,p,z)  ==
   915    "is_formula_rec(M,MH,p,z)  ==
   916       \<exists>dp[M]. \<exists>i[M]. \<exists>f[M]. finite_ordinal(M,dp) & is_depth(M,p,dp) &
   916       \<exists>dp[M]. \<exists>i[M]. \<exists>f[M]. finite_ordinal(M,dp) & is_depth(M,p,dp) &
   917              successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)"
   917              successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)"