src/ZF/Constructible/Datatype_absolute.thy
author paulson
Mon, 01 Jul 2002 18:16:18 +0200
changeset 13268 240509babf00
child 13269 3ba9be497c33
permissions -rw-r--r--
more use of relativized quantifiers list_closed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13268
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     1
theory Datatype_absolute = WF_absolute:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     2
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     3
(*Epsilon.thy*)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     4
lemma succ_subset_eclose_sing: "succ(i) <= eclose({i})"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     5
apply (insert arg_subset_eclose [of "{i}"], simp) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     6
apply (frule eclose_subset, blast) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     7
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     8
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
     9
lemma eclose_sing_Ord_eq: "Ord(i) ==> eclose({i}) = succ(i)"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    10
apply (rule equalityI)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    11
apply (erule eclose_sing_Ord)  
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    12
apply (rule succ_subset_eclose_sing) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    13
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    14
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    15
(*Ordinal.thy*)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    16
lemma relation_Memrel: "relation(Memrel(A))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    17
by (simp add: relation_def Memrel_def, blast)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    18
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    19
lemma (in M_axioms) nat_case_closed:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    20
  "[|M(k); M(a); \<forall>m[M]. M(b(m))|] ==> M(nat_case(a,b,k))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    21
apply (case_tac "k=0", simp) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    22
apply (case_tac "\<exists>m. k = succ(m)")
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    23
apply force 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    24
apply (simp add: nat_case_def) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    25
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    26
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    27
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    28
subsection{*The lfp of a continuous function can be expressed as a union*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    29
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    30
constdefs
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    31
  contin :: "[i=>i]=>o"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    32
   "contin(h) == (\<forall>A. A\<noteq>0 --> h(\<Union>A) = (\<Union>X\<in>A. h(X)))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    33
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    34
lemma bnd_mono_iterates_subset: "[|bnd_mono(D, h); n \<in> nat|] ==> h^n (0) <= D"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    35
apply (induct_tac n) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    36
 apply (simp_all add: bnd_mono_def, blast) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    37
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    38
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    39
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    40
lemma contin_iterates_eq: 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    41
    "contin(h) \<Longrightarrow> h(\<Union>n\<in>nat. h^n (0)) = (\<Union>n\<in>nat. h^n (0))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    42
apply (simp add: contin_def) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    43
apply (rule trans) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    44
apply (rule equalityI) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    45
 apply (simp_all add: UN_subset_iff) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    46
 apply safe
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    47
 apply (erule_tac [2] natE) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    48
  apply (rule_tac a="succ(x)" in UN_I) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    49
   apply simp_all 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    50
apply blast 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    51
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    52
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    53
lemma lfp_subset_Union:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    54
     "[|bnd_mono(D, h); contin(h)|] ==> lfp(D,h) <= (\<Union>n\<in>nat. h^n(0))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    55
apply (rule lfp_lowerbound) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    56
 apply (simp add: contin_iterates_eq) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    57
apply (simp add: contin_def bnd_mono_iterates_subset UN_subset_iff) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    58
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    59
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    60
lemma Union_subset_lfp:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    61
     "bnd_mono(D,h) ==> (\<Union>n\<in>nat. h^n(0)) <= lfp(D,h)"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    62
apply (simp add: UN_subset_iff)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    63
apply (rule ballI)  
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    64
apply (induct_tac x, simp_all) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    65
apply (rule subset_trans [of _ "h(lfp(D,h))"])
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    66
 apply (blast dest: bnd_monoD2 [OF _ _ lfp_subset] )  
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    67
apply (erule lfp_lemma2) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    68
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    69
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    70
lemma lfp_eq_Union:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    71
     "[|bnd_mono(D, h); contin(h)|] ==> lfp(D,h) = (\<Union>n\<in>nat. h^n(0))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    72
by (blast del: subsetI 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    73
          intro: lfp_subset_Union Union_subset_lfp)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    74
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    75
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    76
subsection {*lists without univ*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    77
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    78
lemmas datatype_univs = A_into_univ Inl_in_univ Inr_in_univ 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    79
                        Pair_in_univ zero_in_univ
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    80
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    81
lemma list_fun_bnd_mono: "bnd_mono(univ(A), \<lambda>X. {0} + A*X)"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    82
apply (rule bnd_monoI)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    83
 apply (intro subset_refl zero_subset_univ A_subset_univ 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    84
	      sum_subset_univ Sigma_subset_univ) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    85
 apply (blast intro!: subset_refl sum_mono Sigma_mono del: subsetI)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    86
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    87
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    88
lemma list_fun_contin: "contin(\<lambda>X. {0} + A*X)"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    89
by (simp add: contin_def, blast)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    90
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    91
text{*Re-expresses lists using sum and product*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    92
lemma list_eq_lfp2: "list(A) = lfp(univ(A), \<lambda>X. {0} + A*X)"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    93
apply (simp add: list_def) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    94
apply (rule equalityI) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    95
 apply (rule lfp_lowerbound) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    96
  prefer 2 apply (rule lfp_subset)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    97
 apply (clarify, subst lfp_unfold [OF list_fun_bnd_mono])
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    98
 apply (simp add: Nil_def Cons_def)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
    99
 apply blast 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   100
txt{*Opposite inclusion*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   101
apply (rule lfp_lowerbound) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   102
 prefer 2 apply (rule lfp_subset) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   103
apply (clarify, subst lfp_unfold [OF list.bnd_mono]) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   104
apply (simp add: Nil_def Cons_def)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   105
apply (blast intro: datatype_univs
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   106
             dest: lfp_subset [THEN subsetD])
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   107
done
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   108
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   109
text{*Re-expresses lists using "iterates", no univ.*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   110
lemma list_eq_Union:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   111
     "list(A) = (\<Union>n\<in>nat. (\<lambda>X. {0} + A*X) ^ n (0))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   112
by (simp add: list_eq_lfp2 lfp_eq_Union list_fun_bnd_mono list_fun_contin)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   113
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   114
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   115
subsection {*Absoluteness for "Iterates"*}
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   116
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   117
lemma (in M_trancl) iterates_relativize:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   118
  "[|n \<in> nat; M(v); \<forall>x[M]. M(F(x));
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   119
     strong_replacement(M, 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   120
       \<lambda>x z. \<exists>y[M]. \<exists>g[M]. pair(M, x, y, z) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   121
              is_recfun (Memrel(succ(n)), x,
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   122
                         \<lambda>n f. nat_case(v, \<lambda>m. F(f`m), n), g) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   123
              y = nat_case(v, \<lambda>m. F(g`m), x))|] 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   124
   ==> iterates(F,n,v) = z <-> 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   125
       (\<exists>g[M]. is_recfun(Memrel(succ(n)), n, 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   126
                             \<lambda>n g. nat_case(v, \<lambda>m. F(g`m), n), g) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   127
            z = nat_case(v, \<lambda>m. F(g`m), n))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   128
by (simp add: iterates_nat_def recursor_def transrec_def 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   129
              eclose_sing_Ord_eq trans_wfrec_relativize nat_into_M
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   130
              wf_Memrel trans_Memrel relation_Memrel nat_case_closed)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   131
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   132
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   133
lemma (in M_wfrank) iterates_closed [intro,simp]:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   134
  "[|n \<in> nat; M(v); \<forall>x[M]. M(F(x));
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   135
     strong_replacement(M, 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   136
       \<lambda>x z. \<exists>y[M]. \<exists>g[M]. pair(M, x, y, z) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   137
              is_recfun (Memrel(succ(n)), x,
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   138
                         \<lambda>n f. nat_case(v, \<lambda>m. F(f`m), n), g) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   139
              y = nat_case(v, \<lambda>m. F(g`m), x))|] 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   140
   ==> M(iterates(F,n,v))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   141
by (simp add: iterates_nat_def recursor_def transrec_def 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   142
              eclose_sing_Ord_eq trans_wfrec_closed nat_into_M
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   143
              wf_Memrel trans_Memrel relation_Memrel nat_case_closed)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   144
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   145
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   146
locale M_datatypes = M_wfrank +
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   147
(*THEY NEED RELATIVIZATION*)
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   148
  assumes list_replacement1: 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   149
	   "[|M(A); n \<in> nat|] ==> 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   150
	    strong_replacement(M, 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   151
	      \<lambda>x z. \<exists>y[M]. \<exists>g[M]. pair(M, x, y, z) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   152
		     is_recfun (Memrel(succ(n)), x,
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   153
				\<lambda>n f. nat_case(0, \<lambda>m. {0} + A \<times> f`m, n), g) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   154
		     y = nat_case(0, \<lambda>m. {0} + A \<times> g`m, x))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   155
      and list_replacement2': 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   156
           "M(A) ==> strong_replacement(M, \<lambda>x y. y = (\<lambda>X. {0} + A \<times> X)^x (0))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   157
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   158
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   159
lemma (in M_datatypes) list_replacement1':
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   160
  "[|M(A); n \<in> nat|]
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   161
   ==> strong_replacement
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   162
	  (M, \<lambda>x y. \<exists>z[M]. \<exists>g[M]. y = \<langle>x, z\<rangle> &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   163
               is_recfun (Memrel(succ(n)), x,
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   164
		          \<lambda>n f. nat_case(0, \<lambda>m. {0} + A \<times> f ` m, n), g) &
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   165
 	       z = nat_case(0, \<lambda>m. {0} + A \<times> g ` m, x))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   166
by (insert list_replacement1, simp) 
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   167
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   168
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   169
lemma (in M_datatypes) list_closed [intro,simp]:
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   170
     "M(A) ==> M(list(A))"
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   171
by (simp add: list_eq_Union list_replacement1' list_replacement2')
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   172
240509babf00 more use of relativized quantifiers
paulson
parents:
diff changeset
   173
end