src/ZF/Fixedpt.thy
author immler@in.tum.de
Thu, 26 Feb 2009 10:13:43 +0100
changeset 30151 629f3a92863e
parent 24893 b8ef7afe3a6b
child 35762 af3ff2ba4c54
permissions -rw-r--r--
removed global ref dfg_format
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     1
(*  Title:      ZF/fixedpt.thy
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
13356
c9cfe1638bf2 improved presentation markup
paulson
parents: 13220
diff changeset
     7
header{*Least and Greatest Fixed Points; the Knaster-Tarski Theorem*}
c9cfe1638bf2 improved presentation markup
paulson
parents: 13220
diff changeset
     8
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 14046
diff changeset
     9
theory Fixedpt imports equalities begin
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    10
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    11
definition 
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    12
  (*monotone operator from Pow(D) to itself*)
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    13
  bnd_mono :: "[i,i=>i]=>o"  where
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    14
     "bnd_mono(D,h) == h(D)<=D & (ALL W X. W<=X --> X<=D --> h(W) <= h(X))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    15
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    16
definition 
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    17
  lfp      :: "[i,i=>i]=>i"  where
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    18
     "lfp(D,h) == Inter({X: Pow(D). h(X) <= X})"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    19
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    20
definition 
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 16417
diff changeset
    21
  gfp      :: "[i,i=>i]=>i"  where
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    22
     "gfp(D,h) == Union({X: Pow(D). X <= h(X)})"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    23
14046
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
    24
text{*The theorem is proved in the lattice of subsets of @{term D}, 
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
    25
      namely @{term "Pow(D)"}, with Inter as the greatest lower bound.*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    26
13356
c9cfe1638bf2 improved presentation markup
paulson
parents: 13220
diff changeset
    27
subsection{*Monotone Operators*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    28
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    29
lemma bnd_monoI:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    30
    "[| h(D)<=D;   
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    31
        !!W X. [| W<=D;  X<=D;  W<=X |] ==> h(W) <= h(X)   
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    32
     |] ==> bnd_mono(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    33
by (unfold bnd_mono_def, clarify, blast)  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    34
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    35
lemma bnd_monoD1: "bnd_mono(D,h) ==> h(D) <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    36
apply (unfold bnd_mono_def)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    37
apply (erule conjunct1)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    38
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    39
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    40
lemma bnd_monoD2: "[| bnd_mono(D,h);  W<=X;  X<=D |] ==> h(W) <= h(X)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    41
by (unfold bnd_mono_def, blast)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    42
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    43
lemma bnd_mono_subset:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    44
    "[| bnd_mono(D,h);  X<=D |] ==> h(X) <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    45
by (unfold bnd_mono_def, clarify, blast) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    46
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    47
lemma bnd_mono_Un:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    48
     "[| bnd_mono(D,h);  A <= D;  B <= D |] ==> h(A) Un h(B) <= h(A Un B)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    49
apply (unfold bnd_mono_def)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    50
apply (rule Un_least, blast+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    51
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    52
13220
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    53
(*unused*)
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    54
lemma bnd_mono_UN:
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    55
     "[| bnd_mono(D,h);  \<forall>i\<in>I. A(i) <= D |] 
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    56
      ==> (\<Union>i\<in>I. h(A(i))) <= h((\<Union>i\<in>I. A(i)))"
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    57
apply (unfold bnd_mono_def) 
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    58
apply (rule UN_least)
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    59
apply (elim conjE) 
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    60
apply (drule_tac x="A(i)" in spec)
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    61
apply (drule_tac x="(\<Union>i\<in>I. A(i))" in spec) 
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    62
apply blast 
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    63
done
62c899c77151 tidying
paulson
parents: 13218
diff changeset
    64
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    65
(*Useful??*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    66
lemma bnd_mono_Int:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    67
     "[| bnd_mono(D,h);  A <= D;  B <= D |] ==> h(A Int B) <= h(A) Int h(B)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    68
apply (rule Int_greatest) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    69
apply (erule bnd_monoD2, rule Int_lower1, assumption) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    70
apply (erule bnd_monoD2, rule Int_lower2, assumption) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    71
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    72
14046
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
    73
subsection{*Proof of Knaster-Tarski Theorem using @{term lfp}*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    74
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    75
(*lfp is contained in each pre-fixedpoint*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    76
lemma lfp_lowerbound: 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    77
    "[| h(A) <= A;  A<=D |] ==> lfp(D,h) <= A"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    78
by (unfold lfp_def, blast)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    79
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    80
(*Unfolding the defn of Inter dispenses with the premise bnd_mono(D,h)!*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    81
lemma lfp_subset: "lfp(D,h) <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    82
by (unfold lfp_def Inter_def, blast)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    83
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    84
(*Used in datatype package*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    85
lemma def_lfp_subset:  "A == lfp(D,h) ==> A <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    86
apply simp
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    87
apply (rule lfp_subset)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    88
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    89
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    90
lemma lfp_greatest:  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    91
    "[| h(D) <= D;  !!X. [| h(X) <= X;  X<=D |] ==> A<=X |] ==> A <= lfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    92
by (unfold lfp_def, blast) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    93
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    94
lemma lfp_lemma1:  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    95
    "[| bnd_mono(D,h);  h(A)<=A;  A<=D |] ==> h(lfp(D,h)) <= A"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    96
apply (erule bnd_monoD2 [THEN subset_trans])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    97
apply (rule lfp_lowerbound, assumption+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
    98
done
3923
c257b82a1200 global;
wenzelm
parents: 2469
diff changeset
    99
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   100
lemma lfp_lemma2: "bnd_mono(D,h) ==> h(lfp(D,h)) <= lfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   101
apply (rule bnd_monoD1 [THEN lfp_greatest])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   102
apply (rule_tac [2] lfp_lemma1)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   103
apply (assumption+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   104
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   105
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   106
lemma lfp_lemma3: 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   107
    "bnd_mono(D,h) ==> lfp(D,h) <= h(lfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   108
apply (rule lfp_lowerbound)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   109
apply (rule bnd_monoD2, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   110
apply (rule lfp_lemma2, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   111
apply (erule_tac [2] bnd_mono_subset)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   112
apply (rule lfp_subset)+
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   113
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   114
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   115
lemma lfp_unfold: "bnd_mono(D,h) ==> lfp(D,h) = h(lfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   116
apply (rule equalityI) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   117
apply (erule lfp_lemma3) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   118
apply (erule lfp_lemma2) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   119
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   120
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   121
(*Definition form, to control unfolding*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   122
lemma def_lfp_unfold:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   123
    "[| A==lfp(D,h);  bnd_mono(D,h) |] ==> A = h(A)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   124
apply simp
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   125
apply (erule lfp_unfold)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   126
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   127
13356
c9cfe1638bf2 improved presentation markup
paulson
parents: 13220
diff changeset
   128
subsection{*General Induction Rule for Least Fixedpoints*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   129
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   130
lemma Collect_is_pre_fixedpt:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   131
    "[| bnd_mono(D,h);  !!x. x : h(Collect(lfp(D,h),P)) ==> P(x) |]
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   132
     ==> h(Collect(lfp(D,h),P)) <= Collect(lfp(D,h),P)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   133
by (blast intro: lfp_lemma2 [THEN subsetD] bnd_monoD2 [THEN subsetD] 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   134
                 lfp_subset [THEN subsetD]) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   135
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   136
(*This rule yields an induction hypothesis in which the components of a
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   137
  data structure may be assumed to be elements of lfp(D,h)*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   138
lemma induct:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   139
    "[| bnd_mono(D,h);  a : lfp(D,h);                    
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   140
        !!x. x : h(Collect(lfp(D,h),P)) ==> P(x)         
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   141
     |] ==> P(a)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   142
apply (rule Collect_is_pre_fixedpt
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   143
              [THEN lfp_lowerbound, THEN subsetD, THEN CollectD2])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   144
apply (rule_tac [3] lfp_subset [THEN Collect_subset [THEN subset_trans]], 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   145
       blast+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   146
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   147
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   148
(*Definition form, to control unfolding*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   149
lemma def_induct:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   150
    "[| A == lfp(D,h);  bnd_mono(D,h);  a:A;    
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   151
        !!x. x : h(Collect(A,P)) ==> P(x)  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   152
     |] ==> P(a)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   153
by (rule induct, blast+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   154
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   155
(*This version is useful when "A" is not a subset of D
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   156
  second premise could simply be h(D Int A) <= D or !!X. X<=D ==> h(X)<=D *)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   157
lemma lfp_Int_lowerbound:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   158
    "[| h(D Int A) <= A;  bnd_mono(D,h) |] ==> lfp(D,h) <= A" 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   159
apply (rule lfp_lowerbound [THEN subset_trans])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   160
apply (erule bnd_mono_subset [THEN Int_greatest], blast+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   161
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   162
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   163
(*Monotonicity of lfp, where h precedes i under a domain-like partial order
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   164
  monotonicity of h is not strictly necessary; h must be bounded by D*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   165
lemma lfp_mono:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   166
  assumes hmono: "bnd_mono(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   167
      and imono: "bnd_mono(E,i)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   168
      and subhi: "!!X. X<=D ==> h(X) <= i(X)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   169
    shows "lfp(D,h) <= lfp(E,i)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   170
apply (rule bnd_monoD1 [THEN lfp_greatest])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   171
apply (rule imono)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   172
apply (rule hmono [THEN [2] lfp_Int_lowerbound])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   173
apply (rule Int_lower1 [THEN subhi, THEN subset_trans])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   174
apply (rule imono [THEN bnd_monoD2, THEN subset_trans], auto) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   175
done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   177
(*This (unused) version illustrates that monotonicity is not really needed,
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   178
  but both lfp's must be over the SAME set D;  Inter is anti-monotonic!*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   179
lemma lfp_mono2:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   180
    "[| i(D) <= D;  !!X. X<=D ==> h(X) <= i(X)  |] ==> lfp(D,h) <= lfp(D,i)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   181
apply (rule lfp_greatest, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   182
apply (rule lfp_lowerbound, blast, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   183
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   184
14046
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   185
lemma lfp_cong:
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   186
     "[|D=D'; !!X. X <= D' ==> h(X) = h'(X)|] ==> lfp(D,h) = lfp(D',h')"
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   187
apply (simp add: lfp_def)
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   188
apply (rule_tac t=Inter in subst_context)
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   189
apply (rule Collect_cong, simp_all) 
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   190
done 
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   191
14046
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   192
6616e6c53d48 updating ZF-UNITY with Sidi's new material
paulson
parents: 13356
diff changeset
   193
subsection{*Proof of Knaster-Tarski Theorem using @{term gfp}*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   194
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   195
(*gfp contains each post-fixedpoint that is contained in D*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   196
lemma gfp_upperbound: "[| A <= h(A);  A<=D |] ==> A <= gfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   197
apply (unfold gfp_def)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   198
apply (rule PowI [THEN CollectI, THEN Union_upper])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   199
apply (assumption+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   200
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   201
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   202
lemma gfp_subset: "gfp(D,h) <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   203
by (unfold gfp_def, blast)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   204
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   205
(*Used in datatype package*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   206
lemma def_gfp_subset: "A==gfp(D,h) ==> A <= D"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   207
apply simp
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   208
apply (rule gfp_subset)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   209
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   210
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   211
lemma gfp_least: 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   212
    "[| bnd_mono(D,h);  !!X. [| X <= h(X);  X<=D |] ==> X<=A |] ==>  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   213
     gfp(D,h) <= A"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   214
apply (unfold gfp_def)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   215
apply (blast dest: bnd_monoD1) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   216
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   217
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   218
lemma gfp_lemma1: 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   219
    "[| bnd_mono(D,h);  A<=h(A);  A<=D |] ==> A <= h(gfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   220
apply (rule subset_trans, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   221
apply (erule bnd_monoD2)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   222
apply (rule_tac [2] gfp_subset)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   223
apply (simp add: gfp_upperbound)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   224
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   225
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   226
lemma gfp_lemma2: "bnd_mono(D,h) ==> gfp(D,h) <= h(gfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   227
apply (rule gfp_least)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   228
apply (rule_tac [2] gfp_lemma1)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   229
apply (assumption+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   230
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   231
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   232
lemma gfp_lemma3: 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   233
    "bnd_mono(D,h) ==> h(gfp(D,h)) <= gfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   234
apply (rule gfp_upperbound)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   235
apply (rule bnd_monoD2, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   236
apply (rule gfp_lemma2, assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   237
apply (erule bnd_mono_subset, rule gfp_subset)+
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   238
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   239
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   240
lemma gfp_unfold: "bnd_mono(D,h) ==> gfp(D,h) = h(gfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   241
apply (rule equalityI) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   242
apply (erule gfp_lemma2) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   243
apply (erule gfp_lemma3) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   244
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   245
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   246
(*Definition form, to control unfolding*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   247
lemma def_gfp_unfold:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   248
    "[| A==gfp(D,h);  bnd_mono(D,h) |] ==> A = h(A)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   249
apply simp
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   250
apply (erule gfp_unfold)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   251
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   252
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   253
13356
c9cfe1638bf2 improved presentation markup
paulson
parents: 13220
diff changeset
   254
subsection{*Coinduction Rules for Greatest Fixed Points*}
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   255
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   256
(*weak version*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   257
lemma weak_coinduct: "[| a: X;  X <= h(X);  X <= D |] ==> a : gfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   258
by (blast intro: gfp_upperbound [THEN subsetD])
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   260
lemma coinduct_lemma:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   261
    "[| X <= h(X Un gfp(D,h));  X <= D;  bnd_mono(D,h) |] ==>   
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   262
     X Un gfp(D,h) <= h(X Un gfp(D,h))"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   263
apply (erule Un_least)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   264
apply (rule gfp_lemma2 [THEN subset_trans], assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   265
apply (rule Un_upper2 [THEN subset_trans])
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   266
apply (rule bnd_mono_Un, assumption+) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   267
apply (rule gfp_subset)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   268
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   269
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   270
(*strong version*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   271
lemma coinduct:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   272
     "[| bnd_mono(D,h);  a: X;  X <= h(X Un gfp(D,h));  X <= D |]
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   273
      ==> a : gfp(D,h)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   274
apply (rule weak_coinduct)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   275
apply (erule_tac [2] coinduct_lemma)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   276
apply (simp_all add: gfp_subset Un_subset_iff) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   277
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   278
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   279
(*Definition form, to control unfolding*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   280
lemma def_coinduct:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   281
    "[| A == gfp(D,h);  bnd_mono(D,h);  a: X;  X <= h(X Un A);  X <= D |] ==>  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   282
     a : A"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   283
apply simp
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   284
apply (rule coinduct, assumption+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   285
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   286
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   287
(*The version used in the induction/coinduction package*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   288
lemma def_Collect_coinduct:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   289
    "[| A == gfp(D, %w. Collect(D,P(w)));  bnd_mono(D, %w. Collect(D,P(w)));   
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   290
        a: X;  X <= D;  !!z. z: X ==> P(X Un A, z) |] ==>  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   291
     a : A"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   292
apply (rule def_coinduct, assumption+, blast+)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   293
done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   294
13218
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   295
(*Monotonicity of gfp!*)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   296
lemma gfp_mono:
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   297
    "[| bnd_mono(D,h);  D <= E;                  
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   298
        !!X. X<=D ==> h(X) <= i(X)  |] ==> gfp(D,h) <= gfp(E,i)"
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   299
apply (rule gfp_upperbound)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   300
apply (rule gfp_lemma2 [THEN subset_trans], assumption)
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   301
apply (blast del: subsetI intro: gfp_subset) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   302
apply (blast del: subsetI intro: subset_trans gfp_subset) 
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   303
done
3732064ccbd1 conversion of Fixedpt to Isar script
paulson
parents: 13168
diff changeset
   304
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
end