author  wenzelm 
Wed, 27 Mar 2013 16:38:25 +0100  
changeset 51553  63327f679cff 
parent 46823  57bf0cecb366 
child 58860  fee7cfa69c50 
permissions  rwrr 
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:
21233
diff
changeset

13 
directed :: "i=>o" where 
13385
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

15 

21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

16 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

17 
contin :: "(i=>i) => o" where 
46823  18 
"contin(h) == (\<forall>A. directed(A) \<longrightarrow> h(\<Union>A) = (\<Union>X\<in>A. h(X)))" 
13268  19 

46823  20 
lemma bnd_mono_iterates_subset: "[bnd_mono(D, h); n \<in> nat] ==> h^n (0) \<subseteq> D" 
13268  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:
13382
diff
changeset

25 
lemma bnd_mono_increasing [rule_format]: 
46823  26 
"[i \<in> nat; j \<in> nat; bnd_mono(D,h)] ==> i \<le> j \<longrightarrow> h^i(0) \<subseteq> h^j(0)" 
13385
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

28 
apply (blast del: subsetI 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13382
diff
changeset

30 
done 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

31 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

33 
apply (simp add: directed_def, clarify) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

34 
apply (rename_tac i j) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
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:
13382
diff
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:
13382
diff
changeset

38 
subset_Un_iff2 [THEN iffD1]) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

40 
subset_Un_iff2 [THEN iff_sym]) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

41 
done 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

42 

13268  43 

44 
lemma contin_iterates_eq: 

13385
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

45 
"[bnd_mono(D, h); contin(h)] 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
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:
13382
diff
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: 

46823  59 
"[bnd_mono(D, h); contin(h)] ==> lfp(D,h) \<subseteq> (\<Union>n\<in>nat. h^n(0))" 
13268  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: 

46823  66 
"bnd_mono(D,h) ==> (\<Union>n\<in>nat. h^n(0)) \<subseteq> lfp(D,h)" 
13268  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:
13306
diff
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:
13397
diff
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:
13382
diff
changeset

81 
subsubsection{*Some Standard Datatype Constructions Preserve Continuity*} 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

82 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

84 
apply (simp add: contin_def) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

85 
apply (drule_tac x="{X,Y}" in spec) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

87 
done 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

88 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

90 
by (simp add: contin_def, blast) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

91 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
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:
13382
diff
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:
13382
diff
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:
13382
diff
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:
13382
diff
changeset

97 
apply (simp add: contin_def, clarify) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

98 
apply (rule equalityI) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

99 
prefer 2 apply blast 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

100 
apply clarify 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

101 
apply (rename_tac B C) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
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:
13382
diff
changeset

103 
apply (simp add: directed_def, blast) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

104 
done 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

105 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

106 
lemma const_contin: "contin(\<lambda>X. A)" 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

107 
by (simp add: contin_def directed_def) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

108 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

109 
lemma id_contin: "contin(\<lambda>X. X)" 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

110 
by (simp add: contin_def) 
31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

111 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

112 

31df66ca0780
Expressing Lset and L without using length and arity; simplifies Separation
paulson
parents:
13382
diff
changeset

113 

13268  114 
subsection {*Absoluteness for "Iterates"*} 
115 

21233  116 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
21233
diff
changeset

122 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
21233
diff
changeset

128 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

129 
iterates_replacement :: "[i=>o, [i,i]=>o, i] => o" where 
13353  130 
"iterates_replacement(M,isF,v) == 
46823  131 
\<forall>n[M]. n\<in>nat \<longrightarrow> 
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:
13557
diff
changeset

