Theorem: Filter.prod_lift_lift
File: Mathlib/Order/Filter/Lift.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
⊢ f₁.lift g₁ ×ˢ f₂.lift g₂ = f₁.lift fun s => f₂.lift fun t => g₁ s ×ˢ g₂ t
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
⊢ (f₁.lift fun s => (g₁ s).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    f₁.lift fun s => f₂.lift fun t => (g₁ s).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
tactic: simp only [prod_def, lift_assoc hg₁]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
⊢ (f₁.lift fun s => (g₁ s).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    f₁.lift fun s => f₂.lift fun t => (g₁ s).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
state_after: case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
⊢ (fun s => (g₁ s).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) = fun s =>
    f₂.lift fun t => (g₁ s).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
tactic: apply congr_arg
state_before: case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
⊢ (fun s => (g₁ s).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) = fun s =>
    f₂.lift fun t => (g₁ s).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
state_after: case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ ((g₁ x).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    f₂.lift fun t => (g₁ x).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
tactic: funext x
state_before: case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ ((g₁ x).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    f₂.lift fun t => (g₁ x).lift fun s => (g₂ t).lift' fun t => s ×ˢ t
state_after: case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ ((g₁ x).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    (g₁ x).lift fun t => f₂.lift fun s => (g₂ s).lift' fun t_1 => t ×ˢ t_1
tactic: rw [lift_comm]
state_before: case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ ((g₁ x).lift fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) =
    (g₁ x).lift fun t => f₂.lift fun s => (g₂ s).lift' fun t_1 => t ×ˢ t_1
state_after: case h.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ (fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) = fun t => f₂.lift fun s => (g₂ s).lift' fun t_1 => t ×ˢ t_1
tactic: apply congr_arg
state_before: case h.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
⊢ (fun s => (f₂.lift g₂).lift' fun t => s ×ˢ t) = fun t => f₂.lift fun s => (g₂ s).lift' fun t_1 => t ×ˢ t_1
state_after: case h.h.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
y : Set β₁
⊢ ((f₂.lift g₂).lift' fun t => y ×ˢ t) = f₂.lift fun s => (g₂ s).lift' fun t => y ×ˢ t
tactic: funext y
state_before: case h.h.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
f : Filter α
α₁ : Type u_5
α₂ : Type u_6
β₁ : Type u_7
β₂ : Type u_8
f₁ : Filter α₁
f₂ : Filter α₂
g₁ : Set α₁ → Filter β₁
g₂ : Set α₂ → Filter β₂
hg₁ : Monotone g₁
hg₂ : Monotone g₂
x : Set α₁
y : Set β₁
⊢ ((f₂.lift g₂).lift' fun t => y ×ˢ t) = f₂.lift fun s => (g₂ s).lift' fun t => y ×ˢ t
state_after: no goals
tactic: apply lift'_lift_assoc hg₂