268 |
268 |
269 |
269 |
270 subsection{*@{term M} Contains the List and Formula Datatypes*} |
270 subsection{*@{term M} Contains the List and Formula Datatypes*} |
271 |
271 |
272 constdefs |
272 constdefs |
273 is_list_n :: "[i=>o,i,i,i] => o" |
273 list_N :: "[i,i] => i" |
274 "is_list_n(M,A,n,Z) == |
274 "list_N(A,n) == (\<lambda>X. {0} + A * X)^n (0)" |
|
275 |
|
276 lemma Nil_in_list_N [simp]: "[] \<in> list_N(A,succ(n))" |
|
277 by (simp add: list_N_def Nil_def) |
|
278 |
|
279 lemma Cons_in_list_N [simp]: |
|
280 "Cons(a,l) \<in> list_N(A,succ(n)) <-> a\<in>A & l \<in> list_N(A,n)" |
|
281 by (simp add: list_N_def Cons_def) |
|
282 |
|
283 text{*These two aren't simprules because they reveal the underlying |
|
284 list representation.*} |
|
285 lemma list_N_0: "list_N(A,0) = 0" |
|
286 by (simp add: list_N_def) |
|
287 |
|
288 lemma list_N_succ: "list_N(A,succ(n)) = {0} + A * (list_N(A,n))" |
|
289 by (simp add: list_N_def) |
|
290 |
|
291 lemma list_N_imp_list: |
|
292 "[| l \<in> list_N(A,n); n \<in> nat |] ==> l \<in> list(A)" |
|
293 by (force simp add: list_eq_Union list_N_def) |
|
294 |
|
295 lemma list_N_imp_length_lt [rule_format]: |
|
296 "n \<in> nat ==> \<forall>l \<in> list_N(A,n). length(l) < n" |
|
297 apply (induct_tac n) |
|
298 apply (auto simp add: list_N_0 list_N_succ |
|
299 Nil_def [symmetric] Cons_def [symmetric]) |
|
300 done |
|
301 |
|
302 lemma list_imp_list_N [rule_format]: |
|
303 "l \<in> list(A) ==> \<forall>n\<in>nat. length(l) < n --> l \<in> list_N(A, n)" |
|
304 apply (induct_tac l) |
|
305 apply (force elim: natE)+ |
|
306 done |
|
307 |
|
308 lemma list_N_imp_eq_length: |
|
309 "[|n \<in> nat; l \<notin> list_N(A, n); l \<in> list_N(A, succ(n))|] |
|
310 ==> n = length(l)" |
|
311 apply (rule le_anti_sym) |
|
312 prefer 2 apply (simp add: list_N_imp_length_lt) |
|
313 apply (frule list_N_imp_list, simp) |
|
314 apply (simp add: not_lt_iff_le [symmetric]) |
|
315 apply (blast intro: list_imp_list_N) |
|
316 done |
|
317 |
|
318 text{*Express @{term list_rec} without using @{term rank} or @{term Vset}, |
|
319 neither of which is absolute.*} |
|
320 lemma (in M_triv_axioms) list_rec_eq: |
|
321 "l \<in> list(A) ==> |
|
322 list_rec(a,g,l) = |
|
323 transrec (succ(length(l)), |
|
324 \<lambda>x h. Lambda (list_N(A,x), |
|
325 list_case' (a, |
|
326 \<lambda>a l. g(a, l, h ` succ(length(l)) ` l)))) ` l" |
|
327 apply (induct_tac l) |
|
328 apply (subst transrec, simp) |
|
329 apply (subst transrec) |
|
330 apply (simp add: list_imp_list_N) |
|
331 done |
|
332 |
|
333 constdefs |
|
334 is_list_N :: "[i=>o,i,i,i] => o" |
|
335 "is_list_N(M,A,n,Z) == |
275 \<exists>zero[M]. \<exists>sn[M]. \<exists>msn[M]. |
336 \<exists>zero[M]. \<exists>sn[M]. \<exists>msn[M]. |
276 empty(M,zero) & |
337 empty(M,zero) & |
277 successor(M,n,sn) & membership(M,sn,msn) & |
338 successor(M,n,sn) & membership(M,sn,msn) & |
278 is_wfrec(M, iterates_MH(M, is_list_functor(M,A),zero), msn, n, Z)" |
339 is_wfrec(M, iterates_MH(M, is_list_functor(M,A),zero), msn, n, Z)" |
279 |
340 |
280 mem_list :: "[i=>o,i,i] => o" |
341 mem_list :: "[i=>o,i,i] => o" |
281 "mem_list(M,A,l) == |
342 "mem_list(M,A,l) == |
282 \<exists>n[M]. \<exists>listn[M]. |
343 \<exists>n[M]. \<exists>listn[M]. |
283 finite_ordinal(M,n) & is_list_n(M,A,n,listn) & l \<in> listn" |
344 finite_ordinal(M,n) & is_list_N(M,A,n,listn) & l \<in> listn" |
284 |
345 |
285 is_list :: "[i=>o,i,i] => o" |
346 is_list :: "[i=>o,i,i] => o" |
286 "is_list(M,A,Z) == \<forall>l[M]. l \<in> Z <-> mem_list(M,A,l)" |
347 "is_list(M,A,Z) == \<forall>l[M]. l \<in> Z <-> mem_list(M,A,l)" |
287 |
348 |
288 constdefs |
349 constdefs |
334 "M(A) ==> M(list(A))" |
395 "M(A) ==> M(list(A))" |
335 apply (insert list_replacement1) |
396 apply (insert list_replacement1) |
336 by (simp add: RepFun_closed2 list_eq_Union |
397 by (simp add: RepFun_closed2 list_eq_Union |
337 list_replacement2' relativize1_def |
398 list_replacement2' relativize1_def |
338 iterates_closed [of "is_list_functor(M,A)"]) |
399 iterates_closed [of "is_list_functor(M,A)"]) |
339 lemma (in M_datatypes) is_list_n_abs [simp]: |
400 |
|
401 lemma (in M_datatypes) list_N_abs [simp]: |
340 "[|M(A); n\<in>nat; M(Z)|] |
402 "[|M(A); n\<in>nat; M(Z)|] |
341 ==> is_list_n(M,A,n,Z) <-> Z = (\<lambda>X. {0} + A * X)^n (0)" |
403 ==> is_list_N(M,A,n,Z) <-> Z = list_N(A,n)" |
342 apply (insert list_replacement1) |
404 apply (insert list_replacement1) |
343 apply (simp add: is_list_n_def relativize1_def nat_into_M |
405 apply (simp add: is_list_N_def list_N_def relativize1_def nat_into_M |
344 iterates_abs [of "is_list_functor(M,A)" _ "\<lambda>X. {0} + A*X"]) |
406 iterates_abs [of "is_list_functor(M,A)" _ "\<lambda>X. {0} + A*X"]) |
|
407 done |
|
408 |
|
409 lemma (in M_datatypes) list_N_closed [intro,simp]: |
|
410 "[|M(A); n\<in>nat|] ==> M(list_N(A,n))" |
|
411 apply (insert list_replacement1) |
|
412 apply (simp add: is_list_N_def list_N_def relativize1_def nat_into_M |
|
413 iterates_closed [of "is_list_functor(M,A)"]) |
345 done |
414 done |
346 |
415 |
347 lemma (in M_datatypes) mem_list_abs [simp]: |
416 lemma (in M_datatypes) mem_list_abs [simp]: |
348 "M(A) ==> mem_list(M,A,l) <-> l \<in> list(A)" |
417 "M(A) ==> mem_list(M,A,l) <-> l \<in> list(A)" |
349 apply (insert list_replacement1) |
418 apply (insert list_replacement1) |
350 apply (simp add: mem_list_def relativize1_def list_eq_Union |
419 apply (simp add: mem_list_def list_N_def relativize1_def list_eq_Union |
351 iterates_closed [of "is_list_functor(M,A)"]) |
420 iterates_closed [of "is_list_functor(M,A)"]) |
352 done |
421 done |
353 |
422 |
354 lemma (in M_datatypes) list_abs [simp]: |
423 lemma (in M_datatypes) list_abs [simp]: |
355 "[|M(A); M(Z)|] ==> is_list(M,A,Z) <-> Z = list(A)" |
424 "[|M(A); M(Z)|] ==> is_list(M,A,Z) <-> Z = list(A)" |
492 "transrec_replacement(M,MH,a) == |
563 "transrec_replacement(M,MH,a) == |
493 \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M]. |
564 \<exists>sa[M]. \<exists>esa[M]. \<exists>mesa[M]. |
494 upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) & |
565 upair(M,a,a,sa) & is_eclose(M,sa,esa) & membership(M,esa,mesa) & |
495 wfrec_replacement(M,MH,mesa)" |
566 wfrec_replacement(M,MH,mesa)" |
496 |
567 |
497 (*????????????????Ordinal.thy*) |
|
498 lemma Transset_trans_Memrel: |
|
499 "\<forall>j\<in>i. Transset(j) ==> trans(Memrel(i))" |
|
500 by (unfold Transset_def trans_def, blast) |
|
501 |
|
502 text{*The condition @{term "Ord(i)"} lets us use the simpler |
568 text{*The condition @{term "Ord(i)"} lets us use the simpler |
503 @{text "trans_wfrec_abs"} rather than @{text "trans_wfrec_abs"}, |
569 @{text "trans_wfrec_abs"} rather than @{text "trans_wfrec_abs"}, |
504 which I haven't even proved yet. *} |
570 which I haven't even proved yet. *} |
505 theorem (in M_eclose) transrec_abs: |
571 theorem (in M_eclose) transrec_abs: |
506 "[|Ord(i); M(i); M(z); |
572 "[|Ord(i); M(i); M(z); |
519 by (simp add: trans_wfrec_closed transrec_replacement_def is_transrec_def |
585 by (simp add: trans_wfrec_closed transrec_replacement_def is_transrec_def |
520 transrec_def eclose_sing_Ord_eq wf_Memrel trans_Memrel relation_Memrel) |
586 transrec_def eclose_sing_Ord_eq wf_Memrel trans_Memrel relation_Memrel) |
521 |
587 |
522 |
588 |
523 |
589 |
|
590 subsection{*Absoluteness for the List Operator @{term length}*} |
|
591 constdefs |
|
592 |
|
593 is_length :: "[i=>o,i,i,i] => o" |
|
594 "is_length(M,A,l,n) == |
|
595 \<exists>sn[M]. \<exists>list_n[M]. \<exists>list_sn[M]. |
|
596 is_list_N(M,A,n,list_n) & l \<notin> list_n & |
|
597 successor(M,n,sn) & is_list_N(M,A,sn,list_sn) & l \<in> list_sn" |
|
598 |
|
599 |
|
600 lemma (in M_datatypes) length_abs [simp]: |
|
601 "[|M(A); l \<in> list(A); n \<in> nat|] ==> is_length(M,A,l,n) <-> n = length(l)" |
|
602 apply (subgoal_tac "M(l) & M(n)") |
|
603 prefer 2 apply (blast dest: transM) |
|
604 apply (simp add: is_length_def) |
|
605 apply (blast intro: list_imp_list_N nat_into_Ord list_N_imp_eq_length |
|
606 dest: list_N_imp_length_lt) |
|
607 done |
|
608 |
|
609 text{*Proof is trivial since @{term length} returns natural numbers.*} |
|
610 lemma (in M_triv_axioms) length_closed [intro,simp]: |
|
611 "l \<in> list(A) ==> M(length(l))" |
|
612 by (simp add: nat_into_M ) |
|
613 |
|
614 |
|
615 subsection {*Absoluteness for @{term nth}*} |
|
616 |
|
617 lemma nth_eq_hd_iterates_tl [rule_format]: |
|
618 "xs \<in> list(A) ==> \<forall>n \<in> nat. nth(n,xs) = hd' (tl'^n (xs))" |
|
619 apply (induct_tac xs) |
|
620 apply (simp add: iterates_tl_Nil hd'_Nil, clarify) |
|
621 apply (erule natE) |
|
622 apply (simp add: hd'_Cons) |
|
623 apply (simp add: tl'_Cons iterates_commute) |
|
624 done |
|
625 |
|
626 lemma (in M_axioms) iterates_tl'_closed: |
|
627 "[|n \<in> nat; M(x)|] ==> M(tl'^n (x))" |
|
628 apply (induct_tac n, simp) |
|
629 apply (simp add: tl'_Cons tl'_closed) |
|
630 done |
|
631 |
|
632 locale (open) M_nth = M_datatypes + |
|
633 assumes nth_replacement1: |
|
634 "M(xs) ==> iterates_replacement(M, %l t. is_tl(M,l,t), xs)" |
|
635 |
|
636 text{*Immediate by type-checking*} |
|
637 lemma (in M_datatypes) nth_closed [intro,simp]: |
|
638 "[|xs \<in> list(A); n \<in> nat; M(A)|] ==> M(nth(n,xs))" |
|
639 apply (case_tac "n < length(xs)") |
|
640 apply (blast intro: nth_type transM) |
|
641 apply (simp add: not_lt_iff_le nth_eq_0) |
|
642 done |
|
643 |
|
644 constdefs |
|
645 is_nth :: "[i=>o,i,i,i] => o" |
|
646 "is_nth(M,n,l,Z) == |
|
647 \<exists>X[M]. \<exists>sn[M]. \<exists>msn[M]. |
|
648 successor(M,n,sn) & membership(M,sn,msn) & |
|
649 is_wfrec(M, iterates_MH(M, is_tl(M), l), msn, n, X) & |
|
650 is_hd(M,X,Z)" |
|
651 |
|
652 lemma (in M_nth) nth_abs [simp]: |
|
653 "[|M(A); n \<in> nat; l \<in> list(A); M(Z)|] |
|
654 ==> is_nth(M,n,l,Z) <-> Z = nth(n,l)" |
|
655 apply (subgoal_tac "M(l)") |
|
656 prefer 2 apply (blast intro: transM) |
|
657 apply (insert nth_replacement1) |
|
658 apply (simp add: is_nth_def nth_eq_hd_iterates_tl nat_into_M |
|
659 tl'_closed iterates_tl'_closed |
|
660 iterates_abs [OF _ relativize1_tl]) |
|
661 done |
|
662 |
524 |
663 |
525 end |
664 end |