134 
lemma (in M_basic) iterates_MH_abs: 
13634  135 
"[ relation1(M,isF,F); M(n); M(g); M(z) ] 
46823  136 
==> iterates_MH(M,isF,v,n,g,z) \<longleftrightarrow> 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:
13557
diff
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)) ] 
46823  149 
==> is_iterates(M,isF,v,n,z) \<longleftrightarrow> 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:
13647
diff
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 tabwidth;
wenzelm
parents:
22710
diff
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{*Reexpresses 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{*Reexpresses 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:
21233
diff
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:
13557
diff
changeset

217 
lemma (in M_basic) list_functor_abs [simp]: 
46823  218 
"[ M(A); M(X); M(Z) ] ==> is_list_functor(M,A,X,Z) \<longleftrightarrow> (Z = {0} + A*X)" 
13350  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:
13397
diff
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 tabwidth;
wenzelm
parents:
22710
diff
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:
13397
diff
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{*Reexpresses formulas using sum and product*} 

238 
lemma formula_eq_lfp2: 

13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
13397
diff
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:
13397
diff
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{*Reexpresses formulas using "iterates", no univ.*} 

257 
lemma formula_eq_Union: 

258 
"formula = 

13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
21233
diff
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:
13397
diff
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:
13397
diff
changeset

270 
cartprod(M,X,X,XX) & is_sum(M,XX,X,X3) & 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
13557
diff
changeset

273 
lemma (in M_basic) formula_functor_abs [simp]: 
13386  274 
"[ M(X); M(Z) ] 
46823  275 
==> is_formula_functor(M,X,Z) \<longleftrightarrow> 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
21233
diff
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]: 

46823  290 
"Cons(a,l) \<in> list_N(A,succ(n)) \<longleftrightarrow> a\<in>A & l \<in> list_N(A,n)" 
13397  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]: 

46823  313 
"l \<in> list(A) ==> \<forall>n\<in>nat. length(l) < n \<longrightarrow> l \<in> list_N(A, n)" 
13397  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:
13557
diff
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:
13398
diff
changeset

