src/HOL/Decision_Procs/Approximation_Bounds.thy
changeset 73537 56db8559eadb
parent 71037 f630f2e707a6
child 75455 91c16c5ad3e9
equal deleted inserted replaced
73536:5131c388a9b0 73537:56db8559eadb
   233 qed
   233 qed
   234 
   234 
   235 
   235 
   236 section \<open>Approximation utility functions\<close>
   236 section \<open>Approximation utility functions\<close>
   237 
   237 
       
   238 lift_definition plus_float_interval::"nat \<Rightarrow> float interval \<Rightarrow> float interval \<Rightarrow> float interval"
       
   239   is "\<lambda>prec. \<lambda>(a1, a2). \<lambda>(b1, b2). (float_plus_down prec a1 b1, float_plus_up prec a2 b2)"
       
   240   by (auto intro!: add_mono simp: float_plus_down_le float_plus_up_le)
       
   241 
       
   242 lemma lower_plus_float_interval:
       
   243   "lower (plus_float_interval prec ivl ivl') = float_plus_down prec (lower ivl) (lower ivl')"
       
   244   by transfer auto
       
   245 lemma upper_plus_float_interval:
       
   246   "upper (plus_float_interval prec ivl ivl') = float_plus_up prec (upper ivl) (upper ivl')"
       
   247   by transfer auto
       
   248 
       
   249 lemma mult_float_interval_ge:
       
   250   "real_interval A + real_interval B \<le> real_interval (plus_float_interval prec A B)"
       
   251   unfolding less_eq_interval_def
       
   252   by transfer
       
   253      (auto simp: lower_plus_float_interval upper_plus_float_interval
       
   254            intro!: order.trans[OF float_plus_down] order.trans[OF _ float_plus_up])
       
   255 
       
   256 lemma plus_float_interval:
       
   257   "set_of (real_interval A) + set_of (real_interval B) \<subseteq>
       
   258     set_of (real_interval (plus_float_interval prec A B))"
       
   259 proof -
       
   260   have "set_of (real_interval A) + set_of (real_interval B) \<subseteq>
       
   261           set_of (real_interval A + real_interval B)"
       
   262     by (simp add: set_of_plus)
       
   263   also have "\<dots> \<subseteq> set_of (real_interval (plus_float_interval prec A B))"
       
   264     using mult_float_interval_ge[of A B prec] by (simp add: set_of_subset_iff')
       
   265   finally show ?thesis .
       
   266 qed
       
   267 
       
   268 lemma plus_float_intervalI:
       
   269   "x + y \<in>\<^sub>r plus_float_interval prec A B"
       
   270   if "x \<in>\<^sub>i real_interval A" "y \<in>\<^sub>i real_interval B"
       
   271   using plus_float_interval[of A B] that by auto
       
   272 
       
   273 lemma plus_float_interval_mono:
       
   274   "plus_float_interval prec A B \<le> plus_float_interval prec X Y"
       
   275   if "A \<le> X" "B \<le> Y"
       
   276   using that
       
   277   by (auto simp: less_eq_interval_def lower_plus_float_interval upper_plus_float_interval
       
   278                  float_plus_down.rep_eq float_plus_up.rep_eq plus_down_mono plus_up_mono)
       
   279 
       
   280 lemma plus_float_interval_monotonic:
       
   281   "set_of (ivl + ivl') \<subseteq> set_of (plus_float_interval prec ivl ivl')"
       
   282   using float_plus_down_le float_plus_up_le lower_plus_float_interval upper_plus_float_interval
       
   283   by (simp add: set_of_subset_iff)
       
   284 
       
   285 
   238 definition bnds_mult :: "nat \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<times> float" where
   286 definition bnds_mult :: "nat \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<Rightarrow> float \<times> float" where
   239   "bnds_mult prec a1 a2 b1 b2 =
   287   "bnds_mult prec a1 a2 b1 b2 =
   240       (float_plus_down prec (nprt a1 * pprt b2)
   288       (float_plus_down prec (nprt a1 * pprt b2)
   241           (float_plus_down prec (nprt a2 * nprt b2)
   289           (float_plus_down prec (nprt a2 * nprt b2)
   242             (float_plus_down prec (pprt a1 * pprt b1) (pprt a2 * nprt b1))),
   290             (float_plus_down prec (pprt a1 * pprt b1) (pprt a2 * nprt b1))),
   285   "x * y \<in>\<^sub>r mult_float_interval prec A B"
   333   "x * y \<in>\<^sub>r mult_float_interval prec A B"
   286   if "x \<in>\<^sub>i real_interval A" "y \<in>\<^sub>i real_interval B"
   334   if "x \<in>\<^sub>i real_interval A" "y \<in>\<^sub>i real_interval B"
   287   using mult_float_interval[of A B] that
   335   using mult_float_interval[of A B] that
   288   by (auto simp: )
   336   by (auto simp: )
   289 
   337 
   290 lemma mult_float_interval_mono:
   338 lemma mult_float_interval_mono':
   291   "set_of (mult_float_interval prec A B) \<subseteq> set_of (mult_float_interval prec X Y)"
   339   "set_of (mult_float_interval prec A B) \<subseteq> set_of (mult_float_interval prec X Y)"
   292   if "set_of A \<subseteq> set_of X" "set_of B \<subseteq> set_of Y"
   340   if "set_of A \<subseteq> set_of X" "set_of B \<subseteq> set_of Y"
   293   using that
   341   using that
   294   apply transfer
   342   apply transfer
   295   unfolding bnds_mult_def atLeastatMost_subset_iff float_plus_down.rep_eq float_plus_up.rep_eq
   343   unfolding bnds_mult_def atLeastatMost_subset_iff float_plus_down.rep_eq float_plus_up.rep_eq
   296   by (auto simp: float_plus_down.rep_eq float_plus_up.rep_eq mult_float_mono1 mult_float_mono2)
   344   by (auto simp: float_plus_down.rep_eq float_plus_up.rep_eq mult_float_mono1 mult_float_mono2)
       
   345 
       
   346 lemma mult_float_interval_mono:
       
   347   "mult_float_interval prec A B \<le> mult_float_interval prec X Y"
       
   348   if "A \<le> X" "B \<le> Y"
       
   349   using mult_float_interval_mono'[of A X B Y prec] that
       
   350   by (simp add: set_of_subset_iff')
   297 
   351 
   298 
   352 
   299 definition map_bnds :: "(nat \<Rightarrow> float \<Rightarrow> float) \<Rightarrow> (nat \<Rightarrow> float \<Rightarrow> float) \<Rightarrow>
   353 definition map_bnds :: "(nat \<Rightarrow> float \<Rightarrow> float) \<Rightarrow> (nat \<Rightarrow> float \<Rightarrow> float) \<Rightarrow>
   300                            nat \<Rightarrow> (float \<times> float) \<Rightarrow> (float \<times> float)" where
   354                            nat \<Rightarrow> (float \<times> float) \<Rightarrow> (float \<times> float)" where
   301   "map_bnds lb ub prec = (\<lambda>(l,u). (lb prec l, ub prec u))"
   355   "map_bnds lb ub prec = (\<lambda>(l,u). (lb prec l, ub prec u))"