src/HOLCF/ex/loeckx.ML
author regensbu
Tue, 07 Feb 1995 17:26:32 +0100
changeset 894 6fcddbebabac
child 896 56b9c2626e81
permissions -rw-r--r--
CVS: CVS:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
894
regensbu
parents:
diff changeset
     1
(* Elegant proof for continuity of fixed-point operator *)
regensbu
parents:
diff changeset
     2
(* Loeckx & Sieber S.88                                 *)
regensbu
parents:
diff changeset
     3
regensbu
parents:
diff changeset
     4
val prems = goalw Fix.thy [Ifix_def]
regensbu
parents:
diff changeset
     5
"Ifix(F)=lub(range(%i.%G.iterate(i,G,UU)))(F)";
regensbu
parents:
diff changeset
     6
by (rtac (thelub_fun RS ssubst) 1);
regensbu
parents:
diff changeset
     7
by (rtac ch2ch_fun 1);
regensbu
parents:
diff changeset
     8
back();
regensbu
parents:
diff changeset
     9
by (rtac refl 2);
regensbu
parents:
diff changeset
    10
by (rtac is_chainI 1);
regensbu
parents:
diff changeset
    11
by (strip_tac 1);
regensbu
parents:
diff changeset
    12
by (rtac (less_fun RS iffD2) 1);
regensbu
parents:
diff changeset
    13
by (strip_tac 1);
regensbu
parents:
diff changeset
    14
by (rtac (less_fun RS iffD2) 1);
regensbu
parents:
diff changeset
    15
by (strip_tac 1);
regensbu
parents:
diff changeset
    16
by (rtac (is_chain_iterate RS is_chainE RS spec) 1);
regensbu
parents:
diff changeset
    17
val loeckx_sieber = result();
regensbu
parents:
diff changeset
    18
regensbu
parents:
diff changeset
    19
(* 
regensbu
parents:
diff changeset
    20
regensbu
parents:
diff changeset
    21
Idea: %i.%G.iterate(i,G,UU)) is a chain of continuous functions and
regensbu
parents:
diff changeset
    22
      Ifix is the lub of this chain. Hence Ifix is continuous.
regensbu
parents:
diff changeset
    23
regensbu
parents:
diff changeset
    24
----- The proof  in HOLCF ----------------------- 
regensbu
parents:
diff changeset
    25
regensbu
parents:
diff changeset
    26
Since we already proved the theorem
regensbu
parents:
diff changeset
    27
regensbu
parents:
diff changeset
    28
val contX_lubcfun = prove_goal Cfun2.thy 
regensbu
parents:
diff changeset
    29
	"is_chain(F) ==> contX(% x.lub(range(% j.F(j)[x])))"
regensbu
parents:
diff changeset
    30
regensbu
parents:
diff changeset
    31
regensbu
parents:
diff changeset
    32
we suffices to prove:
regensbu
parents:
diff changeset
    33
regensbu
parents:
diff changeset
    34
Ifix  = (%f.lub(range(%j.(LAM f. iterate(j, f, UU))[f])))
regensbu
parents:
diff changeset
    35
regensbu
parents:
diff changeset
    36
and 
regensbu
parents:
diff changeset
    37
regensbu
parents:
diff changeset
    38
contX(%f.lub(range(%j.(LAM f. iterate(j, f, UU))[f])))
regensbu
parents:
diff changeset
    39
regensbu
parents:
diff changeset
    40
Note that if we use the term 
regensbu
parents:
diff changeset
    41
regensbu
parents:
diff changeset
    42
%i.%G.iterate(i,G,UU)) instead of (%j.(LAM f. iterate(j, f, UU)))
regensbu
parents:
diff changeset
    43
regensbu
parents:
diff changeset
    44
we cannot use the theorem contX_lubcfun    
regensbu
parents:
diff changeset
    45
regensbu
parents:
diff changeset
    46
*)
regensbu
parents:
diff changeset
    47
regensbu
parents:
diff changeset
    48
val prems = goal Fix.thy  "contX(Ifix)";
regensbu
parents:
diff changeset
    49
by (res_inst_tac [("t","Ifix"),("s","(%f.lub(range(%j.(LAM f. iterate(j, f, UU))[f])))")] ssubst 1);
regensbu
parents:
diff changeset
    50
by (rtac ext 1);
regensbu
parents:
diff changeset
    51
by (rewrite_goals_tac [Ifix_def] );
regensbu
parents:
diff changeset
    52
