New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Merged by Bors] - feat(order/complete_lattice): add equiv.supr_congr
and equiv.supr_comp
lemmas
#15852
Conversation
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | ||
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | ||
begin | ||
casesI is_empty_or_nonempty ι, | ||
{ haveI : is_empty ι' := (equiv.is_empty_congr e).mp h, simp only [supr, range_eq_empty] }, | ||
{ haveI : nonempty ι' := (equiv.nonempty_congr e).mp h, | ||
have hg : bdd_above (range g), | ||
{ obtain ⟨M, hM⟩ := hf, use M, rintros - ⟨i, rfl⟩, refine hM ⟨(e.symm i), _⟩, | ||
simpa only [equiv.apply_symm_apply] using hfg (e.symm i), }, | ||
refine le_antisymm (csupr_le (λ i, (hfg i).symm ▸ le_csupr hg (e i))) (csupr_le (λ i, _)), | ||
simpa only [equiv.apply_symm_apply, hfg (e.symm i)] using le_csupr hf (e.symm i) }, | ||
end | ||
|
||
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | ||
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | ||
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't this a weaker version of function.surjective.supr_congr
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it is:
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | |
begin | |
casesI is_empty_or_nonempty ι, | |
{ haveI : is_empty ι' := (equiv.is_empty_congr e).mp h, simp only [supr, range_eq_empty] }, | |
{ haveI : nonempty ι' := (equiv.nonempty_congr e).mp h, | |
have hg : bdd_above (range g), | |
{ obtain ⟨M, hM⟩ := hf, use M, rintros - ⟨i, rfl⟩, refine hM ⟨(e.symm i), _⟩, | |
simpa only [equiv.apply_symm_apply] using hfg (e.symm i), }, | |
refine le_antisymm (csupr_le (λ i, (hfg i).symm ▸ le_csupr hg (e i))) (csupr_le (λ i, _)), | |
simpa only [equiv.apply_symm_apply, hfg (e.symm i)] using le_csupr hf (e.symm i) }, | |
end | |
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | |
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg | |
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | |
e.surjective.supr_congr _ $ λ i, (hfg i).symm | |
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | |
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's maybe worth adding an equiv.supr_congr
wrapper for e.surjective.supr_congr
just to aid with discoverability, but it wouldn't go in this file.
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | ||
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | ||
begin | ||
casesI is_empty_or_nonempty ι, | ||
{ haveI : is_empty ι' := (equiv.is_empty_congr e).mp h, simp only [supr, range_eq_empty] }, | ||
{ haveI : nonempty ι' := (equiv.nonempty_congr e).mp h, | ||
have hg : bdd_above (range g), | ||
{ obtain ⟨M, hM⟩ := hf, use M, rintros - ⟨i, rfl⟩, refine hM ⟨(e.symm i), _⟩, | ||
simpa only [equiv.apply_symm_apply] using hfg (e.symm i), }, | ||
refine le_antisymm (csupr_le (λ i, (hfg i).symm ▸ le_csupr hg (e i))) (csupr_le (λ i, _)), | ||
simpa only [equiv.apply_symm_apply, hfg (e.symm i)] using le_csupr hf (e.symm i) }, | ||
end | ||
|
||
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | ||
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | ||
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it is:
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | |
begin | |
casesI is_empty_or_nonempty ι, | |
{ haveI : is_empty ι' := (equiv.is_empty_congr e).mp h, simp only [supr, range_eq_empty] }, | |
{ haveI : nonempty ι' := (equiv.nonempty_congr e).mp h, | |
have hg : bdd_above (range g), | |
{ obtain ⟨M, hM⟩ := hf, use M, rintros - ⟨i, rfl⟩, refine hM ⟨(e.symm i), _⟩, | |
simpa only [equiv.apply_symm_apply] using hfg (e.symm i), }, | |
refine le_antisymm (csupr_le (λ i, (hfg i).symm ▸ le_csupr hg (e i))) (csupr_le (λ i, _)), | |
simpa only [equiv.apply_symm_apply, hfg (e.symm i)] using le_csupr hf (e.symm i) }, | |
end | |
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | |
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg | |
lemma equiv.csupr {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_above (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨆ i, f i) = ⨆ i, g i := | |
e.surjective.supr_congr _ $ λ i, (hfg i).symm | |
lemma equiv.cinfi {ι ι' : Type*} (e : ι ≃ ι') {f : ι → α} (hf : bdd_below (range f)) {g : ι' → α} | |
(hfg : ∀ i, f i = g (e i)) : (⨅ i, f i) = ⨅ i, g i := | |
@equiv.csupr αᵒᵈ _ _ _ e _ hf _ hfg |
I've placed these immediately after |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bors d+
Make sure to update the PR title and description, since they are no longer accurate.
✌️ j-loreaux can now approve this pull request. To approve and merge a pull request, simply reply with |
equiv.csupr
lemmaequiv.supr_congr
and equiv.supr_comp
lemmas
Bors r+ |
…comp` lemmas (#15852) Adds these lemmas as easy consequences of the `function.surjective` versions in order to aid in discovery.
Pull request successfully merged into master. Build succeeded: |
equiv.supr_congr
and equiv.supr_comp
lemmasequiv.supr_congr
and equiv.supr_comp
lemmas
…of ℝ≥0∞ instead of ℝ (#15833) This refactors `pi_Lp` so that the `p` argument has type ℝ≥0∞ instead of ℝ. There are several reasons for doing this: 1. It matches the design of `lp`. 2. We have `pi_Lp ∞ β`, so we can appropriately state various interpolation inequalities. 3. It makes more sense semantically 4. It should make the equivalence between `pi_Lp` and `lp` easier to implement The new implementation of `pi_Lp` tries to retain as much as possible of the original implementation, while at the same time mimicking the implementation of `lp`. Many of the proofs are now significantly longer because of the required case splits. - [x] depends on: #15852
…pi_Lp`, `bounded_continuous_function` (#15872) This adds a new file for equivalences between various L^p spaces. We do this in a new file instead of `analysis/normed_space/lp_space` in order to minimize imports. We begin by establishing the equivalence between `lp` and `pi_Lp` when the index type is a fintype, and then proceed to recognize the equivalence between `lp` (for `p = ∞`) and `bounded_continuous_function` when the codomain has various algebraic structures. - [x] depends on: #15833 - [x] depends on: #15852
Adds these lemmas as easy consequences of the
function.surjective
versions in order to aid in discovery.