| author | wenzelm | 
| Mon, 07 Jun 2010 21:48:24 +0200 | |
| changeset 37365 | 82b8343cd998 | 
| parent 32960 | 69916a850301 | 
| child 46823 | 57bf0cecb366 | 
| permissions | -rw-r--r-- | 
| 13505 | 1 | (* Title: ZF/Constructible/Datatype_absolute.thy | 
| 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 3 | *) | |
| 4 | ||
| 13306 | 5 | header {*Absoluteness Properties for Recursive Datatypes*}
 | 
| 6 | ||
| 16417 | 7 | theory Datatype_absolute imports Formula WF_absolute begin | 
| 13268 | 8 | |
| 9 | ||
| 10 | subsection{*The lfp of a continuous function can be expressed as a union*}
 | |
| 11 | ||
| 21233 | 12 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 13 | directed :: "i=>o" where | 
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 14 | "directed(A) == A\<noteq>0 & (\<forall>x\<in>A. \<forall>y\<in>A. x \<union> y \<in> A)" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 15 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 16 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 17 | contin :: "(i=>i) => o" where | 
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 18 | "contin(h) == (\<forall>A. directed(A) --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))" | 
| 13268 | 19 | |
| 20 | lemma bnd_mono_iterates_subset: "[|bnd_mono(D, h); n \<in> nat|] ==> h^n (0) <= D" | |
| 21 | apply (induct_tac n) | |
| 22 | apply (simp_all add: bnd_mono_def, blast) | |
| 23 | done | |
| 24 | ||
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 25 | lemma bnd_mono_increasing [rule_format]: | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 26 | "[|i \<in> nat; j \<in> nat; bnd_mono(D,h)|] ==> i \<le> j --> h^i(0) \<subseteq> h^j(0)" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 27 | apply (rule_tac m=i and n=j in diff_induct, simp_all) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 28 | apply (blast del: subsetI | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 29 | intro: bnd_mono_iterates_subset bnd_monoD2 [of concl: h]) | 
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 30 | done | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 31 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 32 | lemma directed_iterates: "bnd_mono(D,h) ==> directed({h^n (0). n\<in>nat})"
 | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 33 | apply (simp add: directed_def, clarify) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 34 | apply (rename_tac i j) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 35 | apply (rule_tac x="i \<union> j" in bexI) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 36 | apply (rule_tac i = i and j = j in Ord_linear_le) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 37 | apply (simp_all add: subset_Un_iff [THEN iffD1] le_imp_subset | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 38 | subset_Un_iff2 [THEN iffD1]) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 39 | apply (simp_all add: subset_Un_iff [THEN iff_sym] bnd_mono_increasing | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 40 | subset_Un_iff2 [THEN iff_sym]) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 41 | done | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 42 | |
| 13268 | 43 | |
| 44 | lemma contin_iterates_eq: | |
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 45 | "[|bnd_mono(D, h); contin(h)|] | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 46 | ==> h(\<Union>n\<in>nat. h^n (0)) = (\<Union>n\<in>nat. h^n (0))" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 47 | apply (simp add: contin_def directed_iterates) | 
| 13268 | 48 | apply (rule trans) | 
| 49 | apply (rule equalityI) | |
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 50 | apply (simp_all add: UN_subset_iff) | 
| 13268 | 51 | apply safe | 
| 52 | apply (erule_tac [2] natE) | |
| 53 | apply (rule_tac a="succ(x)" in UN_I) | |
| 54 | apply simp_all | |
| 55 | apply blast | |
| 56 | done | |
| 57 | ||
| 58 | lemma lfp_subset_Union: | |
| 59 | "[|bnd_mono(D, h); contin(h)|] ==> lfp(D,h) <= (\<Union>n\<in>nat. h^n(0))" | |
| 60 | apply (rule lfp_lowerbound) | |
| 61 | apply (simp add: contin_iterates_eq) | |
| 62 | apply (simp add: contin_def bnd_mono_iterates_subset UN_subset_iff) | |
| 63 | done | |
| 64 | ||
| 65 | lemma Union_subset_lfp: | |
| 66 | "bnd_mono(D,h) ==> (\<Union>n\<in>nat. h^n(0)) <= lfp(D,h)" | |
| 67 | apply (simp add: UN_subset_iff) | |
| 68 | apply (rule ballI) | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
13306diff
changeset | 69 | apply (induct_tac n, simp_all) | 
| 13268 | 70 | apply (rule subset_trans [of _ "h(lfp(D,h))"]) | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 71 | apply (blast dest: bnd_monoD2 [OF _ _ lfp_subset]) | 
| 13268 | 72 | apply (erule lfp_lemma2) | 
| 73 | done | |
| 74 | ||
| 75 | lemma lfp_eq_Union: | |
| 76 | "[|bnd_mono(D, h); contin(h)|] ==> lfp(D,h) = (\<Union>n\<in>nat. h^n(0))" | |
| 77 | by (blast del: subsetI | |
| 78 | intro: lfp_subset_Union Union_subset_lfp) | |
| 79 | ||
| 80 | ||
| 13385 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 81 | subsubsection{*Some Standard Datatype Constructions Preserve Continuity*}
 | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 82 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 83 | lemma contin_imp_mono: "[|X\<subseteq>Y; contin(F)|] ==> F(X) \<subseteq> F(Y)" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 84 | apply (simp add: contin_def) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 85 | apply (drule_tac x="{X,Y}" in spec) 
 | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 86 | apply (simp add: directed_def subset_Un_iff2 Un_commute) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 87 | done | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 88 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 89 | lemma sum_contin: "[|contin(F); contin(G)|] ==> contin(\<lambda>X. F(X) + G(X))" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 90 | by (simp add: contin_def, blast) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 91 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 92 | lemma prod_contin: "[|contin(F); contin(G)|] ==> contin(\<lambda>X. F(X) * G(X))" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 93 | apply (subgoal_tac "\<forall>B C. F(B) \<subseteq> F(B \<union> C)") | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 94 | prefer 2 apply (simp add: Un_upper1 contin_imp_mono) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 95 | apply (subgoal_tac "\<forall>B C. G(C) \<subseteq> G(B \<union> C)") | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 96 | prefer 2 apply (simp add: Un_upper2 contin_imp_mono) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 97 | apply (simp add: contin_def, clarify) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 98 | apply (rule equalityI) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 99 | prefer 2 apply blast | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 100 | apply clarify | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 101 | apply (rename_tac B C) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 102 | apply (rule_tac a="B \<union> C" in UN_I) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 103 | apply (simp add: directed_def, blast) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 104 | done | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 105 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 106 | lemma const_contin: "contin(\<lambda>X. A)" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 107 | by (simp add: contin_def directed_def) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 108 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 109 | lemma id_contin: "contin(\<lambda>X. X)" | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 110 | by (simp add: contin_def) | 
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 111 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 112 | |
| 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
 paulson parents: 
13382diff
changeset | 113 | |
| 13268 | 114 | subsection {*Absoluteness for "Iterates"*}
 | 