by (subgoal_tac " range(% i.iterate(i, f, UU)) = range(%j.(LAM f. iterate(j, f, UU))[f])" 1);
regensbu
parents:
diff changeset
    53
by (etac arg_cong 1);
regensbu
parents:
diff changeset
    54
by (subgoal_tac " (% i.iterate(i, f, UU)) = (%j.(LAM f. iterate(j, f, UU))[f])" 1);
regensbu
parents:
diff changeset
    55
by (etac arg_cong 1);
regensbu
parents:
diff changeset
    56
by (rtac ext 1);
regensbu
parents:
diff changeset
    57
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
    58
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
    59
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
    60
by (rtac refl 1);
regensbu
parents:
diff changeset
    61
by (rtac contX_lubcfun 1);
regensbu
parents:
diff changeset
    62
by (rtac is_chainI 1);
regensbu
parents:
diff changeset
    63
by (strip_tac 1);
regensbu
parents:
diff changeset
    64
by (rtac less_cfun2 1);
regensbu
parents:
diff changeset
    65
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
    66
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
    67
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
    68
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
    69
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
    70
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
    71
by (rtac (is_chain_iterate RS is_chainE RS spec) 1);
regensbu
parents:
diff changeset
    72
val contX_Ifix2 = result();
regensbu
parents:
diff changeset
    73
regensbu
parents:
diff changeset
    74
(* the proof in little steps *)
regensbu
parents:
diff changeset
    75
regensbu
parents:
diff changeset
    76
val prems = goal Fix.thy  
regensbu
parents:
diff changeset
    77
"(% i.iterate(i, f, UU)) = (%j.(LAM f. iterate(j, f, UU))[f])";
regensbu
parents:
diff changeset
    78
by (rtac ext 1);
regensbu
parents:
diff changeset
    79
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
    80
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
    81
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
    82
by (rtac refl 1);
regensbu
parents:
diff changeset
    83
val fix_lemma1 = result();
regensbu
parents:
diff changeset
    84
regensbu
parents:
diff changeset
    85
val prems = goal Fix.thy  
regensbu
parents:
diff changeset
    86
" Ifix = (%f.lub(range(%j.(LAM f.iterate(j,f,UU))[f])))";
regensbu
parents:
diff changeset
    87
by (rtac ext 1);
regensbu
parents:
diff changeset
    88
by (rewrite_goals_tac [Ifix_def] ); 
regensbu
parents:
diff changeset
    89
by (rtac (fix_lemma1 RS ssubst) 1);
regensbu
parents:
diff changeset
    90
by (rtac refl 1);
regensbu
parents:
diff changeset
    91
val fix_lemma2 = result();
regensbu
parents:
diff changeset
    92
regensbu
parents:
diff changeset
    93
(*
regensbu
parents:
diff changeset
    94
- contX_lubcfun;
regensbu
parents:
diff changeset
    95
val it = "is_chain(?F) ==> contX(%x. lub(range(%j. ?F(j)[x])))" : thm
regensbu
parents:
diff changeset
    96
regensbu
parents:
diff changeset
    97
*)
regensbu
parents:
diff changeset
    98
regensbu
parents:
diff changeset
    99
val prems = goal Fix.thy "contX(Ifix)";
regensbu
parents:
diff changeset
   100
by (rtac ( fix_lemma2  RS ssubst) 1);
regensbu
parents:
diff changeset
   101
by (rtac contX_lubcfun 1);
regensbu
parents:
diff changeset
   102
by (rtac is_chainI 1);
regensbu
parents:
diff changeset
   103
by (strip_tac 1);
regensbu
parents:
diff changeset
   104
by (rtac less_cfun2 1);
regensbu
parents:
diff changeset
   105
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
   106
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
   107
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
   108
by (rtac (beta_cfun RS ssubst) 1);
regensbu
parents:
diff changeset
   109
by (rtac  contX2contX_CF1L 1);
regensbu
parents:
diff changeset
   110
by (rtac contX_iterate 1);
regensbu
parents:
diff changeset
   111
by (rtac (is_chain_iterate RS is_chainE RS spec) 1);
regensbu
parents:
diff changeset
   112
val contX_Ifix2 = result();
regensbu
parents:
diff changeset
   113
regensbu
parents:
diff changeset
   114
regensbu
parents:
diff changeset
   115
regensbu
parents:
diff changeset
   116
regensbu
parents:
diff changeset
   117
regensbu
parents:
diff changeset
   118
regensbu
parents:
diff changeset
   119
regensbu
parents:
diff changeset
   120