src/HOL/IMP/AbsInt1_ivl.thy
changeset 45023 76abd26e2e2d
parent 45020 21334181f820
equal deleted inserted replaced
45022:3c888c58e10b 45023:76abd26e2e2d
   143 lemma rep_minus_ivl:
   143 lemma rep_minus_ivl:
   144   "n1 : rep_ivl i1 \<Longrightarrow> n2 : rep_ivl i2 \<Longrightarrow> n1-n2 : rep_ivl(minus_ivl i1 i2)"
   144   "n1 : rep_ivl i1 \<Longrightarrow> n2 : rep_ivl i2 \<Longrightarrow> n1-n2 : rep_ivl(minus_ivl i1 i2)"
   145 by(auto simp add: minus_ivl_def rep_ivl_def split: ivl.splits option.splits)
   145 by(auto simp add: minus_ivl_def rep_ivl_def split: ivl.splits option.splits)
   146 
   146 
   147 
   147 
   148 definition "inv_plus_ivl i1 i2 i = ((*if is_empty i then empty else*)
   148 definition "filter_plus_ivl i i1 i2 = ((*if is_empty i then empty else*)
   149   i1 \<sqinter> minus_ivl i i2, i2 \<sqinter> minus_ivl i i1)"
   149   i1 \<sqinter> minus_ivl i i2, i2 \<sqinter> minus_ivl i i1)"
   150 
   150 
   151 fun inv_less_ivl :: "ivl \<Rightarrow> ivl \<Rightarrow> bool \<Rightarrow> ivl * ivl" where
   151 fun filter_less_ivl :: "bool \<Rightarrow> ivl \<Rightarrow> ivl \<Rightarrow> ivl * ivl" where
   152 "inv_less_ivl (I l1 h1) (I l2 h2) res =
   152 "filter_less_ivl res (I l1 h1) (I l2 h2) =
   153   ((*if is_empty(I l1 h1) \<or> is_empty(I l2 h2) then (empty, empty) else*)
   153   ((*if is_empty(I l1 h1) \<or> is_empty(I l2 h2) then (empty, empty) else*)
   154    if res
   154    if res
   155    then (I l1 (min_option True h1 (h2 - Some 1)),
   155    then (I l1 (min_option True h1 (h2 - Some 1)),
   156          I (max_option False (l1 + Some 1) l2) h2)
   156          I (max_option False (l1 + Some 1) l2) h2)
   157    else (I (max_option False l1 l2) h1, I l2 (min_option True h1 h2)))"
   157    else (I (max_option False l1 l2) h1, I l2 (min_option True h1 h2)))"
   177 next
   177 next
   178   case goal2 show ?case by(auto simp add: Bot_ivl_def rep_ivl_def empty_def)
   178   case goal2 show ?case by(auto simp add: Bot_ivl_def rep_ivl_def empty_def)
   179 qed
   179 qed
   180 
   180 
   181 interpretation
   181 interpretation
   182   Val_abs1 rep_ivl num_ivl plus_ivl inv_plus_ivl inv_less_ivl
   182   Val_abs1 rep_ivl num_ivl plus_ivl filter_plus_ivl filter_less_ivl
   183 proof
   183 proof
   184   case goal1 thus ?case
   184   case goal1 thus ?case
   185     by(auto simp add: inv_plus_ivl_def)
   185     by(auto simp add: filter_plus_ivl_def)
   186       (metis rep_minus_ivl add_diff_cancel add_commute)+
   186       (metis rep_minus_ivl add_diff_cancel add_commute)+
   187 next
   187 next
   188   case goal2 thus ?case
   188   case goal2 thus ?case
   189     by(cases a1, cases a2,
   189     by(cases a1, cases a2,
   190       auto simp: rep_ivl_def min_option_def max_option_def le_option_def split: if_splits option.splits)
   190       auto simp: rep_ivl_def min_option_def max_option_def le_option_def split: if_splits option.splits)
   191 qed
   191 qed
   192 
   192 
   193 interpretation
   193 interpretation
   194   Abs_Int1 rep_ivl num_ivl plus_ivl inv_plus_ivl inv_less_ivl "(iter' 3)"
   194   Abs_Int1 rep_ivl num_ivl plus_ivl filter_plus_ivl filter_less_ivl "(iter' 3)"
   195 defines afilter_ivl is afilter
   195 defines afilter_ivl is afilter
   196 and bfilter_ivl is bfilter
   196 and bfilter_ivl is bfilter
   197 and AI_ivl is AI
   197 and AI_ivl is AI
   198 and aval_ivl is aval'
   198 and aval_ivl is aval'
   199 proof qed (auto simp: iter'_pfp_above)
   199 proof qed (auto simp: iter'_pfp_above)