| 115 | ||
| 21233 | 116 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 117 | iterates_MH :: "[i=>o, [i,i]=>o, i, i, i, i] => o" where | 
| 13353 | 118 | "iterates_MH(M,isF,v,n,g,z) == | 
| 119 | is_nat_case(M, v, \<lambda>m u. \<exists>gm[M]. fun_apply(M,g,m,gm) & isF(gm,u), | |
| 120 | n, z)" | |
| 121 | ||
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 122 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 123 | is_iterates :: "[i=>o, [i,i]=>o, i, i, i] => o" where | 
| 13687 | 124 | "is_iterates(M,isF,v,n,Z) == | 
| 125 | \<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 | ||
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 128 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 129 | iterates_replacement :: "[i=>o, [i,i]=>o, i] => o" where | 
| 13353 | 130 | "iterates_replacement(M,isF,v) == | 
| 13363 | 131 | \<forall>n[M]. n\<in>nat --> | 
| 13353 | 132 | wfrec_replacement(M, iterates_MH(M,isF,v), Memrel(succ(n)))" | 
| 133 | ||
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 134 | lemma (in M_basic) iterates_MH_abs: | 
| 13634 | 135 | "[| relation1(M,isF,F); M(n); M(g); M(z) |] | 
| 13353 | 136 | ==> iterates_MH(M,isF,v,n,g,z) <-> z = nat_case(v, \<lambda>m. F(g`m), n)" | 
| 13363 | 137 | by (simp add: nat_case_abs [of _ "\<lambda>m. F(g ` m)"] | 
| 13634 | 138 | relation1_def iterates_MH_def) | 
| 13353 | 139 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 140 | lemma (in M_basic) iterates_imp_wfrec_replacement: | 
| 13634 | 141 | "[|relation1(M,isF,F); n \<in> nat; iterates_replacement(M,isF,v)|] | 
| 13353 | 142 | ==> wfrec_replacement(M, \<lambda>n f z. z = nat_case(v, \<lambda>m. F(f`m), n), | 
| 143 | Memrel(succ(n)))" | |
| 144 | by (simp add: iterates_replacement_def iterates_MH_abs) | |
| 145 | ||
| 146 | theorem (in M_trancl) iterates_abs: | |
| 13634 | 147 | "[| iterates_replacement(M,isF,v); relation1(M,isF,F); | 
| 13353 | 148 | n \<in> nat; M(v); M(z); \<forall>x[M]. M(F(x)) |] | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 149 | ==> is_iterates(M,isF,v,n,z) <-> z = iterates(F,n,v)" | 
| 13353 | 150 | apply (frule iterates_imp_wfrec_replacement, assumption+) | 
| 151 | apply (simp add: wf_Memrel trans_Memrel relation_Memrel nat_into_M | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 152 | is_iterates_def relation2_def iterates_MH_abs | 
| 13353 | 153 | iterates_nat_def recursor_def transrec_def | 
| 154 | eclose_sing_Ord_eq nat_into_M | |
| 155 | trans_wfrec_abs [of _ _ _ _ "\<lambda>n g. nat_case(v, \<lambda>m. F(g`m), n)"]) | |
| 156 | done | |
| 157 | ||
| 13268 | 158 | |
| 13634 | 159 | lemma (in M_trancl) iterates_closed [intro,simp]: | 
| 160 | "[| iterates_replacement(M,isF,v); relation1(M,isF,F); | |
| 13353 | 161 | n \<in> nat; M(v); \<forall>x[M]. M(F(x)) |] | 
| 13268 | 162 | ==> M(iterates(F,n,v))" | 
| 13353 | 163 | apply (frule iterates_imp_wfrec_replacement, assumption+) | 
| 164 | apply (simp add: wf_Memrel trans_Memrel relation_Memrel nat_into_M | |
| 13634 | 165 | relation2_def iterates_MH_abs | 
| 13353 | 166 | iterates_nat_def recursor_def transrec_def | 
| 167 | eclose_sing_Ord_eq nat_into_M | |
| 168 | trans_wfrec_closed [of _ _ _ "\<lambda>n g. nat_case(v, \<lambda>m. F(g`m), n)"]) | |
| 169 | done | |
| 13268 | 170 | |
| 171 | ||
| 13386 | 172 | subsection {*lists without univ*}
 | 
| 173 | ||
| 174 | lemmas datatype_univs = Inl_in_univ Inr_in_univ | |
| 175 | Pair_in_univ nat_into_univ A_into_univ | |
| 176 | ||
| 177 | lemma list_fun_bnd_mono: "bnd_mono(univ(A), \<lambda>X. {0} + A*X)"
 | |
| 178 | apply (rule bnd_monoI) | |
| 179 | apply (intro subset_refl zero_subset_univ A_subset_univ | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 180 | sum_subset_univ Sigma_subset_univ) | 
| 13386 | 181 | apply (rule subset_refl sum_mono Sigma_mono | assumption)+ | 
| 182 | done | |
| 183 | ||
| 184 | lemma list_fun_contin: "contin(\<lambda>X. {0} + A*X)"
 | |
| 185 | by (intro sum_contin prod_contin id_contin const_contin) | |
| 186 | ||
| 187 | text{*Re-expresses lists using sum and product*}
 | |
| 188 | lemma list_eq_lfp2: "list(A) = lfp(univ(A), \<lambda>X. {0} + A*X)"
 | |
| 189 | apply (simp add: list_def) | |
| 190 | apply (rule equalityI) | |
| 191 | apply (rule lfp_lowerbound) | |
| 192 | prefer 2 apply (rule lfp_subset) | |
| 193 | apply (clarify, subst lfp_unfold [OF list_fun_bnd_mono]) | |
| 194 | apply (simp add: Nil_def Cons_def) | |
| 195 | apply blast | |
| 196 | txt{*Opposite inclusion*}
 | |
| 197 | apply (rule lfp_lowerbound) | |
| 198 | prefer 2 apply (rule lfp_subset) | |
| 199 | apply (clarify, subst lfp_unfold [OF list.bnd_mono]) | |
| 200 | apply (simp add: Nil_def Cons_def) | |
| 201 | apply (blast intro: datatype_univs | |
| 202 | dest: lfp_subset [THEN subsetD]) | |
| 203 | done | |
| 204 | ||
| 205 | text{*Re-expresses lists using "iterates", no univ.*}
 | |
| 206 | lemma list_eq_Union: | |
| 207 |      "list(A) = (\<Union>n\<in>nat. (\<lambda>X. {0} + A*X) ^ n (0))"
 | |
| 208 | by (simp add: list_eq_lfp2 lfp_eq_Union list_fun_bnd_mono list_fun_contin) | |
| 209 | ||
| 210 | ||
| 21233 | 211 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 212 | is_list_functor :: "[i=>o,i,i,i] => o" where | 
| 13350 | 213 | "is_list_functor(M,A,X,Z) == | 
| 214 | \<exists>n1[M]. \<exists>AX[M]. | |
| 215 | number1(M,n1) & cartprod(M,A,X,AX) & is_sum(M,n1,AX,Z)" | |
| 216 | ||
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 217 | lemma (in M_basic) list_functor_abs [simp]: | 
| 13350 | 218 |      "[| M(A); M(X); M(Z) |] ==> is_list_functor(M,A,X,Z) <-> (Z = {0} + A*X)"
 | 
| 219 | by (simp add: is_list_functor_def singleton_0 nat_into_M) | |
| 220 | ||
| 221 | ||
| 13386 | 222 | subsection {*formulas without univ*}
 | 
| 223 | ||
| 224 | lemma formula_fun_bnd_mono: | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 225 | "bnd_mono(univ(0), \<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X))" | 
| 13386 | 226 | apply (rule bnd_monoI) | 
| 227 | apply (intro subset_refl zero_subset_univ A_subset_univ | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 228 | sum_subset_univ Sigma_subset_univ nat_subset_univ) | 
| 13386 | 229 | apply (rule subset_refl sum_mono Sigma_mono | assumption)+ | 
| 230 | done | |
| 231 | ||
| 232 | lemma formula_fun_contin: | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 233 | "contin(\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X))" | 
| 13386 | 234 | by (intro sum_contin prod_contin id_contin const_contin) | 
| 235 | ||
| 236 | ||
| 237 | text{*Re-expresses formulas using sum and product*}
 | |
| 238 | lemma formula_eq_lfp2: | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 239 | "formula = lfp(univ(0), \<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X))" | 
| 13386 | 240 | apply (simp add: formula_def) | 
| 241 | apply (rule equalityI) | |
| 242 | apply (rule lfp_lowerbound) | |
| 243 | prefer 2 apply (rule lfp_subset) | |
| 244 | apply (clarify, subst lfp_unfold [OF formula_fun_bnd_mono]) | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 245 | apply (simp add: Member_def Equal_def Nand_def Forall_def) | 
| 13386 | 246 | apply blast | 
| 247 | txt{*Opposite inclusion*}
 | |
