src/HOL/HOLCF/ex/Loop.thy
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 67613 ce654b0e6d69
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42151
4da4fc77664b tuned headers;
wenzelm
parents: 40774
diff changeset
     1
(*  Title:      HOL/HOLCF/ex/Loop.thy
1479
21eb5e156d91 expanded tabs
clasohm
parents: 1274
diff changeset
     2
    Author:     Franz Regensburger
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     3
*)
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     4
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 58880
diff changeset
     5
section \<open>Theory for a loop primitive like while\<close>
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
     6
17291
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     7
theory Loop
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     8
imports HOLCF
94f6113fe9ed converted to Isar theory format;
wenzelm
parents: 16232
diff changeset
     9
begin
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    10
19763
wenzelm
parents: 19742
diff changeset
    11
definition
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    12
  step  :: "('a \<rightarrow> tr) \<rightarrow> ('a \<rightarrow> 'a) \<rightarrow> 'a \<rightarrow> 'a" where
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    13
  "step = (LAM b g x. If b\<cdot>x then g\<cdot>x else x)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    14
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19763
diff changeset
    15
definition
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    16
  while :: "('a \<rightarrow> tr) \<rightarrow> ('a \<rightarrow> 'a) \<rightarrow> 'a \<rightarrow> 'a" where
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    17
  "while = (LAM b g. fix\<cdot>(LAM f x. If b\<cdot>x then f\<cdot>(g\<cdot>x) else x))"
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
    18
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    19
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    20
(* access to definitions                                                     *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    21
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    22
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    23
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    24
lemma step_def2: "step\<cdot>b\<cdot>g\<cdot>x = If b\<cdot>x then g\<cdot>x else x"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    25
apply (unfold step_def)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    26
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    27
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    28
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    29
lemma while_def2: "while\<cdot>b\<cdot>g = fix\<cdot>(LAM f x. If b\<cdot>x then f\<cdot>(g\<cdot>x) else x)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    30
apply (unfold while_def)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    31
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    32
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    33
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
(* rekursive properties of while                                             *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    37
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    38
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    39
lemma while_unfold: "while\<cdot>b\<cdot>g\<cdot>x = If b\<cdot>x then while\<cdot>b\<cdot>g\<cdot>(g\<cdot>x) else x"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    40
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    41
apply (rule while_def2 [THEN fix_eq5])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    42
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    43
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    44
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    45
lemma while_unfold2: "\<forall>x. while\<cdot>b\<cdot>g\<cdot>x = while\<cdot>b\<cdot>g\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    46
apply (induct_tac k)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    47
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    48
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    49
apply (rule trans)
40429
5f37c3964866 simplify some proofs
huffman
parents: 40322
diff changeset
    50
apply (rule while_unfold)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    51
apply (subst iterate_Suc2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    52
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    53
apply (erule_tac [2] spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    54
apply (subst step_def2)
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    55
apply (rule_tac p = "b\<cdot>x" in trE)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    56
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    57
apply (subst while_unfold)
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    58
apply (rule_tac s = "UU" and t = "b\<cdot>UU" in ssubst)
40429
5f37c3964866 simplify some proofs
huffman
parents: 40322
diff changeset
    59
apply (erule strictI)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    60
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    61
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    62
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    63
apply (subst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    64
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    65
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    66
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    67
lemma while_unfold3: "while\<cdot>b\<cdot>g\<cdot>x = while\<cdot>b\<cdot>g\<cdot>(step\<cdot>b\<cdot>g\<cdot>x)"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    68
apply (rule_tac s = "while\<cdot>b\<cdot>g\<cdot>(iterate (Suc 0)\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)" in trans)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    69
apply (rule while_unfold2 [THEN spec])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    70
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    71
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    72
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    73
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    74
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    75
(* properties of while and iterations                                        *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    76
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    77
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 63549
diff changeset
    78
lemma loop_lemma1: "\<lbrakk>\<exists>y. b\<cdot>y = FF; iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x = UU\<rbrakk>
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    79
     \<Longrightarrow> iterate(Suc k)\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x = UU"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    80
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    81
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    82
apply (rule step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    83
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    84
apply (erule exE)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    85
apply (erule flat_codom [THEN disjE])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    86
apply simp_all
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    87
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    88
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    89
lemma loop_lemma2: "\<lbrakk>\<exists>y. b\<cdot>y = FF; iterate (Suc k)\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x \<noteq> UU\<rbrakk> \<Longrightarrow>
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    90
      iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x \<noteq> UU"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    91
apply (blast intro: loop_lemma1)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    92
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    93
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    94
lemma loop_lemma3 [rule_format (no_asm)]:
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    95
  "\<lbrakk>\<forall>x. INV x \<and> b\<cdot>x = TT \<and> g\<cdot>x \<noteq> UU \<longrightarrow> INV (g\<cdot>x);
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    96
         \<exists>y. b\<cdot>y = FF; INV x\<rbrakk>
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
    97
      \<Longrightarrow> iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x \<noteq> UU \<longrightarrow> INV (iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    98
apply (induct_tac "k")
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
    99
apply (simp (no_asm_simp))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   100
apply (intro strip)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   101
apply (simp (no_asm) add: step_def2)
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   102
apply (rule_tac p = "b\<cdot>(iterate n\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)" in trE)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   103
apply (erule notE)
40028
9ee4e0ab2964 remove old uses of 'simp_tac HOLCF_ss'
huffman
parents: 39159
diff changeset
   104
apply (simp add: step_def2)
9ee4e0ab2964 remove old uses of 'simp_tac HOLCF_ss'
huffman
parents: 39159
diff changeset
   105
apply (simp (no_asm_simp))
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   106
apply (rule mp)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   107
apply (erule spec)
40028
9ee4e0ab2964 remove old uses of 'simp_tac HOLCF_ss'
huffman
parents: 39159
diff changeset
   108
apply (simp (no_asm_simp) del: iterate_Suc add: loop_lemma2)
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   109
apply (rule_tac s = "iterate (Suc n)\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   110
  and t = "g\<cdot>(iterate n\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)" in ssubst)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   111
prefer 2 apply (assumption)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   112
apply (simp add: step_def2)
35170
bb1d1c6a10bb fix looping simp rule
huffman
parents: 25895
diff changeset
   113
apply (drule (1) loop_lemma2, simp)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   114
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   115
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   116
lemma loop_lemma4 [rule_format]:
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   117
  "\<forall>x. b\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) = FF \<longrightarrow> while\<cdot>b\<cdot>g\<cdot>x = iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   118
apply (induct_tac k)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   119
apply (simp (no_asm))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   120
apply (intro strip)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   121
apply (simplesubst while_unfold)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   122
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   123
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   124
apply (simplesubst iterate_Suc2)
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 (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   127
apply (rule while_unfold3)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   128
apply simp
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   129
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   130
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   131
lemma loop_lemma5 [rule_format (no_asm)]:
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   132
  "\<forall>k. b\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) \<noteq> FF \<Longrightarrow>
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   133
    \<forall>m. while\<cdot>b\<cdot>g\<cdot>(iterate m\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) = UU"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   134
apply (simplesubst while_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   135
apply (rule fix_ind)
35948
5e7909f0346b remove ancient continuity tactic
huffman
parents: 35174
diff changeset
   136
apply simp
5e7909f0346b remove ancient continuity tactic
huffman
parents: 35174
diff changeset
   137
apply simp
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   138
apply (rule allI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   139
apply (simp (no_asm))
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   140
apply (rule_tac p = "b\<cdot>(iterate m\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)" in trE)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   141
apply (simp (no_asm_simp))
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   142
apply (simp (no_asm_simp))
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   143
apply (rule_tac s = "xa\<cdot>(iterate (Suc m)\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x)" in trans)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   144
apply (erule_tac [2] spec)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   145
apply (rule cfun_arg_cong)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   146
apply (rule trans)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   147
apply (rule_tac [2] iterate_Suc [symmetric])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   148
apply (simp add: step_def2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   149
apply blast
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   150
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   151
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   152
lemma loop_lemma6: "\<forall>k. b\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) \<noteq> FF \<Longrightarrow> while\<cdot>b\<cdot>g\<cdot>x = UU"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   153
apply (rule_tac t = "x" in iterate_0 [THEN subst])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   154
apply (erule loop_lemma5)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   155
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   156
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   157
lemma loop_lemma7: "while\<cdot>b\<cdot>g\<cdot>x \<noteq> UU \<Longrightarrow> \<exists>k. b\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) = FF"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   158
apply (blast intro: loop_lemma6)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   159
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   160
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   161
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   162
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   163
(* an invariant rule for loops                                               *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   164
(* ------------------------------------------------------------------------- *)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   165
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   166
lemma loop_inv2:
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   167
"\<lbrakk>(\<forall>y. INV y \<and> b\<cdot>y = TT \<and> g\<cdot>y \<noteq> UU \<longrightarrow> INV (g\<cdot>y));
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   168
    (\<forall>y. INV y \<and> b\<cdot>y = FF \<longrightarrow> Q y);
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   169
    INV x; while\<cdot>b\<cdot>g\<cdot>x \<noteq> UU\<rbrakk> \<Longrightarrow> Q (while\<cdot>b\<cdot>g\<cdot>x)"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   170
apply (rule_tac P = "\<lambda>k. b\<cdot>(iterate k\<cdot>(step\<cdot>b\<cdot>g)\<cdot>x) = FF" in exE)
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   171
apply (erule loop_lemma7)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   172
apply (simplesubst loop_lemma4)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   173
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   174
apply (drule spec, erule mp)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   175
apply (rule conjI)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   176
prefer 2 apply (assumption)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   177
apply (rule loop_lemma3)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   178
apply assumption
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   179
apply (blast intro: loop_lemma6)
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 (rotate_tac -1)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   182
apply (simp add: loop_lemma4)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   183
done
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   184
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   185
lemma loop_inv:
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   186
  assumes premP: "P(x)"
63549
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   187
    and premI: "\<And>y. P y \<Longrightarrow> INV y"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   188
    and premTT: "\<And>y. \<lbrakk>INV y; b\<cdot>y = TT; g\<cdot>y \<noteq> UU\<rbrakk> \<Longrightarrow> INV (g\<cdot>y)"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   189
    and premFF: "\<And>y. \<lbrakk>INV y; b\<cdot>y = FF\<rbrakk> \<Longrightarrow> Q y"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   190
    and premW: "while\<cdot>b\<cdot>g\<cdot>x \<noteq> UU"
b0d31c7def86 more symbols;
wenzelm
parents: 62175
diff changeset
   191
  shows "Q (while\<cdot>b\<cdot>g\<cdot>x)"
19742
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   192
apply (rule loop_inv2)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   193
apply (rule_tac [3] premP [THEN premI])
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   194
apply (rule_tac [3] premW)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   195
apply (blast intro: premTT)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   196
apply (blast intro: premFF)
86f21beabafc removed legacy ML scripts;
wenzelm
parents: 17291
diff changeset
   197
done
244
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   198
929fc2c63bd0 HOLCF examples
nipkow
parents:
diff changeset
   199
end