src/HOL/IMP/Abs_Int1_const.thy
author nipkow
Tue, 12 Feb 2013 11:54:29 +0100
changeset 52218 e7b54119c436
parent 52177 3371f5ee4ace
child 52496 00b45c7e831f
permissions -rw-r--r--
tuned top
nipkow@48476
     1
(* Author: Tobias Nipkow *)
nipkow@48476
     2
nipkow@48476
     3
theory Abs_Int1_const
nipkow@48476
     4
imports Abs_Int1
nipkow@48476
     5
begin
nipkow@48476
     6
nipkow@48476
     7
subsection "Constant Propagation"
nipkow@48476
     8
nipkow@48476
     9
datatype const = Const val | Any
nipkow@48476
    10
nipkow@48476
    11
fun \<gamma>_const where
nipkow@48476
    12
"\<gamma>_const (Const n) = {n}" |
nipkow@48476
    13
"\<gamma>_const (Any) = UNIV"
nipkow@48476
    14
nipkow@48476
    15
fun plus_const where
nipkow@48476
    16
"plus_const (Const m) (Const n) = Const(m+n)" |
nipkow@48476
    17
"plus_const _ _ = Any"
nipkow@48476
    18
nipkow@48476
    19
lemma plus_const_cases: "plus_const a1 a2 =
nipkow@48476
    20
  (case (a1,a2) of (Const m, Const n) \<Rightarrow> Const(m+n) | _ \<Rightarrow> Any)"
nipkow@48476
    21
by(auto split: prod.split const.split)
nipkow@48476
    22
nipkow@50411
    23
instantiation const :: semilattice
nipkow@48476
    24
begin
nipkow@48476
    25
nipkow@48476
    26
fun le_const where
nipkow@48476
    27
"_ \<sqsubseteq> Any = True" |
nipkow@48476
    28
"Const n \<sqsubseteq> Const m = (n=m)" |
nipkow@48476
    29
"Any \<sqsubseteq> Const _ = False"
nipkow@48476
    30
nipkow@48476
    31
fun join_const where
nipkow@48476
    32
"Const m \<squnion> Const n = (if n=m then Const m else Any)" |
nipkow@48476
    33
"_ \<squnion> _ = Any"
nipkow@48476
    34
nipkow@48476
    35
definition "\<top> = Any"
nipkow@48476
    36
nipkow@48476
    37
instance
nipkow@48476
    38
proof
nipkow@48476
    39
  case goal1 thus ?case by (cases x) simp_all
nipkow@48476
    40
next
nipkow@48476
    41
  case goal2 thus ?case by(cases z, cases y, cases x, simp_all)
nipkow@48476
    42
next
nipkow@48476
    43
  case goal3 thus ?case by(cases x, cases y, simp_all)
nipkow@48476
    44
next
nipkow@48476
    45
  case goal4 thus ?case by(cases y, cases x, simp_all)
nipkow@48476
    46
next
nipkow@48476
    47
  case goal5 thus ?case by(cases z, cases y, cases x, simp_all)
nipkow@48476
    48
next
nipkow@48476
    49
  case goal6 thus ?case by(simp add: Top_const_def)
nipkow@48476
    50
qed
nipkow@48476
    51
nipkow@48476
    52
end
nipkow@48476
    53
nipkow@48476
    54
nipkow@48476
    55
interpretation Val_abs
nipkow@48476
    56
where \<gamma> = \<gamma>_const and num' = Const and plus' = plus_const
nipkow@48476
    57
proof
nipkow@48476
    58
  case goal1 thus ?case
nipkow@48476
    59
    by(cases a, cases b, simp, simp, cases b, simp, simp)
nipkow@48476
    60
next
nipkow@48476
    61
  case goal2 show ?case by(simp add: Top_const_def)
nipkow@48476
    62
next
nipkow@48476
    63
  case goal3 show ?case by simp
nipkow@48476
    64
next
nipkow@48476
    65
  case goal4 thus ?case
nipkow@48476
    66
    by(auto simp: plus_const_cases split: const.split)
nipkow@48476
    67
qed
nipkow@48476
    68
nipkow@48476
    69
interpretation Abs_Int
nipkow@48476
    70
where \<gamma> = \<gamma>_const and num' = Const and plus' = plus_const
nipkow@48476
    71
defines AI_const is AI and step_const is step' and aval'_const is aval'
nipkow@48476
    72
..
nipkow@48476
    73
nipkow@48476
    74
nipkow@48476
    75
subsubsection "Tests"
nipkow@48476
    76