| 248 | apply (rule lfp_lowerbound) | |
| 249 | prefer 2 apply (rule lfp_subset, clarify) | |
| 250 | apply (subst lfp_unfold [OF formula.bnd_mono, simplified]) | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 251 | apply (simp add: Member_def Equal_def Nand_def Forall_def) | 
| 13386 | 252 | apply (elim sumE SigmaE, simp_all) | 
| 253 | apply (blast intro: datatype_univs dest: lfp_subset [THEN subsetD])+ | |
| 254 | done | |
| 255 | ||
| 256 | text{*Re-expresses formulas using "iterates", no univ.*}
 | |
| 257 | lemma formula_eq_Union: | |
| 258 | "formula = | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 259 | (\<Union>n\<in>nat. (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0))" | 
| 13386 | 260 | by (simp add: formula_eq_lfp2 lfp_eq_Union formula_fun_bnd_mono | 
| 261 | formula_fun_contin) | |
| 262 | ||
| 263 | ||
| 21233 | 264 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 265 | is_formula_functor :: "[i=>o,i,i] => o" where | 
| 13386 | 266 | "is_formula_functor(M,X,Z) == | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 267 | \<exists>nat'[M]. \<exists>natnat[M]. \<exists>natnatsum[M]. \<exists>XX[M]. \<exists>X3[M]. | 
| 13386 | 268 | omega(M,nat') & cartprod(M,nat',nat',natnat) & | 
| 269 | is_sum(M,natnat,natnat,natnatsum) & | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 270 | cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 271 | is_sum(M,natnatsum,X3,Z)" | 
| 13386 | 272 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 273 | lemma (in M_basic) formula_functor_abs [simp]: | 
| 13386 | 274 | "[| M(X); M(Z) |] | 
| 275 | ==> is_formula_functor(M,X,Z) <-> | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 276 | Z = ((nat*nat) + (nat*nat)) + (X*X + X)" | 
| 13386 | 277 | by (simp add: is_formula_functor_def) | 
| 278 | ||
| 279 | ||
| 280 | subsection{*@{term M} Contains the List and Formula Datatypes*}
 | |
| 13395 | 281 | |
| 21233 | 282 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 283 | list_N :: "[i,i] => i" where | 
| 13397 | 284 |     "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)"
 | 
| 285 | ||
| 286 | lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))" | |
| 287 | by (simp add: list_N_def Nil_def) | |
| 288 | ||
| 289 | lemma Cons_in_list_N [simp]: | |
| 290 | "Cons(a,l) \<in> list_N(A,succ(n)) <-> a\<in>A & l \<in> list_N(A,n)" | |
| 291 | by (simp add: list_N_def Cons_def) | |
| 292 | ||
| 293 | text{*These two aren't simprules because they reveal the underlying
 | |
| 294 | list representation.*} | |
| 295 | lemma list_N_0: "list_N(A,0) = 0" | |
| 296 | by (simp add: list_N_def) | |
| 297 | ||
| 298 | lemma list_N_succ: "list_N(A,succ(n)) = {0} + A * (list_N(A,n))"
 | |
