diff -r 51006c02e597 -r 2574977f9afa src/HOL/Library/Extended_Real.thy --- a/src/HOL/Library/Extended_Real.thy Wed Mar 11 08:00:01 2015 +0100 +++ b/src/HOL/Library/Extended_Real.thy Wed Mar 11 11:21:58 2015 +0100 @@ -2602,6 +2602,50 @@ (is "?lhs \ ?rhs") unfolding le_Liminf_iff eventually_sequentially .. +lemma Liminf_add_le: + fixes f g :: "_ \ ereal" + assumes F: "F \ bot" + assumes ev: "eventually (\x. 0 \ f x) F" "eventually (\x. 0 \ g x) F" + shows "Liminf F f + Liminf F g \ Liminf F (\x. f x + g x)" + unfolding Liminf_def +proof (subst SUP_ereal_add_left[symmetric]) + let ?F = "{P. eventually P F}" + let ?INF = "\P g. INFIMUM (Collect P) g" + show "?F \ {}" + by (auto intro: eventually_True) + show "(SUP P:?F. ?INF P g) \ - \" + unfolding bot_ereal_def[symmetric] SUP_bot_conv INF_eq_bot_iff + by (auto intro!: exI[of _ 0] ev simp: bot_ereal_def) + have "(SUP P:?F. ?INF P f + (SUP P:?F. ?INF P g)) \ (SUP P:?F. (SUP P':?F. ?INF P f + ?INF P' g))" + proof (safe intro!: SUP_mono bexI[of _ "\x. P x \ 0 \ f x" for P]) + fix P let ?P' = "\x. P x \ 0 \ f x" + assume "eventually P F" + with ev show "eventually ?P' F" + by eventually_elim auto + have "?INF P f + (SUP P:?F. ?INF P g) \ ?INF ?P' f + (SUP P:?F. ?INF P g)" + by (intro ereal_add_mono INF_mono) auto + also have "\ = (SUP P':?F. ?INF ?P' f + ?INF P' g)" + proof (rule SUP_ereal_add_right[symmetric]) + show "INFIMUM {x. P x \ 0 \ f x} f \ - \" + unfolding bot_ereal_def[symmetric] INF_eq_bot_iff + by (auto intro!: exI[of _ 0] ev simp: bot_ereal_def) + qed fact + finally show "?INF P f + (SUP P:?F. ?INF P g) \ (SUP P':?F. ?INF ?P' f + ?INF P' g)" . + qed + also have "\ \ (SUP P:?F. INF x:Collect P. f x + g x)" + proof (safe intro!: SUP_least) + fix P Q assume *: "eventually P F" "eventually Q F" + show "?INF P f + ?INF Q g \ (SUP P:?F. INF x:Collect P. f x + g x)" + proof (rule SUP_upper2) + show "(\x. P x \ Q x) \ ?F" + using * by (auto simp: eventually_conj) + show "?INF P f + ?INF Q g \ (INF x:{x. P x \ Q x}. f x + g x)" + by (intro INF_greatest ereal_add_mono) (auto intro: INF_lower) + qed + qed + finally show "(SUP P:?F. ?INF P f + (SUP P:?F. ?INF P g)) \ (SUP P:?F. INF x:Collect P. f x + g x)" . +qed + subsubsection {* Tests for code generator *}