Theorem: Pairwise.exists_mem_filter_of_disjoint
File: Mathlib/Order/Filter/Basic.lean

tactic: have : Pairwise fun i j => ∃ (s : {s // s ∈ l i}) (t : {t // t ∈ l j}), Disjoint s.1 t.1 := by
  simpa only [Pairwise, Function.onFun, Filter.disjoint_iff, exists_prop, Subtype.exists] using hd
state_before: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s t : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
⊢ ∃ s, (∀ (i : ι), s i ∈ l i) ∧ Pairwise (Disjoint on s)
state_after: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s t : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
this : Pairwise fun i j => ∃ s t, Disjoint ↑s ↑t
⊢ ∃ s, (∀ (i : ι), s i ∈ l i) ∧ Pairwise (Disjoint on s)

tactic: choose! s t hst using this
state_before: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s t : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
this : Pairwise fun i j => ∃ s t, Disjoint ↑s ↑t
⊢ ∃ s, (∀ (i : ι), s i ∈ l i) ∧ Pairwise (Disjoint on s)
state_after: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
⊢ ∃ s, (∀ (i : ι), s i ∈ l i) ∧ Pairwise (Disjoint on s)

tactic: refine ⟨fun i => ⋂ j, @s i j ∩ @t j i, fun i => ?_, fun i j hij => ?_⟩
state_before: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
⊢ ∃ s, (∀ (i : ι), s i ∈ l i) ∧ Pairwise (Disjoint on s)
state_after: case refine_1
α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
i : ι
⊢ (fun i => ⋂ j, ↑s ∩ ↑t) i ∈ l i

case refine_2
α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
i j : ι
hij : i ≠ j
⊢ (Disjoint on fun i => ⋂ j, ↑s ∩ ↑t) i j

tactic: exacts [iInter_mem.2 fun j => inter_mem (@s i j).2 (@t j i).2,
  (hst hij).mono ((iInter_subset _ j).trans inter_subset_left)
    ((iInter_subset _ i).trans inter_subset_right)]
state_before: case refine_1
α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
i : ι
⊢ (fun i => ⋂ j, ↑s ∩ ↑t) i ∈ l i

case refine_2
α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s✝ t✝ : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
s : ⦃i : ι⦄ → ⦃j : ι⦄ → { s // s ∈ l i }
t : ⦃i : ι⦄ → ⦃j : ι⦄ → { t // t ∈ l j }
hst : ∀ ⦃i j : ι⦄, i ≠ j → Disjoint ↑s ↑t
i j : ι
hij : i ≠ j
⊢ (Disjoint on fun i => ⋂ j, ↑s ∩ ↑t) i j
state_after: no goals

tactic: simpa only [Pairwise, Function.onFun, Filter.disjoint_iff, exists_prop, Subtype.exists] using hd
state_before: α : Type u
β : Type v
γ : Type w
δ : Type u_1
ι✝ : Sort x
f g : Filter α
s t : Set α
ι : Type u_2
inst✝ : Finite ι
l : ι → Filter α
hd : Pairwise (Disjoint on l)
⊢ Pairwise fun i j => ∃ s t, Disjoint ↑s ↑t
state_after: no goals