| 299 | by (simp add: list_N_def) | |
| 300 | ||
| 301 | lemma list_N_imp_list: | |
| 302 | "[| l \<in> list_N(A,n); n \<in> nat |] ==> l \<in> list(A)" | |
| 303 | by (force simp add: list_eq_Union list_N_def) | |
| 304 | ||
| 305 | lemma list_N_imp_length_lt [rule_format]: | |
| 306 | "n \<in> nat ==> \<forall>l \<in> list_N(A,n). length(l) < n" | |
| 307 | apply (induct_tac n) | |
| 308 | apply (auto simp add: list_N_0 list_N_succ | |
| 309 | Nil_def [symmetric] Cons_def [symmetric]) | |
| 310 | done | |
| 311 | ||
| 312 | lemma list_imp_list_N [rule_format]: | |
| 313 | "l \<in> list(A) ==> \<forall>n\<in>nat. length(l) < n --> l \<in> list_N(A, n)" | |
| 314 | apply (induct_tac l) | |
| 315 | apply (force elim: natE)+ | |
| 316 | done | |
| 317 | ||
| 318 | lemma list_N_imp_eq_length: | |
| 319 | "[|n \<in> nat; l \<notin> list_N(A, n); l \<in> list_N(A, succ(n))|] | |
| 320 | ==> n = length(l)" | |
| 321 | apply (rule le_anti_sym) | |
| 322 | prefer 2 apply (simp add: list_N_imp_length_lt) | |
| 323 | apply (frule list_N_imp_list, simp) | |
| 324 | apply (simp add: not_lt_iff_le [symmetric]) | |
| 325 | apply (blast intro: list_imp_list_N) | |
| 326 | done | |
| 327 | ||
| 328 | text{*Express @{term list_rec} without using @{term rank} or @{term Vset},
 | |
| 329 | neither of which is absolute.*} | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 330 | lemma (in M_trivial) list_rec_eq: | 
| 13397 | 331 | "l \<in> list(A) ==> | 
| 332 | list_rec(a,g,l) = | |
| 333 | transrec (succ(length(l)), | |
| 13409 
d4ea094c650e
Relativization and Separation for the function "nth"
 paulson parents: 
13398diff
changeset | 334 | \<lambda>x h. Lambda (list(A), | 
| 
d4ea094c650e
Relativization and Separation for the function "nth"
 paulson parents: 
13398diff
changeset | 335 | list_case' (a, | 
| 
d4ea094c650e
Relativization and Separation for the function "nth"
 paulson parents: 
13398diff
changeset | 336 | \<lambda>a l. g(a, l, h ` succ(length(l)) ` l)))) ` l" | 
| 13397 | 337 | apply (induct_tac l) | 
| 338 | apply (subst transrec, simp) | |
| 339 | apply (subst transrec) | |
| 340 | apply (simp add: list_imp_list_N) | |
| 341 | done | |
| 342 | ||
| 21233 | 343 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 344 | is_list_N :: "[i=>o,i,i,i] => o" where | 
| 13397 | 345 | "is_list_N(M,A,n,Z) == | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 346 | \<exists>zero[M]. empty(M,zero) & | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 347 | is_iterates(M, is_list_functor(M,A), zero, n, Z)" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 348 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 349 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 350 | mem_list :: "[i=>o,i,i] => o" where | 
| 13395 | 351 | "mem_list(M,A,l) == | 
| 352 | \<exists>n[M]. \<exists>listn[M]. | |
| 13397 | 353 | finite_ordinal(M,n) & is_list_N(M,A,n,listn) & l \<in> listn" | 
| 13395 | 354 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 355 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 356 | is_list :: "[i=>o,i,i] => o" where | 
| 13395 | 357 | "is_list(M,A,Z) == \<forall>l[M]. l \<in> Z <-> mem_list(M,A,l)" | 
| 358 | ||
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 359 | subsubsection{*Towards Absoluteness of @{term formula_rec}*}
 | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 360 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 361 | consts depth :: "i=>i" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 362 | primrec | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 363 | "depth(Member(x,y)) = 0" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 364 | "depth(Equal(x,y)) = 0" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 365 | "depth(Nand(p,q)) = succ(depth(p) \<union> depth(q))" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 366 | "depth(Forall(p)) = succ(depth(p))" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 367 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 368 | lemma depth_type [TC]: "p \<in> formula ==> depth(p) \<in> nat" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 369 | by (induct_tac p, simp_all) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 370 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 371 | |
| 21233 | 372 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 373 | formula_N :: "i => i" where | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 374 | "formula_N(n) == (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)) ^ n (0)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 375 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 376 | lemma Member_in_formula_N [simp]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 377 | "Member(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 378 | by (simp add: formula_N_def Member_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 379 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 380 | lemma Equal_in_formula_N [simp]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 381 | "Equal(x,y) \<in> formula_N(succ(n)) <-> x \<in> nat & y \<in> nat" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 382 | by (simp add: formula_N_def Equal_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 383 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 384 | lemma Nand_in_formula_N [simp]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 385 | "Nand(x,y) \<in> formula_N(succ(n)) <-> x \<in> formula_N(n) & y \<in> formula_N(n)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 386 | by (simp add: formula_N_def Nand_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 387 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 388 | lemma Forall_in_formula_N [simp]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 389 | "Forall(x) \<in> formula_N(succ(n)) <-> x \<in> formula_N(n)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 390 | by (simp add: formula_N_def Forall_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 391 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 392 | text{*These two aren't simprules because they reveal the underlying
 | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 393 | formula representation.*} | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 394 | lemma formula_N_0: "formula_N(0) = 0" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 395 | by (simp add: formula_N_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 396 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 397 | lemma formula_N_succ: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 398 | "formula_N(succ(n)) = | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 399 | ((nat*nat) + (nat*nat)) + (formula_N(n) * formula_N(n) + formula_N(n))" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 400 | by (simp add: formula_N_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 401 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 402 | lemma formula_N_imp_formula: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 403 | "[| p \<in> formula_N(n); n \<in> nat |] ==> p \<in> formula" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 404 | by (force simp add: formula_eq_Union formula_N_def) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 405 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 406 | lemma formula_N_imp_depth_lt [rule_format]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 407 | "n \<in> nat ==> \<forall>p \<in> formula_N(n). depth(p) < n" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 408 | apply (induct_tac n) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 409 | apply (auto simp add: formula_N_0 formula_N_succ | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 410 | depth_type formula_N_imp_formula Un_least_lt_iff | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 411 | Member_def [symmetric] Equal_def [symmetric] | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 412 | Nand_def [symmetric] Forall_def [symmetric]) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 413 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 414 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 415 | lemma formula_imp_formula_N [rule_format]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 416 | "p \<in> formula ==> \<forall>n\<in>nat. depth(p) < n --> p \<in> formula_N(n)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 417 | apply (induct_tac p) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 418 | apply (simp_all add: succ_Un_distrib Un_least_lt_iff) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 419 | apply (force elim: natE)+ | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 420 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 421 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 422 | lemma formula_N_imp_eq_depth: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 423 | "[|n \<in> nat; p \<notin> formula_N(n); p \<in> formula_N(succ(n))|] | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 424 | ==> n = depth(p)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 425 | apply (rule le_anti_sym) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 426 | prefer 2 apply (simp add: formula_N_imp_depth_lt) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 427 | apply (frule formula_N_imp_formula, simp) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 428 | apply (simp add: not_lt_iff_le [symmetric]) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 429 | apply (blast intro: formula_imp_formula_N) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 430 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 431 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 432 | |
| 13647 | 433 | text{*This result and the next are unused.*}
 | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 434 | lemma formula_N_mono [rule_format]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 435 | "[| m \<in> nat; n \<in> nat |] ==> m\<le>n --> formula_N(m) \<subseteq> formula_N(n)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 436 | apply (rule_tac m = m and n = n in diff_induct) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 437 | apply (simp_all add: formula_N_0 formula_N_succ, blast) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 438 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 439 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 440 | lemma formula_N_distrib: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 441 | "[| m \<in> nat; n \<in> nat |] ==> formula_N(m \<union> n) = formula_N(m) \<union> formula_N(n)" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 442 | apply (rule_tac i = m and j = n in Ord_linear_le, auto) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 443 | apply (simp_all add: subset_Un_iff [THEN iffD1] subset_Un_iff2 [THEN iffD1] | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 444 | le_imp_subset formula_N_mono) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 445 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 446 | |
| 21233 | 447 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 448 | is_formula_N :: "[i=>o,i,i] => o" where | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 449 | "is_formula_N(M,n,Z) == | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 450 | \<exists>zero[M]. empty(M,zero) & | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 451 | is_iterates(M, is_formula_functor(M), zero, n, Z)" | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 452 | |
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 453 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 454 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 455 | mem_formula :: "[i=>o,i] => o" where | 
| 13395 | 456 | "mem_formula(M,p) == | 
| 457 | \<exists>n[M]. \<exists>formn[M]. | |
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 458 | finite_ordinal(M,n) & is_formula_N(M,n,formn) & p \<in> formn" | 
| 13395 | 459 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 460 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 461 | is_formula :: "[i=>o,i] => o" where | 
| 13395 | 462 | "is_formula(M,Z) == \<forall>p[M]. p \<in> Z <-> mem_formula(M,p)" | 
| 463 | ||
| 13634 | 464 | locale M_datatypes = M_trancl + | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 465 | assumes list_replacement1: | 
| 13363 | 466 | "M(A) ==> iterates_replacement(M, is_list_functor(M,A), 0)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 467 | and list_replacement2: | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 468 | "M(A) ==> strong_replacement(M, | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 469 | \<lambda>n y. n\<in>nat & is_iterates(M, is_list_functor(M,A), 0, n, y))" | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 470 | and formula_replacement1: | 
| 13386 | 471 | "iterates_replacement(M, is_formula_functor(M), 0)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 472 | and formula_replacement2: | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 473 | "strong_replacement(M, | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 474 | \<lambda>n y. n\<in>nat & is_iterates(M, is_formula_functor(M), 0, n, y))" | 
| 13422 
af9bc8d87a75
Added the assumption nth_replacement to locale M_datatypes.
 paulson parents: 
13418diff
changeset | 475 | and nth_replacement: | 
| 
af9bc8d87a75
Added the assumption nth_replacement to locale M_datatypes.
 paulson parents: 
13418diff
changeset | 476 | "M(l) ==> iterates_replacement(M, %l t. is_tl(M,l,t), l)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 477 | |
| 13395 | 478 | |
| 479 | subsubsection{*Absoluteness of the List Construction*}
 | |
| 480 | ||
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 481 | lemma (in M_datatypes) list_replacement2': | 
| 13353 | 482 |   "M(A) ==> strong_replacement(M, \<lambda>n y. n\<in>nat & y = (\<lambda>X. {0} + A * X)^n (0))"
 | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 483 | apply (insert list_replacement2 [of A]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 484 | apply (rule strong_replacement_cong [THEN iffD1]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 485 | apply (rule conj_cong [OF iff_refl iterates_abs [of "is_list_functor(M,A)"]]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 486 | apply (simp_all add: list_replacement1 relation1_def) | 
| 13353 | 487 | done | 
| 13268 | 488 | |
| 489 | lemma (in M_datatypes) list_closed [intro,simp]: | |
| 490 | "M(A) ==> M(list(A))" | |
| 13353 | 491 | apply (insert list_replacement1) | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 492 | by (simp add: RepFun_closed2 list_eq_Union | 
| 13634 | 493 | list_replacement2' relation1_def | 
| 13353 | 494 | iterates_closed [of "is_list_functor(M,A)"]) | 
| 13397 | 495 | |
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 496 | text{*WARNING: use only with @{text "dest:"} or with variables fixed!*}
 | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 497 | lemmas (in M_datatypes) list_into_M = transM [OF _ list_closed] | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 498 | |
| 13397 | 499 | lemma (in M_datatypes) list_N_abs [simp]: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 500 | "[|M(A); n\<in>nat; M(Z)|] | 
| 13397 | 501 | ==> is_list_N(M,A,n,Z) <-> Z = list_N(A,n)" | 
| 13395 | 502 | apply (insert list_replacement1) | 
| 13634 | 503 | apply (simp add: is_list_N_def list_N_def relation1_def nat_into_M | 
| 13395 | 504 |                  iterates_abs [of "is_list_functor(M,A)" _ "\<lambda>X. {0} + A*X"])
 | 
| 505 | done | |
| 13268 | 506 | |
| 13397 | 507 | lemma (in M_datatypes) list_N_closed [intro,simp]: | 
| 508 | "[|M(A); n\<in>nat|] ==> M(list_N(A,n))" | |
| 509 | apply (insert list_replacement1) | |
| 13634 | 510 | apply (simp add: is_list_N_def list_N_def relation1_def nat_into_M | 
| 13397 | 511 | iterates_closed [of "is_list_functor(M,A)"]) | 
| 512 | done | |
| 513 | ||
| 13395 | 514 | lemma (in M_datatypes) mem_list_abs [simp]: | 
| 515 | "M(A) ==> mem_list(M,A,l) <-> l \<in> list(A)" | |
| 516 | apply (insert list_replacement1) | |
| 13634 | 517 | apply (simp add: mem_list_def list_N_def relation1_def list_eq_Union | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 518 | iterates_closed [of "is_list_functor(M,A)"]) | 
| 13395 | 519 | done | 
| 520 | ||
| 521 | lemma (in M_datatypes) list_abs [simp]: | |
| 522 | "[|M(A); M(Z)|] ==> is_list(M,A,Z) <-> Z = list(A)" | |
| 523 | apply (simp add: is_list_def, safe) | |
| 524 | apply (rule M_equalityI, simp_all) | |
| 525 | done | |
| 526 | ||
| 527 | subsubsection{*Absoluteness of Formulas*}
 | |
| 13293 | 528 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 529 | lemma (in M_datatypes) formula_replacement2': | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 530 | "strong_replacement(M, \<lambda>n y. n\<in>nat & y = (\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X))^n (0))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 531 | apply (insert formula_replacement2) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 532 | apply (rule strong_replacement_cong [THEN iffD1]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 533 | apply (rule conj_cong [OF iff_refl iterates_abs [of "is_formula_functor(M)"]]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 534 | apply (simp_all add: formula_replacement1 relation1_def) | 
| 13386 | 535 | done | 
| 536 | ||
| 537 | lemma (in M_datatypes) formula_closed [intro,simp]: | |
| 538 | "M(formula)" | |
| 539 | apply (insert formula_replacement1) | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 540 | apply (simp add: RepFun_closed2 formula_eq_Union | 
| 13634 | 541 | formula_replacement2' relation1_def | 
| 13386 | 542 | iterates_closed [of "is_formula_functor(M)"]) | 
| 543 | done | |
| 544 | ||
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 545 | lemmas (in M_datatypes) formula_into_M = transM [OF _ formula_closed] | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 546 | |
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 547 | lemma (in M_datatypes) formula_N_abs [simp]: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 548 | "[|n\<in>nat; M(Z)|] | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 549 | ==> is_formula_N(M,n,Z) <-> Z = formula_N(n)" | 
| 13395 | 550 | apply (insert formula_replacement1) | 
| 13634 | 551 | apply (simp add: is_formula_N_def formula_N_def relation1_def nat_into_M | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 552 | iterates_abs [of "is_formula_functor(M)" _ | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 553 | "\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)"]) | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 554 | done | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 555 | |
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 556 | lemma (in M_datatypes) formula_N_closed [intro,simp]: | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 557 | "n\<in>nat ==> M(formula_N(n))" | 
| 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 558 | apply (insert formula_replacement1) | 
| 13634 | 559 | apply (simp add: is_formula_N_def formula_N_def relation1_def nat_into_M | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 560 | iterates_closed [of "is_formula_functor(M)"]) | 
| 13395 | 561 | done | 
| 562 | ||
| 563 | lemma (in M_datatypes) mem_formula_abs [simp]: | |
| 564 | "mem_formula(M,l) <-> l \<in> formula" | |
| 565 | apply (insert formula_replacement1) | |
| 13634 | 566 | apply (simp add: mem_formula_def relation1_def formula_eq_Union formula_N_def | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 567 | iterates_closed [of "is_formula_functor(M)"]) | 
| 13395 | 568 | done | 
| 569 | ||
| 570 | lemma (in M_datatypes) formula_abs [simp]: | |
| 571 | "[|M(Z)|] ==> is_formula(M,Z) <-> Z = formula" | |
| 572 | apply (simp add: is_formula_def, safe) | |
| 573 | apply (rule M_equalityI, simp_all) | |
| 574 | done | |
| 575 | ||
| 576 | ||
| 577 | subsection{*Absoluteness for @{text \<epsilon>}-Closure: the @{term eclose} Operator*}
 | |
| 578 | ||
| 579 | text{*Re-expresses eclose using "iterates"*}
 | |
| 580 | lemma eclose_eq_Union: | |
| 581 | "eclose(A) = (\<Union>n\<in>nat. Union^n (A))" | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 582 | apply (simp add: eclose_def) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 583 | apply (rule UN_cong) | 
| 13395 | 584 | apply (rule refl) | 
| 585 | apply (induct_tac n) | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 586 | apply (simp add: nat_rec_0) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 587 | apply (simp add: nat_rec_succ) | 
| 13395 | 588 | done | 
| 589 | ||
| 21233 | 590 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 591 | is_eclose_n :: "[i=>o,i,i,i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 592 | "is_eclose_n(M,A,n,Z) == is_iterates(M, big_union(M), A, n, Z)" | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 593 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 594 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 595 | mem_eclose :: "[i=>o,i,i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 596 | "mem_eclose(M,A,l) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 597 | \<exists>n[M]. \<exists>eclosen[M]. | 
| 13395 | 598 | finite_ordinal(M,n) & is_eclose_n(M,A,n,eclosen) & l \<in> eclosen" | 
| 599 | ||
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 600 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 601 | is_eclose :: "[i=>o,i,i] => o" where | 
| 13395 | 602 | "is_eclose(M,A,Z) == \<forall>u[M]. u \<in> Z <-> mem_eclose(M,A,u)" | 
| 603 | ||
| 604 | ||
| 13428 | 605 | locale M_eclose = M_datatypes + | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 606 | assumes eclose_replacement1: | 
| 13395 | 607 | "M(A) ==> iterates_replacement(M, big_union(M), A)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 608 | and eclose_replacement2: | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 609 | "M(A) ==> strong_replacement(M, | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 610 | \<lambda>n y. n\<in>nat & is_iterates(M, big_union(M), A, n, y))" | 
| 13395 | 611 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 612 | lemma (in M_eclose) eclose_replacement2': | 
| 13395 | 613 | "M(A) ==> strong_replacement(M, \<lambda>n y. n\<in>nat & y = Union^n (A))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 614 | apply (insert eclose_replacement2 [of A]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 615 | apply (rule strong_replacement_cong [THEN iffD1]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 616 | apply (rule conj_cong [OF iff_refl iterates_abs [of "big_union(M)"]]) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 617 | apply (simp_all add: eclose_replacement1 relation1_def) | 
| 13395 | 618 | done | 
| 619 | ||
| 620 | lemma (in M_eclose) eclose_closed [intro,simp]: | |
| 621 | "M(A) ==> M(eclose(A))" | |
| 622 | apply (insert eclose_replacement1) | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 623 | by (simp add: RepFun_closed2 eclose_eq_Union | 
| 13634 | 624 | eclose_replacement2' relation1_def | 
| 13395 | 625 | iterates_closed [of "big_union(M)"]) | 
| 626 | ||
| 627 | lemma (in M_eclose) is_eclose_n_abs [simp]: | |
| 628 | "[|M(A); n\<in>nat; M(Z)|] ==> is_eclose_n(M,A,n,Z) <-> Z = Union^n (A)" | |
| 629 | apply (insert eclose_replacement1) | |
| 13634 | 630 | apply (simp add: is_eclose_n_def relation1_def nat_into_M | 
| 13395 | 631 | iterates_abs [of "big_union(M)" _ "Union"]) | 
| 632 | done | |
| 633 | ||
| 634 | lemma (in M_eclose) mem_eclose_abs [simp]: | |
| 635 | "M(A) ==> mem_eclose(M,A,l) <-> l \<in> eclose(A)" | |
| 636 | apply (insert eclose_replacement1) | |
| 13634 | 637 | apply (simp add: mem_eclose_def relation1_def eclose_eq_Union | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 638 | iterates_closed [of "big_union(M)"]) | 
| 13395 | 639 | done | 
| 640 | ||
| 641 | lemma (in M_eclose) eclose_abs [simp]: | |
| 642 | "[|M(A); M(Z)|] ==> is_eclose(M,A,Z) <-> Z = eclose(A)" | |
| 643 | apply (simp add: is_eclose_def, safe) | |
| 644 | apply (rule M_equalityI, simp_all) | |
| 645 | done | |
| 646 | ||
| 647 | ||
| 648 | subsection {*Absoluteness for @{term transrec}*}
 | |
| 649 | ||
| 22710 | 650 | text{* @{prop "transrec(a,H) \<equiv> wfrec(Memrel(eclose({a})), a, H)"} *}
 | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 651 | |
| 21233 | 652 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 653 | is_transrec :: "[i=>o, [i,i,i]=>o, i, i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 654 | "is_transrec(M,MH,a,z) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 655 | \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M]. | 
| 13395 | 656 | upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) & | 
| 657 | is_wfrec(M,MH,mesa,a,z)" | |
| 658 | ||
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 659 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 660 | transrec_replacement :: "[i=>o, [i,i,i]=>o, i] => o" where | 
| 13395 | 661 | "transrec_replacement(M,MH,a) == | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 662 | \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M]. | 
| 13395 | 663 | upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) & | 
| 664 | wfrec_replacement(M,MH,mesa)" | |
| 665 | ||
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 666 | text{*The condition @{term "Ord(i)"} lets us use the simpler
 | 
| 13395 | 667 |   @{text "trans_wfrec_abs"} rather than @{text "trans_wfrec_abs"},
 | 
| 668 | which I haven't even proved yet. *} | |
| 669 | theorem (in M_eclose) transrec_abs: | |
| 13634 | 670 | "[|transrec_replacement(M,MH,i); relation2(M,MH,H); | 
| 13418 
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
 paulson parents: 
13409diff
changeset | 671 | Ord(i); M(i); M(z); | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 672 | \<forall>x[M]. \<forall>g[M]. function(g) --> M(H(x,g))|] | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 673 | ==> is_transrec(M,MH,i,z) <-> z = transrec(i,H)" | 
| 13615 
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
 paulson parents: 
13564diff
changeset | 674 | by (simp add: trans_wfrec_abs transrec_replacement_def is_transrec_def | 
| 13395 | 675 | transrec_def eclose_sing_Ord_eq wf_Memrel trans_Memrel relation_Memrel) | 
| 676 | ||
| 677 | ||
| 678 | theorem (in M_eclose) transrec_closed: | |
| 13634 | 679 | "[|transrec_replacement(M,MH,i); relation2(M,MH,H); | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 680 | Ord(i); M(i); | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 681 | \<forall>x[M]. \<forall>g[M]. function(g) --> M(H(x,g))|] | 
| 13395 | 682 | ==> M(transrec(i,H))" | 
| 13615 
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
 paulson parents: 
13564diff
changeset | 683 | by (simp add: trans_wfrec_closed transrec_replacement_def is_transrec_def | 
| 
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
 paulson parents: 
13564diff
changeset | 684 | transrec_def eclose_sing_Ord_eq wf_Memrel trans_Memrel relation_Memrel) | 
| 
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
 paulson parents: 
13564diff
changeset | 685 | |
| 13395 | 686 | |
| 13440 | 687 | text{*Helps to prove instances of @{term transrec_replacement}*}
 | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 688 | lemma (in M_eclose) transrec_replacementI: | 
| 13440 | 689 | "[|M(a); | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 690 | strong_replacement (M, | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 691 | \<lambda>x z. \<exists>y[M]. pair(M, x, y, z) & | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 692 |                                is_wfrec(M,MH,Memrel(eclose({a})),x,y))|]
 | 
| 13440 | 693 | ==> transrec_replacement(M,MH,a)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 694 | by (simp add: transrec_replacement_def wfrec_replacement_def) | 
| 13440 | 695 | |
| 13395 | 696 | |
| 13397 | 697 | subsection{*Absoluteness for the List Operator @{term length}*}
 | 
| 13647 | 698 | text{*But it is never used.*}
 | 
| 699 | ||
| 21233 | 700 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 701 | is_length :: "[i=>o,i,i,i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 702 | "is_length(M,A,l,n) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 703 | \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M]. | 
| 13397 | 704 | is_list_N(M,A,n,list_n) & l \<notin> list_n & | 
| 705 | successor(M,n,sn) & is_list_N(M,A,sn,list_sn) & l \<in> list_sn" | |
| 706 | ||
| 707 | ||
| 708 | lemma (in M_datatypes) length_abs [simp]: | |
| 709 | "[|M(A); l \<in> list(A); n \<in> nat|] ==> is_length(M,A,l,n) <-> n = length(l)" | |
| 710 | apply (subgoal_tac "M(l) & M(n)") | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 711 | prefer 2 apply (blast dest: transM) | 
| 13397 | 712 | apply (simp add: is_length_def) | 
| 713 | apply (blast intro: list_imp_list_N nat_into_Ord list_N_imp_eq_length | |
| 714 | dest: list_N_imp_length_lt) | |
| 715 | done | |
| 716 | ||
| 717 | text{*Proof is trivial since @{term length} returns natural numbers.*}
 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 718 | lemma (in M_trivial) length_closed [intro,simp]: | 
| 13397 | 719 | "l \<in> list(A) ==> M(length(l))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 720 | by (simp add: nat_into_M) | 
| 13397 | 721 | |
| 722 | ||
| 13647 | 723 | subsection {*Absoluteness for the List Operator @{term nth}*}
 | 
| 13397 | 724 | |
| 725 | lemma nth_eq_hd_iterates_tl [rule_format]: | |
| 726 | "xs \<in> list(A) ==> \<forall>n \<in> nat. nth(n,xs) = hd' (tl'^n (xs))" | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 727 | apply (induct_tac xs) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 728 | apply (simp add: iterates_tl_Nil hd'_Nil, clarify) | 
| 13397 | 729 | apply (erule natE) | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 730 | apply (simp add: hd'_Cons) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 731 | apply (simp add: tl'_Cons iterates_commute) | 
| 13397 | 732 | done | 
| 733 | ||
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 734 | lemma (in M_basic) iterates_tl'_closed: | 
| 13397 | 735 | "[|n \<in> nat; M(x)|] ==> M(tl'^n (x))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 736 | apply (induct_tac n, simp) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 737 | apply (simp add: tl'_Cons tl'_closed) | 
| 13397 | 738 | done | 
| 739 | ||
| 740 | text{*Immediate by type-checking*}
 | |
| 741 | lemma (in M_datatypes) nth_closed [intro,simp]: | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 742 | "[|xs \<in> list(A); n \<in> nat; M(A)|] ==> M(nth(n,xs))" | 
| 13397 | 743 | apply (case_tac "n < length(xs)") | 
| 744 | apply (blast intro: nth_type transM) | |
| 745 | apply (simp add: not_lt_iff_le nth_eq_0) | |
| 746 | done | |
| 747 | ||
| 21233 | 748 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 749 | is_nth :: "[i=>o,i,i,i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 750 | "is_nth(M,n,l,Z) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 751 | \<exists>X[M]. is_iterates(M, is_tl(M), l, n, X) & is_hd(M,X,Z)" | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 752 | |
| 13409 
d4ea094c650e
Relativization and Separation for the function "nth"
 paulson parents: 
13398diff
changeset | 753 | lemma (in M_datatypes) nth_abs [simp]: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 754 | "[|M(A); n \<in> nat; l \<in> list(A); M(Z)|] | 
| 13397 | 755 | ==> is_nth(M,n,l,Z) <-> Z = nth(n,l)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 756 | apply (subgoal_tac "M(l)") | 
| 13397 | 757 | prefer 2 apply (blast intro: transM) | 
| 758 | apply (simp add: is_nth_def nth_eq_hd_iterates_tl nat_into_M | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 759 | tl'_closed iterates_tl'_closed | 
| 13634 | 760 | iterates_abs [OF _ relation1_tl] nth_replacement) | 
| 13397 | 761 | done | 
| 762 | ||
| 13395 | 763 | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 764 | subsection{*Relativization and Absoluteness for the @{term formula} Constructors*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 765 | |
| 21233 | 766 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 767 | is_Member :: "[i=>o,i,i,i] => o" where | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 768 |      --{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 769 | "is_Member(M,x,y,Z) == | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 770 | \<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inl(M,u,Z)" | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 771 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 772 | lemma (in M_trivial) Member_abs [simp]: | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 773 | "[|M(x); M(y); M(Z)|] ==> is_Member(M,x,y,Z) <-> (Z = Member(x,y))" | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 774 | by (simp add: is_Member_def Member_def) | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 775 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 776 | lemma (in M_trivial) Member_in_M_iff [iff]: | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 777 | "M(Member(x,y)) <-> M(x) & M(y)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 778 | by (simp add: Member_def) | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 779 | |
| 21233 | 780 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 781 | is_Equal :: "[i=>o,i,i,i] => o" where | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 782 |      --{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 783 | "is_Equal(M,x,y,Z) == | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 784 | \<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inr(M,p,u) & is_Inl(M,u,Z)" | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 785 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 786 | lemma (in M_trivial) Equal_abs [simp]: | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 787 | "[|M(x); M(y); M(Z)|] ==> is_Equal(M,x,y,Z) <-> (Z = Equal(x,y))" | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 788 | by (simp add: is_Equal_def Equal_def) | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 789 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 790 | lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) <-> M(x) & M(y)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 791 | by (simp add: Equal_def) | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 792 | |
| 21233 | 793 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 794 | is_Nand :: "[i=>o,i,i,i] => o" where | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 795 |      --{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 796 | "is_Nand(M,x,y,Z) == | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 797 | \<exists>p[M]. \<exists>u[M]. pair(M,x,y,p) & is_Inl(M,p,u) & is_Inr(M,u,Z)" | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 798 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 799 | lemma (in M_trivial) Nand_abs [simp]: | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 800 | "[|M(x); M(y); M(Z)|] ==> is_Nand(M,x,y,Z) <-> (Z = Nand(x,y))" | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 801 | by (simp add: is_Nand_def Nand_def) | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 802 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 803 | lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) <-> M(x) & M(y)" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 804 | by (simp add: Nand_def) | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 805 | |
| 21233 | 806 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 807 | is_Forall :: "[i=>o,i,i] => o" where | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 808 |      --{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 809 | "is_Forall(M,p,Z) == \<exists>u[M]. is_Inr(M,p,u) & is_Inr(M,u,Z)" | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 810 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 811 | lemma (in M_trivial) Forall_abs [simp]: | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 812 | "[|M(x); M(Z)|] ==> is_Forall(M,x,Z) <-> (Z = Forall(x))" | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 813 | by (simp add: is_Forall_def Forall_def) | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 814 | |
| 13564 
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
 paulson parents: 
13557diff
changeset | 815 | lemma (in M_trivial) Forall_in_M_iff [iff]: "M(Forall(x)) <-> M(x)" | 
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 816 | by (simp add: Forall_def) | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 817 | |
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 818 | |
| 13647 | 819 | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 820 | subsection {*Absoluteness for @{term formula_rec}*}
 | 
| 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 821 | |
| 21233 | 822 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 823 | formula_rec_case :: "[[i,i]=>i, [i,i]=>i, [i,i,i,i]=>i, [i,i]=>i, i, i] => i" where | 
| 13647 | 824 |     --{* the instance of @{term formula_case} in @{term formula_rec}*}
 | 
| 825 | "formula_rec_case(a,b,c,d,h) == | |
| 826 | formula_case (a, b, | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 827 | \<lambda>u v. c(u, v, h ` succ(depth(u)) ` u, | 
| 13647 | 828 | h ` succ(depth(v)) ` v), | 
| 829 | \<lambda>u. d(u, h ` succ(depth(u)) ` u))" | |
| 830 | ||
| 831 | text{*Unfold @{term formula_rec} to @{term formula_rec_case}.
 | |
| 832 |      Express @{term formula_rec} without using @{term rank} or @{term Vset},
 | |
| 833 | neither of which is absolute.*} | |
| 834 | lemma (in M_trivial) formula_rec_eq: | |
| 835 | "p \<in> formula ==> | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 836 | formula_rec(a,b,c,d,p) = | 
| 13647 | 837 | transrec (succ(depth(p)), | 
| 838 | \<lambda>x h. Lambda (formula, formula_rec_case(a,b,c,d,h))) ` p" | |
| 839 | apply (simp add: formula_rec_case_def) | |
| 840 | apply (induct_tac p) | |
| 841 |    txt{*Base case for @{term Member}*}
 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 842 | apply (subst transrec, simp add: formula.intros) | 
