Documentation

Mathlib.Order.Filter.Prod

Product and coproduct filters #

In this file we define Filter.prod f g (notation: f ×ˢ g) and Filter.coprod f g. The product of two filters is the largest filter l such that Filter.Tendsto Prod.fst l f and Filter.Tendsto Prod.snd l g.

Implementation details #

The product filter cannot be defined using the monad structure on filters. For example:

F := do {x ← seq, y ← top, return (x, y)}
G := do {y ← top, x ← seq, return (x, y)}

hence:

s ∈ F  ↔  ∃ n, [n..∞] × univ ⊆ s
s ∈ G  ↔  ∀ i:ℕ, ∃ n, [n..∞] × {i} ⊆ s

Now ⋃ i, [i..∞] × {i} is in G but not in F. As product filter we want to have F as result.

Notations #

def Filter.prod {α : Type u_1} {β : Type u_2} (f : Filter α) (g : Filter β) :
Filter (α × β)

Product of filters. This is the filter generated by cartesian products of elements of the component filters.

Equations
Instances For
    instance Filter.instSProd {α : Type u_1} {β : Type u_2} :
    SProd (Filter α) (Filter β) (Filter (α × β))
    Equations
    • Filter.instSProd = { sprod := Filter.prod }
    theorem Filter.prod_mem_prod {α : Type u_1} {β : Type u_2} {s : Set α} {t : Set β} {f : Filter α} {g : Filter β} (hs : s ∈ f) (ht : t ∈ g) :
    s ×ˢ t ∈ f ×ˢ g
    theorem Filter.mem_prod_iff {α : Type u_1} {β : Type u_2} {s : Set (α × β)} {f : Filter α} {g : Filter β} :
    s ∈ f ×ˢ g ↔ ∃ t₁, t₁ ∈ f ∧ ∃ t₂, t₂ ∈ g ∧ t₁ ×ˢ t₂ ⊆ s
    @[simp]
    theorem Filter.prod_mem_prod_iff {α : Type u_1} {β : Type u_2} {s : Set α} {t : Set β} {f : Filter α} {g : Filter β} [Filter.NeBot f] [Filter.NeBot g] :
    s ×ˢ t ∈ f ×ˢ g ↔ s ∈ f ∧ t ∈ g
    theorem Filter.mem_prod_principal {α : Type u_1} {β : Type u_2} {f : Filter α} {s : Set (α × β)} {t : Set β} :
    s ∈ f ×ˢ Filter.principal t ↔ {a | ∀ (b : β), b ∈ t → (a, b) ∈ s} ∈ f
    theorem Filter.mem_prod_top {α : Type u_1} {β : Type u_2} {f : Filter α} {s : Set (α × β)} :
    s ∈ f ×ˢ ⊤ ↔ {a | ∀ (b : β), (a, b) ∈ s} ∈ f
    theorem Filter.eventually_prod_principal_iff {α : Type u_1} {β : Type u_2} {f : Filter α} {p : α × β → Prop} {s : Set β} :
    (∀ᶠ (x : α × β) in f ×ˢ Filter.principal s, p x) ↔ ∀ᶠ (x : α) in f, (y : β) → y ∈ s → p (x, y)
    theorem Filter.comap_prod {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : α → β × γ) (b : Filter β) (c : Filter γ) :
    Filter.comap f (b ×ˢ c) = Filter.comap (Prod.fst ∘ f) b ⊓ Filter.comap (Prod.snd ∘ f) c
    theorem Filter.prod_top {α : Type u_1} {β : Type u_2} {f : Filter α} :
    f ×ˢ ⊤ = Filter.comap Prod.fst f
    theorem Filter.sup_prod {α : Type u_1} {β : Type u_2} (f₁ : Filter α) (f₂ : Filter α) (g : Filter β) :
    (f₁ ⊔ f₂) ×ˢ g = f₁ ×ˢ g ⊔ f₂ ×ˢ g
    theorem Filter.prod_sup {α : Type u_1} {β : Type u_2} (f : Filter α) (g₁ : Filter β) (g₂ : Filter β) :
    f ×ˢ (g₁ ⊔ g₂) = f ×ˢ g₁ ⊔ f ×ˢ g₂
    theorem Filter.eventually_prod_iff {α : Type u_1} {β : Type u_2} {p : α × β → Prop} {f : Filter α} {g : Filter β} :
    (∀ᶠ (x : α × β) in f ×ˢ g, p x) ↔ ∃ pa, (∀ᶠ (x : α) in f, pa x) ∧ ∃ pb, (∀ᶠ (y : β) in g, pb y) ∧ ({x : α} → pa x → {y : β} → pb y → p (x, y))
    theorem Filter.tendsto_fst {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    Filter.Tendsto Prod.fst (f ×ˢ g) f
    theorem Filter.tendsto_snd {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    Filter.Tendsto Prod.snd (f ×ˢ g) g
    theorem Filter.Tendsto.prod_mk {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : Filter α} {g : Filter β} {h : Filter γ} {m₁ : α → β} {m₂ : α → γ} (h₁ : Filter.Tendsto m₁ f g) (h₂ : Filter.Tendsto m₂ f h) :
    Filter.Tendsto (fun x => (m₁ x, m₂ x)) f (g ×ˢ h)
    theorem Filter.tendsto_prod_swap {α1 : Type u_6} {α2 : Type u_7} {a1 : Filter α1} {a2 : Filter α2} :
    Filter.Tendsto Prod.swap (a1 ×ˢ a2) (a2 ×ˢ a1)
    theorem Filter.Eventually.prod_inl {α : Type u_1} {β : Type u_2} {la : Filter α} {p : α → Prop} (h : ∀ᶠ (x : α) in la, p x) (lb : Filter β) :
    ∀ᶠ (x : α × β) in la ×ˢ lb, p x.fst
    theorem Filter.Eventually.prod_inr {α : Type u_1} {β : Type u_2} {lb : Filter β} {p : β → Prop} (h : ∀ᶠ (x : β) in lb, p x) (la : Filter α) :
    ∀ᶠ (x : α × β) in la ×ˢ lb, p x.snd
    theorem Filter.Eventually.prod_mk {α : Type u_1} {β : Type u_2} {la : Filter α} {pa : α → Prop} (ha : ∀ᶠ (x : α) in la, pa x) {lb : Filter β} {pb : β → Prop} (hb : ∀ᶠ (y : β) in lb, pb y) :
    ∀ᶠ (p : α × β) in la ×ˢ lb, pa p.fst ∧ pb p.snd
    theorem Filter.EventuallyEq.prod_map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_6} {la : Filter α} {fa : α → γ} {ga : α → γ} (ha : fa =ᶠ[la] ga) {lb : Filter β} {fb : β → δ} {gb : β → δ} (hb : fb =ᶠ[lb] gb) :
    Prod.map fa fb =ᶠ[la ×ˢ lb] Prod.map ga gb
    theorem Filter.EventuallyLE.prod_map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_6} [LE γ] [LE δ] {la : Filter α} {fa : α → γ} {ga : α → γ} (ha : fa ≤ᶠ[la] ga) {lb : Filter β} {fb : β → δ} {gb : β → δ} (hb : fb ≤ᶠ[lb] gb) :
    Prod.map fa fb ≤ᶠ[la ×ˢ lb] Prod.map ga gb
    theorem Filter.Eventually.curry {α : Type u_1} {β : Type u_2} {la : Filter α} {lb : Filter β} {p : α × β → Prop} (h : ∀ᶠ (x : α × β) in la ×ˢ lb, p x) :
    ∀ᶠ (x : α) in la, ∀ᶠ (y : β) in lb, p (x, y)
    theorem Filter.Eventually.diag_of_prod {α : Type u_1} {f : Filter α} {p : α × α → Prop} (h : ∀ᶠ (i : α × α) in f ×ˢ f, p i) :
    ∀ᶠ (i : α) in f, p (i, i)

    A fact that is eventually true about all pairs l ×ˢ l is eventually true about all diagonal pairs (i, i)

    theorem Filter.Eventually.diag_of_prod_left {α : Type u_1} {γ : Type u_3} {f : Filter α} {g : Filter γ} {p : (α × α) × γ → Prop} :
    (∀ᶠ (x : (α × α) × γ) in (f ×ˢ f) ×ˢ g, p x) → ∀ᶠ (x : α × γ) in f ×ˢ g, p ((x.fst, x.fst), x.snd)
    theorem Filter.Eventually.diag_of_prod_right {α : Type u_1} {γ : Type u_3} {f : Filter α} {g : Filter γ} {p : α × γ × γ → Prop} :
    (∀ᶠ (x : α × γ × γ) in f ×ˢ g ×ˢ g, p x) → ∀ᶠ (x : α × γ) in f ×ˢ g, p (x.fst, x.snd, x.snd)
    theorem Filter.tendsto_diag {α : Type u_1} {f : Filter α} :
    Filter.Tendsto (fun i => (i, i)) f (f ×ˢ f)
    theorem Filter.prod_iInf_left {α : Type u_1} {β : Type u_2} {ι : Sort u_5} [Nonempty ι] {f : ι → Filter α} {g : Filter β} :
    (⨅ (i : ι), f i) ×ˢ g = ⨅ (i : ι), f i ×ˢ g
    theorem Filter.prod_iInf_right {α : Type u_1} {β : Type u_2} {ι : Sort u_5} [Nonempty ι] {f : Filter α} {g : ι → Filter β} :
    f ×ˢ ⨅ (i : ι), g i = ⨅ (i : ι), f ×ˢ g i
    theorem Filter.prod_mono {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g₁ : Filter β} {g₂ : Filter β} (hf : f₁ ≤ f₂) (hg : g₁ ≤ g₂) :
    f₁ ×ˢ g₁ ≤ f₂ ×ˢ g₂
    theorem Filter.prod_mono_left {α : Type u_1} {β : Type u_2} (g : Filter β) {f₁ : Filter α} {f₂ : Filter α} (hf : f₁ ≤ f₂) :
    f₁ ×ˢ g ≤ f₂ ×ˢ g
    theorem Filter.prod_mono_right {α : Type u_1} {β : Type u_2} (f : Filter α) {g₁ : Filter β} {g₂ : Filter β} (hf : g₁ ≤ g₂) :
    f ×ˢ g₁ ≤ f ×ˢ g₂
    theorem Filter.prod_comap_comap_eq {α₁ : Type u} {α₂ : Type v} {β₁ : Type w} {β₂ : Type x} {f₁ : Filter α₁} {f₂ : Filter α₂} {m₁ : β₁ → α₁} {m₂ : β₂ → α₂} :
    Filter.comap m₁ f₁ ×ˢ Filter.comap m₂ f₂ = Filter.comap (fun p => (m₁ p.fst, m₂ p.snd)) (f₁ ×ˢ f₂)
    theorem Filter.prod_comm' {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    f ×ˢ g = Filter.comap Prod.swap (g ×ˢ f)
    theorem Filter.prod_comm {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    f ×ˢ g = Filter.map (fun p => (p.snd, p.fst)) (g ×ˢ f)
    theorem Filter.mem_prod_iff_left {α : Type u_1} {β : Type u_2} {s : Set (α × β)} {f : Filter α} {g : Filter β} :
    s ∈ f ×ˢ g ↔ ∃ t, t ∈ f ∧ ∀ᶠ (y : β) in g, ∀ (x : α), x ∈ t → (x, y) ∈ s
    theorem Filter.mem_prod_iff_right {α : Type u_1} {β : Type u_2} {s : Set (α × β)} {f : Filter α} {g : Filter β} :
    s ∈ f ×ˢ g ↔ ∃ t, t ∈ g ∧ ∀ᶠ (x : α) in f, ∀ (y : β), y ∈ t → (x, y) ∈ s
    @[simp]
    theorem Filter.map_fst_prod {α : Type u_1} {β : Type u_2} (f : Filter α) (g : Filter β) [Filter.NeBot g] :
    Filter.map Prod.fst (f ×ˢ g) = f
    @[simp]
    theorem Filter.map_snd_prod {α : Type u_1} {β : Type u_2} (f : Filter α) (g : Filter β) [Filter.NeBot f] :
    Filter.map Prod.snd (f ×ˢ g) = g
    @[simp]
    theorem Filter.prod_le_prod {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g₁ : Filter β} {g₂ : Filter β} [Filter.NeBot f₁] [Filter.NeBot g₁] :
    f₁ ×ˢ g₁ ≤ f₂ ×ˢ g₂ ↔ f₁ ≤ f₂ ∧ g₁ ≤ g₂
    @[simp]
    theorem Filter.prod_inj {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g₁ : Filter β} {g₂ : Filter β} [Filter.NeBot f₁] [Filter.NeBot g₁] :
    f₁ ×ˢ g₁ = f₂ ×ˢ g₂ ↔ f₁ = f₂ ∧ g₁ = g₂
    theorem Filter.eventually_swap_iff {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} {p : α × β → Prop} :
    (∀ᶠ (x : α × β) in f ×ˢ g, p x) ↔ ∀ᶠ (y : β × α) in g ×ˢ f, p (Prod.swap y)
    theorem Filter.prod_assoc {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : Filter α) (g : Filter β) (h : Filter γ) :
    Filter.map (↑(Equiv.prodAssoc α β γ)) ((f ×ˢ g) ×ˢ h) = f ×ˢ g ×ˢ h
    theorem Filter.prod_assoc_symm {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : Filter α) (g : Filter β) (h : Filter γ) :
    Filter.map (↑(Equiv.prodAssoc α β γ).symm) (f ×ˢ g ×ˢ h) = (f ×ˢ g) ×ˢ h
    theorem Filter.tendsto_prodAssoc {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : Filter α} {g : Filter β} {h : Filter γ} :
    Filter.Tendsto (↑(Equiv.prodAssoc α β γ)) ((f ×ˢ g) ×ˢ h) (f ×ˢ g ×ˢ h)
    theorem Filter.tendsto_prodAssoc_symm {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : Filter α} {g : Filter β} {h : Filter γ} :
    Filter.Tendsto (↑(Equiv.prodAssoc α β γ).symm) (f ×ˢ g ×ˢ h) ((f ×ˢ g) ×ˢ h)
    theorem Filter.map_swap4_prod {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {f : Filter α} {g : Filter β} {h : Filter γ} {k : Filter δ} :
    Filter.map (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) ((f ×ˢ g) ×ˢ h ×ˢ k) = (f ×ˢ h) ×ˢ g ×ˢ k

    A useful lemma when dealing with uniformities.

    theorem Filter.tendsto_swap4_prod {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {f : Filter α} {g : Filter β} {h : Filter γ} {k : Filter δ} :
    Filter.Tendsto (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) ((f ×ˢ g) ×ˢ h ×ˢ k) ((f ×ˢ h) ×ˢ g ×ˢ k)
    theorem Filter.prod_map_map_eq {α₁ : Type u} {α₂ : Type v} {β₁ : Type w} {β₂ : Type x} {f₁ : Filter α₁} {f₂ : Filter α₂} {m₁ : α₁ → β₁} {m₂ : α₂ → β₂} :
    Filter.map m₁ f₁ ×ˢ Filter.map m₂ f₂ = Filter.map (fun p => (m₁ p.fst, m₂ p.snd)) (f₁ ×ˢ f₂)
    theorem Filter.prod_map_map_eq' {α₁ : Type u_6} {α₂ : Type u_7} {β₁ : Type u_8} {β₂ : Type u_9} (f : α₁ → α₂) (g : β₁ → β₂) (F : Filter α₁) (G : Filter β₁) :
    theorem Filter.prod_map_left {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : α → β) (F : Filter α) (G : Filter γ) :
    theorem Filter.prod_map_right {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : β → γ) (F : Filter α) (G : Filter β) :
    theorem Filter.le_prod_map_fst_snd {α : Type u_1} {β : Type u_2} {f : Filter (α × β)} :
    f ≤ Filter.map Prod.fst f ×ˢ Filter.map Prod.snd f
    theorem Filter.Tendsto.prod_map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_6} {f : α → γ} {g : β → δ} {a : Filter α} {b : Filter β} {c : Filter γ} {d : Filter δ} (hf : Filter.Tendsto f a c) (hg : Filter.Tendsto g b d) :
    Filter.Tendsto (Prod.map f g) (a ×ˢ b) (c ×ˢ d)
    theorem Filter.map_prod {α : Type u_1} {β : Type u_2} {γ : Type u_3} (m : α × β → γ) (f : Filter α) (g : Filter β) :
    Filter.map m (f ×ˢ g) = Filter.seq (Filter.map (fun a b => m (a, b)) f) g
    theorem Filter.prod_eq {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    f ×ˢ g = Filter.seq (Filter.map Prod.mk f) g
    theorem Filter.prod_inf_prod {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g₁ : Filter β} {g₂ : Filter β} :
    f₁ ×ˢ g₁ ⊓ f₂ ×ˢ g₂ = (f₁ ⊓ f₂) ×ˢ (g₁ ⊓ g₂)
    theorem Filter.inf_prod {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g : Filter β} :
    (f₁ ⊓ f₂) ×ˢ g = f₁ ×ˢ g ⊓ f₂ ×ˢ g
    theorem Filter.prod_inf {α : Type u_1} {β : Type u_2} {f : Filter α} {g₁ : Filter β} {g₂ : Filter β} :
    f ×ˢ (g₁ ⊓ g₂) = f ×ˢ g₁ ⊓ f ×ˢ g₂
    @[simp]
    theorem Filter.prod_principal_principal {α : Type u_1} {β : Type u_2} {s : Set α} {t : Set β} :
    @[simp]
    theorem Filter.pure_prod {α : Type u_1} {β : Type u_2} {a : α} {f : Filter β} :
    theorem Filter.map_pure_prod {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : α → β → γ) (a : α) (B : Filter β) :
    @[simp]
    theorem Filter.prod_pure {α : Type u_1} {β : Type u_2} {f : Filter α} {b : β} :
    f ×ˢ pure b = Filter.map (fun a => (a, b)) f
    theorem Filter.prod_pure_pure {α : Type u_1} {β : Type u_2} {a : α} {b : β} :
    pure a ×ˢ pure b = pure (a, b)
    theorem Filter.prod_eq_bot {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    f ×ˢ g = ⊥ ↔ f = ⊥ ∨ g = ⊥
    @[simp]
    theorem Filter.prod_bot {α : Type u_1} {β : Type u_2} {f : Filter α} :
    @[simp]
    theorem Filter.bot_prod {α : Type u_1} {β : Type u_2} {g : Filter β} :
    theorem Filter.prod_neBot {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} :
    theorem Filter.NeBot.prod {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} (hf : Filter.NeBot f) (hg : Filter.NeBot g) :
    instance Filter.prod_neBot' {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} [hf : Filter.NeBot f] [hg : Filter.NeBot g] :
    Equations
    theorem Filter.tendsto_prod_iff {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : α × β → γ} {x : Filter α} {y : Filter β} {z : Filter γ} :
    Filter.Tendsto f (x ×ˢ y) z ↔ ∀ (W : Set γ), W ∈ z → ∃ U, U ∈ x ∧ ∃ V, V ∈ y ∧ ∀ (x : α) (y : β), x ∈ U → y ∈ V → f (x, y) ∈ W
    theorem Filter.le_prod {α : Type u_1} {β : Type u_2} {f : Filter (α × β)} {g : Filter α} {g' : Filter β} :
    f ≤ g ×ˢ g' ↔ Filter.Tendsto Prod.fst f g ∧ Filter.Tendsto Prod.snd f g'
    theorem Filter.tendsto_prod_iff' {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : Filter α} {g : Filter β} {g' : Filter γ} {s : α → β × γ} :
    Filter.Tendsto s f (g ×ˢ g') ↔ Filter.Tendsto (fun n => (s n).fst) f g ∧ Filter.Tendsto (fun n => (s n).snd) f g'

    Coproducts of filters #

    def Filter.coprod {α : Type u_1} {β : Type u_2} (f : Filter α) (g : Filter β) :
    Filter (α × β)

    Coproduct of filters.

    Equations
    Instances For
      theorem Filter.mem_coprod_iff {α : Type u_1} {β : Type u_2} {s : Set (α × β)} {f : Filter α} {g : Filter β} :
      s ∈ Filter.coprod f g ↔ (∃ t₁, t₁ ∈ f ∧ Prod.fst ⁻¹' t₁ ⊆ s) ∧ ∃ t₂, t₂ ∈ g ∧ Prod.snd ⁻¹' t₂ ⊆ s
      @[simp]
      theorem Filter.bot_coprod {α : Type u_1} {β : Type u_2} (l : Filter β) :
      @[simp]
      theorem Filter.coprod_bot {α : Type u_1} {β : Type u_2} (l : Filter α) :
      theorem Filter.compl_mem_coprod {α : Type u_1} {β : Type u_2} {s : Set (α × β)} {la : Filter α} {lb : Filter β} :
      sᶜ ∈ Filter.coprod la lb ↔ (Prod.fst '' s)ᶜ ∈ la ∧ (Prod.snd '' s)ᶜ ∈ lb
      theorem Filter.coprod_mono {α : Type u_1} {β : Type u_2} {f₁ : Filter α} {f₂ : Filter α} {g₁ : Filter β} {g₂ : Filter β} (hf : f₁ ≤ f₂) (hg : g₁ ≤ g₂) :
      Filter.coprod f₁ g₁ ≤ Filter.coprod f₂ g₂
      theorem Filter.coprod_neBot_left {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} [Filter.NeBot f] [Nonempty β] :
      theorem Filter.coprod_neBot_right {α : Type u_1} {β : Type u_2} {f : Filter α} {g : Filter β} [Filter.NeBot g] [Nonempty α] :
      theorem Filter.map_prod_map_coprod_le {α₁ : Type u} {α₂ : Type v} {β₁ : Type w} {β₂ : Type x} {f₁ : Filter α₁} {f₂ : Filter α₂} {m₁ : α₁ → β₁} {m₂ : α₂ → β₂} :
      Filter.map (Prod.map m₁ m₂) (Filter.coprod f₁ f₂) ≤ Filter.coprod (Filter.map m₁ f₁) (Filter.map m₂ f₂)
      theorem Filter.map_const_principal_coprod_map_id_principal {α : Type u_6} {β : Type u_7} {ι : Type u_8} (a : α) (b : β) (i : ι) :
      Filter.coprod (Filter.map (fun x => b) (Filter.principal {a})) (Filter.map id (Filter.principal {i})) = Filter.principal ({b} ×ˢ Set.univ ∪ Set.univ ×ˢ {i})

      Characterization of the coproduct of the Filter.maps of two principal filters 𝓟 {a} and 𝓟 {i}, the first under the constant function fun a => b and the second under the identity function. Together with the next lemma, map_prod_map_const_id_principal_coprod_principal, this provides an example showing that the inequality in the lemma map_prod_map_coprod_le can be strict.

      theorem Filter.map_prod_map_const_id_principal_coprod_principal {α : Type u_6} {β : Type u_7} {ι : Type u_8} (a : α) (b : β) (i : ι) :

      Characterization of the Filter.map of the coproduct of two principal filters 𝓟 {a} and 𝓟 {i}, under the Prod.map of two functions, respectively the constant function fun a => b and the identity function. Together with the previous lemma, map_const_principal_coprod_map_id_principal, this provides an example showing that the inequality in the lemma map_prod_map_coprod_le can be strict.

      theorem Filter.Tendsto.prod_map_coprod {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_6} {f : α → γ} {g : β → δ} {a : Filter α} {b : Filter β} {c : Filter γ} {d : Filter δ} (hf : Filter.Tendsto f a c) (hg : Filter.Tendsto g b d) :