src/HOLCF/ex/Loop.thy
author wenzelm
Fri, 17 Nov 2006 02:20:03 +0100
changeset 21404 eb85850d3eb7
parent 19763 ec18656a2c10
child 25895 0eaadfa8889e
permissions -rw-r--r--
more robust syntax for definition/abbreviation/notation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1479
21eb5e156d91 expanded tabs
clasohm
parents: 1274
diff changeset
     1
(*  Title:      HOLCF/ex/Loop.thy
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     2
    ID:         $Id$
1479
21eb5e156d91 expanded tabs
clasohm
parents: 1274
diff changeset
     3
    Author:     Franz Regensburger
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     4
*)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     5
17291
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     6
header {* Theory for a loop primitive like while *}
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     7
17291
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     8
theory Loop
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     9
imports HOLCF
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
    10
begin
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    11
19763
wenzelm
parents: 19742
diff changeset
    12
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19763
diff changeset
    13
  step  :: "('a -> tr)->('a -> 'a)->'a->'a" where
19763
wenzelm
parents: 19742
diff changeset
    14
  "step = (LAM b g x. If b$x then g$x else x fi)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    15
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19763
diff changeset
    16
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19763
diff changeset
    17
  while :: "('a -> tr)->('a -> 'a)->'a->'a" where
