src/HOL/IMP/Abs_Int2_ivl.thy
author nipkow
Fri, 22 Feb 2013 20:12:53 +0100
changeset 51245 311fe56541ea
parent 51036 e7b54119c436
child 51261 d301ba7da9b6
permissions -rw-r--r--
more abstract intervals
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_Int2_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     4
imports Abs_Int2
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
subsection "Interval Analysis"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
     8
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
     9
datatype lb = Minf | Lb int
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    10
datatype ub = Pinf | Ub int
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    11
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    12
datatype ivl = Ivl lb ub
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    13
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    14
definition "\<gamma>_ivl i = (case i of
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    15
  Ivl (Lb l) (Ub h) \<Rightarrow> {l..h} |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    16
  Ivl (Lb l) Pinf \<Rightarrow> {l..} |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    17
  Ivl Minf (Ub h) \<Rightarrow> {..h} |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    18
  Ivl Minf Pinf \<Rightarrow> UNIV)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    19
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    20
abbreviation Ivl_Lb_Ub :: "int \<Rightarrow> int \<Rightarrow> ivl"  ("{_\<dots>_}") where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    21
"{lo\<dots>hi} == Ivl (Lb lo) (Ub hi)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    22
abbreviation Ivl_Lb_Pinf :: "int \<Rightarrow> ivl"  ("{_\<dots>}") where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    23
"{lo\<dots>} == Ivl (Lb lo) Pinf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    24
abbreviation Ivl_Minf_Ub :: "int \<Rightarrow> ivl"  ("{\<dots>_}") where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    25
"{\<dots>hi} == Ivl Minf (Ub hi)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    26
abbreviation Ivl_Minf_Pinf :: "ivl"  ("{\<dots>}") where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    27
"{\<dots>} == Ivl Minf Pinf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    28
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    29
lemmas lub_splits = lb.splits ub.splits
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    30
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    31
definition "num_ivl n = {n\<dots>n}"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    32
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    33
fun in_ivl :: "int \<Rightarrow> ivl \<Rightarrow> bool" where
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    34
"in_ivl k (Ivl (Lb l) (Ub h)) \<longleftrightarrow> l \<le> k \<and> k \<le> h" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    35
"in_ivl k (Ivl (Lb l) Pinf) \<longleftrightarrow> l \<le> k" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    36
"in_ivl k (Ivl Minf (Ub h)) \<longleftrightarrow> k \<le> h" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    37
"in_ivl k (Ivl Minf Pinf) \<longleftrightarrow> True"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    38
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    39
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    40
instantiation lb :: order
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    41
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    42
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    43
definition less_eq_lb where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    44
"l1 \<le> l2 = (case l1 of Minf \<Rightarrow> True | Lb i1 \<Rightarrow> (case l2 of Minf \<Rightarrow> False | Lb i2 \<Rightarrow> i1 \<le> i2))"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    45
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    46
definition less_lb :: "lb \<Rightarrow> lb \<Rightarrow> bool" where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    47
"((l1::lb) < l2) = (l1 \<le> l2 & ~ l1 \<ge> l2)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    48
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    49
instance
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    50
proof
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    51
  case goal1 show ?case by(rule less_lb_def)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    52
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    53
  case goal2 show ?case by(auto simp: less_eq_lb_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    54
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    55
  case goal3 thus ?case by(auto simp: less_eq_lb_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    56
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    57
  case goal4 thus ?case by(auto simp: less_eq_lb_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    58
qed
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    59
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    60
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    61
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    62
instantiation ub :: order
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    63
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    64
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    65
definition less_eq_ub where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    66
"u1 \<le> u2 = (case u2 of Pinf \<Rightarrow> True | Ub i2 \<Rightarrow> (case u1 of Pinf \<Rightarrow> False | Ub i1 \<Rightarrow> i1 \<le> i2))"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    67
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    68
definition less_ub :: "ub \<Rightarrow> ub \<Rightarrow> bool" where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    69
"((u1::ub) < u2) = (u1 \<le> u2 & ~ u1 \<ge> u2)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    70
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    71
instance
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    72
proof
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    73
  case goal1 show ?case by(rule less_ub_def)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    74
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    75
  case goal2 show ?case by(auto simp: less_eq_ub_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    76
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    77
  case goal3 thus ?case by(auto simp: less_eq_ub_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    78
next
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    79
  case goal4 thus ?case by(auto simp: less_eq_ub_def split:lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    80
qed
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    81
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    82
end
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    83
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    84
lemmas le_lub_defs = less_eq_lb_def less_eq_ub_def
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    85
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    86
definition empty where "empty = {1\<dots>0}"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    87
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    88
fun is_empty where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    89
"is_empty {l\<dots>h} = (h<l)" |
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    90
"is_empty _ = False"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    91
49579
nipkow
parents: 49399
diff changeset
    92
lemma [simp]: "is_empty(Ivl l h) =
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    93
  (case l of Lb l \<Rightarrow> (case h of Ub h \<Rightarrow> h<l | Pinf \<Rightarrow> False) | Minf \<Rightarrow> False)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    94
by(auto split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    95
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    96
lemma [simp]: "is_empty i \<Longrightarrow> \<gamma>_ivl i = {}"
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    97
by(auto simp add: \<gamma>_ivl_def split: ivl.split lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    98
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    99
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   100
instantiation ivl :: semilattice
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   101
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   102
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   103
fun le_aux where
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   104
"le_aux (Ivl l1 h1) (Ivl l2 h2) = (l2 \<le> l1 & h1 \<le> h2)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   105
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   106
definition le_ivl where
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   107
"i1 \<sqsubseteq> i2 =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   108
 (if is_empty i1 then True else
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   109
  if is_empty i2 then False else le_aux i1 i2)"
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 "i1 \<squnion> i2 =
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   112
 (if is_empty i1 then i2 else if is_empty i2 then i1
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   113
  else case (i1,i2) of (Ivl l1 h1, Ivl l2 h2) \<Rightarrow> Ivl (min l1 l2) (max h1 h2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   114
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   115
definition "\<top> = {\<dots>}"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   116
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   117
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   118
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   119
  case goal1 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   120
    by(cases x, simp add: le_ivl_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   121
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   122
  case goal2 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   123
    by(cases x, cases y, cases z, auto simp: le_ivl_def split: if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   124
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   125
  case goal3 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   126
    by(cases x, cases y, simp add: le_ivl_def join_ivl_def le_lub_defs min_def max_def split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   127
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   128
  case goal4 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   129
    by(cases x, cases y, simp add: le_ivl_def join_ivl_def le_lub_defs min_def max_def split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   130
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   131
  case goal5 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   132
    by(cases x, cases y, cases z, auto simp add: le_ivl_def join_ivl_def le_lub_defs min_def max_def split: lub_splits if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   133
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   134
  case goal6 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   135
    by(cases x, simp add: Top_ivl_def le_ivl_def le_lub_defs split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   136
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   137
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   138
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   139
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   140
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   141
instantiation ivl :: lattice
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   142
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   143
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   144
definition "i1 \<sqinter> i2 = (if is_empty i1 \<or> is_empty i2 then empty else
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   145
  case (i1,i2) of (Ivl l1 h1, Ivl l2 h2) \<Rightarrow> Ivl (max l1 l2) (min h1 h2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   146
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   147
definition "\<bottom> = empty"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   148
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   149
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   150
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   151
  case goal2 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   152
    by (simp add:meet_ivl_def empty_def le_ivl_def le_lub_defs max_def min_def split: ivl.splits lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   153
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   154
  case goal3 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   155
    by (simp add: empty_def meet_ivl_def le_ivl_def le_lub_defs max_def min_def split: ivl.splits lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   156
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   157
  case goal4 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   158
    by (cases x, cases y, cases z, auto simp add: le_ivl_def meet_ivl_def empty_def le_lub_defs max_def min_def split: lub_splits if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   159
next
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   160
  case goal1 show ?case by(cases x, simp add: bot_ivl_def empty_def le_ivl_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   161
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   162
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   163
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   164
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   165
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   166
instantiation lb :: plus
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   167
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   168
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   169
fun plus_lb where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   170
"Lb x + Lb y = Lb(x+y)" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   171
"_ + _ = Minf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   172
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   173
instance ..
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   174
end
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   175
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   176
instantiation ub :: plus
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   177
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   178
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   179
fun plus_ub where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   180
"Ub x + Ub y = Ub(x+y)" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   181
"_ + _ = Pinf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   182
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   183
instance ..
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   184
end
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   185
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   186
instantiation ivl :: plus
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   187
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   188
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   189
definition "i1+i2 = (if is_empty i1 | is_empty i2 then empty else
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   190
  case (i1,i2) of (Ivl l1 h1, Ivl l2 h2) \<Rightarrow> Ivl (l1+l2) (h1+h2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   191
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   192
instance ..
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   193
end
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   194
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   195
fun uminus_ub :: "ub \<Rightarrow> lb" where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   196
"uminus_ub(Ub( x)) = Lb(-x)" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   197
"uminus_ub Pinf = Minf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   198
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   199
fun uminus_lb :: "lb \<Rightarrow> ub" where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   200
"uminus_lb(Lb( x)) = Ub(-x)" |
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   201
"uminus_lb Minf = Pinf"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   202
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   203
instantiation ivl :: minus
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   204
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   205
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   206
definition "i1 - i2 = (if is_empty i1 | is_empty i2 then empty else
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   207
  case (i1,i2) of (Ivl l1 h1, Ivl l2 h2) \<Rightarrow> Ivl (l1 + uminus_ub h2) (h1 + uminus_lb l2))"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   208
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   209
instance ..
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   210
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   211
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   212
instantiation ivl :: uminus
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   213
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   214
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   215
fun uminus_ivl where
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   216
"-(Ivl l h) = Ivl (uminus_ub h) (uminus_lb l)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   217
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   218
instance ..
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   219
end
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   220
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   221
lemma minus_ivl_nice_def: "(i1::ivl) - i2 = i1 + -i2"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   222
by(auto simp: plus_ivl_def minus_ivl_def split: ivl.split lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   223
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   224
lemma gamma_minus_ivl:
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   225
  "n1 : \<gamma>_ivl i1 \<Longrightarrow> n2 : \<gamma>_ivl i2 \<Longrightarrow> n1-n2 : \<gamma>_ivl(i1 - i2)"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   226
by(auto simp add: minus_ivl_def \<gamma>_ivl_def split: ivl.splits lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   227
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   228
definition "filter_plus_ivl i i1 i2 = ((*if is_empty i then empty else*)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   229
  i1 \<sqinter> (i - i2), i2 \<sqinter> (i - i1))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   230
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   231
fun filter_less_ivl :: "bool \<Rightarrow> ivl \<Rightarrow> ivl \<Rightarrow> ivl * ivl" where
49579
nipkow
parents: 49399
diff changeset
   232
"filter_less_ivl res (Ivl l1 h1) (Ivl l2 h2) =
nipkow
parents: 49399
diff changeset
   233
  (if is_empty(Ivl l1 h1) \<or> is_empty(Ivl l2 h2) then (empty, empty) else
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   234
   if res
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   235
   then (Ivl l1 (min h1 (h2 + Ub -1)), Ivl (max (l1 + Lb 1) l2) h2)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   236
   else (Ivl (max l1 l2) h1, Ivl l2 (min h1 h2)))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   237
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   238
interpretation Val_abs
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   239
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   240
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   241
  case goal1 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   242
    by(auto simp: \<gamma>_ivl_def le_ivl_def le_lub_defs split: ivl.split lub_splits if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   243
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   244
  case goal2 show ?case by(simp add: \<gamma>_ivl_def Top_ivl_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   245
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   246
  case goal3 thus ?case by(simp add: \<gamma>_ivl_def num_ivl_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   247
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   248
  case goal4 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   249
    by(auto simp add: \<gamma>_ivl_def plus_ivl_def split: ivl.split lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   250
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   251
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   252
interpretation Val_abs1_gamma
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   253
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   254
defines aval_ivl is aval'
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   255
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   256
  case goal1 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   257
    by(auto simp add: \<gamma>_ivl_def meet_ivl_def empty_def min_def max_def split: ivl.split lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   258
next
49396
73fb17ed2e08 converted wt into a set, tuned names
nipkow
parents: 49188
diff changeset
   259
  case goal2 show ?case by(auto simp add: bot_ivl_def \<gamma>_ivl_def empty_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   260
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   261
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   262
lemma mono_minus_ivl: fixes i1 :: ivl
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   263
shows "i1 \<sqsubseteq> i1' \<Longrightarrow> i2 \<sqsubseteq> i2' \<Longrightarrow> i1 - i2 \<sqsubseteq> i1' - i2'"
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   264
apply(auto simp add: minus_ivl_def empty_def le_ivl_def le_lub_defs split: ivl.splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   265
  apply(simp split: lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   266
 apply(simp split: lub_splits)
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   267
apply(simp split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   268
done
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   269
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   270
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   271
interpretation Val_abs1
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   272
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   273
and test_num' = in_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   274
and filter_plus' = filter_plus_ivl and filter_less' = filter_less_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   275
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   276
  case goal1 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   277
    by (simp add: \<gamma>_ivl_def split: ivl.split lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   278
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   279
  case goal2 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   280
    by(auto simp add: filter_plus_ivl_def)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   281
      (metis gamma_minus_ivl add_diff_cancel add_commute)+
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   282
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   283
  case goal3 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   284
    by(cases a1, cases a2, auto simp: \<gamma>_ivl_def min_def max_def split: if_splits lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   285
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   286
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   287
interpretation Abs_Int1
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   288
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   289
and test_num' = in_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   290
and filter_plus' = filter_plus_ivl and filter_less' = filter_less_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   291
defines afilter_ivl is afilter
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   292
and bfilter_ivl is bfilter
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   293
and step_ivl is step'
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   294
and AI_ivl is AI
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   295
and aval_ivl' is aval''
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   296
..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   297
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   298
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   299
text{* Monotonicity: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   300
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   301
interpretation Abs_Int1_mono
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   302
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   303
and test_num' = in_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   304
and filter_plus' = filter_plus_ivl and filter_less' = filter_less_ivl
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   305
proof
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   306
  case goal1 thus ?case
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   307
    by(auto simp: plus_ivl_def le_ivl_def le_lub_defs empty_def split: if_splits ivl.splits lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   308
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   309
  case goal2 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   310
    by(auto simp: filter_plus_ivl_def le_prod_def mono_meet mono_minus_ivl)
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   311
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   312
  case goal3 thus ?case
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   313
    apply(cases a1, cases b1, cases a2, cases b2, auto simp: le_prod_def)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   314
    by(auto simp add: empty_def le_ivl_def le_lub_defs min_def max_def split: lub_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   315
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   316
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   317
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   318
subsubsection "Tests"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   319
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   320
value "show_acom_opt (AI_ivl test1_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   321
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   322
text{* Better than @{text AI_const}: *}
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   323
value "show_acom_opt (AI_ivl test3_const)"
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   324
value "show_acom_opt (AI_ivl test4_const)"
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   325
value "show_acom_opt (AI_ivl test6_const)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   326
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   327
definition "steps c i = (step_ivl(top(vars c)) ^^ i) (bot c)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   328
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   329
value "show_acom_opt (AI_ivl test2_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   330
value "show_acom (steps test2_ivl 0)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   331
value "show_acom (steps test2_ivl 1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   332
value "show_acom (steps test2_ivl 2)"
49188
22f7e7b68f50 adjusted examples
nipkow
parents: 47613
diff changeset
   333
value "show_acom (steps test2_ivl 3)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   334
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   335
text{* Fixed point reached in 2 steps.
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   336
 Not so if the start value of x is known: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   337
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   338
value "show_acom_opt (AI_ivl test3_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   339
value "show_acom (steps test3_ivl 0)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   340
value "show_acom (steps test3_ivl 1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   341
value "show_acom (steps test3_ivl 2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   342
value "show_acom (steps test3_ivl 3)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   343
value "show_acom (steps test3_ivl 4)"
49188
22f7e7b68f50 adjusted examples
nipkow
parents: 47613
diff changeset
   344
value "show_acom (steps test3_ivl 5)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   345
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   346
text{* Takes as many iterations as the actual execution. Would diverge if
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   347
loop did not terminate. Worse still, as the following example shows: even if
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   348
the actual execution terminates, the analysis may not. The value of y keeps
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   349
decreasing as the analysis is iterated, no matter how long: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   350
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   351
value "show_acom (steps test4_ivl 50)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   352
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   353
text{* Relationships between variables are NOT captured: *}
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   354
value "show_acom_opt (AI_ivl test5_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   355
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   356
text{* Again, the analysis would not terminate: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   357
value "show_acom (steps test6_ivl 50)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   358
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   359
end