src/HOL/IMP/AbsInt2.thy
author nipkow
Thu, 15 Sep 2011 09:44:08 +0200
changeset 44932 7c93ee993cae
child 44944 f136409c2cef
permissions -rw-r--r--
revised AbsInt and added widening and narrowing
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44932
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     2
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     3
theory AbsInt2
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     4
imports AbsInt1_ivl
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     5
begin
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     6
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     7
subsection "Widening and Narrowing"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     8
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
     9
text{* The assumptions about winden and narrow are merely sanity checks. They
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    10
are only needed in case we want to prove termination of the fixedpoint
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    11
iteration, which we do not --- we limit the number of iterations as before. *}
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    12
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    13
class WN = SL_top +
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    14
fixes widen :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infix "\<nabla>" 65)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    15
assumes widen: "y \<sqsubseteq> x \<nabla> y"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    16
fixes narrow :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infix "\<triangle>" 65)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    17
assumes narrow1: "y \<sqsubseteq> x \<Longrightarrow> y \<sqsubseteq> x \<triangle> y"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    18
assumes narrow2: "y \<sqsubseteq> x \<Longrightarrow> x \<triangle> y \<sqsubseteq> x"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    19
begin
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    20
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    21
fun iter_up :: "('a \<Rightarrow> 'a) \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" where
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    22
"iter_up f 0 x = Top" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    23
"iter_up f (Suc n) x =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    24
  (let fx = f x in if fx \<sqsubseteq> x then x else iter_up f n (x \<nabla> fx))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    25
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    26
lemma iter_up_pfp: "f(iter_up f n x) \<sqsubseteq> iter_up f n x"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    27
apply (induct n arbitrary: x)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    28
 apply (simp)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    29
apply (simp add: Let_def)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    30
done
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    31
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    32
fun iter_down :: "('a \<Rightarrow> 'a) \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" where
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    33
"iter_down f 0 x = x" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    34
"iter_down f (Suc n) x =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    35
  (let y = x \<triangle> f x in if f y \<sqsubseteq> y then iter_down f n y else x)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    36
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    37
lemma iter_down_pfp: "f x \<sqsubseteq> x \<Longrightarrow> f(iter_down f n x) \<sqsubseteq> iter_down f n x"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    38
apply (induct n arbitrary: x)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    39
 apply (simp)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    40
apply (simp add: Let_def)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    41
done
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    42
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    43
definition iter_above :: "nat \<Rightarrow> nat \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a" where
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    44
"iter_above m n f x =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    45
  (let f' = (\<lambda>y. x \<squnion> f y) in iter_down f' n (iter_up f' m x))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    46
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    47
lemma iter_above_pfp:
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    48
shows "f(iter_above m n f x0) \<sqsubseteq> iter_above m n f x0"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    49
and "x0 \<sqsubseteq> iter_above m n f x0"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    50
using iter_up_pfp[of "\<lambda>x. x0 \<squnion> f x"] iter_down_pfp[of "\<lambda>x. x0 \<squnion> f x"]
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    51
by(auto simp add: iter_above_def Let_def)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    52
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    53
end
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    54
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    55
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    56
instantiation ivl :: WN
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    57
begin
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    58
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    59
definition "widen_ivl ivl1 ivl2 =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    60
  ((*if is_empty ivl1 then ivl2 else
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    61
   if is_empty ivl2 then ivl1 else*)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    62
     case (ivl1,ivl2) of (I l1 h1, I l2 h2) \<Rightarrow>
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    63
       I (if le_option False l2 l1 \<and> l2 \<noteq> l1 then None else l2)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    64
         (if le_option True h1 h2 \<and> h1 \<noteq> h2 then None else h2))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    65
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    66
definition "narrow_ivl ivl1 ivl2 =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    67
  ((*if is_empty ivl1 \<or> is_empty ivl2 then empty else*)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    68
     case (ivl1,ivl2) of (I l1 h1, I l2 h2) \<Rightarrow>
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    69
       I (if l1 = None then l2 else l1)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    70
         (if h1 = None then h2 else h1))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    71
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    72
instance
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    73
proof qed
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    74
  (auto simp add: widen_ivl_def narrow_ivl_def le_option_def le_ivl_def empty_def split: ivl.split option.split if_splits)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    75
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    76
end
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    77
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    78
instantiation astate :: (WN)WN
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    79
begin
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    80
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    81
definition "widen_astate F1 F2 =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    82
  FunDom (\<lambda>x. fun F1 x \<nabla> fun F2 x) (inter_list (dom F1) (dom F2))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    83
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    84
definition "narrow_astate F1 F2 =
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    85
  FunDom (\<lambda>x. fun F1 x \<triangle> fun F2 x) (inter_list (dom F1) (dom F2))"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    86
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    87
instance
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    88
proof
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    89
  case goal1 thus ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    90
    by(simp add: widen_astate_def le_astate_def lookup_def widen)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    91
next
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    92
  case goal2 thus ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    93
    by(auto simp: narrow_astate_def le_astate_def lookup_def narrow1)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    94
next
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    95
  case goal3 thus ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    96
    by(auto simp: narrow_astate_def le_astate_def lookup_def narrow2)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    97
qed
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    98
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
    99
end
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   100
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   101
instantiation up :: (WN)WN
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   102
begin
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   103
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   104
fun widen_up where
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   105
"widen_up bot x = x" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   106
"widen_up x bot = x" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   107
"widen_up (Up x) (Up y) = Up(x \<nabla> y)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   108
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   109
fun narrow_up where
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   110
"narrow_up bot x = bot" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   111
"narrow_up x bot = bot" |
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   112
"narrow_up (Up x) (Up y) = Up(x \<triangle> y)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   113
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   114
instance
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   115
proof
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   116
  case goal1 show ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   117
    by(induct x y rule: widen_up.induct) (simp_all add: widen)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   118
next
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   119
  case goal2 thus ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   120
    by(induct x y rule: narrow_up.induct) (simp_all add: narrow1)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   121
next
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   122
  case goal3 thus ?case
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   123
    by(induct x y rule: narrow_up.induct) (simp_all add: narrow2)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   124
qed
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   125
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   126
end
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   127
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   128
interpretation
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   129
  Abs_Int1 rep_ivl num_ivl plus_ivl inv_plus_ivl inv_less_ivl "(iter_above 3 2)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   130
defines afilter_ivl' is afilter
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   131
and bfilter_ivl' is bfilter
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   132
and AI_ivl' is AI
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   133
and aval_ivl' is aval'
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   134
proof qed (auto simp: iter_above_pfp)
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   135
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   136
value [code] "list_up(AI_ivl' test3_ivl Top)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   137
value [code] "list_up(AI_ivl' test4_ivl Top)"
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   138
7c93ee993cae revised AbsInt and added widening and narrowing
nipkow
parents:
diff changeset
   139
end