| 13647 | 843 |   txt{*Base case for @{term Equal}*}
 | 
| 844 | apply (subst transrec, simp add: formula.intros) | |
| 845 |  txt{*Inductive step for @{term Nand}*}
 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 846 | apply (subst transrec) | 
| 13647 | 847 | apply (simp add: succ_Un_distrib formula.intros) | 
| 848 | txt{*Inductive step for @{term Forall}*}
 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 849 | apply (subst transrec) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 850 | apply (simp add: formula_imp_formula_N formula.intros) | 
| 13647 | 851 | done | 
| 852 | ||
| 853 | ||
| 854 | subsubsection{*Absoluteness for the Formula Operator @{term depth}*}
 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 855 | |
| 21233 | 856 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 857 | is_depth :: "[i=>o,i,i] => o" where | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 858 | "is_depth(M,p,n) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 859 | \<exists>sn[M]. \<exists>formula_n[M]. \<exists>formula_sn[M]. | 
| 13647 | 860 | is_formula_N(M,n,formula_n) & p \<notin> formula_n & | 
| 861 | successor(M,n,sn) & is_formula_N(M,sn,formula_sn) & p \<in> formula_sn" | |
| 862 | ||
| 863 | ||
| 864 | lemma (in M_datatypes) depth_abs [simp]: | |
| 865 | "[|p \<in> formula; n \<in> nat|] ==> is_depth(M,p,n) <-> n = depth(p)" | |
| 866 | apply (subgoal_tac "M(p) & M(n)") | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 867 | prefer 2 apply (blast dest: transM) | 
| 13647 | 868 | apply (simp add: is_depth_def) | 
| 869 | apply (blast intro: formula_imp_formula_N nat_into_Ord formula_N_imp_eq_depth | |
| 870 | dest: formula_N_imp_depth_lt) | |
| 871 | done | |
| 872 | ||
| 873 | text{*Proof is trivial since @{term depth} returns natural numbers.*}
 | |