19763
wenzelm
parents: 19742
diff changeset
    18
  "while = (LAM b g. fix$(LAM f x. If b$x then f$(g$x) else x fi))"
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    19
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    20
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    21
(* access to definitions                                                     *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    22
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    23
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    24
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    25
lemma step_def2: "step$b$g$x = If b$x then g$x else x fi"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    26
apply (unfold step_def)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    27
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    28
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    29
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    30
lemma while_def2: "while$b$g = fix$(LAM f x. If b$x then f$(g$x) else x fi)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    31
apply (unfold while_def)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    32
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    33
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    34
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    35
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    36
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    37
(* rekursive properties of while                                             *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    38
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    39
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    40
lemma while_unfold: "while$b$g$x = If b$x then while$b$g$(g$x) else x fi"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    41
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    42
apply (rule while_def2 [THEN fix_eq5])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    43
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    44
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    45
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    46
lemma while_unfold2: "ALL x. while$b$g$x = while$b$g$(iterate k$(step$b$g)$x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    47
apply (induct_tac k)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    48
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    49
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    50
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    51
apply (subst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    52
apply (rule_tac [2] refl)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    53
apply (subst iterate_Suc2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    54
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    55
apply (erule_tac [2] spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    56
apply (subst step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    57
apply (rule_tac p = "b$x" in trE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    58
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    59
apply (subst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    60
apply (rule_tac s = "UU" and t = "b$UU" in ssubst)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    61
apply (erule flat_codom [THEN disjE])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    62
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    63
apply (erule spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    64
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    65
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    66
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    67
apply (subst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    68
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    69
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    70
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    71
lemma while_unfold3: "while$b$g$x = while$b$g$(step$b$g$x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    72
apply (rule_tac s = "while$b$g$ (iterate (Suc 0) $ (step$b$g) $x) " in trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    73
apply (rule while_unfold2 [THEN spec])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    74
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    75
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    76
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    77
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    78
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    79
(* properties of while and iterations                                        *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    80
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    81
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    82
lemma loop_lemma1: "[| EX y. b$y=FF; iterate k$(step$b$g)$x = UU |]
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    83
     ==>iterate(Suc k)$(step$b$g)$x=UU"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    84
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    85
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    86
apply (rule step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    87
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    88
apply (erule exE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    89
apply (erule flat_codom [THEN disjE])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    90
apply simp_all
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    91
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    92
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    93
lemma loop_lemma2: "[|EX y. b$y=FF;iterate (Suc k)$(step$b$g)$x ~=UU |]==>
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    94
      iterate k$(step$b$g)$x ~=UU"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    95
apply (blast intro: loop_lemma1)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    96
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    97
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    98
lemma loop_lemma3 [rule_format (no_asm)]:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    99
  "[| ALL x. INV x & b$x=TT & g$x~=UU --> INV (g$x);
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   100
         EX y. b$y=FF; INV x |]
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   101
      ==> iterate k$(step$b$g)$x ~=UU --> INV (iterate k$(step$b$g)$x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   102
apply (induct_tac "k")
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   103
apply (simp (no_asm_simp))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   104
apply (intro strip)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   105
apply (simp (no_asm) add: step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   106
apply (rule_tac p = "b$ (iterate n$ (step$b$g) $x) " in trE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   107
apply (erule notE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   108
apply (tactic {* asm_simp_tac (HOLCF_ss addsimps [thm "step_def2"]) 1 *})
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   109
apply (tactic "asm_simp_tac HOLCF_ss 1")
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   110
apply (rule mp)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   111
apply (erule spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   112
apply (tactic {* asm_simp_tac (HOLCF_ss delsimps [thm "iterate_Suc"]
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   113
  addsimps [thm "loop_lemma2"]) 1 *})
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   114
apply (rule_tac s = "iterate (Suc n) $ (step$b$g) $x"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   115
  and t = "g$ (iterate n$ (step$b$g) $x) " in ssubst)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   116
prefer 2 apply (assumption)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   117
apply (simp add: step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   118
apply (simp del: iterate_Suc add: loop_lemma2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   119
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   120
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   121
lemma loop_lemma4 [rule_format]:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   122
  "ALL x. b$(iterate k$(step$b$g)$x)=FF --> while$b$g$x= iterate k$(step$b$g)$x"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   123
apply (induct_tac k)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   124
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   125
apply (intro strip)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   126
apply (simplesubst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   127
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   128
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   129
apply (simplesubst iterate_Suc2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   130
apply (intro strip)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   131
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   132
apply (rule while_unfold3)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   133
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   134
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   135
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   136
lemma loop_lemma5 [rule_format (no_asm)]:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   137
  "ALL k. b$(iterate k$(step$b$g)$x) ~= FF ==>
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   138
    ALL m. while$b$g$(iterate m$(step$b$g)$x)=UU"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   139
apply (simplesubst while_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   140
apply (rule fix_ind)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   141
apply (rule allI [THEN adm_all])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   142
apply (rule adm_eq)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   143
apply (tactic "cont_tacR 1")
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   144
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   145
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   146
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   147
apply (rule_tac p = "b$ (iterate m$ (step$b$g) $x) " in trE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   148
apply (simp (no_asm_simp))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   149
apply (simp (no_asm_simp))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   150
apply (rule_tac s = "xa$ (iterate (Suc m) $ (step$b$g) $x) " in trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   151
apply (erule_tac [2] spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   152
apply (rule cfun_arg_cong)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   153
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   154
apply (rule_tac [2] iterate_Suc [symmetric])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   155
apply (simp add: step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   156
apply blast
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   157
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   158
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   159
lemma loop_lemma6: "ALL k. b$(iterate k$(step$b$g)$x) ~= FF ==> while$b$g$x=UU"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   160
apply (rule_tac t = "x" in iterate_0 [THEN subst])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   161
apply (erule loop_lemma5)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   162
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   163
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   164
lemma loop_lemma7: "while$b$g$x ~= UU ==> EX k. b$(iterate k$(step$b$g)$x) = FF"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   165
apply (blast intro: loop_lemma6)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   166
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   167
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   168
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   169
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   170
(* an invariant rule for loops                                               *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   171
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   172
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   173
lemma loop_inv2:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   174
"[| (ALL y. INV y & b$y=TT & g$y ~= UU --> INV (g$y));
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   175
    (ALL y. INV y & b$y=FF --> Q y);
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   176
    INV x; while$b$g$x~=UU |] ==> Q (while$b$g$x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   177
apply (rule_tac P = "%k. b$ (iterate k$ (step$b$g) $x) =FF" in exE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   178
apply (erule loop_lemma7)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   179
apply (simplesubst loop_lemma4)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   180
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   181
apply (drule spec, erule mp)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   182
apply (rule conjI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   183
prefer 2 apply (assumption)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   184
apply (rule loop_lemma3)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   185
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   186
apply (blast intro: loop_lemma6)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   187
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   188
apply (rotate_tac -1)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   189
apply (simp add: loop_lemma4)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   190
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   191
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   192
lemma loop_inv:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   193
  assumes premP: "P(x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   194
    and premI: "!!y. P y ==> INV y"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   195
    and premTT: "!!y. [| INV y; b$y=TT; g$y~=UU|] ==> INV (g$y)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   196
    and premFF: "!!y. [| INV y; b$y=FF|] ==> Q y"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   197
    and premW: "while$b$g$x ~= UU"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   198
  shows "Q (while$b$g$x)"
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   199
apply (rule loop_inv2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   200
apply (rule_tac [3] premP [THEN premI])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   201
apply (rule_tac [3] premW)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   202
apply (blast intro: premTT)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   203
apply (blast intro: premFF)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   204
done
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   205
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   206
end
17291
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
   207