changeset 21233 | 5a5c8ea5f66a |
parent 16417 | 9bc16273c2d4 |
child 21404 | eb85850d3eb7 |
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)" |