| 874 | lemma (in M_trivial) depth_closed [intro,simp]: | |
| 875 | "p \<in> formula ==> M(depth(p))" | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 876 | by (simp add: nat_into_M) | 
| 13647 | 877 | |
| 878 | ||
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 879 | subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*}
 | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 880 | |
| 21233 | 881 | definition | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 882 | is_formula_case :: | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 883 | "[i=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i,i]=>o, [i,i]=>o, i, i] => o" where | 
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 884 |   --{*no constraint on non-formulas*}
 | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 885 | "is_formula_case(M, is_a, is_b, is_c, is_d, p, z) == | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 886 | (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) --> | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 887 | is_Member(M,x,y,p) --> is_a(x,y,z)) & | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 888 | (\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) --> finite_ordinal(M,y) --> | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 889 | is_Equal(M,x,y,p) --> is_b(x,y,z)) & | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 890 | (\<forall>x[M]. \<forall>y[M]. mem_formula(M,x) --> mem_formula(M,y) --> | 
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 891 | is_Nand(M,x,y,p) --> is_c(x,y,z)) & | 
| 13493 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
 paulson parents: 
13440diff
changeset | 892 | (\<forall>x[M]. mem_formula(M,x) --> is_Forall(M,x,p) --> is_d(x,z))" | 
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 893 | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 894 | lemma (in M_datatypes) formula_case_abs [simp]: | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 895 | "[| Relation2(M,nat,nat,is_a,a); Relation2(M,nat,nat,is_b,b); | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 896 | Relation2(M,formula,formula,is_c,c); Relation1(M,formula,is_d,d); | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 897 | p \<in> formula; M(z) |] | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 898 | ==> is_formula_case(M,is_a,is_b,is_c,is_d,p,z) <-> | 
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 899 | z = formula_case(a,b,c,d,p)" | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 900 | apply (simp add: formula_into_M is_formula_case_def) | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 901 | apply (erule formula.cases) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 902 | apply (simp_all add: Relation1_def Relation2_def) | 
| 13423 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 903 | done | 
| 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
 paulson parents: 
