src/ZF/Constructible/Rec_Separation.thy
changeset 13386 f3e9e8b21aba
parent 13385 31df66ca0780
child 13387 b7464ca2ebbb
equal deleted inserted replaced
13385:31df66ca0780 13386:f3e9e8b21aba
   560 apply (simp only: is_sum_def setclass_simps)
   560 apply (simp only: is_sum_def setclass_simps)
   561 apply (intro FOL_reflections function_reflections cartprod_reflection)  
   561 apply (intro FOL_reflections function_reflections cartprod_reflection)  
   562 done
   562 done
   563 
   563 
   564 
   564 
   565 subsubsection{*The List Functor, Internalized*}
       
   566 
       
   567 constdefs list_functor_fm :: "[i,i,i]=>i"
       
   568 (* "is_list_functor(M,A,X,Z) == 
       
   569         \<exists>n1[M]. \<exists>AX[M]. 
       
   570          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)" *)
       
   571     "list_functor_fm(A,X,Z) == 
       
   572        Exists(Exists(
       
   573 	And(number1_fm(1),
       
   574             And(cartprod_fm(A#+2,X#+2,0), sum_fm(1,0,Z#+2)))))"
       
   575 
       
   576 lemma list_functor_type [TC]:
       
   577      "[| x \<in> nat; y \<in> nat; z \<in> nat |] ==> list_functor_fm(x,y,z) \<in> formula"
       
   578 by (simp add: list_functor_fm_def) 
       
   579 
       
   580 lemma arity_list_functor_fm [simp]:
       
   581      "[| x \<in> nat; y \<in> nat; z \<in> nat |] 
       
   582       ==> arity(list_functor_fm(x,y,z)) = succ(x) \<union> succ(y) \<union> succ(z)"
       
   583 by (simp add: list_functor_fm_def succ_Un_distrib [symmetric] Un_ac) 
       
   584 
       
   585 lemma sats_list_functor_fm [simp]:
       
   586    "[| x \<in> nat; y \<in> nat; z \<in> nat; env \<in> list(A)|]
       
   587     ==> sats(A, list_functor_fm(x,y,z), env) <-> 
       
   588         is_list_functor(**A, nth(x,env), nth(y,env), nth(z,env))"
       
   589 by (simp add: list_functor_fm_def is_list_functor_def)
       
   590 
       
   591 lemma list_functor_iff_sats:
       
   592   "[| nth(i,env) = x; nth(j,env) = y; nth(k,env) = z; 
       
   593       i \<in> nat; j \<in> nat; k \<in> nat; env \<in> list(A)|]
       
   594    ==> is_list_functor(**A, x, y, z) <-> sats(A, list_functor_fm(i,j,k), env)"
       
   595 by simp
       
   596 
       
   597 theorem list_functor_reflection:
       
   598      "REFLECTS[\<lambda>x. is_list_functor(L,f(x),g(x),h(x)), 
       
   599                \<lambda>i x. is_list_functor(**Lset(i),f(x),g(x),h(x))]"
       
   600 apply (simp only: is_list_functor_def setclass_simps)
       
   601 apply (intro FOL_reflections number1_reflection
       
   602              cartprod_reflection sum_reflection)  
       
   603 done
       
   604 
       
   605 subsubsection{*The Operator @{term quasinat}*}
   565 subsubsection{*The Operator @{term quasinat}*}
   606 
   566 
   607 (* "is_quasinat(M,z) == empty(M,z) | (\<exists>m[M]. successor(M,m,z))" *)
   567 (* "is_quasinat(M,z) == empty(M,z) | (\<exists>m[M]. successor(M,m,z))" *)
   608 constdefs quasinat_fm :: "i=>i"
   568 constdefs quasinat_fm :: "i=>i"
   609     "quasinat_fm(z) == Or(empty_fm(z), Exists(succ_fm(0,succ(z))))"
   569     "quasinat_fm(z) == Or(empty_fm(z), Exists(succ_fm(0,succ(z))))"
   783 
   743 
   784 
   744 
   785 
   745 
   786 subsection{*@{term L} is Closed Under the Operator @{term list}*} 
   746 subsection{*@{term L} is Closed Under the Operator @{term list}*} 
   787 
   747 
       
   748 subsubsection{*The List Functor, Internalized*}
       
   749 
       
   750 constdefs list_functor_fm :: "[i,i,i]=>i"
       
   751 (* "is_list_functor(M,A,X,Z) == 
       
   752         \<exists>n1[M]. \<exists>AX[M]. 
       
   753          number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)" *)
       
   754     "list_functor_fm(A,X,Z) == 
       
   755        Exists(Exists(
       
   756 	And(number1_fm(1),
       
   757             And(cartprod_fm(A#+2,X#+2,0), sum_fm(1,0,Z#+2)))))"
       
   758 
       
   759 lemma list_functor_type [TC]:
       
   760      "[| x \<in> nat; y \<in> nat; z \<in> nat |] ==> list_functor_fm(x,y,z) \<in> formula"
       
   761 by (simp add: list_functor_fm_def) 
       
   762 
       
   763 lemma arity_list_functor_fm [simp]:
       
   764      "[| x \<in> nat; y \<in> nat; z \<in> nat |] 
       
   765       ==> arity(list_functor_fm(x,y,z)) = succ(x) \<union> succ(y) \<union> succ(z)"
       
   766 by (simp add: list_functor_fm_def succ_Un_distrib [symmetric] Un_ac) 
       
   767 
       
   768 lemma sats_list_functor_fm [simp]:
       
   769    "[| x \<in> nat; y \<in> nat; z \<in> nat; env \<in> list(A)|]
       
   770     ==> sats(A, list_functor_fm(x,y,z), env) <-> 
       
   771         is_list_functor(**A, nth(x,env), nth(y,env), nth(z,env))"
       
   772 by (simp add: list_functor_fm_def is_list_functor_def)
       
   773 
       
   774 lemma list_functor_iff_sats:
       
   775   "[| nth(i,env) = x; nth(j,env) = y; nth(k,env) = z; 
       
   776       i \<in> nat; j \<in> nat; k \<in> nat; env \<in> list(A)|]
       
   777    ==> is_list_functor(**A, x, y, z) <-> sats(A, list_functor_fm(i,j,k), env)"
       
   778 by simp
       
   779 
       
   780 theorem list_functor_reflection:
       
   781      "REFLECTS[\<lambda>x. is_list_functor(L,f(x),g(x),h(x)), 
       
   782                \<lambda>i x. is_list_functor(**Lset(i),f(x),g(x),h(x))]"
       
   783 apply (simp only: is_list_functor_def setclass_simps)
       
   784 apply (intro FOL_reflections number1_reflection
       
   785              cartprod_reflection sum_reflection)  
       
   786 done
       
   787 
       
   788 
       
   789 subsubsection{*Instances of Replacement for Lists*}
       
   790 
   788 lemma list_replacement1_Reflects:
   791 lemma list_replacement1_Reflects:
   789  "REFLECTS
   792  "REFLECTS
   790    [\<lambda>x. \<exists>u[L]. u \<in> B \<and> (\<exists>y[L]. pair(L,u,y,x) \<and>
   793    [\<lambda>x. \<exists>u[L]. u \<in> B \<and> (\<exists>y[L]. pair(L,u,y,x) \<and>
   791          is_wfrec(L, iterates_MH(L, is_list_functor(L,A), 0), memsn, u, y)),
   794          is_wfrec(L, iterates_MH(L, is_list_functor(L,A), 0), memsn, u, y)),
   792     \<lambda>i x. \<exists>u \<in> Lset(i). u \<in> B \<and> (\<exists>y \<in> Lset(i). pair(**Lset(i), u, y, x) \<and>
   795     \<lambda>i x. \<exists>u \<in> Lset(i). u \<in> B \<and> (\<exists>y \<in> Lset(i). pair(**Lset(i), u, y, x) \<and>
   807 apply (subgoal_tac "L(Memrel(succ(n)))") 
   810 apply (subgoal_tac "L(Memrel(succ(n)))") 
   808 apply (rule_tac A="{B,A,n,z,0,Memrel(succ(n))}" in subset_LsetE, blast ) 
   811 apply (rule_tac A="{B,A,n,z,0,Memrel(succ(n))}" in subset_LsetE, blast ) 
   809 apply (rule ReflectsE [OF list_replacement1_Reflects], assumption)
   812 apply (rule ReflectsE [OF list_replacement1_Reflects], assumption)
   810 apply (drule subset_Lset_ltD, assumption) 
   813 apply (drule subset_Lset_ltD, assumption) 
   811 apply (erule reflection_imp_L_separation)
   814 apply (erule reflection_imp_L_separation)
   812   apply (simp_all add: lt_Ord2)
   815   apply (simp_all add: lt_Ord2 Memrel_closed)
       
   816 apply (elim conjE) 
   813 apply (rule DPow_LsetI)
   817 apply (rule DPow_LsetI)
   814 apply (rename_tac v) 
   818 apply (rename_tac v) 
   815 apply (rule bex_iff_sats conj_iff_sats)+
   819 apply (rule bex_iff_sats conj_iff_sats)+
   816 apply (rule_tac env = "[u,v,A,n,B,0,Memrel(succ(n))]" in mem_iff_sats)
   820 apply (rule_tac env = "[u,v,A,n,B,0,Memrel(succ(n))]" in mem_iff_sats)
   817 apply (rule sep_rules | simp)+
   821 apply (rule sep_rules | simp)+
   818 txt{*Can't get sat rules to work for higher-order operators, so just expand them!*}
   822 txt{*Can't get sat rules to work for higher-order operators, so just expand them!*}
   819 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
   823 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
   820 apply (rule sep_rules list_functor_iff_sats quasinat_iff_sats | simp)+
   824 apply (rule sep_rules list_functor_iff_sats quasinat_iff_sats | simp)+
   821 apply (simp_all add: succ_Un_distrib [symmetric] Memrel_closed)
       
   822 done
   825 done
   823 
   826 
   824 
   827 
   825 lemma list_replacement2_Reflects:
   828 lemma list_replacement2_Reflects:
   826  "REFLECTS
   829  "REFLECTS
   862 apply (rule sep_rules | simp)+
   865 apply (rule sep_rules | simp)+
   863 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
   866 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
   864 apply (rule sep_rules list_functor_iff_sats quasinat_iff_sats | simp)+
   867 apply (rule sep_rules list_functor_iff_sats quasinat_iff_sats | simp)+
   865 done
   868 done
   866 
   869 
       
   870 
       
   871 subsection{*@{term L} is Closed Under the Operator @{term formula}*} 
       
   872 
       
   873 subsubsection{*The Formula Functor, Internalized*}
       
   874 
       
   875 constdefs formula_functor_fm :: "[i,i]=>i"
       
   876 (*     "is_formula_functor(M,X,Z) == 
       
   877         \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. \<exists>X4[M]. 
       
   878           5          4              3          2       1       0
       
   879           omega(M,nat') & cartprod(M,nat',nat',natnat) & 
       
   880           is_sum(M,natnat,natnat,natnatsum) &
       
   881           cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & is_sum(M,X,X3,X4) &
       
   882           is_sum(M,natnatsum,X4,Z)" *) 
       
   883     "formula_functor_fm(X,Z) == 
       
   884        Exists(Exists(Exists(Exists(Exists(Exists(
       
   885 	And(omega_fm(5),
       
   886          And(cartprod_fm(5,5,4),
       
   887           And(sum_fm(4,4,3),
       
   888            And(cartprod_fm(X#+6,X#+6,2),
       
   889             And(sum_fm(2,X#+6,1),
       
   890              And(sum_fm(X#+6,1,0), sum_fm(3,0,Z#+6)))))))))))))"
       
   891 
       
   892 lemma formula_functor_type [TC]:
       
   893      "[| x \<in> nat; y \<in> nat |] ==> formula_functor_fm(x,y) \<in> formula"
       
   894 by (simp add: formula_functor_fm_def) 
       
   895 
       
   896 lemma sats_formula_functor_fm [simp]:
       
   897    "[| x \<in> nat; y \<in> nat; env \<in> list(A)|]
       
   898     ==> sats(A, formula_functor_fm(x,y), env) <-> 
       
   899         is_formula_functor(**A, nth(x,env), nth(y,env))"
       
   900 by (simp add: formula_functor_fm_def is_formula_functor_def)
       
   901 
       
   902 lemma formula_functor_iff_sats:
       
   903   "[| nth(i,env) = x; nth(j,env) = y; 
       
   904       i \<in> nat; j \<in> nat; env \<in> list(A)|]
       
   905    ==> is_formula_functor(**A, x, y) <-> sats(A, formula_functor_fm(i,j), env)"
       
   906 by simp
       
   907 
       
   908 theorem formula_functor_reflection:
       
   909      "REFLECTS[\<lambda>x. is_formula_functor(L,f(x),g(x)), 
       
   910                \<lambda>i x. is_formula_functor(**Lset(i),f(x),g(x))]"
       
   911 apply (simp only: is_formula_functor_def setclass_simps)
       
   912 apply (intro FOL_reflections omega_reflection
       
   913              cartprod_reflection sum_reflection)  
       
   914 done
       
   915 
       
   916 subsubsection{*Instances of Replacement for Formulas*}
       
   917 
       
   918 lemma formula_replacement1_Reflects:
       
   919  "REFLECTS
       
   920    [\<lambda>x. \<exists>u[L]. u \<in> B \<and> (\<exists>y[L]. pair(L,u,y,x) \<and>
       
   921          is_wfrec(L, iterates_MH(L, is_formula_functor(L), 0), memsn, u, y)),
       
   922     \<lambda>i x. \<exists>u \<in> Lset(i). u \<in> B \<and> (\<exists>y \<in> Lset(i). pair(**Lset(i), u, y, x) \<and>
       
   923          is_wfrec(**Lset(i), 
       
   924                   iterates_MH(**Lset(i), 
       
   925                           is_formula_functor(**Lset(i)), 0), memsn, u, y))]"
       
   926 by (intro FOL_reflections function_reflections is_wfrec_reflection 
       
   927           iterates_MH_reflection formula_functor_reflection) 
       
   928 
       
   929 lemma formula_replacement1: 
       
   930    "iterates_replacement(L, is_formula_functor(L), 0)"
       
   931 apply (unfold iterates_replacement_def wfrec_replacement_def, clarify)
       
   932 apply (rule strong_replacementI) 
       
   933 apply (rule rallI)
       
   934 apply (rename_tac B)   
       
   935 apply (rule separation_CollectI) 
       
   936 apply (insert nonempty) 
       
   937 apply (subgoal_tac "L(Memrel(succ(n)))") 
       
   938 apply (rule_tac A="{B,n,z,0,Memrel(succ(n))}" in subset_LsetE, blast ) 
       
   939 apply (rule ReflectsE [OF formula_replacement1_Reflects], assumption)
       
   940 apply (drule subset_Lset_ltD, assumption) 
       
   941 apply (erule reflection_imp_L_separation)
       
   942   apply (simp_all add: lt_Ord2 Memrel_closed)
       
   943 apply (rule DPow_LsetI)
       
   944 apply (rename_tac v) 
       
   945 apply (rule bex_iff_sats conj_iff_sats)+
       
   946 apply (rule_tac env = "[u,v,n,B,0,Memrel(succ(n))]" in mem_iff_sats)
       
   947 apply (rule sep_rules | simp)+
       
   948 txt{*Can't get sat rules to work for higher-order operators, so just expand them!*}
       
   949 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
       
   950 apply (rule sep_rules formula_functor_iff_sats quasinat_iff_sats | simp)+
       
   951 txt{*SLOW: like 40 seconds!*}
       
   952 done
       
   953 
       
   954 lemma formula_replacement2_Reflects:
       
   955  "REFLECTS
       
   956    [\<lambda>x. \<exists>u[L]. u \<in> B \<and> u \<in> nat \<and>
       
   957          (\<exists>sn[L]. \<exists>msn[L]. successor(L, u, sn) \<and> membership(L, sn, msn) \<and>
       
   958            is_wfrec (L, iterates_MH (L, is_formula_functor(L), 0),
       
   959                               msn, u, x)),
       
   960     \<lambda>i x. \<exists>u \<in> Lset(i). u \<in> B \<and> u \<in> nat \<and>
       
   961          (\<exists>sn \<in> Lset(i). \<exists>msn \<in> Lset(i). 
       
   962           successor(**Lset(i), u, sn) \<and> membership(**Lset(i), sn, msn) \<and>
       
   963            is_wfrec (**Lset(i), 
       
   964                  iterates_MH (**Lset(i), is_formula_functor(**Lset(i)), 0),
       
   965                      msn, u, x))]"
       
   966 by (intro FOL_reflections function_reflections is_wfrec_reflection 
       
   967           iterates_MH_reflection formula_functor_reflection) 
       
   968 
       
   969 
       
   970 lemma formula_replacement2: 
       
   971    "strong_replacement(L, 
       
   972          \<lambda>n y. n\<in>nat & 
       
   973                (\<exists>sn[L]. \<exists>msn[L]. successor(L,n,sn) & membership(L,sn,msn) &
       
   974                is_wfrec(L, iterates_MH(L,is_formula_functor(L), 0), 
       
   975                         msn, n, y)))"
       
   976 apply (rule strong_replacementI) 
       
   977 apply (rule rallI)
       
   978 apply (rename_tac B)   
       
   979 apply (rule separation_CollectI) 
       
   980 apply (insert nonempty) 
       
   981 apply (rule_tac A="{B,z,0,nat}" in subset_LsetE) 
       
   982 apply (blast intro: L_nat) 
       
   983 apply (rule ReflectsE [OF formula_replacement2_Reflects], assumption)
       
   984 apply (drule subset_Lset_ltD, assumption) 
       
   985 apply (erule reflection_imp_L_separation)
       
   986   apply (simp_all add: lt_Ord2)
       
   987 apply (rule DPow_LsetI)
       
   988 apply (rename_tac v) 
       
   989 apply (rule bex_iff_sats conj_iff_sats)+
       
   990 apply (rule_tac env = "[u,v,B,0,nat]" in mem_iff_sats)
       
   991 apply (rule sep_rules | simp)+
       
   992 apply (simp add: is_wfrec_def M_is_recfun_def iterates_MH_def is_nat_case_def)
       
   993 apply (rule sep_rules formula_functor_iff_sats quasinat_iff_sats | simp)+
       
   994 done
       
   995 
       
   996 text{*NB The proofs for type @{term formula} are virtually identical to those
       
   997 for @{term "list(A)"}.  It was a cut-and-paste job! *}
       
   998 
   867 end
   999 end