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

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

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

tactic: rintro ⟨a, f, xeq, pf⟩
state_before: case mpr
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
⊢ (∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)) → Liftp p x
state_after: case mpr.intro.intro.intro
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Liftp p x

tactic: use ⟨a, fun i => ⟨f i, pf i⟩⟩
state_before: case mpr.intro.intro.intro
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Liftp p x
state_after: case h
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Subtype.val <$> ⟨a, fun i => ⟨f i, ⋯⟩⟩ = x

tactic: rw [xeq]
state_before: case h
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Subtype.val <$> ⟨a, fun i => ⟨f i, ⋯⟩⟩ = x
state_after: case h
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Subtype.val <$> ⟨a, fun i => ⟨f i, ⋯⟩⟩ = ⟨a, f⟩

tactic: rfl
state_before: case h
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
a : P.A
f : P.B a → α
xeq : x = ⟨a, f⟩
pf : ∀ (i : P.B a), p (f i)
⊢ Subtype.val <$> ⟨a, fun i => ⟨f i, ⋯⟩⟩ = ⟨a, f⟩
state_after: no goals

tactic: rintro ⟨y, hy⟩
state_before: case mp
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
⊢ Liftp p x → ∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)
state_after: case mp.intro
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
⊢ ∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)

tactic: cases' h : y with a f
state_before: case mp.intro
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
⊢ ∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)
state_after: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ ∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)

tactic: refine ⟨a, fun i => (f i).val, ?_, fun i => (f i).property⟩
state_before: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ ∃ a f, x = ⟨a, f⟩ ∧ ∀ (i : P.B a), p (f i)
state_after: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ x = ⟨a, fun i => ↑(f i)⟩

tactic: rw [← hy, h, map_eq_map, PFunctor.map_eq]
state_before: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ x = ⟨a, fun i => ↑(f i)⟩
state_after: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ ⟨a, Subtype.val ∘ f⟩ = ⟨a, fun i => ↑(f i)⟩

tactic: congr
state_before: case mp.intro.mk
P : PFunctor.{u}
α : Type u
p : α → Prop
x : ↑P α
y : ↑P (Subtype p)
hy : Subtype.val <$> y = x
a : P.A
f : P.B a → Subtype p
h : y = ⟨a, f⟩
⊢ ⟨a, Subtype.val ∘ f⟩ = ⟨a, fun i => ↑(f i)⟩
state_after: no goals