13422diff
changeset | 904 | |
| 13418 
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
 paulson parents: 
13409diff
changeset | 905 | lemma (in M_datatypes) formula_case_closed [intro,simp]: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 906 | "[|p \<in> formula; | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 907 | \<forall>x[M]. \<forall>y[M]. x\<in>nat --> y\<in>nat --> M(a(x,y)); | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 908 | \<forall>x[M]. \<forall>y[M]. x\<in>nat --> y\<in>nat --> M(b(x,y)); | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 909 | \<forall>x[M]. \<forall>y[M]. x\<in>formula --> y\<in>formula --> M(c(x,y)); | 
| 13418 
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
 paulson parents: 
13409diff
changeset | 910 | \<forall>x[M]. x\<in>formula --> M(d(x))|] ==> M(formula_case(a,b,c,d,p))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 911 | by (erule formula.cases, simp_all) | 
| 13418 
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
 paulson parents: 
13409diff
changeset | 912 | |
| 13398 
1cadd412da48
Towards relativization and absoluteness of formula_rec
 paulson parents: 
13397diff
changeset | 913 | |
| 13647 | 914 | subsubsection {*Absoluteness for @{term formula_rec}: Final Results*}
 | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 915 | |
| 21233 | 916 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21233diff
changeset | 917 | is_formula_rec :: "[i=>o, [i,i,i]=>o, i, i] => o" where | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 918 |     --{* predicate to relativize the functional @{term formula_rec}*}
 | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 919 | "is_formula_rec(M,MH,p,z) == | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 920 | \<exists>dp[M]. \<exists>i[M]. \<exists>f[M]. finite_ordinal(M,dp) & is_depth(M,p,dp) & | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 921 | successor(M,dp,i) & fun_apply(M,f,p,z) & is_transrec(M,MH,i,f)" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 922 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 923 | |
