From mathcomp Require Import all_ssreflect ssralg ssrnum ssrint interval.
From mathcomp Require Import finmap fingroup perm rat.
From mathcomp Require Import mathcomp_extra boolp classical_sets functions.
From mathcomp Require Export set_interval.
From HB Require Import structures.
Require Import reals ereal signed topology normedtype sequences.
# Sets and intervals on $\overline{\mathbb{R}}$
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Import Order.TTheory GRing.Theory Num.Def Num.Theory.
Local Open Scope classical_set_scope.
Local Open Scope ring_scope.
Section interval_has.
Variable R : realType.
Implicit Types x : R.
Lemma has_sup_half x b (
i : itv_bound R)
: (
i < BSide b x)
%O ->
has_sup [set` Interval i (
BSide b x)
].
Proof.
Lemma has_inf_half x b (
i : itv_bound R)
: (
BSide b x < i)
%O ->
has_inf [set` Interval (
BSide b x)
i].
Proof.
move: b i => [] [[]y|[]]; rewrite ?bnd_simp => xy; do 1?[
by split=> //; exists ((
x + y)
/ 2)
;
rewrite !set_itvE/= !(
midf_le,midf_lt)
//;
exact: ltW
| by split => //; exists (
x + 1)
; rewrite !set_itvE/= !(
ltrDl,lerDl)
].
Qed.
End interval_has.
#[global]
Hint Extern 0 (
has_sup _)
=> solve[apply: has_sup1 | exact: has_sup_half] : core.
#[global]
Hint Extern 0 (
has_inf _)
=> solve[apply: has_inf1 | exact: has_inf_half]: core.
Section interval_sup_inf.
Variable R : realType.
Implicit Types x y : R.
Let sup_itv_infty_bnd x b : sup [set` Interval -oo%O (
BSide b x)
] = x.
Proof.
case: b; last first.
by rewrite -setUitv1// sup_setU ?sup1// => ? ? ? ->; exact/ltW.
set s := sup _; apply/eqP; rewrite eq_le; apply/andP; split.
- apply sup_le_ub; last by move=> ? /ltW.
by exists (
x - 1)
; rewrite !set_itvE/= ltrBlDr ltrDl.
- rewrite leNgt; apply/negP => sx; pose p := (
s + x)
/ 2.
suff /andP[?]: (
p < x)
&& (
s < p)
by apply/negP; rewrite -leNgt sup_ub.
by rewrite !midf_lt.
Qed.
Let inf_itv_bnd_infty x b : inf [set` Interval (
BSide b x)
+oo%O] = x.
Proof.
Let sup_itv_o_bnd x y b : x < y ->
sup [set` Interval (
BRight x) (
BSide b y)
] = y.
Proof.
case: b => xy; last first.
by rewrite -setUitv1// sup_setU ?sup1// => ? ? /andP[? /ltW ?] ->.
set B := [set` _]; set A := `]-oo, x]%classic.
rewrite -(
@sup_setU _ A B)
//.
- rewrite -(
sup_itv_infty_bnd y true)
; congr sup.
rewrite predeqE => u; split=> [[|/andP[]//]|yu].
by rewrite /A !set_itvE => /le_lt_trans; apply.
by have [xu|ux] := ltP x u; [right; rewrite /B !set_itvE/= xu| left].
- by move=> u v; rewrite /A /B => ? /andP[xv _]; rewrite (
le_trans _ (
ltW xv)).
Qed.
Let sup_itv_bounded x y a b : (
BSide a x < BSide b y)
%O ->
sup [set` Interval (
BSide a x) (
BSide b y)
] = y.
Proof.
case: a => xy; last exact: sup_itv_o_bnd.
case: b in xy *.
by rewrite -setU1itv// sup_setU ?sup_itv_o_bnd// => ? ? -> /andP[/ltW].
by rewrite -setUitv1// sup_setU ?sup1// => ? ? /andP[_ /ltW ? ->].
Qed.
Let inf_itv_bnd_o x y b : (
BSide b x < BLeft y)
%O ->
inf [set` Interval (
BSide b x) (
BLeft y)
] = x.
Proof.
Let inf_itv_bounded x y a b : (
BSide a x < BSide b y)
%O ->
inf [set` Interval (
BSide a x) (
BSide b y)
] = x.
Proof.
case: b => xy; first exact: inf_itv_bnd_o.
case: a in xy *.
by rewrite -setU1itv// inf_setU ?inf1// => ? ? -> /andP[/ltW].
by rewrite -setUitv1// inf_setU ?inf_itv_bnd_o// => ? ? /andP[? /ltW ?] ->.
Qed.
Lemma sup_itv a b x : (
a < BSide b x)
%O ->
sup [set` Interval a (
BSide b x)
] = x.
Proof.
by case: a => [b' y|[]]; rewrite ?bnd_simp//= => /sup_itv_bounded->. Qed.
Lemma inf_itv a b x : (
BSide b x < a)
%O ->
inf [set` Interval (
BSide b x)
a] = x.
Proof.
by case: a => [b' y|[]]; rewrite ?bnd_simp//= => /inf_itv_bounded->. Qed.
Lemma sup_itvcc x y : x <= y -> sup `[x, y] = y.
Proof.
Lemma inf_itvcc x y : x <= y -> inf `[x, y] = x.
Proof.
End interval_sup_inf.
Section set_itv_realType.
Variable R : realType.
Implicit Types x : R.
Lemma set_itvK : {in neitv, cancel pred_set (
@Rhull R)
}.
Proof.
Lemma RhullT : Rhull setT = `]-oo, +oo[%R :> interval R.
Proof.
Lemma RhullK : {in (
@is_interval _ : set (
set R))
, cancel (
@Rhull R)
pred_set}.
Proof.
by move=> X /asboolP iX; apply/esym/is_intervalP. Qed.
Lemma itv_c_inftyEbigcap x :
`[x, +oo[%classic = \bigcap_k `]x - k.
+1%:R^-1, +oo[%classic.
Proof.
Lemma itv_bnd_inftyEbigcup b x : [set` Interval (
BSide b x)
+oo%O] =
\bigcup_k [set` Interval (
BSide b x) (
BLeft k%:R)
].
Proof.
Lemma itv_o_inftyEbigcup x :
`]x, +oo[%classic = \bigcup_k `[x + k.
+1%:R^-1, +oo[%classic.
Proof.
Lemma set_itv_setT (
i : interval R)
: [set` i] = setT -> i = `]-oo, +oo[.
Proof.
End set_itv_realType.
Section Rhull_lemmas.
Variable R : realType.
Implicit Types (
a b t r : R) (
A : set R).
Lemma Rhull_smallest A : [set` Rhull A] = smallest (
@is_interval R)
A.
Proof.
apply/seteqP; split; last first.
by apply: smallest_sub; [apply: interval_is_interval | apply: sub_Rhull].
move=> x /= + I [Iitv AI]; rewrite /Rhull.
have [|] := asboolP (
has_lbound A)
=> lA; last first.
have /forallNP/(
_ x)
/existsNP[a] := lA.
move=> /existsNP[Aa /negP]; rewrite -ltNge => ax.
have [|]:= asboolP (
has_ubound A)
=> uA; last first.
move=> ?; have /forallNP/(
_ x)
/existsNP[b] := uA.
move=> /existsNP[Ab /negP]; rewrite -ltNge => xb.
have /is_intervalPlt/(
_ a b)
:= Iitv; apply; do ?by apply: AI.
by rewrite ax xb.
have [As|NAs]/= := asboolP (
A _)
=> xA.
by apply: (
Iitv a (
sup A))
; by [apply: AI | rewrite ltW ?ax].
have [||b Ab xb] := @sup_gt _ A x; do ?by [exists a | rewrite (
itvP xA)
].
have /is_intervalPlt/(
_ a b)
:= Iitv; apply; do ?by apply: AI.
by rewrite ax xb.
have [|]:= asboolP (
has_ubound A)
=> uA; last first.
have /forallNP/(
_ x)
/existsNP[b] := uA.
move=> /existsNP[Ab /negP]; rewrite -ltNge => xb.
have [Ai|NAi]/= := asboolP (
A _)
=> xA.
by apply: (
Iitv (
inf A)
b)
; by [apply: AI | rewrite (
ltW xb)
].
have [||a Aa ax] := @inf_lt _ A x; do ?by [exists b | rewrite (
itvP xA)
].
have /is_intervalPlt/(
_ a b)
:= Iitv; apply; do ?by apply: AI.
by rewrite ax xb.
have [Ai|NAi]/= := asboolP (
A _)
; have [As|NAs]/= := asboolP (
A _).
- by apply: Iitv; apply: AI.
- move=> xA.
have [||b Ab xb] := @sup_gt _ A x; do ?by [exists (
inf A)
| rewrite (
itvP xA)
].
have /(
_ (
inf A)
b)
:= Iitv; apply; do ?by apply: AI.
by rewrite (
itvP xA) (
ltW xb).
- move=> xA.
have [||a Aa ax] := @inf_lt _ A x; do ?by [exists (
sup A)
| rewrite (
itvP xA)
].
have /(
_ a (
sup A))
:= Iitv; apply; do ?by apply: AI.
by rewrite (
itvP xA) (
ltW ax).
have [->|/set0P AN0] := eqVneq A set0.
by rewrite inf0 sup0 itv_ge//= ltBSide/= ltxx.
move=> xA.
have [||a Aa ax] := @inf_lt _ A x; do ?by [|rewrite (
itvP xA)
].
have [||b Ab xb] := @sup_gt _ A x; do ?by [|rewrite (
itvP xA)
].
have /is_intervalPlt/(
_ a b)
:= Iitv; apply; do ?by apply: AI.
by rewrite ax xb.
Qed.
Lemma le_Rhull : {homo (
@Rhull R)
: A B / (
A `<=` B)
>-> {subset A <= B}}.
Proof.
Lemma neitv_Rhull A : ~~ neitv (
Rhull A)
-> A = set0.
Proof.
move/negPn/eqP => A0; rewrite predeqE => r; split => // /sub_Rhull.
by rewrite A0.
Qed.
Lemma Rhull_involutive A : Rhull [set` Rhull A] = Rhull A.
Proof.
End Rhull_lemmas.
Coercion ereal_of_itv_bound T (
b : itv_bound T)
: \bar T :=
match b with BSide _ y => y%:E | +oo%O => +oo%E | -oo%O => -oo%E end.
Arguments ereal_of_itv_bound T !b.
Section itv_realDomainType.
Context (
R : realDomainType).
Lemma le_bnd_ereal (
a b : itv_bound R)
: (
a <= b)
%O -> (
a <= b)
%E.
Proof.
move: a b => -[[] a|[]] [bb b|[]] //=; rewrite ?(
leey,leNye)
//.
by rewrite bnd_simp.
by move=> /lteifW.
Qed.
Lemma lt_ereal_bnd (
a b : itv_bound R)
: (
a < b)
%E -> (
a < b)
%O.
Proof.
by move: a b => -[[] a|[]] [[] b|[]] //=;
rewrite ?(
lee_pinfty,lee_ninfty,lte_fin)
// => ab; rewrite bnd_simp ltW.
Qed.
Lemma Interval_ereal_mem (
r : R) (
a b : itv_bound R)
:
r \in Interval a b -> (
a <= r%:E <= b)
%E.
Proof.
case: a b => [[] a|[]] [[] b|[]] => /[dup] rab /itvP rw//=;
by rewrite ?lee_fin ?rw//= ?leey ?leNye//; move: rab; rewrite in_itv//= andbF.
Qed.
Lemma ereal_mem_Interval (
r : R) (
a b : itv_bound R)
:
(
a < r%:E < b)
%E -> r \in Interval a b.
Proof.
move: a b => [[]a|[]] [[]b|[]] //=; rewrite ?lte_fin ?in_itv //= => /andP[] //;
by do ?[move->|move/ltW|move=>_].
Qed.
Lemma itv_cyy : `[+oo%E, +oo[%classic = [set +oo%E] :> set (
\bar R).
Proof.
Lemma itv_oyy : `]+oo%E, +oo[%classic = set0 :> set (
\bar R).
Proof.
Lemma itv_cNyy : `[-oo%E, +oo[%classic = setT :> set (
\bar R).
Proof.
Lemma itv_oNyy : `]-oo%E, +oo[%classic = ~` [set -oo]%E :> set (
\bar R).
Proof.
rewrite set_itvE predeqE => x; split => /=.
- by move: x => [x| |]; rewrite ?ltxx.
- by move: x => [x h|//|/(
_ erefl)
]; rewrite ?ltNyr.
Qed.
End itv_realDomainType.
Section set_ereal.
Context (
R : realType)
T (
f g : T -> \bar R).
Local Open Scope ereal_scope.
Let E j := [set x | f x - g x >= j.
+1%:R^-1%:E].
Lemma set_lte_bigcup : [set x | f x > g x] = \bigcup_j E j.
Proof.
End set_ereal.
Lemma disj_itv_Rhull {R : realType} (
A B : set R)
: A `&` B = set0 ->
is_interval A -> is_interval B -> disjoint_itv (
Rhull A) (
Rhull B).
Proof.
by move=> AB0 iA iB; rewrite /disjoint_itv RhullK ?inE// RhullK ?inE.
Qed.
Lemma set1_bigcap_oc (
R : realType) (
r : R)
:
[set r] = \bigcap_i `]r - i.
+1%:R^-1, r]%classic.
Proof.
Lemma itv_bnd_open_bigcup (
R : realType)
b (
r s : R)
:
[set` Interval (
BSide b r) (
BLeft s)
] =
\bigcup_n [set` Interval (
BSide b r) (
BRight (
s - n.
+1%:R^-1))
].
Proof.
Lemma itv_open_bnd_bigcup (
R : realType)
b (
r s : R)
:
[set` Interval (
BRight s) (
BSide b r)
] =
\bigcup_n [set` Interval (
BLeft (
s + n.
+1%:R^-1)) (
BSide b r)
].
Proof.
Lemma itv_bnd_infty_bigcup (
R : realType)
b (
x : R)
:
[set` Interval (
BSide b x)
+oo%O] =
\bigcup_i [set` Interval (
BSide b x) (
BRight (
x + i%:R))
].
Proof.
apply/seteqP; split=> y; rewrite /= !in_itv/= andbT; last first.
by move=> [k _ /=]; move: b => [|] /=; rewrite in_itv/= => /andP[//] /ltW.
move=> xy; exists `|ceil (
y - x)
|%N => //=; rewrite in_itv/= xy/= -lerBlDl.
rewrite !natr_absz/= ger0_norm ?ceil_ge0 ?subr_ge0 ?ceil_ge//.
by case: b xy => //= /ltW.
Qed.
Lemma itv_infty_bnd_bigcup (
R : realType)
b (
x : R)
:
[set` Interval -oo%O (
BSide b x)
] =
\bigcup_i [set` Interval (
BLeft (
x - i%:R)) (
BSide b x)
].
Proof.
Lemma bigcup_itvT {R : realType} b :
\bigcup_i [set` Interval (
BSide b (
- i%:R)) (
BRight i%:R)
] = [set: R].
Proof.