-- Mathlib/Combinatorics/SimpleGraph/Matching.lean
lemma IsMatching.iSup {ι : Sort _} {f : ι → Subgraph G} (hM : (i : ι) → (f i).IsMatching)
    (hd : Pairwise fun i j ↦ Disjoint (f i).support (f j).support) :
    (⨆ i, f i).IsMatching

Proof state:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
⊢ y = w

Tactic:
obtain ⟨i' , hi'⟩ := iSup_adj.mp hy

Result:
case h.intro
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
⊢ y = w

Proof state:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ ∀ (y : V), (fun w => (⨆ i, f i).Adj v w) y → y = w

Tactic:
intro y hy

Result:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
⊢ y = w

Proof state:
case pos
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : i = i'
⊢ y = w

Tactic:
exact hw.2 y (heq.symm ▸ hi')

Result:
no goals

Proof state:
case neg
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : ¬i = i'
this : ∀ ⦃a : V⦄, a ∈ (f i).support → a ∉ (f i').support
⊢ y = w

Tactic:
simpa [(mem_support _).mpr ⟨w, hw.1⟩, (mem_support _).mpr ⟨y, hi'⟩] using @this v

Result:
no goals

Proof state:
case neg
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : ¬i = i'
this : (fun i j => Disjoint (f i).support (f j).support) i i'
⊢ y = w

Tactic:
simp only [Set.disjoint_left] at this

Result:
case neg
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : ¬i = i'
this : ∀ ⦃a : V⦄, a ∈ (f i).support → a ∉ (f i').support
⊢ y = w

Proof state:
case intro.intro
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ ∃! w, (⨆ i, f i).Adj v w

Tactic:
use w

Result:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ (fun w => (⨆ i, f i).Adj v w) w ∧ ∀ (y : V), (fun w => (⨆ i, f i).Adj v w) y → y = w

Proof state:
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
⊢ (⨆ i, f i).IsMatching

Tactic:
intro v hv

Result:
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
⊢ ∃! w, (⨆ i, f i).Adj v w

Proof state:
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
⊢ ∃! w, (⨆ i, f i).Adj v w

Tactic:
obtain ⟨i , hi⟩ := Set.mem_iUnion.mp (verts_iSup ▸ hv)

Result:
case intro
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
⊢ ∃! w, (⨆ i, f i).Adj v w

Proof state:
case neg
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : ¬i = i'
⊢ y = w

Tactic:
have := hd heq

Result:
case neg
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
y : V
hy : (⨆ i, f i).Adj v y
i' : ι
hi' : (f i').Adj v y
heq : ¬i = i'
this : (fun i j => Disjoint (f i).support (f j).support) i i'
⊢ y = w

Proof state:
case intro
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
⊢ ∃! w, (⨆ i, f i).Adj v w

Tactic:
obtain ⟨w , hw⟩ := hM i hi

Result:
case intro.intro
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ ∃! w, (⨆ i, f i).Adj v w

Proof state:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ (fun w => (⨆ i, f i).Adj v w) w ∧ ∀ (y : V), (fun w => (⨆ i, f i).Adj v w) y → y = w

Tactic:
refine ⟨iSup_adj.mpr ⟨i, hw.1⟩, ?_⟩

Result:
case h
V : Type u_1
G : SimpleGraph V
ι : Type u_3
f : ι → G.Subgraph
hM : ∀ (i : ι), (f i).IsMatching
hd : Pairwise fun i j => Disjoint (f i).support (f j).support
v : V
hv : v ∈ (⨆ i, f i).verts
i : ι
hi : v ∈ (f i).verts
w : V
hw : (fun w => (f i).Adj v w) w ∧ ∀ (y : V), (fun w => (f i).Adj v w) y → y = w
⊢ ∀ (y : V), (fun w => (⨆ i, f i).Adj v w) y → y = w