334 
\<lambda>x h. Lambda (list(A), 
d4ea094c650e
Relativization and Separation for the function "nth"
paulson
parents:
13398
diff
changeset

335 
list_case' (a, 
d4ea094c650e
Relativization and Separation for the function "nth"
paulson
parents:
13398
diff
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:
21233
diff
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:
13647
diff
changeset

346 
\<exists>zero[M]. empty(M,zero) & 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

347 
is_iterates(M, is_list_functor(M,A), zero, n, Z)" 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

348 

eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

349 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
21233
diff
changeset

355 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

356 
is_list :: "[i=>o,i,i] => o" where 
46823  357 
"is_list(M,A,Z) == \<forall>l[M]. l \<in> Z \<longleftrightarrow> mem_list(M,A,l)" 
13395  358 

13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

359 
subsubsection{*Towards Absoluteness of @{term formula_rec}*} 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

360 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

361 
consts depth :: "i=>i" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

362 
primrec 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

363 
"depth(Member(x,y)) = 0" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

364 
"depth(Equal(x,y)) = 0" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

366 
"depth(Forall(p)) = succ(depth(p))" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

367 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

369 
by (induct_tac p, simp_all) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

370 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

371 

21233  372 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

373 
formula_N :: "i => i" where 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

375 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

376 
lemma Member_in_formula_N [simp]: 
46823  377 
"Member(x,y) \<in> formula_N(succ(n)) \<longleftrightarrow> x \<in> nat & y \<in> nat" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

378 
by (simp add: formula_N_def Member_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

379 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

380 
lemma Equal_in_formula_N [simp]: 
46823  381 
"Equal(x,y) \<in> formula_N(succ(n)) \<longleftrightarrow> x \<in> nat & y \<in> nat" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

382 
by (simp add: formula_N_def Equal_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

383 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

384 
lemma Nand_in_formula_N [simp]: 
46823  385 
"Nand(x,y) \<in> formula_N(succ(n)) \<longleftrightarrow> x \<in> formula_N(n) & y \<in> formula_N(n)" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

386 
by (simp add: formula_N_def Nand_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

387 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

388 
lemma Forall_in_formula_N [simp]: 
46823  389 
"Forall(x) \<in> formula_N(succ(n)) \<longleftrightarrow> x \<in> formula_N(n)" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

390 
by (simp add: formula_N_def Forall_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

391 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

393 
formula representation.*} 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

394 
lemma formula_N_0: "formula_N(0) = 0" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

395 
by (simp add: formula_N_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

396 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

397 
lemma formula_N_succ: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

398 
"formula_N(succ(n)) = 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

400 
by (simp add: formula_N_def) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

401 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

402 
lemma formula_N_imp_formula: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
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:
13440
diff
changeset

405 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

406 
lemma formula_N_imp_depth_lt [rule_format]: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

408 
apply (induct_tac n) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
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:
13440
diff
changeset

411 
Member_def [symmetric] Equal_def [symmetric] 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

412 
Nand_def [symmetric] Forall_def [symmetric]) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

413 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

414 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

415 
lemma formula_imp_formula_N [rule_format]: 
46823  416 
"p \<in> formula ==> \<forall>n\<in>nat. depth(p) < n \<longrightarrow> p \<in> formula_N(n)" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

417 
apply (induct_tac p) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

419 
apply (force elim: natE)+ 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

420 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

421 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

422 
lemma formula_N_imp_eq_depth: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

424 
==> n = depth(p)" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

425 
apply (rule le_anti_sym) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

427 
apply (frule formula_N_imp_formula, simp) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

428 
apply (simp add: not_lt_iff_le [symmetric]) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

429 
apply (blast intro: formula_imp_formula_N) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

430 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

431 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

434 
lemma formula_N_mono [rule_format]: 
46823  435 
"[ m \<in> nat; n \<in> nat ] ==> m\<le>n \<longrightarrow> formula_N(m) \<subseteq> formula_N(n)" 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
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:
13440
diff
changeset

438 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

439 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

440 
lemma formula_N_distrib: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
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:
13440
diff
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:
13440
diff
changeset

444 
le_imp_subset formula_N_mono) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

445 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

446 

21233  447 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13440
diff
changeset

449 
"is_formula_N(M,n,Z) == 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

450 
\<exists>zero[M]. empty(M,zero) & 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

452 

13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

453 

21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

454 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13440
diff
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:
21233
diff
changeset

460 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

461 
is_formula :: "[i=>o,i] => o" where 
46823  462 
"is_formula(M,Z) == \<forall>p[M]. p \<in> Z \<longleftrightarrow> mem_formula(M,p)" 
13395  463 

13634  464 
locale M_datatypes = M_trancl + 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

467 
and list_replacement2: 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

468 
"M(A) ==> strong_replacement(M, 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
changeset

472 
and formula_replacement2: 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

473 
"strong_replacement(M, 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13418
diff
changeset

475 
and nth_replacement: 
af9bc8d87a75
Added the assumption nth_replacement to locale M_datatypes.
paulson
parents:
13418
diff
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:
13647
diff
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:
13647
diff
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:
13647
diff
changeset

483 
apply (insert list_replacement2 [of A]) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

484 
apply (rule strong_replacement_cong [THEN iffD1]) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
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:
13422
diff
changeset

496 
text{*WARNING: use only with @{text "dest:"} or with variables fixed!*} 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

497 
lemmas (in M_datatypes) list_into_M = transM [OF _ list_closed] 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
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:
13647
diff
changeset

500 
"[M(A); n\<in>nat; M(Z)] 
46823  501 
==> is_list_N(M,A,n,Z) \<longleftrightarrow> 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]: 
46823  515 
"M(A) ==> mem_list(M,A,l) \<longleftrightarrow> l \<in> list(A)" 
13395  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:
13647
diff
changeset

518 
iterates_closed [of "is_list_functor(M,A)"]) 
13395  519 
done 
520 

521 
lemma (in M_datatypes) list_abs [simp]: 

46823  522 
"[M(A); M(Z)] ==> is_list(M,A,Z) \<longleftrightarrow> Z = list(A)" 
13395  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:
13647
diff
changeset

529 
lemma (in M_datatypes) formula_replacement2': 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
13647
diff
changeset

531 
apply (insert formula_replacement2) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

532 
apply (rule strong_replacement_cong [THEN iffD1]) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
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:
13422
diff
changeset

545 
lemmas (in M_datatypes) formula_into_M = transM [OF _ formula_closed] 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

546 

13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

547 
lemma (in M_datatypes) formula_N_abs [simp]: 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

548 
"[n\<in>nat; M(Z)] 
46823  549 
==> is_formula_N(M,n,Z) \<longleftrightarrow> 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:
13647
diff
changeset

552 
iterates_abs [of "is_formula_functor(M)" _ 
13493
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

553 
"\<lambda>X. ((nat*nat) + (nat*nat)) + (X*X + X)"]) 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

554 
done 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

555 

5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

556 
lemma (in M_datatypes) formula_N_closed [intro,simp]: 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
changeset

