src/ZF/Constructible/Datatype_absolute.thy
changeset 13397 6e5f4d911435
parent 13395 4eb948d1eb4e
child 13398 1cadd412da48
equal deleted inserted replaced
13396:11219ca224ab 13397:6e5f4d911435
   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)"
   396      "[|M(Z)|] ==> is_formula(M,Z) <-> Z = formula"
   465      "[|M(Z)|] ==> is_formula(M,Z) <-> Z = formula"
   397 apply (simp add: is_formula_def, safe)
   466 apply (simp add: is_formula_def, safe)
   398 apply (rule M_equalityI, simp_all)
   467 apply (rule M_equalityI, simp_all)
   399 done
   468 done
   400 
   469 
       
   470 
       
   471 subsection{*Absoluteness for Some List Operators*}
   401 
   472 
   402 subsection{*Absoluteness for @{text \<epsilon>}-Closure: the @{term eclose} Operator*}
   473 subsection{*Absoluteness for @{text \<epsilon>}-Closure: the @{term eclose} Operator*}
   403 
   474 
   404 text{*Re-expresses eclose using "iterates"*}
   475 text{*Re-expresses eclose using "iterates"*}
   405 lemma eclose_eq_Union:
   476 lemma eclose_eq_Union:
   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