61 is_sum :: "[i=>o,i,i,i] => o" |
61 is_sum :: "[i=>o,i,i,i] => o" |
62 "is_sum(M,A,B,Z) == |
62 "is_sum(M,A,B,Z) == |
63 \<exists>A0[M]. \<exists>n1[M]. \<exists>s1[M]. \<exists>B1[M]. |
63 \<exists>A0[M]. \<exists>n1[M]. \<exists>s1[M]. \<exists>B1[M]. |
64 number1(M,n1) & cartprod(M,n1,A,A0) & upair(M,n1,n1,s1) & |
64 number1(M,n1) & cartprod(M,n1,A,A0) & upair(M,n1,n1,s1) & |
65 cartprod(M,s1,B,B1) & union(M,A0,B1,Z)" |
65 cartprod(M,s1,B,B1) & union(M,A0,B1,Z)" |
|
66 |
|
67 is_Inl :: "[i=>o,i,i] => o" |
|
68 "is_Inl(M,a,z) == \<exists>zero[M]. empty(M,zero) & pair(M,zero,a,z)" |
|
69 |
|
70 is_Inr :: "[i=>o,i,i] => o" |
|
71 "is_Inr(M,a,z) == \<exists>n1[M]. number1(M,n1) & pair(M,n1,a,z)" |
66 |
72 |
67 is_converse :: "[i=>o,i,i] => o" |
73 is_converse :: "[i=>o,i,i] => o" |
68 "is_converse(M,r,z) == |
74 "is_converse(M,r,z) == |
69 \<forall>x[M]. x \<in> z <-> |
75 \<forall>x[M]. x \<in> z <-> |
70 (\<exists>w[M]. w\<in>r & (\<exists>u[M]. \<exists>v[M]. pair(M,u,v,w) & pair(M,v,u,x)))" |
76 (\<exists>w[M]. w\<in>r & (\<exists>u[M]. \<exists>v[M]. pair(M,u,v,w) & pair(M,v,u,x)))" |
1156 apply (induct_tac n, simp) |
1178 apply (induct_tac n, simp) |
1157 apply (simp add: funspace_succ nat_into_M) |
1179 apply (simp add: funspace_succ nat_into_M) |
1158 done |
1180 done |
1159 |
1181 |
1160 |
1182 |
|
1183 subsection{*Relativization and Absoluteness for List Operators*} |
|
1184 |
|
1185 constdefs |
|
1186 |
|
1187 is_Nil :: "[i=>o, i] => o" |
|
1188 --{* because @{term "[] \<equiv> Inl(0)"}*} |
|
1189 "is_Nil(M,xs) == \<exists>zero[M]. empty(M,zero) & is_Inl(M,zero,xs)" |
|
1190 |
|
1191 is_Cons :: "[i=>o,i,i,i] => o" |
|
1192 --{* because @{term "Cons(a, l) \<equiv> Inr(\<langle>a,l\<rangle>)"}*} |
|
1193 "is_Cons(M,a,l,Z) == \<exists>p[M]. pair(M,a,l,p) & is_Inr(M,p,Z)" |
|
1194 |
|
1195 |
|
1196 lemma (in M_triv_axioms) Nil_in_M [intro,simp]: "M(Nil)" |
|
1197 by (simp add: Nil_def) |
|
1198 |
|
1199 lemma (in M_triv_axioms) Nil_abs [simp]: "M(Z) ==> is_Nil(M,Z) <-> (Z = Nil)" |
|
1200 by (simp add: is_Nil_def Nil_def) |
|
1201 |
|
1202 lemma (in M_triv_axioms) Cons_in_M_iff [iff]: "M(Cons(a,l)) <-> M(a) & M(l)" |
|
1203 by (simp add: Cons_def) |
|
1204 |
|
1205 lemma (in M_triv_axioms) Cons_abs [simp]: |
|
1206 "[|M(a); M(l); M(Z)|] ==> is_Cons(M,a,l,Z) <-> (Z = Cons(a,l))" |
|
1207 by (simp add: is_Cons_def Cons_def) |
|
1208 |
|
1209 |
|
1210 constdefs |
|
1211 |
|
1212 quasilist :: "i => o" |
|
1213 "quasilist(xs) == xs=Nil | (\<exists>x l. xs = Cons(x,l))" |
|
1214 |
|
1215 is_quasilist :: "[i=>o,i] => o" |
|
1216 "is_quasilist(M,z) == is_Nil(M,z) | (\<exists>x[M]. \<exists>l[M]. is_Cons(M,x,l,z))" |
|
1217 |
|
1218 list_case' :: "[i, [i,i]=>i, i] => i" |
|
1219 --{*A version of @{term list_case} that's always defined.*} |
|
1220 "list_case'(a,b,xs) == |
|
1221 if quasilist(xs) then list_case(a,b,xs) else 0" |
|
1222 |
|
1223 is_list_case :: "[i=>o, i, [i,i,i]=>o, i, i] => o" |
|
1224 --{*Returns 0 for non-lists*} |
|
1225 "is_list_case(M, a, is_b, xs, z) == |
|
1226 (is_Nil(M,xs) --> z=a) & |
|
1227 (\<forall>x[M]. \<forall>l[M]. is_Cons(M,x,l,xs) --> is_b(x,l,z)) & |
|
1228 (is_quasilist(M,xs) | empty(M,z))" |
|
1229 |
|
1230 hd' :: "i => i" |
|
1231 --{*A version of @{term hd} that's always defined.*} |
|
1232 "hd'(xs) == if quasilist(xs) then hd(xs) else 0" |
|
1233 |
|
1234 tl' :: "i => i" |
|
1235 --{*A version of @{term tl} that's always defined.*} |
|
1236 "tl'(xs) == if quasilist(xs) then tl(xs) else 0" |
|
1237 |
|
1238 is_hd :: "[i=>o,i,i] => o" |
|
1239 --{* @{term "hd([]) = 0"} no constraints if not a list. |
|
1240 Avoiding implication prevents the simplifier's looping.*} |
|
1241 "is_hd(M,xs,H) == |
|
1242 (is_Nil(M,xs) --> empty(M,H)) & |
|
1243 (\<forall>x[M]. \<forall>l[M]. ~ is_Cons(M,x,l,xs) | H=x) & |
|
1244 (is_quasilist(M,xs) | empty(M,H))" |
|
1245 |
|
1246 is_tl :: "[i=>o,i,i] => o" |
|
1247 --{* @{term "tl([]) = []"}; see comments about @{term is_hd}*} |
|
1248 "is_tl(M,xs,T) == |
|
1249 (is_Nil(M,xs) --> T=xs) & |
|
1250 (\<forall>x[M]. \<forall>l[M]. ~ is_Cons(M,x,l,xs) | T=l) & |
|
1251 (is_quasilist(M,xs) | empty(M,T))" |
|
1252 |
|
1253 subsubsection{*@{term quasilist}: For Case-Splitting with @{term list_case'}*} |
|
1254 |
|
1255 lemma [iff]: "quasilist(Nil)" |
|
1256 by (simp add: quasilist_def) |
|
1257 |
|
1258 lemma [iff]: "quasilist(Cons(x,l))" |
|
1259 by (simp add: quasilist_def) |
|
1260 |
|
1261 lemma list_imp_quasilist: "l \<in> list(A) ==> quasilist(l)" |
|
1262 by (erule list.cases, simp_all) |
|
1263 |
|
1264 subsubsection{*@{term list_case'}, the Modified Version of @{term list_case}*} |
|
1265 |
|
1266 lemma list_case'_Nil [simp]: "list_case'(a,b,Nil) = a" |
|
1267 by (simp add: list_case'_def quasilist_def) |
|
1268 |
|
1269 lemma list_case'_Cons [simp]: "list_case'(a,b,Cons(x,l)) = b(x,l)" |
|
1270 by (simp add: list_case'_def quasilist_def) |
|
1271 |
|
1272 lemma non_list_case: "~ quasilist(x) ==> list_case'(a,b,x) = 0" |
|
1273 by (simp add: quasilist_def list_case'_def) |
|
1274 |
|
1275 lemma list_case'_eq_list_case [simp]: |
|
1276 "xs \<in> list(A) ==>list_case'(a,b,xs) = list_case(a,b,xs)" |
|
1277 by (erule list.cases, simp_all) |
|
1278 |
|
1279 lemma (in M_axioms) list_case'_closed [intro,simp]: |
|
1280 "[|M(k); M(a); \<forall>x[M]. \<forall>y[M]. M(b(x,y))|] ==> M(list_case'(a,b,k))" |
|
1281 apply (case_tac "quasilist(k)") |
|
1282 apply (simp add: quasilist_def, force) |
|
1283 apply (simp add: non_list_case) |
|
1284 done |
|
1285 |
|
1286 lemma (in M_triv_axioms) quasilist_abs [simp]: |
|
1287 "M(z) ==> is_quasilist(M,z) <-> quasilist(z)" |
|
1288 by (auto simp add: is_quasilist_def quasilist_def) |
|
1289 |
|
1290 lemma (in M_triv_axioms) list_case_abs [simp]: |
|
1291 "[| relativize2(M,is_b,b); M(k); M(z) |] |
|
1292 ==> is_list_case(M,a,is_b,k,z) <-> z = list_case'(a,b,k)" |
|
1293 apply (case_tac "quasilist(k)") |
|
1294 prefer 2 |
|
1295 apply (simp add: is_list_case_def non_list_case) |
|
1296 apply (force simp add: quasilist_def) |
|
1297 apply (simp add: quasilist_def is_list_case_def) |
|
1298 apply (elim disjE exE) |
|
1299 apply (simp_all add: relativize2_def) |
|
1300 done |
|
1301 |
|
1302 |
|
1303 subsubsection{*The Modified Operators @{term hd'} and @{term tl'}*} |
|
1304 |
|
1305 lemma (in M_triv_axioms) is_hd_Nil: "is_hd(M,[],Z) <-> empty(M,Z)" |
|
1306 by (simp add: is_hd_def ) |
|
1307 |
|
1308 lemma (in M_triv_axioms) is_hd_Cons: |
|
1309 "[|M(a); M(l)|] ==> is_hd(M,Cons(a,l),Z) <-> Z = a" |
|
1310 by (force simp add: is_hd_def ) |
|
1311 |
|
1312 lemma (in M_triv_axioms) hd_abs [simp]: |
|
1313 "[|M(x); M(y)|] ==> is_hd(M,x,y) <-> y = hd'(x)" |
|
1314 apply (simp add: hd'_def) |
|
1315 apply (intro impI conjI) |
|
1316 prefer 2 apply (force simp add: is_hd_def) |
|
1317 apply (simp add: quasilist_def is_hd_def ) |
|
1318 apply (elim disjE exE, auto) |
|
1319 done |
|
1320 |
|
1321 lemma (in M_triv_axioms) is_tl_Nil: "is_tl(M,[],Z) <-> Z = []" |
|
1322 by (simp add: is_tl_def ) |
|
1323 |
|
1324 lemma (in M_triv_axioms) is_tl_Cons: |
|
1325 "[|M(a); M(l)|] ==> is_tl(M,Cons(a,l),Z) <-> Z = l" |
|
1326 by (force simp add: is_tl_def ) |
|
1327 |
|
1328 lemma (in M_triv_axioms) tl_abs [simp]: |
|
1329 "[|M(x); M(y)|] ==> is_tl(M,x,y) <-> y = tl'(x)" |
|
1330 apply (simp add: tl'_def) |
|
1331 apply (intro impI conjI) |
|
1332 prefer 2 apply (force simp add: is_tl_def) |
|
1333 apply (simp add: quasilist_def is_tl_def ) |
|
1334 apply (elim disjE exE, auto) |
|
1335 done |
|
1336 |
|
1337 lemma (in M_triv_axioms) relativize1_tl: "relativize1(M, is_tl(M), tl')" |
|
1338 by (simp add: relativize1_def) |
|
1339 |
|
1340 lemma hd'_Nil: "hd'([]) = 0" |
|
1341 by (simp add: hd'_def) |
|
1342 |
|
1343 lemma hd'_Cons: "hd'(Cons(a,l)) = a" |
|
1344 by (simp add: hd'_def) |
|
1345 |
|
1346 lemma tl'_Nil: "tl'([]) = []" |
|
1347 by (simp add: tl'_def) |
|
1348 |
|
1349 lemma tl'_Cons: "tl'(Cons(a,l)) = l" |
|
1350 by (simp add: tl'_def) |
|
1351 |
|
1352 lemma iterates_tl_Nil: "n \<in> nat ==> tl'^n ([]) = []" |
|
1353 apply (induct_tac n) |
|
1354 apply (simp_all add: tl'_Nil) |
|
1355 done |
|
1356 |
|
1357 lemma (in M_axioms) tl'_closed: "M(x) ==> M(tl'(x))" |
|
1358 apply (simp add: tl'_def) |
|
1359 apply (force simp add: quasilist_def) |
|
1360 done |
|
1361 |
|
1362 |
1161 end |
1363 end |