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