src/ZF/fixedpt.ML
author lcp
Mon, 20 Sep 1993 17:02:11 +0200
changeset 8 c3d2c6dcf3f0
parent 0 a5a9c433f639
child 14 1c0926788772
permissions -rw-r--r--
Installation of new simplfier. Previously appeared to set up the old simplifier to rewrite with the partial ordering [=, something not possible with the new simplifier. But such rewriting appears not to have actually been used, and there were few complications. In terms.ML setloop was used to avoid infinite rewriting with the letrec rule. Congruence rules were deleted, and an occasional SIMP_TAC had to become asm_simp_tac.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/fixedpt.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
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
For fixedpt.thy.  Least and greatest fixed points; the Knaster-Tarski Theorem
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
Proved in the lattice of subsets of D, namely Pow(D), with Inter as glb
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
open Fixedpt;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
(*** Monotone operators ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
val prems = goalw Fixedpt.thy [bnd_mono_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
    "[| h(D)<=D;  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
\       !!W X. [| W<=D;  X<=D;  W<=X |] ==> h(W) <= h(X)  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
\    |] ==> bnd_mono(D,h)";  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
by (REPEAT (ares_tac (prems@[conjI,allI,impI]) 1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
     ORELSE etac subset_trans 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
val bnd_monoI = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
val [major] = goalw Fixedpt.thy [bnd_mono_def] "bnd_mono(D,h) ==> h(D) <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
by (rtac (major RS conjunct1) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
val bnd_monoD1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
val major::prems = goalw Fixedpt.thy [bnd_mono_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
    "[| bnd_mono(D,h);  W<=X;  X<=D |] ==> h(W) <= h(X)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
by (rtac (major RS conjunct2 RS spec RS spec RS mp RS mp) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val bnd_monoD2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val [major,minor] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
    "[| bnd_mono(D,h);  X<=D |] ==> h(X) <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
by (rtac (major RS bnd_monoD2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
by (rtac (major RS bnd_monoD1) 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
by (rtac minor 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
by (rtac subset_refl 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
val bnd_mono_subset = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
goal Fixedpt.thy "!!A B. [| bnd_mono(D,h);  A <= D;  B <= D |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
\                         h(A) Un h(B) <= h(A Un B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
by (REPEAT (ares_tac [Un_upper1, Un_upper2, Un_least] 1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
     ORELSE etac bnd_monoD2 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val bnd_mono_Un = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
(*Useful??*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
goal Fixedpt.thy "!!A B. [| bnd_mono(D,h);  A <= D;  B <= D |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
\                        h(A Int B) <= h(A) Int h(B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
by (REPEAT (ares_tac [Int_lower1, Int_lower2, Int_greatest] 1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
     ORELSE etac bnd_monoD2 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
val bnd_mono_Int = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
(**** Proof of Knaster-Tarski Theorem for the lfp ****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
(*lfp is contained in each pre-fixedpoint*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
val prems = goalw Fixedpt.thy [lfp_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
    "[| h(A) <= A;  A<=D |] ==> lfp(D,h) <= A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (rtac (PowI RS CollectI RS Inter_lower) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
val lfp_lowerbound = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
(*Unfolding the defn of Inter dispenses with the premise bnd_mono(D,h)!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
goalw Fixedpt.thy [lfp_def,Inter_def] "lfp(D,h) <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
val lfp_subset = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
(*Used in datatype package*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
val [rew] = goal Fixedpt.thy "A==lfp(D,h) ==> A <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
by (rtac lfp_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
val def_lfp_subset = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
val subset0_cs = FOL_cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
  addSIs [ballI, InterI, CollectI, PowI, empty_subsetI]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
  addIs [bexI, UnionI, ReplaceI, RepFunI]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
  addSEs [bexE, make_elim PowD, UnionE, ReplaceE, RepFunE,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
	  CollectE, emptyE]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
  addEs [rev_ballE, InterD, make_elim InterD, subsetD];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
val subset_cs = subset0_cs 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
  addSIs [subset_refl,cons_subsetI,subset_consI,Union_least,UN_least,Un_least,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
	  Inter_greatest,Int_greatest,RepFun_subset]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
  addSIs [Un_upper1,Un_upper2,Int_lower1,Int_lower2]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
  addIs  [Union_upper,Inter_lower]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
  addSEs [cons_subsetE];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
val prems = goalw Fixedpt.thy [lfp_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
    "[| h(D) <= D;  !!X. [| h(X) <= X;  X<=D |] ==> A<=X |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
\    A <= lfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
br (Pow_top RS CollectI RS Inter_greatest) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
by (REPEAT (ares_tac prems 1 ORELSE eresolve_tac [CollectE,PowD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val lfp_greatest = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
val hmono::prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
    "[| bnd_mono(D,h);  h(A)<=A;  A<=D |] ==> h(lfp(D,h)) <= A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by (rtac (hmono RS bnd_monoD2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
val lfp_lemma1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
val [hmono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
    "bnd_mono(D,h) ==> h(lfp(D,h)) <= lfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
by (rtac (bnd_monoD1 RS lfp_greatest) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
by (rtac lfp_lemma1 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
by (REPEAT (ares_tac [hmono] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
val lfp_lemma2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
val [hmono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
    "bnd_mono(D,h) ==> lfp(D,h) <= h(lfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
by (rtac (hmono RS bnd_monoD2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
by (rtac (hmono RS lfp_lemma2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
by (rtac (hmono RS bnd_mono_subset) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
by (REPEAT (rtac lfp_subset 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
val lfp_lemma3 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
val prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
    "bnd_mono(D,h) ==> lfp(D,h) = h(lfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
by (REPEAT (resolve_tac (prems@[equalityI,lfp_lemma2,lfp_lemma3]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
val lfp_Tarski = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
(*Definition form, to control unfolding*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
val [rew,mono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
    "[| A==lfp(D,h);  bnd_mono(D,h) |] ==> A = h(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
by (rtac (mono RS lfp_Tarski) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
val def_lfp_Tarski = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
(*** General induction rule for least fixedpoints ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
val [hmono,indstep] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
    "[| bnd_mono(D,h);  !!x. x : h(Collect(lfp(D,h),P)) ==> P(x) \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
\    |] ==> h(Collect(lfp(D,h),P)) <= Collect(lfp(D,h),P)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
by (rtac subsetI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
by (rtac CollectI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
by (etac indstep 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
by (rtac (hmono RS lfp_lemma2 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
by (rtac (hmono RS bnd_monoD2 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
by (REPEAT (ares_tac [Collect_subset, lfp_subset] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
val Collect_is_pre_fixedpt = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
(*This rule yields an induction hypothesis in which the components of a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
  data structure may be assumed to be elements of lfp(D,h)*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
val prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
    "[| bnd_mono(D,h);  a : lfp(D,h);   		\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
\       !!x. x : h(Collect(lfp(D,h),P)) ==> P(x) 	\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
\    |] ==> P(a)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
by (rtac (Collect_is_pre_fixedpt RS lfp_lowerbound RS subsetD RS CollectD2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
by (rtac (lfp_subset RS (Collect_subset RS subset_trans)) 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
by (REPEAT (ares_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
val induct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
(*Definition form, to control unfolding*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
val rew::prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
    "[| A == lfp(D,h);  bnd_mono(D,h);  a:A;   \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
\       !!x. x : h(Collect(A,P)) ==> P(x) \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
\    |] ==> P(a)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
by (rtac induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
by (REPEAT (ares_tac (map (rewrite_rule [rew]) prems) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
val def_induct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
(*This version is useful when "A" is not a subset of D;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
  second premise could simply be h(D Int A) <= D or !!X. X<=D ==> h(X)<=D *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
val [hsub,hmono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
    "[| h(D Int A) <= A;  bnd_mono(D,h) |] ==> lfp(D,h) <= A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
by (rtac (lfp_lowerbound RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
by (rtac (hmono RS bnd_mono_subset RS Int_greatest) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
by (REPEAT (resolve_tac [hsub,Int_lower1,Int_lower2] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
val lfp_Int_lowerbound = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
(*Monotonicity of lfp, where h precedes i under a domain-like partial order
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
  monotonicity of h is not strictly necessary; h must be bounded by D*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
val [hmono,imono,subhi] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
    "[| bnd_mono(D,h);  bnd_mono(E,i); 		\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
\       !!X. X<=D ==> h(X) <= i(X)  |] ==> lfp(D,h) <= lfp(E,i)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
br (bnd_monoD1 RS lfp_greatest) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
br imono 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
by (rtac (hmono RSN (2, lfp_Int_lowerbound)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
by (rtac (Int_lower1 RS subhi RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
by (rtac (imono RS bnd_monoD2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
by (REPEAT (ares_tac [Int_lower2] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
val lfp_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
(*This (unused) version illustrates that monotonicity is not really needed,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
  but both lfp's must be over the SAME set D;  Inter is anti-monotonic!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
val [isubD,subhi] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
    "[| i(D) <= D;  !!X. X<=D ==> h(X) <= i(X)  |] ==> lfp(D,h) <= lfp(D,i)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
br lfp_greatest 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
br isubD 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
be (subhi RS subset_trans) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
by (REPEAT (assume_tac 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
val lfp_mono2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
(**** Proof of Knaster-Tarski Theorem for the gfp ****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
(*gfp contains each post-fixedpoint that is contained in D*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
val prems = goalw Fixedpt.thy [gfp_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
    "[| A <= h(A);  A<=D |] ==> A <= gfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
by (rtac (PowI RS CollectI RS Union_upper) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
val gfp_upperbound = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
goalw Fixedpt.thy [gfp_def] "gfp(D,h) <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
val gfp_subset = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
(*Used in datatype package*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
val [rew] = goal Fixedpt.thy "A==gfp(D,h) ==> A <= D";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
by (rtac gfp_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
val def_gfp_subset = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
val hmono::prems = goalw Fixedpt.thy [gfp_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
    "[| bnd_mono(D,h);  !!X. [| X <= h(X);  X<=D |] ==> X<=A |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
\    gfp(D,h) <= A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
by (fast_tac (subset_cs addIs ((hmono RS bnd_monoD1)::prems)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
val gfp_least = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
val hmono::prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
    "[| bnd_mono(D,h);  A<=h(A);  A<=D |] ==> A <= h(gfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
by (rtac (hmono RS bnd_monoD2 RSN (2,subset_trans)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
by (rtac gfp_subset 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
by (rtac gfp_upperbound 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
val gfp_lemma1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
val [hmono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
    "bnd_mono(D,h) ==> gfp(D,h) <= h(gfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
by (rtac gfp_least 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
by (rtac gfp_lemma1 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
by (REPEAT (ares_tac [hmono] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
val gfp_lemma2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
val [hmono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
    "bnd_mono(D,h) ==> h(gfp(D,h)) <= gfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
by (rtac gfp_upperbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
by (rtac (hmono RS bnd_monoD2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
by (rtac (hmono RS gfp_lemma2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
by (REPEAT (rtac ([hmono, gfp_subset] MRS bnd_mono_subset) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
val gfp_lemma3 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
val prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
    "bnd_mono(D,h) ==> gfp(D,h) = h(gfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
by (REPEAT (resolve_tac (prems@[equalityI,gfp_lemma2,gfp_lemma3]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
val gfp_Tarski = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
(*Definition form, to control unfolding*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
val [rew,mono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
    "[| A==gfp(D,h);  bnd_mono(D,h) |] ==> A = h(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
by (rtac (mono RS gfp_Tarski) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
val def_gfp_Tarski = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
(*** Coinduction rules for greatest fixed points ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
(*weak version*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
goal Fixedpt.thy "!!X h. [| a: X;  X <= h(X);  X <= D |] ==> a : gfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
by (REPEAT (ares_tac [gfp_upperbound RS subsetD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
val weak_coinduct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
val [subs_h,subs_D,mono] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
    "[| X <= h(X Un gfp(D,h));  X <= D;  bnd_mono(D,h) |] ==>  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
\    X Un gfp(D,h) <= h(X Un gfp(D,h))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
by (rtac (subs_h RS Un_least) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
by (rtac (mono RS gfp_lemma2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
by (rtac (Un_upper2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
by (rtac ([mono, subs_D, gfp_subset] MRS bnd_mono_Un) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
val coinduct_lemma = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
(*strong version*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   275
goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   276
    "!!X D. [| bnd_mono(D,h);  a: X;  X <= h(X Un gfp(D,h));  X <= D |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
\           a : gfp(D,h)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   278
by (rtac (coinduct_lemma RSN (2, weak_coinduct)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
by (REPEAT (ares_tac [gfp_subset, UnI1, Un_least] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
val coinduct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282
(*Definition form, to control unfolding*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
val rew::prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   284
    "[| A == gfp(D,h);  bnd_mono(D,h);  a: X;  X <= h(X Un A);  X <= D |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   285
\    a : A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   286
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   287
by (rtac coinduct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
by (REPEAT (ares_tac (map (rewrite_rule [rew]) prems) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   289
val def_coinduct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   290
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
(*Lemma used immediately below!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
val [subsA,XimpP] = goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
    "[| X <= A;  !!z. z:X ==> P(z) |] ==> X <= Collect(A,P)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   294
by (rtac (subsA RS subsetD RS CollectI RS subsetI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   295
by (assume_tac 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
by (etac XimpP 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   297
val subset_Collect = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   298
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   299
(*The version used in the induction/coinduction package*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   300
val prems = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   301
    "[| A == gfp(D, %w. Collect(D,P(w)));  bnd_mono(D, %w. Collect(D,P(w)));  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   302
\       a: X;  X <= D;  !!z. z: X ==> P(X Un A, z) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   303
\    a : A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
by (rtac def_coinduct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
by (REPEAT (ares_tac (subset_Collect::prems) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   306
val def_Collect_coinduct = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   307
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   308
(*Monotonicity of gfp!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   309
val [hmono,subde,subhi] = goal Fixedpt.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   310
    "[| bnd_mono(D,h);  D <= E; 		\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   311
\       !!X. X<=D ==> h(X) <= i(X)  |] ==> gfp(D,h) <= gfp(E,i)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   312
by (rtac gfp_upperbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   313
by (rtac (hmono RS gfp_lemma2 RS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   314
by (rtac (gfp_subset RS subhi) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   315
by (rtac ([gfp_subset, subde] MRS subset_trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   316
val gfp_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   317