557 
"n\<in>nat ==> M(formula_N(n))" 
5aa68c051725
Lots of new results concerning recursive datatypes, towards absoluteness of
paulson
parents:
13440
diff
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:
13440
diff
changeset

560 
iterates_closed [of "is_formula_functor(M)"]) 
13395  561 
done 
562 

563 
lemma (in M_datatypes) mem_formula_abs [simp]: 

46823  564 
"mem_formula(M,l) \<longleftrightarrow> l \<in> formula" 
13395  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:
13647
diff
changeset

567 
iterates_closed [of "is_formula_functor(M)"]) 
13395  568 
done 
569 

570 
lemma (in M_datatypes) formula_abs [simp]: 

46823  571 
"[M(Z)] ==> is_formula(M,Z) \<longleftrightarrow> Z = formula" 
13395  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{*Reexpresses 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:
13647
diff
changeset

582 
apply (simp add: eclose_def) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

586 
apply (simp add: nat_rec_0) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
21233
diff
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:
13647
diff
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:
13647
diff
changeset

593 

21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

594 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

595 
mem_eclose :: "[i=>o,i,i] => o" where 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

596 
"mem_eclose(M,A,l) == 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
21233
diff
changeset

600 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

601 
is_eclose :: "[i=>o,i,i] => o" where 
46823  602 
"is_eclose(M,A,Z) == \<forall>u[M]. u \<in> Z \<longleftrightarrow> mem_eclose(M,A,u)" 
13395  603 

604 

13428  605 
locale M_eclose = M_datatypes + 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

608 
and eclose_replacement2: 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

609 
"M(A) ==> strong_replacement(M, 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
changeset

614 
apply (insert eclose_replacement2 [of A]) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

615 
apply (rule strong_replacement_cong [THEN iffD1]) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
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]: 

46823  628 
"[M(A); n\<in>nat; M(Z)] ==> is_eclose_n(M,A,n,Z) \<longleftrightarrow> Z = Union^n (A)" 
13395  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]: 

46823  635 
"M(A) ==> mem_eclose(M,A,l) \<longleftrightarrow> l \<in> eclose(A)" 
13395  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:
13647
diff
changeset

638 
iterates_closed [of "big_union(M)"]) 
13395  639 
done 
640 

641 
lemma (in M_eclose) eclose_abs [simp]: 

46823  642 
"[M(A); M(Z)] ==> is_eclose(M,A,Z) \<longleftrightarrow> Z = eclose(A)" 
13395  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:
21233
diff
changeset

651 

21233  652 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13647
diff
changeset

654 
"is_transrec(M,MH,a,z) == 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
21233
diff
changeset

659 
definition 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13647
diff
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:
13647
diff
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:
13409
diff
changeset

671 
Ord(i); M(i); M(z); 
46823  672 
\<forall>x[M]. \<forall>g[M]. function(g) \<longrightarrow> M(H(x,g))] 
673 
==> is_transrec(M,MH,i,z) \<longleftrightarrow> z = transrec(i,H)" 

13615
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
paulson
parents:
13564
diff
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 tabwidth;
wenzelm
parents:
22710
diff
changeset

680 
Ord(i); M(i); 
46823  681 
\<forall>x[M]. \<forall>g[M]. function(g) \<longrightarrow> M(H(x,g))] 
13395  682 
==> M(transrec(i,H))" 
13615
449a70d88b38
Numerous cosmetic changes, prompted by the new simplifier
paulson
parents:
13564
diff
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:
13564
diff
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:
13564
diff
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:
13647
diff
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:
13647
diff
changeset

