Theorem: PFunctor.liftr_iff
File: Mathlib/Data/PFunctor/Univariate/Basic.lean

tactic: constructor
state_before: P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
⊢ Liftr r x y ↔ ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)
state_after: case mp
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
⊢ Liftr r x y → ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)

case mpr
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
⊢ (∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)) → Liftr r x y

tactic: rintro ⟨a, f₀, f₁, xeq, yeq, h⟩
state_before: case mpr
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
⊢ (∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)) → Liftr r x y
state_after: case mpr.intro.intro.intro.intro.intro
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ Liftr r x y

tactic: use ⟨a, fun i => ⟨(f₀ i, f₁ i), h i⟩⟩
state_before: case mpr.intro.intro.intro.intro.intro
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ Liftr r x y
state_after: case h
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = x ∧ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = y

tactic: constructor
state_before: case h
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = x ∧ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = y
state_after: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = x

case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = y

tactic: rw [yeq]
state_before: case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = y
state_after: case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = ⟨a, f₁⟩

tactic: rfl
state_before: case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).2) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = ⟨a, f₁⟩
state_after: no goals

tactic: rintro ⟨u, xeq, yeq⟩
state_before: case mp
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
⊢ Liftr r x y → ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)
state_after: case mp.intro.intro
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
⊢ ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)

tactic: cases' h : u with a f
state_before: case mp.intro.intro
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
⊢ ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)
state_after: case mp.intro.intro.mk
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)

tactic: use a, fun i => (f i).val.fst, fun i => (f i).val.snd
state_before: case mp.intro.intro.mk
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ ∃ a f₀ f₁, x = ⟨a, f₀⟩ ∧ y = ⟨a, f₁⟩ ∧ ∀ (i : P.B a), r (f₀ i) (f₁ i)
state_after: case h
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ x = ⟨a, fun i => (↑(f i)).1⟩ ∧ y = ⟨a, fun i => (↑(f i)).2⟩ ∧ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2

tactic: constructor
state_before: case h
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ x = ⟨a, fun i => (↑(f i)).1⟩ ∧ y = ⟨a, fun i => (↑(f i)).2⟩ ∧ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2
state_after: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ x = ⟨a, fun i => (↑(f i)).1⟩

case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ y = ⟨a, fun i => (↑(f i)).2⟩ ∧ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2

tactic: constructor
state_before: case h.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ y = ⟨a, fun i => (↑(f i)).2⟩ ∧ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2
state_after: case h.right.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ y = ⟨a, fun i => (↑(f i)).2⟩

case h.right.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2

tactic: intro i
state_before: case h.right.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ ∀ (i : P.B a), r (↑(f i)).1 (↑(f i)).2
state_after: case h.right.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
i : P.B a
⊢ r (↑(f i)).1 (↑(f i)).2

tactic: exact (f i).property
state_before: case h.right.right
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
i : P.B a
⊢ r (↑(f i)).1 (↑(f i)).2
state_after: no goals

tactic: rw [← xeq, h]
state_before: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ x = ⟨a, fun i => (↑(f i)).1⟩
state_after: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ (fun t => (↑t).1) <$> ⟨a, f⟩ = ⟨a, fun i => (↑(f i)).1⟩

tactic: rfl
state_before: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ (fun t => (↑t).1) <$> ⟨a, f⟩ = ⟨a, fun i => (↑(f i)).1⟩
state_after: no goals

tactic: rw [← yeq, h]
state_before: case h.right.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ y = ⟨a, fun i => (↑(f i)).2⟩
state_after: case h.right.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ (fun t => (↑t).2) <$> ⟨a, f⟩ = ⟨a, fun i => (↑(f i)).2⟩

tactic: rfl
state_before: case h.right.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
u : ↑P { p // r p.1 p.2 }
xeq : (fun t => (↑t).1) <$> u = x
yeq : (fun t => (↑t).2) <$> u = y
a : P.A
f : P.B a → { p // r p.1 p.2 }
h : u = ⟨a, f⟩
⊢ (fun t => (↑t).2) <$> ⟨a, f⟩ = ⟨a, fun i => (↑(f i)).2⟩
state_after: no goals

tactic: rw [xeq]
state_before: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = x
state_after: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = ⟨a, f₀⟩

tactic: rfl
state_before: case h.left
P : PFunctor.{u}
α : Type u
r : α → α → Prop
x y : ↑P α
a : P.A
f₀ f₁ : P.B a → α
xeq : x = ⟨a, f₀⟩
yeq : y = ⟨a, f₁⟩
h : ∀ (i : P.B a), r (f₀ i) (f₁ i)
⊢ (fun t => (↑t).1) <$> ⟨a, fun i => ⟨(f₀ i, f₁ i), ⋯⟩⟩ = ⟨a, f₀⟩
state_after: no goals