src/HOL/IMP/Abs_Int2_ivl.thy
author nipkow
Tue, 14 May 2013 06:54:31 +0200
changeset 51974 9c80e62161a5
parent 51924 e398ab28eaa7
child 51994 82cc2aeb7d13
permissions -rw-r--r--
tuned names
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
51390
1dff81cf425b more factorisation of Step & Co
nipkow
parents: 51389
diff changeset
     4
imports Abs_Int2
47613
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
51913
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
     9
text{* Drop @{const Fin} around numerals on output: *}
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
    10
translations
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
    11
"_Numeral i" <= "CONST Fin(_Numeral i)"
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
    12
"0" <= "CONST Fin 0"
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
    13
"1" <= "CONST Fin 1"
b41268648df2 hide Fin on output
nipkow
parents: 51890
diff changeset
    14
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    15
type_synonym eint = "int extended"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    16
type_synonym eint2 = "eint * eint"
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    17
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    18
definition \<gamma>_rep :: "eint2 \<Rightarrow> int set" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    19
"\<gamma>_rep p = (let (l,h) = p in {i. l \<le> Fin i \<and> Fin i \<le> h})"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    20
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    21
definition eq_ivl :: "eint2 \<Rightarrow> eint2 \<Rightarrow> bool" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    22
"eq_ivl p1 p2 = (\<gamma>_rep p1 = \<gamma>_rep p2)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    23
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    24
lemma refl_eq_ivl[simp]: "eq_ivl p p"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    25
by(auto simp: eq_ivl_def)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    26
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    27
quotient_type ivl = eint2 / eq_ivl
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    28
by(rule equivpI)(auto simp: reflp_def symp_def transp_def eq_ivl_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    29
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
    30
abbreviation ivl_abbr :: "eint \<Rightarrow> eint \<Rightarrow> ivl" ("[_, _]") where
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
    31
"[l,h] == abs_ivl(l,h)"
51871
f16bd7d2359c added lemma
nipkow
parents: 51870
diff changeset
    32
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    33
lift_definition \<gamma>_ivl :: "ivl \<Rightarrow> int set" is \<gamma>_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    34
by(simp add: eq_ivl_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    35
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
    36
lemma \<gamma>_ivl_nice: "\<gamma>_ivl[l,h] = {i. l \<le> Fin i \<and> Fin i \<le> h}"
51871
f16bd7d2359c added lemma
nipkow
parents: 51870
diff changeset
    37
by transfer (simp add: \<gamma>_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    38
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    39
lift_definition num_ivl :: "int \<Rightarrow> ivl" is "\<lambda>i. (Fin i, Fin i)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    40
by(auto simp: eq_ivl_def)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    41
51887
nipkow
parents: 51882
diff changeset
    42
lift_definition in_ivl :: "int \<Rightarrow> ivl \<Rightarrow> bool"
nipkow
parents: 51882
diff changeset
    43
  is "\<lambda>i (l,h). l \<le> Fin i \<and> Fin i \<le> h"
nipkow
parents: 51882
diff changeset
    44
by(auto simp: eq_ivl_def \<gamma>_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    45
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
    46
lemma in_ivl_nice: "in_ivl i [l,h] = (l \<le> Fin i \<and> Fin i \<le> h)"
51887
nipkow
parents: 51882
diff changeset
    47
by transfer simp
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    48
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    49
definition is_empty_rep :: "eint2 \<Rightarrow> bool" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    50
"is_empty_rep p = (let (l,h) = p in l>h | l=Pinf & h=Pinf | l=Minf & h=Minf)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    51
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    52
lemma \<gamma>_rep_cases: "\<gamma>_rep p = (case p of (Fin i,Fin j) => {i..j} | (Fin i,Pinf) => {i..} |
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    53
  (Minf,Fin i) \<Rightarrow> {..i} | (Minf,Pinf) \<Rightarrow> UNIV | _ \<Rightarrow> {})"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    54
by(auto simp add: \<gamma>_rep_def split: prod.splits extended.splits)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    55
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    56
lift_definition  is_empty_ivl :: "ivl \<Rightarrow> bool" is is_empty_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    57
apply(auto simp: eq_ivl_def \<gamma>_rep_cases is_empty_rep_def)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    58
apply(auto simp: not_less less_eq_extended_cases split: extended.splits)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    59
done
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    60
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    61
lemma eq_ivl_iff: "eq_ivl p1 p2 = (is_empty_rep p1 & is_empty_rep p2 | p1 = p2)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    62
by(auto simp: eq_ivl_def is_empty_rep_def \<gamma>_rep_cases Icc_eq_Icc split: prod.splits extended.splits)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    63
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    64
definition empty_rep :: eint2 where "empty_rep = (Pinf,Minf)"
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    65
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    66
lift_definition empty_ivl :: ivl is empty_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    67
by simp
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
    68
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    69
lemma is_empty_empty_rep[simp]: "is_empty_rep empty_rep"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    70
by(auto simp add: is_empty_rep_def empty_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    71
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    72
lemma is_empty_rep_iff: "is_empty_rep p = (\<gamma>_rep p = {})"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    73
by(auto simp add: \<gamma>_rep_cases is_empty_rep_def split: prod.splits extended.splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    74
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    75
declare is_empty_rep_iff[THEN iffD1, simp]
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    76
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    77
51826
054a40461449 canonical names of classes
nipkow
parents: 51711
diff changeset
    78
instantiation ivl :: semilattice_sup_top
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    79
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    80
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    81
definition le_rep :: "eint2 \<Rightarrow> eint2 \<Rightarrow> bool" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    82
"le_rep p1 p2 = (let (l1,h1) = p1; (l2,h2) = p2 in
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    83
  if is_empty_rep(l1,h1) then True else
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    84
  if is_empty_rep(l2,h2) then False else l1 \<ge> l2 & h1 \<le> h2)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    85
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    86
lemma le_iff_subset: "le_rep p1 p2 \<longleftrightarrow> \<gamma>_rep p1 \<subseteq> \<gamma>_rep p2"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    87
apply rule
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    88
apply(auto simp: is_empty_rep_def le_rep_def \<gamma>_rep_def split: if_splits prod.splits)[1]
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    89
apply(auto simp: is_empty_rep_def \<gamma>_rep_cases le_rep_def)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    90
apply(auto simp: not_less split: extended.splits)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    91
done
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    92
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    93
lift_definition less_eq_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> bool" is le_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    94
by(auto simp: eq_ivl_def le_iff_subset)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
    95
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    96
definition less_ivl where "i1 < i2 = (i1 \<le> i2 \<and> \<not> i2 \<le> (i1::ivl))"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
    97
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
    98
lemma le_ivl_iff_subset: "iv1 \<le> iv2 \<longleftrightarrow> \<gamma>_ivl iv1 \<subseteq> \<gamma>_ivl iv2"
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
    99
by transfer (rule le_iff_subset)
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   100
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   101
definition sup_rep :: "eint2 \<Rightarrow> eint2 \<Rightarrow> eint2" where
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   102
"sup_rep p1 p2 = (if is_empty_rep p1 then p2 else if is_empty_rep p2 then p1
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   103
  else let (l1,h1) = p1; (l2,h2) = p2 in  (min l1 l2, max h1 h2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   104
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   105
lift_definition sup_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> ivl" is sup_rep
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   106
by(auto simp: eq_ivl_iff sup_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   107
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   108
lift_definition top_ivl :: ivl is "(Minf,Pinf)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   109
by(auto simp: eq_ivl_def)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   110
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   111
lemma is_empty_min_max:
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   112
  "\<not> is_empty_rep (l1,h1) \<Longrightarrow> \<not> is_empty_rep (l2, h2) \<Longrightarrow> \<not> is_empty_rep (min l1 l2, max h1 h2)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   113
by(auto simp add: is_empty_rep_def max_def min_def split: if_splits)
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
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   116
proof
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   117
  case goal1 show ?case by (rule less_ivl_def)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   118
next
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   119
  case goal2 show ?case by transfer (simp add: le_rep_def split: prod.splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   120
next
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   121
  case goal3 thus ?case by transfer (auto simp: le_rep_def split: if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   122
next
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   123
  case goal4 thus ?case by transfer (auto simp: le_rep_def eq_ivl_iff split: if_splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   124
next
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   125
  case goal5 thus ?case by transfer (auto simp add: le_rep_def sup_rep_def is_empty_min_max)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   126
next
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   127
  case goal6 thus ?case by transfer (auto simp add: le_rep_def sup_rep_def is_empty_min_max)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   128
next
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   129
  case goal7 thus ?case by transfer (auto simp add: le_rep_def sup_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   130
next
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   131
  case goal8 show ?case by transfer (simp add: le_rep_def is_empty_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   132
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   133
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   134
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   135
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   136
text{* Implement (naive) executable equality: *}
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   137
instantiation ivl :: equal
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   138
begin
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   139
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   140
definition equal_ivl where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   141
"equal_ivl i1 (i2::ivl) = (i1\<le>i2 \<and> i2 \<le> i1)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   142
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   143
instance
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   144
proof
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   145
  case goal1 show ?case by(simp add: equal_ivl_def eq_iff)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   146
qed
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   147
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   148
end
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   149
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   150
lemma [simp]: fixes x :: "'a::linorder extended" shows "(\<not> x < Pinf) = (x = Pinf)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   151
by(simp add: not_less)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   152
lemma [simp]: fixes x :: "'a::linorder extended" shows "(\<not> Minf < x) = (x = Minf)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   153
by(simp add: not_less)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   154
51711
df3426139651 complete revision: finally got rid of annoying L-predicate
nipkow
parents: 51390
diff changeset
   155
instantiation ivl :: bounded_lattice
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   156
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   157
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   158
definition inf_rep :: "eint2 \<Rightarrow> eint2 \<Rightarrow> eint2" where
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   159
"inf_rep p1 p2 = (let (l1,h1) = p1; (l2,h2) = p2 in (max l1 l2, min h1 h2))"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   160
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   161
lemma \<gamma>_inf_rep: "\<gamma>_rep(inf_rep p1 p2) = \<gamma>_rep p1 \<inter> \<gamma>_rep p2"
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   162
by(auto simp:inf_rep_def \<gamma>_rep_cases split: prod.splits extended.splits)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   163
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   164
lift_definition inf_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> ivl" is inf_rep
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   165
by(auto simp: \<gamma>_inf_rep eq_ivl_def)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   166
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   167
lemma \<gamma>_inf: "\<gamma>_ivl (iv1 \<sqinter> iv2) = \<gamma>_ivl iv1 \<inter> \<gamma>_ivl iv2"
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   168
by transfer (rule \<gamma>_inf_rep)
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   169
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   170
definition "\<bottom> = empty_ivl"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   171
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   172
instance
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   173
proof
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   174
  case goal1 thus ?case by (simp add: \<gamma>_inf le_ivl_iff_subset)
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   175
next
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   176
  case goal2 thus ?case by (simp add: \<gamma>_inf le_ivl_iff_subset)
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   177
next
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   178
  case goal3 thus ?case by (simp add: \<gamma>_inf le_ivl_iff_subset)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   179
next
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   180
  case goal4 show ?case
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   181
    unfolding bot_ivl_def by transfer (auto simp: le_iff_subset)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   182
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   183
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   184
end
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   185
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   186
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   187
lemma eq_ivl_empty: "eq_ivl p empty_rep = is_empty_rep p"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   188
by (metis eq_ivl_iff is_empty_empty_rep)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   189
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   190
lemma le_ivl_nice: "[l1,h1] \<le> [l2,h2] \<longleftrightarrow>
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   191
  (if [l1,h1] = \<bottom> then True else
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   192
   if [l2,h2] = \<bottom> then False else l1 \<ge> l2 & h1 \<le> h2)"
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   193
unfolding bot_ivl_def by transfer (simp add: le_rep_def eq_ivl_empty)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   194
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   195
lemma sup_ivl_nice: "[l1,h1] \<squnion> [l2,h2] =
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   196
  (if [l1,h1] = \<bottom> then [l2,h2] else
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   197
   if [l2,h2] = \<bottom> then [l1,h1] else [min l1 l2,max h1 h2])"
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   198
unfolding bot_ivl_def by transfer (simp add: sup_rep_def eq_ivl_empty)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   199
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   200
lemma inf_ivl_nice: "[l1,h1] \<sqinter> [l2,h2] = [max l1 l2,min h1 h2]"
51389
8a9f0503b1c0 factored out Step
nipkow
parents: 51359
diff changeset
   201
by transfer (simp add: inf_rep_def)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   202
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   203
lemma top_ivl_nice: "\<top> = [-\<infinity>,\<infinity>]"
51870
a331fbefcdb1 added lemma
nipkow
parents: 51826
diff changeset
   204
by (simp add: top_ivl_def)
a331fbefcdb1 added lemma
nipkow
parents: 51826
diff changeset
   205
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   206
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   207
instantiation ivl :: plus
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   208
begin
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   209
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   210
definition plus_rep :: "eint2 \<Rightarrow> eint2 \<Rightarrow> eint2" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   211
"plus_rep p1 p2 =
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   212
  (if is_empty_rep p1 \<or> is_empty_rep p2 then empty_rep else
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   213
   let (l1,h1) = p1; (l2,h2) = p2 in (l1+l2, h1+h2))"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   214
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   215
lift_definition plus_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> ivl" is plus_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   216
by(auto simp: plus_rep_def eq_ivl_iff)
51245
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
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   221
lemma plus_ivl_nice: "[l1,h1] + [l2,h2] =
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   222
  (if [l1,h1] = \<bottom> \<or> [l2,h2] = \<bottom> then \<bottom> else [l1+l2 , h1+h2])"
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   223
unfolding bot_ivl_def by transfer (auto simp: plus_rep_def eq_ivl_empty)
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   224
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   225
lemma uminus_eq_Minf[simp]: "-x = Minf \<longleftrightarrow> x = Pinf"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   226
by(cases x) auto
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   227
lemma uminus_eq_Pinf[simp]: "-x = Pinf \<longleftrightarrow> x = Minf"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   228
by(cases x) auto
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   229
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   230
lemma uminus_le_Fin_iff: "- x \<le> Fin(-y) \<longleftrightarrow> Fin y \<le> (x::'a::ordered_ab_group_add extended)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   231
by(cases x) auto
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   232
lemma Fin_uminus_le_iff: "Fin(-y) \<le> -x \<longleftrightarrow> x \<le> ((Fin y)::'a::ordered_ab_group_add extended)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   233
by(cases x) auto
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   234
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   235
instantiation ivl :: uminus
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   236
begin
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   237
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   238
definition uminus_rep :: "eint2 \<Rightarrow> eint2" where
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   239
"uminus_rep p = (let (l,h) = p in (-h, -l))"
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   240
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   241
lemma \<gamma>_uminus_rep: "i : \<gamma>_rep p \<Longrightarrow> -i \<in> \<gamma>_rep(uminus_rep p)"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   242
by(auto simp: uminus_rep_def \<gamma>_rep_def image_def uminus_le_Fin_iff Fin_uminus_le_iff
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   243
        split: prod.split)
51261
d301ba7da9b6 improved orderings
nipkow
parents: 51245
diff changeset
   244
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   245
lift_definition uminus_ivl :: "ivl \<Rightarrow> ivl" is uminus_rep
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   246
by (auto simp: uminus_rep_def eq_ivl_def \<gamma>_rep_cases)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   247
   (auto simp: Icc_eq_Icc split: extended.splits)
51261
d301ba7da9b6 improved orderings
nipkow
parents: 51245
diff changeset
   248
d301ba7da9b6 improved orderings
nipkow
parents: 51245
diff changeset
   249
instance ..
d301ba7da9b6 improved orderings
nipkow
parents: 51245
diff changeset
   250
end
d301ba7da9b6 improved orderings
nipkow
parents: 51245
diff changeset
   251
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   252
lemma \<gamma>_uminus: "i : \<gamma>_ivl iv \<Longrightarrow> -i \<in> \<gamma>_ivl(- iv)"
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   253
by transfer (rule \<gamma>_uminus_rep)
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   254
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   255
lemma uminus_nice: "-[l,h] = [-h,-l]"
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   256
by transfer (simp add: uminus_rep_def)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   257
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   258
instantiation ivl :: minus
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   259
begin
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   260
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   261
definition minus_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> ivl" where
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   262
"(iv1::ivl) - iv2 = iv1 + -iv2"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   263
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   264
instance ..
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   265
end
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   266
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   267
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   268
definition inv_plus_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> ivl \<Rightarrow> ivl*ivl" where
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   269
"inv_plus_ivl iv iv1 iv2 = (iv1 \<sqinter> (iv - iv2), iv2 \<sqinter> (iv - iv1))"
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   270
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   271
definition above_rep :: "eint2 \<Rightarrow> eint2" where
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   272
"above_rep p = (if is_empty_rep p then empty_rep else let (l,h) = p in (l,\<infinity>))"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   273
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   274
definition below_rep :: "eint2 \<Rightarrow> eint2" where
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   275
"below_rep p = (if is_empty_rep p then empty_rep else let (l,h) = p in (-\<infinity>,h))"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   276
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   277
lift_definition above :: "ivl \<Rightarrow> ivl" is above_rep
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   278
by(auto simp: above_rep_def eq_ivl_iff)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   279
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   280
lift_definition below :: "ivl \<Rightarrow> ivl" is below_rep
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   281
by(auto simp: below_rep_def eq_ivl_iff)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   282
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   283
lemma \<gamma>_aboveI: "i \<in> \<gamma>_ivl iv \<Longrightarrow> i \<le> j \<Longrightarrow> j \<in> \<gamma>_ivl(above iv)"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   284
by transfer 
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   285
   (auto simp add: above_rep_def \<gamma>_rep_cases is_empty_rep_def
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   286
         split: extended.splits)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   287
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   288
lemma \<gamma>_belowI: "i : \<gamma>_ivl iv \<Longrightarrow> j \<le> i \<Longrightarrow> j : \<gamma>_ivl(below iv)"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   289
by transfer 
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   290
   (auto simp add: below_rep_def \<gamma>_rep_cases is_empty_rep_def
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   291
         split: extended.splits)
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   292
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   293
definition inv_less_ivl :: "bool \<Rightarrow> ivl \<Rightarrow> ivl \<Rightarrow> ivl * ivl" where
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   294
"inv_less_ivl res iv1 iv2 =
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   295
  (if res
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   296
   then (iv1 \<sqinter> (below iv2 - [Fin 1,Fin 1]),
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   297
         iv2 \<sqinter> (above iv1 + [Fin 1,Fin 1]))
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   298
   else (iv1 \<sqinter> above iv2, iv2 \<sqinter> below iv1))"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   299
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   300
lemma above_nice: "above[l,h] = (if [l,h] = \<bottom> then \<bottom> else [l,\<infinity>])"
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   301
unfolding bot_ivl_def by transfer (simp add: above_rep_def eq_ivl_empty)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   302
51924
e398ab28eaa7 standard ivl notation [l,h]
nipkow
parents: 51913
diff changeset
   303
lemma below_nice: "below[l,h] = (if [l,h] = \<bottom> then \<bottom> else [-\<infinity>,h])"
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   304
unfolding bot_ivl_def by transfer (simp add: below_rep_def eq_ivl_empty)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   305
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   306
lemma add_mono_le_Fin:
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   307
  "\<lbrakk>x1 \<le> Fin y1; x2 \<le> Fin y2\<rbrakk> \<Longrightarrow> x1 + x2 \<le> Fin (y1 + (y2::'a::ordered_ab_group_add))"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   308
by(drule (1) add_mono) simp
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   309
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   310
lemma add_mono_Fin_le:
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   311
  "\<lbrakk>Fin y1 \<le> x1; Fin y2 \<le> x2\<rbrakk> \<Longrightarrow> Fin(y1 + y2::'a::ordered_ab_group_add) \<le> x1 + x2"
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   312
by(drule (1) add_mono) simp
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   313
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   314
interpretation Val_abs
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   315
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   316
proof
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   317
  case goal1 thus ?case by transfer (simp add: le_iff_subset)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   318
next
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   319
  case goal2 show ?case by transfer (simp add: \<gamma>_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   320
next
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   321
  case goal3 show ?case by transfer (simp add: \<gamma>_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   322
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   323
  case goal4 thus ?case
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   324
    apply transfer
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   325
    apply(auto simp: \<gamma>_rep_def plus_rep_def add_mono_le_Fin add_mono_Fin_le)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   326
    by(auto simp: empty_rep_def is_empty_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   327
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   328
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   329
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   330
interpretation Val_abs1_gamma
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   331
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   332
defines aval_ivl is aval'
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   333
proof
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   334
  case goal1 show ?case by(simp add: \<gamma>_inf)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   335
next
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   336
  case goal2 show ?case unfolding bot_ivl_def by transfer simp
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   337
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   338
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   339
interpretation Val_abs1
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   340
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   341
and test_num' = in_ivl
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   342
and inv_plus' = inv_plus_ivl and inv_less' = inv_less_ivl
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   343
proof
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   344
  case goal1 thus ?case by transfer (auto simp: \<gamma>_rep_def)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   345
next
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   346
  case goal2 thus ?case
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   347
    unfolding inv_plus_ivl_def minus_ivl_def
51874
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   348
    apply(clarsimp simp add: \<gamma>_inf)
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   349
    using gamma_plus'[of "i1+i2" _ "-i1"] gamma_plus'[of "i1+i2" _ "-i2"]
730b9802d6fe simplified proofs
nipkow
parents: 51871
diff changeset
   350
    by(simp add:  \<gamma>_uminus)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   351
next
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   352
  case goal3 thus ?case
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   353
    unfolding inv_less_ivl_def minus_ivl_def
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   354
    apply(clarsimp simp add: \<gamma>_inf split: if_splits)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   355
    using gamma_plus'[of "i1+1" _ "-1"] gamma_plus'[of "i2 - 1" _ "1"]
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   356
    apply(simp add: \<gamma>_belowI[of i2] \<gamma>_aboveI[of i1]
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   357
      uminus_ivl.abs_eq uminus_rep_def \<gamma>_ivl_nice)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   358
    apply(simp add: \<gamma>_aboveI[of i2] \<gamma>_belowI[of i1])
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   359
    done
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   360
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   361
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   362
interpretation Abs_Int1
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   363
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   364
and test_num' = in_ivl
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   365
and inv_plus' = inv_plus_ivl and inv_less' = inv_less_ivl
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   366
defines inv_aval_ivl is inv_aval''
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   367
and inv_bval_ivl is inv_bval''
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   368
and step_ivl is step'
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   369
and AI_ivl is AI
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   370
and aval_ivl' is aval''
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   371
..
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   372
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   373
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   374
text{* Monotonicity: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   375
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   376
lemma mono_plus_ivl: "iv1 \<le> iv2 \<Longrightarrow> iv3 \<le> iv4 \<Longrightarrow> iv1+iv3 \<le> iv2+(iv4::ivl)"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   377
apply transfer
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   378
apply(auto simp: plus_rep_def le_iff_subset split: if_splits)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   379
by(auto simp: is_empty_rep_iff \<gamma>_rep_cases split: extended.splits)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   380
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   381
lemma mono_minus_ivl: "iv1 \<le> iv2 \<Longrightarrow> -iv1 \<le> -(iv2::ivl)"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   382
apply transfer
51359
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   383
apply(auto simp: uminus_rep_def le_iff_subset split: if_splits prod.split)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   384
by(auto simp: \<gamma>_rep_cases split: extended.splits)
00b45c7e831f major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents: 51261
diff changeset
   385
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   386
lemma mono_above: "iv1 \<le> iv2 \<Longrightarrow> above iv1 \<le> above iv2"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   387
apply transfer
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   388
apply(auto simp: above_rep_def le_iff_subset split: if_splits prod.split)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   389
by(auto simp: is_empty_rep_iff \<gamma>_rep_cases split: extended.splits)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   390
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   391
lemma mono_below: "iv1 \<le> iv2 \<Longrightarrow> below iv1 \<le> below iv2"
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   392
apply transfer
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   393
apply(auto simp: below_rep_def le_iff_subset split: if_splits prod.split)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   394
by(auto simp: is_empty_rep_iff \<gamma>_rep_cases split: extended.splits)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   395
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   396
interpretation Abs_Int1_mono
51245
311fe56541ea more abstract intervals
nipkow
parents: 51036
diff changeset
   397
where \<gamma> = \<gamma>_ivl and num' = num_ivl and plus' = "op +"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   398
and test_num' = in_ivl
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   399
and inv_plus' = inv_plus_ivl and inv_less' = inv_less_ivl
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   400
proof
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   401
  case goal1 thus ?case by (rule mono_plus_ivl)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   402
next
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   403
  case goal2 thus ?case
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   404
    unfolding inv_plus_ivl_def minus_ivl_def less_eq_prod_def
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   405
    by (auto simp: le_infI1 le_infI2 mono_plus_ivl mono_minus_ivl)
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   406
next
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   407
  case goal3 thus ?case
51974
9c80e62161a5 tuned names
nipkow
parents: 51924
diff changeset
   408
    unfolding less_eq_prod_def inv_less_ivl_def minus_ivl_def
51882
2023639f566b improved defns and proofs
nipkow
parents: 51874
diff changeset
   409
    by (auto simp: le_infI1 le_infI2 mono_plus_ivl mono_above mono_below)
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   410
qed
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   411
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   412
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   413
subsubsection "Tests"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   414
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   415
value "show_acom_opt (AI_ivl test1_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   416
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   417
text{* Better than @{text AI_const}: *}
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   418
value "show_acom_opt (AI_ivl test3_const)"
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   419
value "show_acom_opt (AI_ivl test4_const)"
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   420
value "show_acom_opt (AI_ivl test6_const)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   421
51711
df3426139651 complete revision: finally got rid of annoying L-predicate
nipkow
parents: 51390
diff changeset
   422
definition "steps c i = (step_ivl \<top> ^^ i) (bot c)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   423
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   424
value "show_acom_opt (AI_ivl test2_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   425
value "show_acom (steps test2_ivl 0)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   426
value "show_acom (steps test2_ivl 1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   427
value "show_acom (steps test2_ivl 2)"
49188
22f7e7b68f50 adjusted examples
nipkow
parents: 47613
diff changeset
   428
value "show_acom (steps test2_ivl 3)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   429
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   430
text{* Fixed point reached in 2 steps.
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   431
 Not so if the start value of x is known: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   432
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   433
value "show_acom_opt (AI_ivl test3_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   434
value "show_acom (steps test3_ivl 0)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   435
value "show_acom (steps test3_ivl 1)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   436
value "show_acom (steps test3_ivl 2)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   437
value "show_acom (steps test3_ivl 3)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   438
value "show_acom (steps test3_ivl 4)"
49188
22f7e7b68f50 adjusted examples
nipkow
parents: 47613
diff changeset
   439
value "show_acom (steps test3_ivl 5)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   440
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   441
text{* Takes as many iterations as the actual execution. Would diverge if
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   442
loop did not terminate. Worse still, as the following example shows: even if
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   443
the actual execution terminates, the analysis may not. The value of y keeps
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   444
decreasing as the analysis is iterated, no matter how long: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   445
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   446
value "show_acom (steps test4_ivl 50)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   447
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   448
text{* Relationships between variables are NOT captured: *}
51036
e7b54119c436 tuned top
nipkow
parents: 50995
diff changeset
   449
value "show_acom_opt (AI_ivl test5_ivl)"
47613
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   450
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   451
text{* Again, the analysis would not terminate: *}
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   452
value "show_acom (steps test6_ivl 50)"
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   453
e72e44cee6f2 added revised version of Abs_Int
nipkow
parents:
diff changeset
   454
end