690 
strong_replacement (M, 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
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:
21233
diff
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:
13647
diff
changeset

702 
"is_length(M,A,l,n) == 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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]: 

46823  709 
"[M(A); l \<in> list(A); n \<in> nat] ==> is_length(M,A,l,n) \<longleftrightarrow> n = length(l)" 
13397  710 
apply (subgoal_tac "M(l) & M(n)") 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13557
diff
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:
13647
diff
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:
13647
diff
changeset

727 
apply (induct_tac xs) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

730 
apply (simp add: hd'_Cons) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13557
diff
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:
13647
diff
changeset

736 
apply (induct_tac n, simp) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

737 
apply (simp add: tl'_Cons tl'_closed) 
13397  738 
done 
739 

740 
text{*Immediate by typechecking*} 

741 
lemma (in M_datatypes) nth_closed [intro,simp]: 

13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
21233
diff
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:
13647
diff
changeset

750 
"is_nth(M,n,l,Z) == 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

752 

13409
d4ea094c650e
Relativization and Separation for the function "nth"
paulson
parents:
13398
diff
changeset

753 
lemma (in M_datatypes) nth_abs [simp]: 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

754 
"[M(A); n \<in> nat; l \<in> list(A); M(Z)] 
46823  755 
==> is_nth(M,n,l,Z) \<longleftrightarrow> Z = nth(n,l)" 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13397
diff
changeset

764 
subsection{*Relativization and Absoluteness for the @{term formula} Constructors*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

765 

21233  766 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

767 
is_Member :: "[i=>o,i,i,i] => o" where 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

768 
{* because @{term "Member(x,y) \<equiv> Inl(Inl(\<langle>x,y\<rangle>))"}*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

769 
"is_Member(M,x,y,Z) == 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13397
diff
changeset

771 

13564
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
paulson
parents:
13557
diff
changeset

772 
lemma (in M_trivial) Member_abs [simp]: 
46823  773 
"[M(x); M(y); M(Z)] ==> is_Member(M,x,y,Z) \<longleftrightarrow> (Z = Member(x,y))" 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

774 
by (simp add: is_Member_def Member_def) 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

775 

13564
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
paulson
parents:
13557
diff
changeset

776 
lemma (in M_trivial) Member_in_M_iff [iff]: 
46823  777 
"M(Member(x,y)) \<longleftrightarrow> M(x) & M(y)" 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

778 
by (simp add: Member_def) 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

779 

21233  780 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

781 
is_Equal :: "[i=>o,i,i,i] => o" where 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

782 
{* because @{term "Equal(x,y) \<equiv> Inl(Inr(\<langle>x,y\<rangle>))"}*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

783 
"is_Equal(M,x,y,Z) == 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13397
diff
changeset

785 

13564
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
paulson
parents:
13557
diff
changeset

786 
lemma (in M_trivial) Equal_abs [simp]: 
46823  787 
"[M(x); M(y); M(Z)] ==> is_Equal(M,x,y,Z) \<longleftrightarrow> (Z = Equal(x,y))" 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

788 
by (simp add: is_Equal_def Equal_def) 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

789 

46823  790 
lemma (in M_trivial) Equal_in_M_iff [iff]: "M(Equal(x,y)) \<longleftrightarrow> M(x) & M(y)" 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

791 
by (simp add: Equal_def) 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

792 

21233  793 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

794 
is_Nand :: "[i=>o,i,i,i] => o" where 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

795 
{* because @{term "Nand(x,y) \<equiv> Inr(Inl(\<langle>x,y\<rangle>))"}*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

796 
"is_Nand(M,x,y,Z) == 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13397
diff
changeset

798 

13564
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
paulson
parents:
13557
diff
changeset

799 
lemma (in M_trivial) Nand_abs [simp]: 
46823  800 
"[M(x); M(y); M(Z)] ==> is_Nand(M,x,y,Z) \<longleftrightarrow> (Z = Nand(x,y))" 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

801 
by (simp add: is_Nand_def Nand_def) 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

802 

46823  803 
lemma (in M_trivial) Nand_in_M_iff [iff]: "M(Nand(x,y)) \<longleftrightarrow> M(x) & M(y)" 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

804 
by (simp add: Nand_def) 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

805 

21233  806 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

807 
is_Forall :: "[i=>o,i,i] => o" where 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

808 
{* because @{term "Forall(x) \<equiv> Inr(Inr(p))"}*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
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:
13397
diff
changeset

810 

13564
1500a2e48d44
renamed M_triv_axioms to M_trivial and M_axioms to M_basic
paulson
parents:
13557
diff
changeset

811 
lemma (in M_trivial) Forall_abs [simp]: 
46823  812 
"[M(x); M(Z)] ==> is_Forall(M,x,Z) \<longleftrightarrow> (Z = Forall(x))" 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

813 
by (simp add: is_Forall_def Forall_def) 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

814 

46823  815 
lemma (in M_trivial) Forall_in_M_iff [iff]: "M(Forall(x)) \<longleftrightarrow> M(x)" 
13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

816 
by (simp add: Forall_def) 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

817 

1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

818 

13647  819 

13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

820 
subsection {*Absoluteness for @{term formula_rec}*} 
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

821 

21233  822 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13647
diff
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:
13647
diff
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:
13647
diff
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:
13647
diff
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:
13647
diff
changeset

849 
apply (subst transrec) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
21233
diff
changeset

855 

21233  856 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
changeset

857 
is_depth :: "[i=>o,i,i] => o" where 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

858 
"is_depth(M,p,n) == 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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]: 

46823  865 
"[p \<in> formula; n \<in> nat] ==> is_depth(M,p,n) \<longleftrightarrow> n = depth(p)" 
13647  866 
apply (subgoal_tac "M(p) & M(n)") 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

876 
by (simp add: nat_into_M) 
13647  877 

878 

13423
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

879 
subsubsection{*@{term is_formula_case}: relativization of @{term formula_case}*} 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

880 

21233  881 
definition 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

882 
is_formula_case :: 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13422
diff
changeset

884 
{*no constraint on nonformulas*} 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

885 
"is_formula_case(M, is_a, is_b, is_c, is_d, p, z) == 
46823  886 
(\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) \<longrightarrow> finite_ordinal(M,y) \<longrightarrow> 
887 
is_Member(M,x,y,p) \<longrightarrow> is_a(x,y,z)) & 

888 
(\<forall>x[M]. \<forall>y[M]. finite_ordinal(M,x) \<longrightarrow> finite_ordinal(M,y) \<longrightarrow> 

889 
is_Equal(M,x,y,p) \<longrightarrow> is_b(x,y,z)) & 

890 
(\<forall>x[M]. \<forall>y[M]. mem_formula(M,x) \<longrightarrow> mem_formula(M,y) \<longrightarrow> 

891 
is_Nand(M,x,y,p) \<longrightarrow> is_c(x,y,z)) & 

892 
(\<forall>x[M]. mem_formula(M,x) \<longrightarrow> is_Forall(M,x,p) \<longrightarrow> is_d(x,z))" 

13423
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

893 

13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

894 
lemma (in M_datatypes) formula_case_abs [simp]: 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
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:
13647
diff
changeset

897 
p \<in> formula; M(z) ] 
46823  898 
==> is_formula_case(M,is_a,is_b,is_c,is_d,p,z) \<longleftrightarrow> 
13423
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

899 
z = formula_case(a,b,c,d,p)" 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
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:
13647
diff
changeset

901 
apply (erule formula.cases) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

902 
apply (simp_all add: Relation1_def Relation2_def) 
13423
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

903 
done 
7ec771711c09
More lemmas, working towards relativization of "satisfies"
paulson
parents:
13422
diff
changeset

904 

13418
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
paulson
parents:
13409
diff
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:
13647
diff
changeset

906 
"[p \<in> formula; 
46823  907 
\<forall>x[M]. \<forall>y[M]. x\<in>nat \<longrightarrow> y\<in>nat \<longrightarrow> M(a(x,y)); 
908 
\<forall>x[M]. \<forall>y[M]. x\<in>nat \<longrightarrow> y\<in>nat \<longrightarrow> M(b(x,y)); 

909 
\<forall>x[M]. \<forall>y[M]. x\<in>formula \<longrightarrow> y\<in>formula \<longrightarrow> M(c(x,y)); 

910 
\<forall>x[M]. x\<in>formula \<longrightarrow> 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:
13647
diff
changeset

911 
by (erule formula.cases, simp_all) 
13418
7c0ba9dba978
tweaks, aiming towards relativization of "satisfies"
paulson
parents:
13409
diff
changeset

912 

13398
1cadd412da48
Towards relativization and absoluteness of formula_rec
paulson
parents:
13397
diff
changeset

913 

13647  914 
subsubsection {*Absoluteness for @{term formula_rec}: Final Results*} 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

915 

21233  916 
definition 
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21233
diff
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:
13505
diff
changeset

918 
{* predicate to relativize the functional @{term formula_rec}*} 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

919 
"is_formula_rec(M,MH,p,z) == 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13505
diff
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:
13505
diff
changeset

922 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13505
diff
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:
13647
diff
changeset

929 
Relation2 (M, formula, formula, 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13647
diff
changeset

931 
Relation1(M, formula, 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

932 
is_d, \<lambda>u. d(u, h ` succ(depth(u)) ` u)); 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
changeset

933 
M(h) ] 
13634  934 
==> Relation1(M, formula, 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

935 
is_formula_case (M, is_a, is_b, is_c, is_d), 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

936 
formula_rec_case(a, b, c, d, h))" 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13647
diff
changeset

938 
apply (simp add: formula_case_abs) 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

939 
done 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

940 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

941 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

942 
text{*This locale packages the premises of the following theorems, 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

943 
which is the normal purpose of locales. It doesn't accumulate 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

944 
constraints on the class @{term M}, as in most of this deveopment.*} 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

945 
locale Formula_Rec = M_eclose + 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13505
diff
changeset

947 
defines 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

948 
"MH(u::i,f,z) == 
46823  949 
\<forall>fml[M]. is_formula(M,fml) \<longrightarrow> 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

950 
is_lambda 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13505
diff
changeset

952 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13505
diff
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:
13505
diff
changeset

957 
and c_closed: "[x \<in> formula; y \<in> formula; M(gx); M(gy)] 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

958 
==> M(c(x, y, gx, gy))" 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

959 
and c_rel: 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

960 
"M(f) ==> 
13634  961 
Relation2 (M, formula, formula, is_c(f), 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13505
diff
changeset

963 
and d_closed: "[x \<in> formula; M(gx)] ==> M(d(x, gx))" 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

964 
and d_rel: 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13505
diff
changeset

967 
and fr_replace: "n \<in> nat ==> transrec_replacement(M,MH,n)" 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

968 
and fr_lam_replace: 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

969 
"M(g) ==> 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

970 
strong_replacement 
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
changeset

971 
(M, \<lambda>x y. x \<in> formula & 
69916a850301
eliminated hard tabulators, guessing at each author's individual tabwidth;
wenzelm
parents:
22710
diff
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:
13505
diff
changeset

973 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

974 
lemma (in Formula_Rec) formula_rec_case_closed: 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13647
diff
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:
13505
diff
changeset

977 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

978 
lemma (in Formula_Rec) formula_rec_lam_closed: 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

979 
"M(g) ==> M(Lambda (formula, formula_rec_case(a,b,c,d,g)))" 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

980 
by (simp add: lam_closed2 fr_lam_replace formula_rec_case_closed) 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

981 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

982 
lemma (in Formula_Rec) MH_rel2: 
13634  983 
"relation2 (M, MH, 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13647
diff
changeset

985 
apply (simp add: relation2_def MH_def, clarify) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

986 
apply (rule lambda_abs2) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

987 
apply (rule Relation1_formula_rec_case) 
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
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:
13505
diff
changeset

989 
done 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

990 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

991 
lemma (in Formula_Rec) fr_transrec_closed: 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

992 
"n \<in> nat 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

993 
==> M(transrec 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13647
diff
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:
13647
diff
changeset

996 
nat_into_M formula_rec_lam_closed) 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

997 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

998 
text{*The main two results: @{term formula_rec} is absolute for @{term M}.*} 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

999 
theorem (in Formula_Rec) formula_rec_closed: 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13647
diff
changeset

1001 
by (simp add: formula_rec_eq fr_transrec_closed 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1002 
transM [OF _ formula_closed]) 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1003 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1004 
theorem (in Formula_Rec) formula_rec_abs: 
13655
95b95cdb4704
Tidying up. New primitives is_iterates and is_iterates_fm.
paulson
parents:
13647
diff
changeset

1005 
"[ p \<in> formula; M(z)] 
46823  1006 
==> is_formula_rec(M,MH,p,z) \<longleftrightarrow> z = formula_rec(a,b,c,d,p)" 
13557
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
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:
13505
diff
changeset

1008 
transrec_abs [OF fr_replace MH_rel2] depth_type 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1009 
fr_transrec_closed formula_rec_lam_closed eq_commute) 
6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1010 

6061d0045409
deleted redundant material (quasiformula, ...) and rationalized
paulson
parents:
13505
diff
changeset

1011 

13268  1012 
end 