src/HOLCF/ex/hoare.ML
author wenzelm
Wed, 15 Oct 1997 15:12:59 +0200
changeset 3872 a5839ecee7b8
parent 244 929fc2c63bd0
permissions -rw-r--r--
tuned; prepare ext;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     1
(*  Title:	HOLCF/ex/hoare.ML
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     2
    ID:         $Id$
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     3
    Author: 	Franz Regensburger
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     4
    Copyright	1993 Technische Universitaet Muenchen
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     5
*)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     6
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     7
open Hoare;
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     8
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     9
(* --------- pure HOLCF logic, some little lemmas ------ *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    10
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    11
val hoare_lemma2 = prove_goal HOLCF.thy "~b=TT ==> b=FF | b=UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    12
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    13
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    14
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    15
	(rtac (Exh_tr RS disjE) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    16
	(fast_tac HOL_cs 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    17
	(etac disjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    18
	(contr_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    19
	(fast_tac HOL_cs 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    20
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    21
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    22
val hoare_lemma3 = prove_goal HOLCF.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    23
" (!k.b1[iterate(k,g,x)]=TT) | (? k.~ b1[iterate(k,g,x)]=TT)"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    24
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    25
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    26
	(fast_tac HOL_cs 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    27
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    28
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    29
val hoare_lemma4 = prove_goal HOLCF.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    30
"(? k.~ b1[iterate(k,g,x)]=TT) ==> \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    31
\ ? k.b1[iterate(k,g,x)]=FF | b1[iterate(k,g,x)]=UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    32
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    33
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    34
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    35
	(etac exE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    36
	(rtac exI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    37
	(rtac hoare_lemma2 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    38
	(atac 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    39
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    40
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    41
val hoare_lemma5 = prove_goal HOLCF.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    42
"[|(? k.~ b1[iterate(k,g,x)]=TT);\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    43
\   k=theleast(%n.~ b1[iterate(n,g,x)]=TT)|] ==> \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    44
\ b1[iterate(k,g,x)]=FF | b1[iterate(k,g,x)]=UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    45
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    46
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    47
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    48
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    49
	(rtac hoare_lemma2 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    50
	(etac exE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    51
	(etac theleast1 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    52
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    53
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    54
val hoare_lemma6 = prove_goal HOLCF.thy "b=UU ==> ~b=TT"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    55
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    56
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    57
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    58
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    59
	(resolve_tac dist_eq_tr 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    60
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    61
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    62
val hoare_lemma7 = prove_goal HOLCF.thy "b=FF ==> ~b=TT"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    63
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    64
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    65
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    66
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    67
	(resolve_tac dist_eq_tr 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    68
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    69
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    70
val hoare_lemma8 = prove_goal HOLCF.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    71
"[|(? k.~ b1[iterate(k,g,x)]=TT);\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    72
\   k=theleast(%n.~ b1[iterate(n,g,x)]=TT)|] ==> \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    73
\ !m. m<k --> b1[iterate(m,g,x)]=TT"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    74
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    75
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    76
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    77
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    78
	(etac exE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    79
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    80
	(res_inst_tac [("p","b1[iterate(m,g,x)]")] trE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    81
	(atac 2),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    82
	(rtac (le_less_trans RS less_anti_refl) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    83
	(atac 2),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    84
	(rtac theleast2 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    85
	(etac hoare_lemma6 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    86
	(rtac (le_less_trans RS less_anti_refl) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    87
	(atac 2),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    88
	(rtac theleast2 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    89
	(etac hoare_lemma7 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    90
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    91
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    92
val hoare_lemma28 = prove_goal HOLCF.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    93
"b1[y::'a]=UU::tr ==> b1[UU] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    94
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    95
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    96
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    97
	(etac (flat_tr RS flat_codom RS disjE) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    98
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    99
	(etac spec 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   100
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   101
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   102
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   103
(* ----- access to definitions ----- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   104
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   105
val p_def2 = prove_goalw Hoare.thy [p_def]
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   106
"p = fix[LAM f x. If b1[x] then f[g[x]] else x fi]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   107
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   108
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   109
	(rtac refl 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   110
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   111
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   112
val q_def2 = prove_goalw Hoare.thy [q_def]
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   113
"q = fix[LAM f x. If b1[x] orelse b2[x] then \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   114
\     f[g[x]] else x fi]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   115
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   116
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   117
	(rtac refl 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   118
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   119
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   120
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   121
val p_def3 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   122
"p[x] = If b1[x] then p[g[x]] else x fi"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   123
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   124
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   125
	(fix_tac3 p_def 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   126
	(simp_tac HOLCF_ss 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   127
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   128
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   129
val q_def3 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   130
"q[x] = If b1[x] orelse b2[x] then q[g[x]] else x fi"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   131
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   132
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   133
	(fix_tac3 q_def 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   134
	(simp_tac HOLCF_ss 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   135
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   136
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   137
(** --------- proves about iterations of p and q ---------- **)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   138
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   139
val hoare_lemma9 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   140
"(! m. m<Suc(k) --> b1[iterate(m,g,x)]=TT) -->\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   141
\  p[iterate(k,g,x)]=p[x]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   142
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   143
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   144
	(nat_ind_tac "k" 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   145
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   146
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   147
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   148
	(res_inst_tac [("s","p[iterate(k1,g,x)]")] trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   149
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   150
	(rtac (p_def3 RS sym) 2),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   151
	(res_inst_tac [("s","TT"),("t","b1[iterate(k1,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   152
	(rtac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   153
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   154
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   155
	(simp_tac HOLCF_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   156
	(etac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   157
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   158
	(rtac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   159
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   160
	(etac less_trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   161
	(simp_tac nat_ss 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   162
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   163
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   164
val hoare_lemma24 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   165
"(! m. m<Suc(k) --> b1[iterate(m,g,x)]=TT) --> \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   166
\ q[iterate(k,g,x)]=q[x]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   167
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   168
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   169
	(nat_ind_tac "k" 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   170
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   171
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   172
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   173
	(res_inst_tac [("s","q[iterate(k1,g,x)]")] trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   174
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   175
	(rtac (q_def3 RS sym) 2),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   176
	(res_inst_tac [("s","TT"),("t","b1[iterate(k1,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   177
	(rtac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   178
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   179
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   180
	(simp_tac HOLCF_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   181
	(etac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   182
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   183
	(rtac mp 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   184
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   185
	(etac less_trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   186
	(simp_tac nat_ss 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   187
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   188
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   189
(* -------- results about p for case (? k.~ b1[iterate(k,g,x)]=TT) ------- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   190
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   191
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   192
val hoare_lemma10 = (hoare_lemma8 RS (hoare_lemma9 RS mp));
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   193
(* 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   194
[| ? k. ~ b1[iterate(k,g,?x1)] = TT;
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   195
   Suc(?k3) = theleast(%n. ~ b1[iterate(n,g,?x1)] = TT) |] ==>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   196
p[iterate(?k3,g,?x1)] = p[?x1]
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   197
*)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   198
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   199
val hoare_lemma11 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   200
"(? n.b1[iterate(n,g,x)]~=TT) ==>\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   201
\ k=theleast(%n.b1[iterate(n,g,x)]~=TT) & b1[iterate(k,g,x)]=FF \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   202
\ --> p[x] = iterate(k,g,x)"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   203
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   204
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   205
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   206
	(res_inst_tac [("n","k")] natE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   207
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   208
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   209
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   210
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   211
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   212
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   213
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   214
	(eres_inst_tac [("s","0"),("t","theleast(%n. b1[iterate(n, g, x)] ~= TT)")]
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   215
	subst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   216
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   217
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   218
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   219
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   220
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   221
	(etac (hoare_lemma10 RS sym) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   222
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   223
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   224
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   225
	(res_inst_tac [("s","TT"),("t","b1[iterate(xa,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   226
	(rtac (hoare_lemma8 RS spec RS mp) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   227
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   228
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   229
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   230
	(simp_tac HOLCF_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   231
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   232
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   233
	(simp_tac (HOLCF_ss addsimps [iterate_Suc RS sym]) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   234
	(eres_inst_tac [("s","FF")]	ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   235
	(simp_tac HOLCF_ss 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   236
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   237
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   238
val hoare_lemma12 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   239
"(? n.~ b1[iterate(n,g,x)]=TT) ==>\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   240
\ k=theleast(%n.~ b1[iterate(n,g,x)]=TT) & b1[iterate(k,g,x)]=UU \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   241
\ --> p[x] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   242
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   243
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   244
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   245
	(res_inst_tac [("n","k")] natE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   246
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   247
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   248
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   249
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   250
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   251
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   252
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   253
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   254
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   255
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   256
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   257
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   258
	(rtac (hoare_lemma10 RS sym) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   259
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   260
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   261
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   262
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   263
	(res_inst_tac [("s","TT"),("t","b1[iterate(xa,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   264
	(rtac (hoare_lemma8 RS spec RS mp) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   265
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   266
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   267
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   268
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   269
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   270
	(rtac p_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   271
	(asm_simp_tac HOLCF_ss  1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   272
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   273
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   274
(* -------- results about p for case  (! k. b1[iterate(k,g,x)]=TT) ------- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   275
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   276
val fernpass_lemma = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   277
"(! k. b1[iterate(k,g,x)]=TT) ==> !k.p[iterate(k,g,x)] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   278
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   279
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   280
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   281
	(rtac (p_def2 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   282
	(rtac fix_ind 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   283
	(rtac adm_all 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   284
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   285
	(rtac adm_eq 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   286
	(contX_tacR 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   287
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   288
	(rtac (strict_fapp1 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   289
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   290
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   291
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   292
	(res_inst_tac [("s","TT"),("t","b1[iterate(k,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   293
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   294
	(asm_simp_tac HOLCF_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   295
	(rtac (iterate_Suc RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   296
	(etac spec 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   297
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   298
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   299
val hoare_lemma16 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   300
"(! k. b1[iterate(k,g,x)]=TT) ==> p[x] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   301
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   302
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   303
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   304
	(res_inst_tac [("F1","g"),("t","x")] (iterate_0 RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   305
	(etac (fernpass_lemma RS spec) 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   306
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   307
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   308
(* -------- results about q for case  (! k. b1[iterate(k,g,x)]=TT) ------- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   309
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   310
val hoare_lemma17 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   311
"(! k. b1[iterate(k,g,x)]=TT) ==> !k.q[iterate(k,g,x)] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   312
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   313
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   314
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   315
	(rtac (q_def2 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   316
	(rtac fix_ind 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   317
	(rtac adm_all 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   318
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   319
	(rtac adm_eq 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   320
	(contX_tacR 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   321
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   322
	(rtac (strict_fapp1 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   323
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   324
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   325
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   326
	(res_inst_tac [("s","TT"),("t","b1[iterate(k,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   327
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   328
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   329
	(rtac (iterate_Suc RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   330
	(etac spec 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   331
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   332
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   333
val hoare_lemma18 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   334
"(! k. b1[iterate(k,g,x)]=TT) ==> q[x] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   335
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   336
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   337
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   338
	(res_inst_tac [("F1","g"),("t","x")] (iterate_0 RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   339
	(etac (hoare_lemma17 RS spec) 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   340
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   341
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   342
val hoare_lemma19 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   343
"(!k. (b1::'a->tr)[iterate(k,g,x)]=TT) ==> b1[UU::'a] = UU | (!y.b1[y::'a]=TT)"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   344
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   345
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   346
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   347
	(rtac (flat_tr RS flat_codom) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   348
	(res_inst_tac [("t","x1")] (iterate_0 RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   349
	(etac spec 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   350
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   351
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   352
val hoare_lemma20 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   353
"(! y. b1[y::'a]=TT) ==> !k.q[iterate(k,g,x::'a)] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   354
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   355
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   356
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   357
	(rtac (q_def2 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   358
	(rtac fix_ind 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   359
	(rtac adm_all 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   360
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   361
	(rtac adm_eq 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   362
	(contX_tacR 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   363
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   364
	(rtac (strict_fapp1 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   365
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   366
	(rtac allI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   367
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   368
	(res_inst_tac [("s","TT"),("t","b1[iterate(k,g,x::'a)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   369
	(etac spec 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   370
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   371
	(rtac (iterate_Suc RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   372
	(etac spec 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   373
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   374
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   375
val hoare_lemma21 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   376
"(! y. b1[y::'a]=TT) ==> q[x::'a] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   377
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   378
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   379
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   380
	(res_inst_tac [("F1","g"),("t","x")] (iterate_0 RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   381
	(etac (hoare_lemma20 RS spec) 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   382
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   383
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   384
val hoare_lemma22 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   385
"b1[UU::'a]=UU ==> q[UU::'a] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   386
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   387
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   388
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   389
	(rtac (q_def3 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   390
	(asm_simp_tac HOLCF_ss  1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   391
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   392
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   393
(* -------- results about q for case (? k.~ b1[iterate(k,g,x)]=TT) ------- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   394
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   395
val hoare_lemma25 = (hoare_lemma8 RS (hoare_lemma24 RS mp) );
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   396
(* 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   397
[| ? k. ~ ?b1.1[iterate(k,?g1,?x1)] = TT;
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   398
   Suc(?k3) = theleast(%n. ~ ?b1.1[iterate(n,?g1,?x1)] = TT) |] ==>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   399
q[iterate(?k3,?g1,?x1)] = q[?x1]
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   400
*)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   401
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   402
val hoare_lemma26 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   403
"(? n.~ b1[iterate(n,g,x)]=TT) ==>\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   404
\ k=theleast(%n.~ b1[iterate(n,g,x)]=TT) & b1[iterate(k,g,x)]=FF \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   405
\ --> q[x] = q[iterate(k,g,x)]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   406
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   407
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   408
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   409
	(res_inst_tac [("n","k")] natE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   410
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   411
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   412
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   413
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   414
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   415
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   416
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   417
	(rtac (hoare_lemma25 RS sym) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   418
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   419
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   420
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   421
	(rtac q_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   422
	(res_inst_tac [("s","TT"),("t","b1[iterate(xa,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   423
	(rtac (hoare_lemma8 RS spec RS mp) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   424
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   425
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   426
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   427
	(simp_tac (HOLCF_ss addsimps [iterate_Suc]) 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   428
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   429
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   430
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   431
val hoare_lemma27 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   432
"(? n.~ b1[iterate(n,g,x)]=TT) ==>\
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   433
\ k=theleast(%n.~ b1[iterate(n,g,x)]=TT) & b1[iterate(k,g,x)]=UU \
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   434
\ --> q[x] = UU"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   435
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   436
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   437
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   438
	(res_inst_tac [("n","k")] natE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   439
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   440
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   441
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   442
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   443
	(rtac (q_def3 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   444
	(asm_simp_tac HOLCF_ss  1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   445
	(hyp_subst_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   446
	(simp_tac iterate_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   447
	(strip_tac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   448
	(etac conjE 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   449
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   450
	(rtac (hoare_lemma25 RS sym) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   451
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   452
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   453
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   454
	(rtac q_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   455
	(res_inst_tac [("s","TT"),("t","b1[iterate(xa,g,x)]")] ssubst 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   456
	(rtac (hoare_lemma8 RS spec RS mp) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   457
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   458
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   459
	(simp_tac nat_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   460
	(asm_simp_tac HOLCF_ss 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   461
	(rtac trans 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   462
	(rtac q_def3 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   463
	(asm_simp_tac HOLCF_ss  1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   464
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   465
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   466
(* ------- (! k. b1[iterate(k,g,x)]=TT) ==> q o p = q   ----- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   467
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   468
val hoare_lemma23 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   469
"(! k. b1[iterate(k,g,x)]=TT) ==> q[p[x]] = q[x]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   470
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   471
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   472
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   473
	(rtac (hoare_lemma16 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   474
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   475
	(rtac (hoare_lemma19 RS disjE) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   476
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   477
	(rtac (hoare_lemma18 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   478
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   479
	(rtac (hoare_lemma22 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   480
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   481
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   482
	(rtac (hoare_lemma21 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   483
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   484
	(rtac (hoare_lemma21 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   485
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   486
	(rtac refl 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   487
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   488
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   489
(* ------------  ? k. ~ b1[iterate(k,g,x)] = TT ==> q o p = q   ----- *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   490
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   491
val hoare_lemma29 = prove_goal Hoare.thy 
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   492
"? k. ~ b1[iterate(k,g,x)] = TT ==> q[p[x]] = q[x]"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   493
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   494
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   495
	(cut_facts_tac prems 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   496
	(rtac (hoare_lemma5 RS disjE) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   497
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   498
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   499
	(rtac (hoare_lemma11 RS mp RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   500
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   501
	(rtac conjI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   502
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   503
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   504
	(rtac (hoare_lemma26 RS mp RS subst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   505
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   506
	(rtac conjI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   507
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   508
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   509
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   510
	(rtac (hoare_lemma12 RS mp RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   511
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   512
	(rtac conjI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   513
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   514
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   515
	(rtac (hoare_lemma22 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   516
	(rtac (hoare_lemma28 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   517
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   518
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   519
	(rtac sym 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   520
	(rtac (hoare_lemma27 RS mp RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   521
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   522
	(rtac conjI 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   523
	(rtac refl 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   524
	(atac 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   525
	(rtac refl 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   526
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   527
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   528
(* ------ the main prove q o p = q ------ *)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   529
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   530
val hoare_main = prove_goal Hoare.thy "q oo p = q"
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   531
 (fn prems =>
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   532
	[
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   533
	(rtac ext_cfun 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   534
	(rtac (cfcomp2 RS ssubst) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   535
	(rtac (hoare_lemma3 RS disjE) 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   536
	(etac hoare_lemma23 1),
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   537
	(etac hoare_lemma29 1)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   538
	]);
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   539
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   540