-- Mathlib/Order/Filter/Lift.lean
theorem prod_lift_lift {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

Proof state:
case h.h
α₁ : 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:
apply congr_arg

Result:
case h.h.h
α₁ : 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

Proof state:
case h
α₁ : 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:
funext x

Result:
case h.h
α₁ : 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

Proof state:
α₁ : 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:
apply congr_arg

Result:
case h
α₁ : 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

Proof state:
case h.h.h.h
α₁ : 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:
apply lift'_lift_assoc hg₂

Result:
no goals

Proof state:
case h.h
α₁ : 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:
rw [lift_comm]

Result:
case h.h
α₁ : 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

Proof state:
α₁ : 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

Tactic:
simp only [prod_def, lift_assoc hg₁]

Result:
α₁ : 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

Proof state:
case h.h.h
α₁ : 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:
funext y

Result:
case h.h.h.h
α₁ : 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