src/ZF/Constructible/Datatype_absolute.thy
changeset 21404 eb85850d3eb7
parent 21233 5a5c8ea5f66a
child 22710 f44439cdce77
equal deleted inserted replaced
21403:dd58f13a8eb4 21404:eb85850d3eb7
     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 definition
    13 definition
    14   directed :: "i=>o"
    14   directed :: "i=>o" where
    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 definition
       
    18   contin :: "(i=>i) => o" where
    18    "contin(h) == (\<forall>A. directed(A) --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))"
    19    "contin(h) == (\<forall>A. directed(A) --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))"
    19 
    20 
    20 lemma bnd_mono_iterates_subset: "[|bnd_mono(D, h); n \<in> nat|] ==> h^n (0) <= D"
    21 lemma bnd_mono_iterates_subset: "[|bnd_mono(D, h); n \<in> nat|] ==> h^n (0) <= D"
    21 apply (induct_tac n) 
    22 apply (induct_tac n) 
    22  apply (simp_all add: bnd_mono_def, blast) 
    23  apply (simp_all add: bnd_mono_def, blast) 
   112 
   113 
   113 
   114 
   114 subsection {*Absoluteness for "Iterates"*}
   115 subsection {*Absoluteness for "Iterates"*}
   115 
   116 
   116 definition
   117 definition
   117 
   118   iterates_MH :: "[i=>o, [i,i]=>o, i, i, i, i] => o" where
   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)"
   122 
   122 
   123   is_iterates :: "[i=>o, [i,i]=>o, i, i, i] => o"
   123 definition
       
   124   is_iterates :: "[i=>o, [i,i]=>o, i, i, i] => o" where
   124     "is_iterates(M,isF,v,n,Z) == 
   125     "is_iterates(M,isF,v,n,Z) == 
   125       \<exists>sn[M]. \<exists>msn[M]. successor(M,n,sn) & membership(M,sn,msn) &
   126       \<exists>sn[M]. \<exists>msn[M]. successor(M,n,sn) & membership(M,sn,msn) &
   126                        is_wfrec(M, iterates_MH(M,isF,v), msn, n, Z)"
   127                        is_wfrec(M, iterates_MH(M,isF,v), msn, n, Z)"
   127 
   128 
   128   iterates_replacement :: "[i=>o, [i,i]=>o, i] => o"
   129 definition
       
   130   iterates_replacement :: "[i=>o, [i,i]=>o, i] => o" where
   129    "iterates_replacement(M,isF,v) ==
   131    "iterates_replacement(M,isF,v) ==
   130       \<forall>n[M]. n\<in>nat --> 
   132       \<forall>n[M]. n\<in>nat --> 
   131          wfrec_replacement(M, iterates_MH(M,isF,v), Memrel(succ(n)))"
   133          wfrec_replacement(M, iterates_MH(M,isF,v), Memrel(succ(n)))"
   132 
   134 
   133 lemma (in M_basic) iterates_MH_abs:
   135 lemma (in M_basic) iterates_MH_abs:
   206      "list(A) = (\<Union>n\<in>nat. (\<lambda>X. {0} + A*X) ^ n (0))"
   208      "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)
   209 by (simp add: list_eq_lfp2 lfp_eq_Union list_fun_bnd_mono list_fun_contin)
   208 
   210 
   209 
   211 
   210 definition
   212 definition
   211   is_list_functor :: "[i=>o,i,i,i] => o"
   213   is_list_functor :: "[i=>o,i,i,i] => o" where
   212     "is_list_functor(M,A,X,Z) == 
   214     "is_list_functor(M,A,X,Z) == 
   213         \<exists>n1[M]. \<exists>AX[M]. 
   215         \<exists>n1[M]. \<exists>AX[M]. 
   214          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   216          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)"
   215 
   217 
   216 lemma (in M_basic) list_functor_abs [simp]: 
   218 lemma (in M_basic) list_functor_abs [simp]: 
   259 by (simp add: formula_eq_lfp2 lfp_eq_Union formula_fun_bnd_mono 
   261 by (simp add: formula_eq_lfp2 lfp_eq_Union formula_fun_bnd_mono 
   260               formula_fun_contin)
   262               formula_fun_contin)
   261 
   263 
   262 
   264 
   263 definition
   265 definition
   264   is_formula_functor :: "[i=>o,i,i] => o"
   266   is_formula_functor :: "[i=>o,i,i] => o" where
   265     "is_formula_functor(M,X,Z) == 
   267     "is_formula_functor(M,X,Z) == 
   266         \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. 
   268         \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. 
   267           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   269           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
   268           is_sum(M,natnat,natnat,natnatsum) &
   270           is_sum(M,natnat,natnat,natnatsum) &
   269           cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & 
   271           cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & 
   277 
   279 
   278 
   280 
   279 subsection{*@{term M} Contains the List and Formula Datatypes*}
   281 subsection{*@{term M} Contains the List and Formula Datatypes*}
   280 
   282 
   281 definition
   283 definition
   282   list_N :: "[i,i] => i"
   284   list_N :: "[i,i] => i" where
   283     "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)"
   285     "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)"
   284 
   286 
   285 lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))"
   287 lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))"
   286 by (simp add: list_N_def Nil_def)
   288 by (simp add: list_N_def Nil_def)
   287 
   289 
   338 apply (subst transrec) 
   340 apply (subst transrec) 
   339 apply (simp add: list_imp_list_N) 
   341 apply (simp add: list_imp_list_N) 
   340 done
   342 done
   341 
   343 
   342 definition
   344 definition
   343   is_list_N :: "[i=>o,i,i,i] => o"
   345   is_list_N :: "[i=>o,i,i,i] => o" where
   344     "is_list_N(M,A,n,Z) == 
   346     "is_list_N(M,A,n,Z) == 
   345       \<exists>zero[M]. empty(M,zero) & 
   347       \<exists>zero[M]. empty(M,zero) & 
   346                 is_iterates(M, is_list_functor(M,A), zero, n, Z)"
   348                 is_iterates(M, is_list_functor(M,A), zero, n, Z)"
   347   
   349 
   348   mem_list :: "[i=>o,i,i] => o"
   350 definition  
       
   351   mem_list :: "[i=>o,i,i] => o" where
   349     "mem_list(M,A,l) == 
   352     "mem_list(M,A,l) == 
   350       \<exists>n[M]. \<exists>listn[M]. 
   353       \<exists>n[M]. \<exists>listn[M]. 
   351        finite_ordinal(M,n) & is_list_N(M,A,n,listn) & l \<in> listn"
   354        finite_ordinal(M,n) & is_list_N(M,A,n,listn) & l \<in> listn"
   352 
   355 
   353   is_list :: "[i=>o,i,i] => o"
   356 definition
       
   357   is_list :: "[i=>o,i,i] => o" where
   354     "is_list(M,A,Z) == \<forall>l[M]. l \<in> Z <-> mem_list(M,A,l)"
   358     "is_list(M,A,Z) == \<forall>l[M]. l \<in> Z <-> mem_list(M,A,l)"
   355 
   359 
   356 subsubsection{*Towards Absoluteness of @{term formula_rec}*}
   360 subsubsection{*Towards Absoluteness of @{term formula_rec}*}
   357 
   361 
   358 consts   depth :: "i=>i"
   362 consts   depth :: "i=>i"
   365 lemma depth_type [TC]: "p \<in> formula ==> depth(p) \<in> nat"
   369 lemma depth_type [TC]: "p \<in> formula ==> depth(p) \<in> nat"
   366 by (induct_tac p, simp_all) 
   370 by (induct_tac p, simp_all) 
   367 
   371 
   368 
   372 
   369 definition
   373 definition
   370   formula_N :: "i => i"
   374   formula_N :: "i => i" where
   371     "formula_N(n) == (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0)"
   375     "formula_N(n) == (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0)"
   372 
   376 
   373 lemma Member_in_formula_N [simp]:
   377 lemma Member_in_formula_N [simp]:
   374      "Member(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat"
   378      "Member(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat"
   375 by (simp add: formula_N_def Member_def) 
   379 by (simp add: formula_N_def Member_def) 
   440 apply (simp_all add: subset_Un_iff [THEN iffD1] subset_Un_iff2 [THEN iffD1] 
   444 apply (simp_all add: subset_Un_iff [THEN iffD1] subset_Un_iff2 [THEN iffD1] 
   441                      le_imp_subset formula_N_mono)
   445                      le_imp_subset formula_N_mono)
   442 done
   446 done
   443 
   447 
   444 definition
   448 definition
   445   is_formula_N :: "[i=>o,i,i] => o"
   449   is_formula_N :: "[i=>o,i,i] => o" where
   446     "is_formula_N(M,n,Z) == 
   450     "is_formula_N(M,n,Z) == 
   447       \<exists>zero[M]. empty(M,zero) & 
   451       \<exists>zero[M]. empty(M,zero) & 
   448                 is_iterates(M, is_formula_functor(M), zero, n, Z)"
   452                 is_iterates(M, is_formula_functor(M), zero, n, Z)"
   449 
   453 
   450 
   454 
   451 definition
   455 definition  
   452   
   456   mem_formula :: "[i=>o,i] => o" where
   453   mem_formula :: "[i=>o,i] => o"
       
   454     "mem_formula(M,p) == 
   457     "mem_formula(M,p) == 
   455       \<exists>n[M]. \<exists>formn[M]. 
   458       \<exists>n[M]. \<exists>formn[M]. 
   456        finite_ordinal(M,n) & is_formula_N(M,n,formn) & p \<in> formn"
   459        finite_ordinal(M,n) & is_formula_N(M,n,formn) & p \<in> formn"
   457 
   460 
   458   is_formula :: "[i=>o,i] => o"
   461 definition
       
   462   is_formula :: "[i=>o,i] => o" where
   459     "is_formula(M,Z) == \<forall>p[M]. p \<in> Z <-> mem_formula(M,p)"
   463     "is_formula(M,Z) == \<forall>p[M]. p \<in> Z <-> mem_formula(M,p)"
   460 
   464 
   461 locale M_datatypes = M_trancl +
   465 locale M_datatypes = M_trancl +
   462  assumes list_replacement1:
   466  assumes list_replacement1:
   463    "M(A) ==> iterates_replacement(M, is_list_functor(M,A), 0)"
   467    "M(A) ==> iterates_replacement(M, is_list_functor(M,A), 0)"
   583 apply (simp add: nat_rec_0)
   587 apply (simp add: nat_rec_0)
   584 apply (simp add: nat_rec_succ)
   588 apply (simp add: nat_rec_succ)
   585 done
   589 done
   586 
   590 
   587 definition
   591 definition
   588   is_eclose_n :: "[i=>o,i,i,i] => o"
   592   is_eclose_n :: "[i=>o,i,i,i] => o" where
   589     "is_eclose_n(M,A,n,Z) == is_iterates(M, big_union(M), A, n, Z)"
   593     "is_eclose_n(M,A,n,Z) == is_iterates(M, big_union(M), A, n, Z)"
   590 
   594 
   591   mem_eclose :: "[i=>o,i,i] => o"
   595 definition
       
   596   mem_eclose :: "[i=>o,i,i] => o" where
   592     "mem_eclose(M,A,l) ==
   597     "mem_eclose(M,A,l) ==
   593       \<exists>n[M]. \<exists>eclosen[M].
   598       \<exists>n[M]. \<exists>eclosen[M].
   594        finite_ordinal(M,n) & is_eclose_n(M,A,n,eclosen) & l \<in> eclosen"
   599        finite_ordinal(M,n) & is_eclose_n(M,A,n,eclosen) & l \<in> eclosen"
   595 
   600 
   596   is_eclose :: "[i=>o,i,i] => o"
   601 definition
       
   602   is_eclose :: "[i=>o,i,i] => o" where
   597     "is_eclose(M,A,Z) == \<forall>u[M]. u \<in> Z <-> mem_eclose(M,A,u)"
   603     "is_eclose(M,A,Z) == \<forall>u[M]. u \<in> Z <-> mem_eclose(M,A,u)"
   598 
   604 
   599 
   605 
   600 locale M_eclose = M_datatypes +
   606 locale M_eclose = M_datatypes +
   601  assumes eclose_replacement1:
   607  assumes eclose_replacement1:
   641 
   647 
   642 
   648 
   643 subsection {*Absoluteness for @{term transrec}*}
   649 subsection {*Absoluteness for @{term transrec}*}
   644 
   650 
   645 text{* @{term "transrec(a,H) \<equiv> wfrec(Memrel(eclose({a})), a, H)"} *}
   651 text{* @{term "transrec(a,H) \<equiv> wfrec(Memrel(eclose({a})), a, H)"} *}
   646 definition
   652 
   647 
   653 definition
   648   is_transrec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   654   is_transrec :: "[i=>o, [i,i,i]=>o, i, i] => o" where
   649    "is_transrec(M,MH,a,z) ==
   655    "is_transrec(M,MH,a,z) ==
   650       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   656       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   651        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   657        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   652        is_wfrec(M,MH,mesa,a,z)"
   658        is_wfrec(M,MH,mesa,a,z)"
   653 
   659 
   654   transrec_replacement :: "[i=>o, [i,i,i]=>o, i] => o"
   660 definition
       
   661   transrec_replacement :: "[i=>o, [i,i,i]=>o, i] => o" where
   655    "transrec_replacement(M,MH,a) ==
   662    "transrec_replacement(M,MH,a) ==
   656       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   663       \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M].
   657        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   664        upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) &
   658        wfrec_replacement(M,MH,mesa)"
   665        wfrec_replacement(M,MH,mesa)"
   659 
   666 
   690 
   697 
   691 subsection{*Absoluteness for the List Operator @{term length}*}
   698 subsection{*Absoluteness for the List Operator @{term length}*}
   692 text{*But it is never used.*}
   699 text{*But it is never used.*}
   693 
   700 
   694 definition
   701 definition
   695   is_length :: "[i=>o,i,i,i] => o"
   702   is_length :: "[i=>o,i,i,i] => o" where
   696     "is_length(M,A,l,n) ==
   703     "is_length(M,A,l,n) ==
   697        \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M].
   704        \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M].
   698         is_list_N(M,A,n,list_n) & l \<notin> list_n &
   705         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"
   706         successor(M,n,sn) & is_list_N(M,A,sn,list_sn) & l \<in> list_sn"
   700 
   707 
   738  apply (blast intro: nth_type transM)
   745  apply (blast intro: nth_type transM)
   739 apply (simp add: not_lt_iff_le nth_eq_0)
   746 apply (simp add: not_lt_iff_le nth_eq_0)
   740 done
   747 done
   741 
   748 
   742 definition
   749 definition
   743   is_nth :: "[i=>o,i,i,i] => o"
   750   is_nth :: "[i=>o,i,i,i] => o" where
   744     "is_nth(M,n,l,Z) ==
   751     "is_nth(M,n,l,Z) ==
   745       \<exists>X[M]. is_iterates(M, is_tl(M), l, n, X) & is_hd(M,X,Z)"
   752       \<exists>X[M]. is_iterates(M, is_tl(M), l, n, X) & is_hd(M,X,Z)"
   746 
   753 
   747 lemma (in M_datatypes) nth_abs [simp]:
   754 lemma (in M_datatypes) nth_abs [simp]:
   748      "[|M(A); n \<in> nat; l \<in> list(A); M(Z)|]
   755      "[|M(A); n \<in> nat; l \<in> list(A); M(Z)|]
   756 
   763 
   757 
   764 
   758 subsection{*Relativization and Absoluteness for the @{term formula} Constructors*}
   765 subsection{*Relativization and Absoluteness for the @{term formula} Constructors*}
   759 
   766 
   760 definition
   767 definition
   761   is_Member :: "[i=>o,i,i,i] => o"
   768   is_Member :: "[i=>o,i,i,i] => o" where
   762      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   769      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
   763     "is_Member(M,x,y,Z) ==
   770     "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)"
   771 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)"
   765 
   772 
   766 lemma (in M_trivial) Member_abs [simp]:
   773 lemma (in M_trivial) Member_abs [simp]:
   770 lemma (in M_trivial) Member_in_M_iff [iff]:
   777 lemma (in M_trivial) Member_in_M_iff [iff]:
   771      "M(Member(x,y)) <-> M(x) & M(y)"
   778      "M(Member(x,y)) <-> M(x) & M(y)"
   772 by (simp add: Member_def)
   779 by (simp add: Member_def)
   773 
   780 
   774 definition
   781 definition
   775   is_Equal :: "[i=>o,i,i,i] => o"
   782   is_Equal :: "[i=>o,i,i,i] => o" where
   776      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   783      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
   777     "is_Equal(M,x,y,Z) ==
   784     "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)"
   785 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)"
   779 
   786 
   780 lemma (in M_trivial) Equal_abs [simp]:
   787 lemma (in M_trivial) Equal_abs [simp]:
   783 
   790 
   784 lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   791 lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)"
   785 by (simp add: Equal_def)
   792 by (simp add: Equal_def)
   786 
   793 
   787 definition
   794 definition
   788   is_Nand :: "[i=>o,i,i,i] => o"
   795   is_Nand :: "[i=>o,i,i,i] => o" where
   789      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   796      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
   790     "is_Nand(M,x,y,Z) ==
   797     "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)"
   798 	\<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)"
   792 
   799 
   793 lemma (in M_trivial) Nand_abs [simp]:
   800 lemma (in M_trivial) Nand_abs [simp]:
   796 
   803 
   797 lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   804 lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)"
   798 by (simp add: Nand_def)
   805 by (simp add: Nand_def)
   799 
   806 
   800 definition
   807 definition
   801   is_Forall :: "[i=>o,i,i] => o"
   808   is_Forall :: "[i=>o,i,i] => o" where
   802      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
   809      --{* 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)"
   810     "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)"
   804 
   811 
   805 lemma (in M_trivial) Forall_abs [simp]:
   812 lemma (in M_trivial) Forall_abs [simp]:
   806      "[|M(x); M(Z)|] ==> is_Forall(M,x,Z) <-> (Z = Forall(x))"
   813      "[|M(x); M(Z)|] ==> is_Forall(M,x,Z) <-> (Z = Forall(x))"
   812 
   819 
   813 
   820 
   814 subsection {*Absoluteness for @{term formula_rec}*}
   821 subsection {*Absoluteness for @{term formula_rec}*}
   815 
   822 
   816 definition
   823 definition
   817 
   824   formula_rec_case :: "[[i,i]=>i, [i,i]=>i, [i,i,i,i]=>i, [i,i]=>i, i, i] => i" where
   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}*}
   825     --{* the instance of @{term formula_case} in @{term formula_rec}*}
   820    "formula_rec_case(a,b,c,d,h) ==
   826    "formula_rec_case(a,b,c,d,h) ==
   821         formula_case (a, b,
   827         formula_case (a, b,
   822                 \<lambda>u v. c(u, v, h ` succ(depth(u)) ` u,
   828                 \<lambda>u v. c(u, v, h ` succ(depth(u)) ` u,
   823                               h ` succ(depth(v)) ` v),
   829                               h ` succ(depth(v)) ` v),
   845 apply (simp add: formula_imp_formula_N formula.intros)
   851 apply (simp add: formula_imp_formula_N formula.intros)
   846 done
   852 done
   847 
   853 
   848 
   854 
   849 subsubsection{*Absoluteness for the Formula Operator @{term depth}*}
   855 subsubsection{*Absoluteness for the Formula Operator @{term depth}*}
   850 definition
   856 
   851 
   857 definition
   852   is_depth :: "[i=>o,i,i] => o"
   858   is_depth :: "[i=>o,i,i] => o" where
   853     "is_depth(M,p,n) ==
   859     "is_depth(M,p,n) ==
   854        \<exists>sn[M]. \<exists>formula_n[M]. \<exists>formula_sn[M].
   860        \<exists>sn[M]. \<exists>formula_n[M]. \<exists>formula_sn[M].
   855         is_formula_N(M,n,formula_n) & p \<notin> formula_n &
   861         is_formula_N(M,n,formula_n) & p \<notin> formula_n &
   856         successor(M,n,sn) & is_formula_N(M,sn,formula_sn) & p \<in> formula_sn"
   862         successor(M,n,sn) & is_formula_N(M,sn,formula_sn) & p \<in> formula_sn"
   857 
   863 
   872 
   878 
   873 
   879 
   874 subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*}
   880 subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*}
   875 
   881 
   876 definition
   882 definition
   877 
       
   878  is_formula_case ::
   883  is_formula_case ::
   879     "[i=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i]=>o, i, i] => o"
   884     "[i=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i]=>o, i, i] => o" where
   880   --{*no constraint on non-formulas*}
   885   --{*no constraint on non-formulas*}
   881   "is_formula_case(M, is_a, is_b, is_c, is_d, p, z) ==
   886   "is_formula_case(M, is_a, is_b, is_c, is_d, p, z) ==
   882       (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) -->
   887       (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) -->
   883                       is_Member(M,x,y,p) --> is_a(x,y,z)) &
   888                       is_Member(M,x,y,p) --> is_a(x,y,z)) &
   884       (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) -->
   889       (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) -->
   908 
   913 
   909 
   914 
   910 subsubsection {*Absoluteness for @{term formula_rec}: Final Results*}
   915 subsubsection {*Absoluteness for @{term formula_rec}: Final Results*}
   911 
   916 
   912 definition
   917 definition
   913   is_formula_rec :: "[i=>o, [i,i,i]=>o, i, i] => o"
   918   is_formula_rec :: "[i=>o, [i,i,i]=>o, i, i] => o" where
   914     --{* predicate to relativize the functional @{term formula_rec}*}
   919     --{* predicate to relativize the functional @{term formula_rec}*}
   915    "is_formula_rec(M,MH,p,z)  ==
   920    "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) &
   921       \<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)"
   922              successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)"
   918 
   923