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 |