nipkow@52218
    77
definition "steps c i = (step_const(top(vars c)) ^^ i) (bot c)"
nipkow@48476
    78
nipkow@48476
    79
value "show_acom (steps test1_const 0)"
nipkow@48476
    80
value "show_acom (steps test1_const 1)"
nipkow@48476
    81
value "show_acom (steps test1_const 2)"
nipkow@48476
    82
value "show_acom (steps test1_const 3)"
nipkow@52177
    83
value "show_acom (the(AI_const test1_const))"
nipkow@48476
    84
nipkow@52177
    85
value "show_acom (the(AI_const test2_const))"
nipkow@52177
    86
value "show_acom (the(AI_const test3_const))"
nipkow@48476
    87
nipkow@48476
    88
value "show_acom (steps test4_const 0)"
nipkow@48476
    89
value "show_acom (steps test4_const 1)"
nipkow@48476
    90
value "show_acom (steps test4_const 2)"
nipkow@48476
    91
value "show_acom (steps test4_const 3)"
nipkow@50203
    92
value "show_acom (steps test4_const 4)"
nipkow@52177
    93
value "show_acom (the(AI_const test4_const))"
nipkow@48476
    94
nipkow@48476
    95
value "show_acom (steps test5_const 0)"
nipkow@48476
    96
value "show_acom (steps test5_const 1)"
nipkow@48476
    97
value "show_acom (steps test5_const 2)"
nipkow@48476
    98
value "show_acom (steps test5_const 3)"
nipkow@48476
    99
value "show_acom (steps test5_const 4)"
nipkow@48476
   100
value "show_acom (steps test5_const 5)"
nipkow@50203
   101
value "show_acom (steps test5_const 6)"
nipkow@52177
   102
value "show_acom (the(AI_const test5_const))"
nipkow@48476
   103
nipkow@48476
   104
value "show_acom (steps test6_const 0)"
nipkow@48476
   105
value "show_acom (steps test6_const 1)"
nipkow@48476
   106
value "show_acom (steps test6_const 2)"
nipkow@48476
   107
value "show_acom (steps test6_const 3)"
nipkow@48476
   108
value "show_acom (steps test6_const 4)"
nipkow@48476
   109
value "show_acom (steps test6_const 5)"
nipkow@48476
   110
value "show_acom (steps test6_const 6)"
nipkow@48476
   111
value "show_acom (steps test6_const 7)"
nipkow@48476
   112
value "show_acom (steps test6_const 8)"
nipkow@48476
   113
value "show_acom (steps test6_const 9)"
nipkow@48476
   114
value "show_acom (steps test6_const 10)"
nipkow@48476
   115
value "show_acom (steps test6_const 11)"
nipkow@50203
   116
value "show_acom (steps test6_const 12)"
nipkow@50203
   117
value "show_acom (steps test6_const 13)"
nipkow@52177
   118
value "show_acom (the(AI_const test6_const))"
nipkow@48476
   119
nipkow@48476
   120
nipkow@48476
   121
text{* Monotonicity: *}
nipkow@48476
   122
nipkow@48476
   123
interpretation Abs_Int_mono
nipkow@48476
   124
where \<gamma> = \<gamma>_const and num' = Const and plus' = plus_const
nipkow@48476
   125
proof
nipkow@48476
   126
  case goal1 thus ?case
nipkow@48476
   127
    by(auto simp: plus_const_cases split: const.split)
nipkow@48476
   128
qed
nipkow@48476
   129
nipkow@48476
   130
text{* Termination: *}
nipkow@48476
   131
nipkow@48476
   132
definition "m_const x = (case x of Const _ \<Rightarrow> 1 | Any \<Rightarrow> 0)"
nipkow@48476
   133
nipkow@48476
   134
interpretation Abs_Int_measure
nipkow@48476
   135
where \<gamma> = \<gamma>_const and num' = Const and plus' = plus_const
nipkow@50448
   136
and m = m_const and h = "1"
nipkow@48476
   137
proof
nipkow@48476
   138
  case goal1 thus ?case by(auto simp: m_const_def split: const.splits)
nipkow@48476
   139
next
nipkow@48476
   140
  case goal2 thus ?case by(auto simp: m_const_def split: const.splits)
nipkow@48476
   141
next
nipkow@48476
   142
  case goal3 thus ?case by(auto simp: m_const_def split: const.splits)
nipkow@48476
   143
qed
nipkow@48476
   144
nipkow@48476
   145
thm AI_Some_measure
nipkow@48476
   146
nipkow@48476
   147
end