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))" |