src/HOL/IMP/Abs_Int3.thy
author nipkow
Fri, 21 Sep 2012 13:39:30 +0200
changeset 49496 2694d1615eef
parent 49399 a9d9f3483b71
child 49547 78be750222cf
permissions -rw-r--r--
more termination proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     2
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     3
theory Abs_Int3
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     4
imports Abs_Int2_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     5
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     6
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     7
subsubsection "Welltypedness"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     8
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
     9
class Lc =
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    10
fixes Lc :: "com \<Rightarrow> 'a set"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    11
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    12
instantiation st :: (type)Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    13
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    14
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    15
definition Lc_st :: "com \<Rightarrow> 'a st set" where
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    16
"Lc_st c = L (vars c)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    17
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    18
instance ..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    19
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    20
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    21
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    22
instantiation acom :: (Lc)Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    23
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    24
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    25
definition Lc_acom :: "com \<Rightarrow> 'a acom set" where
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    26
"Lc c = {C. strip C = c \<and> (\<forall>a\<in>set(annos C). a \<in> Lc c)}"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    27
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    28
instance ..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    29
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    30
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    31
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    32
instantiation option :: (Lc)Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    33
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    34
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    35
definition Lc_option :: "com \<Rightarrow> 'a option set" where
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    36
"Lc c = {None} \<union> Some ` Lc c"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    37
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    38
lemma Lc_option_simps[simp]: "None \<in> Lc c" "(Some x \<in> Lc c) = (x \<in> Lc c)"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    39
by(auto simp: Lc_option_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    40
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    41
instance ..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    42
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    43
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    44
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    45
lemma Lc_option_iff_wt[simp]: fixes a :: "_ st option"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    46
shows "(a \<in> Lc c) = (a \<in> L (vars c))"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    47
by(auto simp add: L_option_def Lc_st_def split: option.splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    48
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    49
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    50
context Abs_Int1
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    51
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    52
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    53
lemma step'_in_Lc: "C \<in> Lc c \<Longrightarrow> S \<in> Lc c \<Longrightarrow> step' S C \<in> Lc c"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    54
apply(auto simp add: Lc_acom_def)
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    55
by(metis step'_in_L[simplified L_acom_def mem_Collect_eq] order_refl)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    56
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    57
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    58
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    59
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    60
subsection "Widening and Narrowing"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    61
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    62
class widen =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    63
fixes widen :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infix "\<nabla>" 65)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    64
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    65
class narrow =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    66
fixes narrow :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infix "\<triangle>" 65)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    67
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    68
class WN = widen + narrow + preord +
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    69
assumes widen1: "x \<sqsubseteq> x \<nabla> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    70
assumes widen2: "y \<sqsubseteq> x \<nabla> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    71
assumes narrow1: "y \<sqsubseteq> x \<Longrightarrow> y \<sqsubseteq> x \<triangle> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    72
assumes narrow2: "y \<sqsubseteq> x \<Longrightarrow> x \<triangle> y \<sqsubseteq> x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    73
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    74
class WN_Lc = widen + narrow + preord + Lc +
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    75
assumes widen1: "x \<in> Lc c \<Longrightarrow> y \<in> Lc c \<Longrightarrow> x \<sqsubseteq> x \<nabla> y"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    76
assumes widen2: "x \<in> Lc c \<Longrightarrow> y \<in> Lc c \<Longrightarrow> y \<sqsubseteq> x \<nabla> y"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    77
assumes narrow1: "y \<sqsubseteq> x \<Longrightarrow> y \<sqsubseteq> x \<triangle> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    78
assumes narrow2: "y \<sqsubseteq> x \<Longrightarrow> x \<triangle> y \<sqsubseteq> x"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    79
assumes Lc_widen[simp]: "x \<in> Lc c \<Longrightarrow> y \<in> Lc c \<Longrightarrow> x \<nabla> y \<in> Lc c"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
    80
assumes Lc_narrow[simp]: "x \<in> Lc c \<Longrightarrow> y \<in> Lc c \<Longrightarrow> x \<triangle> y \<in> Lc c"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    81
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    82
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    83
instantiation ivl :: WN
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    84
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    85
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    86
definition "widen_ivl ivl1 ivl2 =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    87
  ((*if is_empty ivl1 then ivl2 else
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    88
   if is_empty ivl2 then ivl1 else*)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    89
     case (ivl1,ivl2) of (I l1 h1, I l2 h2) \<Rightarrow>
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    90
       I (if le_option False l2 l1 \<and> l2 \<noteq> l1 then None else l1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    91
         (if le_option True h1 h2 \<and> h1 \<noteq> h2 then None else h1))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    92
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    93
definition "narrow_ivl ivl1 ivl2 =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    94
  ((*if is_empty ivl1 \<or> is_empty ivl2 then empty else*)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    95
     case (ivl1,ivl2) of (I l1 h1, I l2 h2) \<Rightarrow>
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    96
       I (if l1 = None then l2 else l1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    97
         (if h1 = None then h2 else h1))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    98
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    99
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   100
proof qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   101
  (auto simp add: widen_ivl_def narrow_ivl_def le_option_def le_ivl_def empty_def split: ivl.split option.split if_splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   102
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   103
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   104
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   105
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   106
instantiation st :: (WN)WN_Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   107
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   108
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   109
definition "widen_st F1 F2 = FunDom (\<lambda>x. fun F1 x \<nabla> fun F2 x) (dom F1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   110
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   111
definition "narrow_st F1 F2 = FunDom (\<lambda>x. fun F1 x \<triangle> fun F2 x) (dom F1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   112
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   113
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   114
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   115
  case goal1 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   116
    by(simp add: widen_st_def le_st_def WN_class.widen1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   117
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   118
  case goal2 thus ?case
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   119
    by(simp add: widen_st_def le_st_def WN_class.widen2 Lc_st_def L_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   120
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   121
  case goal3 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   122
    by(auto simp: narrow_st_def le_st_def WN_class.narrow1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   123
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   124
  case goal4 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   125
    by(auto simp: narrow_st_def le_st_def WN_class.narrow2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   126
next
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   127
  case goal5 thus ?case by(auto simp: widen_st_def Lc_st_def L_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   128
next
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   129
  case goal6 thus ?case by(auto simp: narrow_st_def Lc_st_def L_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   130
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   131
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   132
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   133
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   134
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   135
instantiation option :: (WN_Lc)WN_Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   136
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   137
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   138
fun widen_option where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   139
"None \<nabla> x = x" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   140
"x \<nabla> None = x" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   141
"(Some x) \<nabla> (Some y) = Some(x \<nabla> y)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   142
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   143
fun narrow_option where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   144
"None \<triangle> x = None" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   145
"x \<triangle> None = None" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   146
"(Some x) \<triangle> (Some y) = Some(x \<triangle> y)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   147
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   148
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   149
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   150
  case goal1 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   151
    by(induct x y rule: widen_option.induct)(simp_all add: widen1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   152
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   153
  case goal2 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   154
    by(induct x y rule: widen_option.induct)(simp_all add: widen2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   155
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   156
  case goal3 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   157
    by(induct x y rule: narrow_option.induct) (simp_all add: narrow1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   158
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   159
  case goal4 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   160
    by(induct x y rule: narrow_option.induct) (simp_all add: narrow2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   161
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   162
  case goal5 thus ?case
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   163
    by(induction x y rule: widen_option.induct)(auto simp: Lc_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   164
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   165
  case goal6 thus ?case
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   166
    by(induction x y rule: narrow_option.induct)(auto simp: Lc_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   167
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   168
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   169
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   170
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   171
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   172
fun map2_acom :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> 'a acom \<Rightarrow> 'a acom \<Rightarrow> 'a acom" where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   173
"map2_acom f (SKIP {a1}) (SKIP {a2}) = (SKIP {f a1 a2})" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   174
"map2_acom f (x ::= e {a1}) (x' ::= e' {a2}) = (x ::= e {f a1 a2})" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   175
"map2_acom f (C1;C2) (D1;D2) = (map2_acom f C1 D1; map2_acom f C2 D2)" |
49095
7df19036392e added annotations after condition in if and while
nipkow
parents: 48759
diff changeset
   176
"map2_acom f (IF b THEN {p1} C1 ELSE {p2} C2 {a1}) (IF b' THEN {q1} D1 ELSE {q2} D2 {a2}) =
7df19036392e added annotations after condition in if and while
nipkow
parents: 48759
diff changeset
   177
  (IF b THEN {f p1 q1} map2_acom f C1 D1 ELSE {f p2 q2} map2_acom f C2 D2 {f a1 a2})" |
7df19036392e added annotations after condition in if and while
nipkow
parents: 48759
diff changeset
   178
"map2_acom f ({a1} WHILE b DO {p} C {a2}) ({a3} WHILE b' DO {p'} C' {a4}) =
7df19036392e added annotations after condition in if and while
nipkow
parents: 48759
diff changeset
   179
  ({f a1 a3} WHILE b DO {f p p'} map2_acom f C C' {f a2 a4})"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   180
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   181
instantiation acom :: (WN_Lc)WN_Lc
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   182
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   183
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   184
definition "widen_acom = map2_acom (op \<nabla>)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   185
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   186
definition "narrow_acom = map2_acom (op \<triangle>)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   187
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   188
lemma widen_acom1:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   189
  "\<lbrakk>\<forall>a\<in>set(annos x). a \<in> Lc c; \<forall>a\<in>set (annos y). a \<in> Lc c; strip x = strip y\<rbrakk>
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   190
   \<Longrightarrow> x \<sqsubseteq> x \<nabla> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   191
by(induct x y rule: le_acom.induct)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   192
  (auto simp: widen_acom_def widen1 Lc_acom_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   193
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   194
lemma widen_acom2:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   195
  "\<lbrakk>\<forall>a\<in>set(annos x). a \<in> Lc c; \<forall>a\<in>set (annos y). a \<in> Lc c; strip x = strip y\<rbrakk>
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   196
   \<Longrightarrow> y \<sqsubseteq> x \<nabla> y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   197
by(induct x y rule: le_acom.induct)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   198
  (auto simp: widen_acom_def widen2 Lc_acom_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   199
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   200
lemma strip_map2_acom[simp]:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   201
 "strip C1 = strip C2 \<Longrightarrow> strip(map2_acom f C1 C2) = strip C1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   202
by(induct f C1 C2 rule: map2_acom.induct) simp_all
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   203
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   204
lemma strip_widen_acom[simp]:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   205
  "strip C1 = strip C2 \<Longrightarrow> strip(C1 \<nabla> C2) = strip C1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   206
by(simp add: widen_acom_def strip_map2_acom)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   207
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   208
lemma strip_narrow_acom[simp]:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   209
  "strip C1 = strip C2 \<Longrightarrow> strip(C1 \<triangle> C2) = strip C1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   210
by(simp add: narrow_acom_def strip_map2_acom)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   211
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   212
lemma annos_map2_acom[simp]: "strip C2 = strip C1 \<Longrightarrow>
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   213
  annos(map2_acom f C1 C2) = map (%(x,y).f x y) (zip (annos C1) (annos C2))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   214
by(induction f C1 C2 rule: map2_acom.induct)(simp_all add: size_annos_same2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   215
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   216
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   217
proof
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   218
  case goal1 thus ?case by(auto simp: Lc_acom_def widen_acom1)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   219
next
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   220
  case goal2 thus ?case by(auto simp: Lc_acom_def widen_acom2)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   221
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   222
  case goal3 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   223
    by(induct x y rule: le_acom.induct)(simp_all add: narrow_acom_def narrow1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   224
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   225
  case goal4 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   226
    by(induct x y rule: le_acom.induct)(simp_all add: narrow_acom_def narrow2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   227
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   228
  case goal5 thus ?case
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   229
    by(auto simp: Lc_acom_def widen_acom_def split_conv elim!: in_set_zipE)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   230
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   231
  case goal6 thus ?case
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   232
    by(auto simp: Lc_acom_def narrow_acom_def split_conv elim!: in_set_zipE)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   233
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   234
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   235
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   236
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   237
lemma widen_o_in_L[simp]: fixes x1 x2 :: "_ st option"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   238
shows "x1 \<in> L X \<Longrightarrow> x2 \<in> L X \<Longrightarrow> x1 \<nabla> x2 \<in> L X"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   239
by(induction x1 x2 rule: widen_option.induct)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   240
  (simp_all add: widen_st_def L_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   241
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   242
lemma narrow_o_in_L[simp]: fixes x1 x2 :: "_ st option"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   243
shows "x1 \<in> L X \<Longrightarrow> x2 \<in> L X \<Longrightarrow> x1 \<triangle> x2 \<in> L X"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   244
by(induction x1 x2 rule: narrow_option.induct)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   245
  (simp_all add: narrow_st_def L_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   246
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   247
lemma widen_c_in_L: fixes C1 C2 :: "_ st option acom"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   248
shows "strip C1 = strip C2 \<Longrightarrow> C1 \<in> L X \<Longrightarrow> C2 \<in> L X \<Longrightarrow> C1 \<nabla> C2 \<in> L X"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   249
by(induction C1 C2 rule: le_acom.induct)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   250
  (auto simp: widen_acom_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   251
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   252
lemma narrow_c_in_L: fixes C1 C2 :: "_ st option acom"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   253
shows "strip C1 = strip C2 \<Longrightarrow> C1 \<in> L X \<Longrightarrow> C2 \<in> L X \<Longrightarrow> C1 \<triangle> C2 \<in> L X"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   254
by(induction C1 C2 rule: le_acom.induct)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   255
  (auto simp: narrow_acom_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   256
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   257
lemma bot_in_Lc[simp]: "bot c \<in> Lc c"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   258
by(simp add: Lc_acom_def bot_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   259
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   260
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   261
subsubsection "Post-fixed point computation"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   262
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   263
definition iter_widen :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> ('a::{preord,widen})option"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   264
where "iter_widen f = while_option (\<lambda>c. \<not> f c \<sqsubseteq> c) (\<lambda>c. c \<nabla> f c)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   265
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   266
definition iter_narrow :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> ('a::{preord,narrow})option"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   267
where "iter_narrow f = while_option (\<lambda>c. \<not> c \<sqsubseteq> c \<triangle> f c) (\<lambda>c. c \<triangle> f c)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   268
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   269
definition pfp_wn :: "(('a::WN_Lc option acom) \<Rightarrow> 'a option acom) \<Rightarrow> com \<Rightarrow> 'a option acom option"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   270
where "pfp_wn f c =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   271
  (case iter_widen f (bot c) of None \<Rightarrow> None | Some c' \<Rightarrow> iter_narrow f c')"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   272
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   273
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   274
lemma iter_widen_pfp: "iter_widen f c = Some c' \<Longrightarrow> f c' \<sqsubseteq> c'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   275
by(auto simp add: iter_widen_def dest: while_option_stop)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   276
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   277
lemma iter_widen_inv:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   278
assumes "!!x. P x \<Longrightarrow> P(f x)" "!!x1 x2. P x1 \<Longrightarrow> P x2 \<Longrightarrow> P(x1 \<nabla> x2)" and "P x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   279
and "iter_widen f x = Some y" shows "P y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   280
using while_option_rule[where P = "P", OF _ assms(4)[unfolded iter_widen_def]]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   281
by (blast intro: assms(1-3))
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   282
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   283
lemma strip_while: fixes f :: "'a acom \<Rightarrow> 'a acom"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   284
assumes "\<forall>C. strip (f C) = strip C" and "while_option P f C = Some C'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   285
shows "strip C' = strip C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   286
using while_option_rule[where P = "\<lambda>C'. strip C' = strip C", OF _ assms(2)]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   287
by (metis assms(1))
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   288
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   289
lemma strip_iter_widen: fixes f :: "'a::WN_Lc acom \<Rightarrow> 'a acom"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   290
assumes "\<forall>C. strip (f C) = strip C" and "iter_widen f C = Some C'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   291
shows "strip C' = strip C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   292
proof-
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   293
  have "\<forall>C. strip(C \<nabla> f C) = strip C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   294
    by (metis assms(1) strip_map2_acom widen_acom_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   295
  from strip_while[OF this] assms(2) show ?thesis by(simp add: iter_widen_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   296
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   297
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   298
lemma iter_narrow_pfp:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   299
assumes mono: "!!c1 c2::_::WN_Lc. P c1 \<Longrightarrow>  P c2 \<Longrightarrow> c1 \<sqsubseteq> c2 \<Longrightarrow> f c1 \<sqsubseteq> f c2"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   300
and Pinv: "!!c. P c \<Longrightarrow> P(f c)" "!!c1 c2. P c1 \<Longrightarrow> P c2 \<Longrightarrow> P(c1 \<triangle> c2)" and "P c0"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   301
and "f c0 \<sqsubseteq> c0" and "iter_narrow f c0 = Some c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   302
shows "P c \<and> f c \<sqsubseteq> c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   303
proof-
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   304
  let ?Q = "%c. P c \<and> f c \<sqsubseteq> c \<and> c \<sqsubseteq> c0"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   305
  { fix c assume "?Q c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   306
    note P = conjunct1[OF this] and 12 = conjunct2[OF this]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   307
    note 1 = conjunct1[OF 12] and 2 = conjunct2[OF 12]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   308
    let ?c' = "c \<triangle> f c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   309
    have "?Q ?c'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   310
    proof auto
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   311
      show "P ?c'" by (blast intro: P Pinv)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   312
      have "f ?c' \<sqsubseteq> f c" by(rule mono[OF `P (c \<triangle> f c)`  P narrow2[OF 1]])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   313
      also have "\<dots> \<sqsubseteq> ?c'" by(rule narrow1[OF 1])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   314
      finally show "f ?c' \<sqsubseteq> ?c'" .
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   315
      have "?c' \<sqsubseteq> c" by (rule narrow2[OF 1])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   316
      also have "c \<sqsubseteq> c0" by(rule 2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   317
      finally show "?c' \<sqsubseteq> c0" .
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   318
    qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   319
  }
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   320
  thus ?thesis
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   321
    using while_option_rule[where P = ?Q, OF _ assms(6)[simplified iter_narrow_def]]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   322
    by (blast intro: assms(4,5) le_refl)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   323
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   324
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   325
lemma pfp_wn_pfp:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   326
assumes mono: "!!c1 c2::_::WN_Lc option acom. P c1 \<Longrightarrow>  P c2 \<Longrightarrow> c1 \<sqsubseteq> c2 \<Longrightarrow> f c1 \<sqsubseteq> f c2"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   327
and Pinv: "P (bot c)"  "!!c. P c \<Longrightarrow> P(f c)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   328
  "!!c1 c2. P c1 \<Longrightarrow> P c2 \<Longrightarrow> P(c1 \<nabla> c2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   329
  "!!c1 c2. P c1 \<Longrightarrow> P c2 \<Longrightarrow> P(c1 \<triangle> c2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   330
and pfp_wn: "pfp_wn f c = Some c'" shows "P c' \<and> f c' \<sqsubseteq> c'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   331
proof-
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   332
  from pfp_wn obtain p
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   333
    where its: "iter_widen f (bot c) = Some p" "iter_narrow f p = Some c'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   334
    by(auto simp: pfp_wn_def split: option.splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   335
  have "P p" by (blast intro: iter_widen_inv[where P="P"] its(1) Pinv(1-3))
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   336
  thus ?thesis
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   337
    by - (assumption |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   338
          rule iter_narrow_pfp[where P=P] mono Pinv(2,4) iter_widen_pfp its)+
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   339
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   340
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   341
lemma strip_pfp_wn:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   342
  "\<lbrakk> \<forall>c. strip(f c) = strip c; pfp_wn f c = Some c' \<rbrakk> \<Longrightarrow> strip c' = c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   343
by(auto simp add: pfp_wn_def iter_narrow_def split: option.splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   344
  (metis (no_types) narrow_acom_def strip_bot strip_iter_widen strip_map2_acom strip_while)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   345
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   346
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   347
locale Abs_Int2 = Abs_Int1_mono
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   348
where \<gamma>=\<gamma> for \<gamma> :: "'av::{WN,lattice} \<Rightarrow> val set"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   349
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   350
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   351
definition AI_wn :: "com \<Rightarrow> 'av st option acom option" where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   352
"AI_wn c = pfp_wn (step' (top c)) c"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   353
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   354
lemma AI_wn_sound: "AI_wn c = Some C \<Longrightarrow> CS c \<le> \<gamma>\<^isub>c C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   355
proof(simp add: CS_def AI_wn_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   356
  assume 1: "pfp_wn (step' (top c)) c = Some C"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   357
  have 2: "(strip C = c & C \<in> L(vars c)) \<and> step' \<top>\<^bsub>c\<^esub> C \<sqsubseteq> C"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   358
    by(rule pfp_wn_pfp[where c=c])
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   359
      (simp_all add: 1 mono_step'_top widen_c_in_L narrow_c_in_L)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   360
  have 3: "strip (\<gamma>\<^isub>c (step' \<top>\<^bsub>c\<^esub> C)) = c" by(simp add: strip_pfp_wn[OF _ 1])
48759
ff570720ba1c Improved complete lattice formalisation - no more index set.
nipkow
parents: 47613
diff changeset
   361
  have "lfp c (step UNIV) \<le> \<gamma>\<^isub>c (step' \<top>\<^bsub>c\<^esub> C)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   362
  proof(rule lfp_lowerbound[simplified,OF 3])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   363
    show "step UNIV (\<gamma>\<^isub>c (step' \<top>\<^bsub>c\<^esub> C)) \<le> \<gamma>\<^isub>c (step' \<top>\<^bsub>c\<^esub> C)"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   364
    proof(rule step_preserves_le[OF _ _ _ top_in_L])
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   365
      show "UNIV \<subseteq> \<gamma>\<^isub>o \<top>\<^bsub>c\<^esub>" by simp
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   366
      show "\<gamma>\<^isub>c (step' \<top>\<^bsub>c\<^esub> C) \<le> \<gamma>\<^isub>c C" by(rule mono_gamma_c[OF conjunct2[OF 2]])
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   367
      show "C \<in> L(vars c)" using 2 by blast
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   368
    qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   369
  qed
48759
ff570720ba1c Improved complete lattice formalisation - no more index set.
nipkow
parents: 47613
diff changeset
   370
  from this 2 show "lfp c (step UNIV) \<le> \<gamma>\<^isub>c C"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   371
    by (blast intro: mono_gamma_c order_trans)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   372
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   373
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   374
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   375
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   376
interpretation Abs_Int2
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   377
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = plus_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   378
and test_num' = in_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   379
and filter_plus' = filter_plus_ivl and filter_less' = filter_less_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   380
defines AI_ivl' is AI_wn
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   381
..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   382
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   383
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   384
subsubsection "Tests"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   385
49399
nipkow
parents: 49396
diff changeset
   386
(* Trick to make the code generator happy. *)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   387
lemma [code]: "equal_class.equal (x::'a st) y = equal_class.equal x y"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   388
by(rule refl)
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   389
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   390
definition "step_up_ivl n =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   391
  ((\<lambda>C. C \<nabla> step_ivl (top(strip C)) C)^^n)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   392
definition "step_down_ivl n =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   393
  ((\<lambda>C. C \<triangle> step_ivl (top (strip C)) C)^^n)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   394
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   395
text{* For @{const test3_ivl}, @{const AI_ivl} needed as many iterations as
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   396
the loop took to execute. In contrast, @{const AI_ivl'} converges in a
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   397
constant number of steps: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   398
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   399
value "show_acom (step_up_ivl 1 (bot test3_ivl))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   400
value "show_acom (step_up_ivl 2 (bot test3_ivl))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   401
value "show_acom (step_up_ivl 3 (bot test3_ivl))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   402
value "show_acom (step_up_ivl 4 (bot test3_ivl))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   403
value "show_acom (step_up_ivl 5 (bot test3_ivl))"
49188
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   404
value "show_acom (step_up_ivl 6 (bot test3_ivl))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   405
value "show_acom (step_up_ivl 7 (bot test3_ivl))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   406
value "show_acom (step_up_ivl 8 (bot test3_ivl))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   407
value "show_acom (step_down_ivl 1 (step_up_ivl 8 (bot test3_ivl)))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   408
value "show_acom (step_down_ivl 2 (step_up_ivl 8 (bot test3_ivl)))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   409
value "show_acom (step_down_ivl 3 (step_up_ivl 8 (bot test3_ivl)))"
22f7e7b68f50 adjusted examples
nipkow
parents: 49095
diff changeset
   410
value "show_acom (step_down_ivl 4 (step_up_ivl 8 (bot test3_ivl)))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   411
value "show_acom_opt (AI_ivl' test3_ivl)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   412
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   413
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   414
text{* Now all the analyses terminate: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   415
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   416
value "show_acom_opt (AI_ivl' test4_ivl)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   417
value "show_acom_opt (AI_ivl' test5_ivl)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   418
value "show_acom_opt (AI_ivl' test6_ivl)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   419
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   420
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   421
subsubsection "Generic Termination Proof"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   422
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   423
locale Abs_Int2_measure = Abs_Int2
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   424
  where \<gamma>=\<gamma> for \<gamma> :: "'av::{WN,lattice} \<Rightarrow> val set" +
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   425
fixes m :: "'av \<Rightarrow> nat"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   426
fixes n :: "'av \<Rightarrow> nat"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   427
fixes h :: "nat"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   428
assumes m_anti_mono: "x \<sqsubseteq> y \<Longrightarrow> m x \<ge> m y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   429
assumes m_widen: "~ y \<sqsubseteq> x \<Longrightarrow> m(x \<nabla> y) < m x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   430
assumes m_height: "m x \<le> h"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   431
assumes n_mono: "x \<sqsubseteq> y \<Longrightarrow> n x \<le> n y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   432
assumes n_narrow: "~ x \<sqsubseteq> x \<triangle> y \<Longrightarrow> n(x \<triangle> y) < n x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   433
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   434
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   435
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   436
definition "m_st S = (SUM x:dom S. m(fun S x))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   437
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   438
lemma m_st_h: "x \<in> L X \<Longrightarrow> finite X \<Longrightarrow> m_st x \<le> h * card X"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   439
by(simp add: L_st_def m_st_def)
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   440
  (metis nat_mult_commute of_nat_id setsum_bounded[OF m_height])
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   441
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   442
lemma m_st_anti_mono: "S1 \<sqsubseteq> S2 \<Longrightarrow> m_st S1 \<ge> m_st S2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   443
proof(auto simp add: le_st_def m_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   444
  assume "\<forall>x\<in>dom S2. fun S1 x \<sqsubseteq> fun S2 x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   445
  hence "\<forall>x\<in>dom S2. m(fun S1 x) \<ge> m(fun S2 x)" by (metis m_anti_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   446
  thus "(\<Sum>x\<in>dom S2. m (fun S2 x)) \<le> (\<Sum>x\<in>dom S2. m (fun S1 x))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   447
    by (metis setsum_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   448
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   449
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   450
lemma m_st_widen: "S1 \<in> L X \<Longrightarrow> S2 \<in> L X \<Longrightarrow> finite X \<Longrightarrow>
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   451
  ~ S2 \<sqsubseteq> S1 \<Longrightarrow> m_st(S1 \<nabla> S2) < m_st S1"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   452
proof(auto simp add: le_st_def m_st_def L_st_def widen_st_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   453
  assume "finite(dom S1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   454
  have 1: "\<forall>x\<in>dom S1. m(fun S1 x) \<ge> m(fun S1 x \<nabla> fun S2 x)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   455
    by (metis m_anti_mono WN_class.widen1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   456
  fix x assume "x \<in> dom S1" "\<not> fun S2 x \<sqsubseteq> fun S1 x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   457
  hence 2: "EX x : dom S1. m(fun S1 x) > m(fun S1 x \<nabla> fun S2 x)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   458
    using m_widen by blast
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   459
  from setsum_strict_mono_ex1[OF `finite(dom S1)` 1 2]
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   460
  show "(\<Sum>x\<in>dom S1. m (fun S1 x \<nabla> fun S2 x)) < (\<Sum>x\<in>dom S1. m (fun S1 x))" .
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   461
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   462
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   463
definition "n_st S = (\<Sum>x\<in>dom S. n(fun S x))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   464
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   465
lemma n_st_mono: assumes "S1 \<sqsubseteq> S2" shows "n_st S1 \<le> n_st S2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   466
proof-
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   467
  from assms have [simp]: "dom S1 = dom S2" "\<forall>x\<in>dom S1. fun S1 x \<sqsubseteq> fun S2 x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   468
    by(simp_all add: le_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   469
  have "(\<Sum>x\<in>dom S1. n(fun S1 x)) \<le> (\<Sum>x\<in>dom S1. n(fun S2 x))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   470
    by(rule setsum_mono)(simp add: le_st_def n_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   471
  thus ?thesis by(simp add: n_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   472
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   473
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   474
lemma n_st_narrow:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   475
assumes "finite(dom S1)" and "S2 \<sqsubseteq> S1" "\<not> S1 \<sqsubseteq> S1 \<triangle> S2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   476
shows "n_st (S1 \<triangle> S2) < n_st S1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   477
proof-
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   478
  from `S2\<sqsubseteq>S1` have [simp]: "dom S1 = dom S2" "\<forall>x\<in>dom S1. fun S2 x \<sqsubseteq> fun S1 x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   479
    by(simp_all add: le_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   480
  have 1: "\<forall>x\<in>dom S1. n(fun (S1 \<triangle> S2) x) \<le> n(fun S1 x)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   481
    by(auto simp: le_st_def narrow_st_def n_mono WN_class.narrow2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   482
  have 2: "\<exists>x\<in>dom S1. n(fun (S1 \<triangle> S2) x) < n(fun S1 x)" using `\<not> S1 \<sqsubseteq> S1 \<triangle> S2`
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   483
    by(auto simp: le_st_def narrow_st_def intro: n_narrow)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   484
  have "(\<Sum>x\<in>dom S1. n(fun (S1 \<triangle> S2) x)) < (\<Sum>x\<in>dom S1. n(fun S1 x))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   485
    apply(rule setsum_strict_mono_ex1[OF `finite(dom S1)`]) using 1 2 by blast+
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   486
  moreover have "dom (S1 \<triangle> S2) = dom S1" by(simp add: narrow_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   487
  ultimately show ?thesis by(simp add: n_st_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   488
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   489
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   490
definition m_o :: "nat \<Rightarrow> 'av st option \<Rightarrow> nat" where
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   491
"m_o d opt = (case opt of None \<Rightarrow> h*d+1 | Some S \<Rightarrow> m_st S)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   492
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   493
lemma m_o_h: "ost \<in> L X \<Longrightarrow> finite X \<Longrightarrow> m_o (card X) ost \<le> (h*card X + 1)"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   494
by(auto simp add: m_o_def m_st_h split: option.split dest!:m_st_h)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   495
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   496
lemma m_o_anti_mono: "S1 \<in> L X \<Longrightarrow> S2 \<in> L X \<Longrightarrow> finite X \<Longrightarrow>
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   497
  S1 \<sqsubseteq> S2 \<Longrightarrow> m_o (card X) S2 \<le> m_o (card X) S1"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   498
apply(induction S1 S2 rule: le_option.induct)
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   499
apply(auto simp: m_o_def m_st_anti_mono le_SucI m_st_h L_st_def
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   500
           split: option.splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   501
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   502
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   503
lemma m_o_widen: "\<lbrakk> S1 \<in> L X; S2 \<in> L X; finite X; \<not> S2 \<sqsubseteq> S1 \<rbrakk> \<Longrightarrow>
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   504
  m_o (card X) (S1 \<nabla> S2) < m_o (card X) S1"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   505
by(auto simp: m_o_def L_st_def m_st_h less_Suc_eq_le m_st_widen
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   506
        split: option.split)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   507
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   508
definition "n_o opt = (case opt of None \<Rightarrow> 0 | Some x \<Rightarrow> n_st x + 1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   509
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   510
lemma n_o_mono: "S1 \<sqsubseteq> S2 \<Longrightarrow> n_o S1 \<le> n_o S2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   511
by(induction S1 S2 rule: le_option.induct)(auto simp: n_o_def n_st_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   512
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   513
lemma n_o_narrow:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   514
  "S1 \<in> L X \<Longrightarrow> S2 \<in> L X \<Longrightarrow> finite X
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   515
  \<Longrightarrow> S2 \<sqsubseteq> S1 \<Longrightarrow> \<not> S1 \<sqsubseteq> S1 \<triangle> S2 \<Longrightarrow> n_o (S1 \<triangle> S2) < n_o S1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   516
apply(induction S1 S2 rule: narrow_option.induct)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   517
apply(auto simp: n_o_def L_st_def n_st_narrow)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   518
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   519
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   520
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   521
lemma annos_narrow_acom[simp]: "strip C2 = strip (C1::'a::WN_Lc acom) \<Longrightarrow>
49095
7df19036392e added annotations after condition in if and while
nipkow
parents: 48759
diff changeset
   522
  annos(C1 \<triangle> C2) = map (\<lambda>(x,y).x\<triangle>y) (zip (annos C1) (annos C2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   523
by(induction "narrow::'a\<Rightarrow>'a\<Rightarrow>'a" C1 C2 rule: map2_acom.induct)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   524
  (simp_all add: narrow_acom_def size_annos_same2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   525
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   526
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   527
definition "m_c C = (let as = annos C in
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   528
  \<Sum>i<size as. m_o (card(vars(strip C))) (as!i))"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   529
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   530
lemma m_c_h: assumes "C \<in> L(vars(strip C))"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   531
shows "m_c C \<le> size(annos C) * (h * card(vars(strip C)) + 1)"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   532
proof-
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   533
  let ?X = "vars(strip C)" let ?n = "card ?X" let ?a = "size(annos C)"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   534
  { fix i assume "i < ?a"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   535
    hence "annos C ! i \<in> L ?X" using assms by(simp add: L_acom_def)
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   536
    note m_o_h[OF this finite_cvars]
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   537
  } note 1 = this
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   538
  have "m_c C = (\<Sum>i<?a. m_o ?n (annos C ! i))" by(simp add: m_c_def Let_def)
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   539
  also have "\<dots> \<le> (\<Sum>i<?a. h * ?n + 1)"
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   540
    apply(rule setsum_mono) using 1 by simp
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   541
  also have "\<dots> = ?a * (h * ?n + 1)" by simp
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   542
  finally show ?thesis .
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   543
qed
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   544
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   545
lemma m_c_widen:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   546
  "C1 \<in> Lc c \<Longrightarrow> C2 \<in> Lc c \<Longrightarrow> \<not> C2 \<sqsubseteq> C1 \<Longrightarrow> m_c (C1 \<nabla> C2) < m_c C1"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   547
apply(auto simp: Lc_acom_def m_c_def Let_def widen_acom_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   548
apply(subgoal_tac "length(annos C2) = length(annos C1)")
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   549
prefer 2 apply (simp add: size_annos_same2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   550
apply (auto)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   551
apply(rule setsum_strict_mono_ex1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   552
apply simp
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   553
apply (clarsimp)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   554
apply(simp add: m_o_anti_mono finite_cvars widen1[where c = "strip C2"])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   555
apply(auto simp: le_iff_le_annos listrel_iff_nth)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   556
apply(rule_tac x=i in bexI)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   557
prefer 2 apply simp
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   558
apply(rule m_o_widen)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   559
apply (simp add: finite_cvars)+
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   560
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   561
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   562
definition "n_c C = (let as = annos C in \<Sum>i=0..<size as. n_o (as!i))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   563
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   564
lemma n_c_narrow: "C1 \<in> Lc c \<Longrightarrow> C2 \<in> Lc c \<Longrightarrow>
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   565
  C2 \<sqsubseteq> C1 \<Longrightarrow> \<not> C1 \<sqsubseteq> C1 \<triangle> C2 \<Longrightarrow> n_c (C1 \<triangle> C2) < n_c C1"
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   566
apply(auto simp: n_c_def Let_def Lc_acom_def narrow_acom_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   567
apply(subgoal_tac "length(annos C2) = length(annos C1)")
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   568
prefer 2 apply (simp add: size_annos_same2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   569
apply (auto)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   570
apply(rule setsum_strict_mono_ex1)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   571
apply simp
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   572
apply (clarsimp)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   573
apply(rule n_o_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   574
apply(rule narrow2)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   575
apply(fastforce simp: le_iff_le_annos listrel_iff_nth)
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   576
apply(auto simp: le_iff_le_annos listrel_iff_nth)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   577
apply(rule_tac x=i in bexI)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   578
prefer 2 apply simp
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   579
apply(rule n_o_narrow[where X = "vars(strip C1)"])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   580
apply (simp add: finite_cvars)+
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   581
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   582
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   583
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   584
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   585
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   586
lemma iter_widen_termination:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   587
fixes m :: "'a::WN_Lc \<Rightarrow> nat"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   588
assumes P_f: "\<And>C. P C \<Longrightarrow> P(f C)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   589
and P_widen: "\<And>C1 C2. P C1 \<Longrightarrow> P C2 \<Longrightarrow> P(C1 \<nabla> C2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   590
and m_widen: "\<And>C1 C2. P C1 \<Longrightarrow> P C2 \<Longrightarrow> ~ C2 \<sqsubseteq> C1 \<Longrightarrow> m(C1 \<nabla> C2) < m C1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   591
and "P C" shows "EX C'. iter_widen f C = Some C'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   592
proof(simp add: iter_widen_def, rule wf_while_option_Some[where P = P])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   593
  show "wf {(cc, c). (P c \<and> \<not> f c \<sqsubseteq> c) \<and> cc = c \<nabla> f c}"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   594
    by(rule wf_subset[OF wf_measure[of "m"]])(auto simp: m_widen P_f)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   595
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   596
  show "P C" by(rule `P C`)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   597
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   598
  fix C assume "P C" thus "P (C \<nabla> f C)" by(simp add: P_f P_widen)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   599
qed
49496
2694d1615eef more termination proofs
nipkow
parents: 49399
diff changeset
   600
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   601
lemma iter_narrow_termination:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   602
fixes n :: "'a::WN_Lc \<Rightarrow> nat"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   603
assumes P_f: "\<And>C. P C \<Longrightarrow> P(f C)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   604
and P_narrow: "\<And>C1 C2. P C1 \<Longrightarrow> P C2 \<Longrightarrow> P(C1 \<triangle> C2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   605
and mono: "\<And>C1 C2. P C1 \<Longrightarrow> P C2 \<Longrightarrow> C1 \<sqsubseteq> C2 \<Longrightarrow> f C1 \<sqsubseteq> f C2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   606
and n_narrow: "\<And>C1 C2. P C1 \<Longrightarrow> P C2 \<Longrightarrow> C2 \<sqsubseteq> C1 \<Longrightarrow> ~ C1 \<sqsubseteq> C1 \<triangle> C2 \<Longrightarrow> n(C1 \<triangle> C2) < n C1"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   607
and init: "P C" "f C \<sqsubseteq> C" shows "EX C'. iter_narrow f C = Some C'"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   608
proof(simp add: iter_narrow_def, rule wf_while_option_Some[where P = "%C. P C \<and> f C \<sqsubseteq> C"])
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   609
  show "wf {(c', c). ((P c \<and> f c \<sqsubseteq> c) \<and> \<not> c \<sqsubseteq> c \<triangle> f c) \<and> c' = c \<triangle> f c}"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   610
    by(rule wf_subset[OF wf_measure[of "n"]])(auto simp: n_narrow P_f)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   611
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   612
  show "P C \<and> f C \<sqsubseteq> C" using init by blast
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   613
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   614
  fix C assume 1: "P C \<and> f C \<sqsubseteq> C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   615
  hence "P (C \<triangle> f C)" by(simp add: P_f P_narrow)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   616
  moreover then have "f (C \<triangle> f C) \<sqsubseteq> C \<triangle> f C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   617
    by (metis narrow1 narrow2 1 mono preord_class.le_trans)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   618
  ultimately show "P (C \<triangle> f C) \<and> f (C \<triangle> f C) \<sqsubseteq> C \<triangle> f C" ..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   619
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   620
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   621
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   622
subsubsection "Termination: Intervals"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   623
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   624
definition m_ivl :: "ivl \<Rightarrow> nat" where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   625
"m_ivl ivl = (case ivl of I l h \<Rightarrow>
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   626
     (case l of None \<Rightarrow> 0 | Some _ \<Rightarrow> 1) + (case h of None \<Rightarrow> 0 | Some _ \<Rightarrow> 1))"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   627
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   628
lemma m_ivl_height: "m_ivl ivl \<le> 2"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   629
by(simp add: m_ivl_def split: ivl.split option.split)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   630
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   631
lemma m_ivl_anti_mono: "(y::ivl) \<sqsubseteq> x \<Longrightarrow> m_ivl x \<le> m_ivl y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   632
by(auto simp: m_ivl_def le_option_def le_ivl_def
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   633
        split: ivl.split option.split if_splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   634
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   635
lemma m_ivl_widen:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   636
  "~ y \<sqsubseteq> x \<Longrightarrow> m_ivl(x \<nabla> y) < m_ivl x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   637
by(auto simp: m_ivl_def widen_ivl_def le_option_def le_ivl_def
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   638
        split: ivl.splits option.splits if_splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   639
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   640
definition n_ivl :: "ivl \<Rightarrow> nat" where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   641
"n_ivl ivl = 2 - m_ivl ivl"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   642
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   643
lemma n_ivl_mono: "(x::ivl) \<sqsubseteq> y \<Longrightarrow> n_ivl x \<le> n_ivl y"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   644
unfolding n_ivl_def by (metis diff_le_mono2 m_ivl_anti_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   645
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   646
lemma n_ivl_narrow:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   647
  "~ x \<sqsubseteq> x \<triangle> y \<Longrightarrow> n_ivl(x \<triangle> y) < n_ivl x"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   648
by(auto simp: n_ivl_def m_ivl_def narrow_ivl_def le_option_def le_ivl_def
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   649
        split: ivl.splits option.splits if_splits)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   650
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   651
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   652
interpretation Abs_Int2_measure
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   653
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = plus_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   654
and test_num' = in_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   655
and filter_plus' = filter_plus_ivl and filter_less' = filter_less_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   656
and m = m_ivl and n = n_ivl and h = 2
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   657
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   658
  case goal1 thus ?case by(rule m_ivl_anti_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   659
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   660
  case goal2 thus ?case by(rule m_ivl_widen)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   661
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   662
  case goal3 thus ?case by(rule m_ivl_height)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   663
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   664
  case goal4 thus ?case by(rule n_ivl_mono)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   665
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   666
  case goal5 thus ?case by(rule n_ivl_narrow)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   667
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   668
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   669
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   670
lemma iter_winden_step_ivl_termination:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   671
  "\<exists>C. iter_widen (step_ivl (top c)) (bot c) = Some C"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   672
apply(rule iter_widen_termination[where m = "m_c" and P = "%C. C \<in> Lc c"])
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   673
apply (simp_all add: step'_in_Lc m_c_widen)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   674
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   675
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   676
lemma iter_narrow_step_ivl_termination:
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   677
  "C0 \<in> Lc c \<Longrightarrow> step_ivl (top c) C0 \<sqsubseteq> C0 \<Longrightarrow>
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   678
  \<exists>C. iter_narrow (step_ivl (top c)) C0 = Some C"
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   679
apply(rule iter_narrow_termination[where n = "n_c" and P = "%C. C \<in> Lc c"])
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   680
apply (simp add: step'_in_Lc)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   681
apply (simp)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   682
apply(rule mono_step'_top)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   683
apply(simp add: Lc_acom_def L_acom_def)
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   684
apply(simp add: Lc_acom_def L_acom_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   685
apply assumption
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   686
apply(erule (3) n_c_narrow)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   687
apply assumption
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   688
apply assumption
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   689
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   690
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   691
theorem AI_ivl'_termination:
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   692
  "\<exists>C. AI_ivl' c = Some C"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   693
apply(auto simp: AI_wn_def pfp_wn_def iter_winden_step_ivl_termination
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   694
           split: option.split)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   695
apply(rule iter_narrow_step_ivl_termination)
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   696
apply(blast intro: iter_widen_inv[where f = "step' \<top>\<^bsub>c\<^esub>" and P = "%C. C \<in> Lc c"] bot_in_Lc Lc_widen step'_in_Lc[where S = "\<top>\<^bsub>c\<^esub>" and c=c, simplified])
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   697
apply(erule iter_widen_pfp)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   698
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   699
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   700
(*unused_thms Abs_Int_init -*)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   701
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   702
end