| 13647 | 924 | text{*Sufficient conditions to relativize the instance of @{term formula_case}
 | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 925 |       in @{term formula_rec}*}
 | 
| 13634 | 926 | lemma (in M_datatypes) Relation1_formula_rec_case: | 
| 927 | "[|Relation2(M, nat, nat, is_a, a); | |
| 928 | Relation2(M, nat, nat, is_b, b); | |
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 929 | Relation2 (M, formula, formula, | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 930 | is_c, \<lambda>u v. c(u, v, h`succ(depth(u))`u, h`succ(depth(v))`v)); | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 931 | Relation1(M, formula, | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 932 | is_d, \<lambda>u. d(u, h ` succ(depth(u)) ` u)); | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 933 | M(h) |] | 
| 13634 | 934 | ==> Relation1(M, formula, | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 935 | is_formula_case (M, is_a, is_b, is_c, is_d), | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 936 | formula_rec_case(a, b, c, d, h))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 937 | apply (simp (no_asm) add: formula_rec_case_def Relation1_def) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 938 | apply (simp add: formula_case_abs) | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 939 | done | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 940 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 941 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 942 | text{*This locale packages the premises of the following theorems,
 | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 943 | which is the normal purpose of locales. It doesn't accumulate | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 944 |       constraints on the class @{term M}, as in most of this deveopment.*}
 | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 945 | locale Formula_Rec = M_eclose + | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 946 | fixes a and is_a and b and is_b and c and is_c and d and is_d and MH | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 947 | defines | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 948 | "MH(u::i,f,z) == | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 949 | \<forall>fml[M]. is_formula(M,fml) --> | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 950 | is_lambda | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 951 | (M, fml, is_formula_case (M, is_a, is_b, is_c(f), is_d(f)), z)" | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 952 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 953 | assumes a_closed: "[|x\<in>nat; y\<in>nat|] ==> M(a(x,y))" | 
| 13634 | 954 | and a_rel: "Relation2(M, nat, nat, is_a, a)" | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 955 | and b_closed: "[|x\<in>nat; y\<in>nat|] ==> M(b(x,y))" | 
| 13634 | 956 | and b_rel: "Relation2(M, nat, nat, is_b, b)" | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 957 | and c_closed: "[|x \<in> formula; y \<in> formula; M(gx); M(gy)|] | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 958 | ==> M(c(x, y, gx, gy))" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 959 | and c_rel: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 960 | "M(f) ==> | 
| 13634 | 961 | Relation2 (M, formula, formula, is_c(f), | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 962 | \<lambda>u v. c(u, v, f ` succ(depth(u)) ` u, f ` succ(depth(v)) ` v))" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 963 | and d_closed: "[|x \<in> formula; M(gx)|] ==> M(d(x, gx))" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 964 | and d_rel: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 965 | "M(f) ==> | 
| 13634 | 966 | Relation1(M, formula, is_d(f), \<lambda>u. d(u, f ` succ(depth(u)) ` u))" | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 967 | and fr_replace: "n \<in> nat ==> transrec_replacement(M,MH,n)" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 968 | and fr_lam_replace: | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 969 | "M(g) ==> | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 970 | strong_replacement | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 971 | (M, \<lambda>x y. x \<in> formula & | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
22710diff
changeset | 972 | y = \<langle>x, formula_rec_case(a,b,c,d,g,x)\<rangle>)"; | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 973 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 974 | lemma (in Formula_Rec) formula_rec_case_closed: | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 975 | "[|M(g); p \<in> formula|] ==> M(formula_rec_case(a, b, c, d, g, p))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 976 | by (simp add: formula_rec_case_def a_closed b_closed c_closed d_closed) | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 977 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 978 | lemma (in Formula_Rec) formula_rec_lam_closed: | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 979 | "M(g) ==> M(Lambda (formula, formula_rec_case(a,b,c,d,g)))" | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 980 | by (simp add: lam_closed2 fr_lam_replace formula_rec_case_closed) | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 981 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 982 | lemma (in Formula_Rec) MH_rel2: | 
| 13634 | 983 | "relation2 (M, MH, | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 984 | \<lambda>x h. Lambda (formula, formula_rec_case(a,b,c,d,h)))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 985 | apply (simp add: relation2_def MH_def, clarify) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 986 | apply (rule lambda_abs2) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 987 | apply (rule Relation1_formula_rec_case) | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 988 | apply (simp_all add: a_rel b_rel c_rel d_rel formula_rec_case_closed) | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 989 | done | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 990 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 991 | lemma (in Formula_Rec) fr_transrec_closed: | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 992 | "n \<in> nat | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 993 | ==> M(transrec | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 994 | (n, \<lambda>x h. Lambda(formula, formula_rec_case(a, b, c, d, h))))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 995 | by (simp add: transrec_closed [OF fr_replace MH_rel2] | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 996 | nat_into_M formula_rec_lam_closed) | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 997 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 998 | text{*The main two results: @{term formula_rec} is absolute for @{term M}.*}
 | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 999 | theorem (in Formula_Rec) formula_rec_closed: | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1000 | "p \<in> formula ==> M(formula_rec(a,b,c,d,p))" | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 1001 | by (simp add: formula_rec_eq fr_transrec_closed | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1002 | transM [OF _ formula_closed]) | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1003 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1004 | theorem (in Formula_Rec) formula_rec_abs: | 
| 13655 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 1005 | "[| p \<in> formula; M(z)|] | 
| 
95b95cdb4704
Tidying up.  New primitives is_iterates and is_iterates_fm.
 paulson parents: 
13647diff
changeset | 1006 | ==> is_formula_rec(M,MH,p,z) <-> z = formula_rec(a,b,c,d,p)" | 
| 13557 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1007 | by (simp add: is_formula_rec_def formula_rec_eq transM [OF _ formula_closed] | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1008 | transrec_abs [OF fr_replace MH_rel2] depth_type | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1009 | fr_transrec_closed formula_rec_lam_closed eq_commute) | 
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1010 | |
| 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
 paulson parents: 
13505diff
changeset | 1011 | |
| 13268 | 1012 | end |