l3lab/ntp-mathlib huggingface dataset:
theorem eq_singletonSubgraph_iff_verts_eq (H : G.Subgraph) {v : V} :
    H = G.singletonSubgraph v ↔ H.verts = {v} := by
  refine' ⟨fun h ↦ by rw [h, singletonSubgraph_verts], fun h ↦ _⟩
  ext
  · rw [h, singletonSubgraph_verts]
  · simp only [Prop.bot_eq_false, singletonSubgraph_adj, Pi.bot_apply, iff_false_iff]
    intro ha
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
H : Subgraph G
v : V
h : H.verts = {v}
x✝¹ x✝ : V
ha : Subgraph.Adj H x✝¹ x✝
⊢ False

Next tactic:
have ha1 := ha.fst_mem
theorem eq_singletonSubgraph_iff_verts_eq (H : G.Subgraph) {v : V} :
    H = G.singletonSubgraph v ↔ H.verts = {v} := by
  refine' ⟨fun h ↦ by rw [h, singletonSubgraph_verts], fun h ↦ _⟩
  ext
  · rw [h, singletonSubgraph_verts]
  · simp only [Prop.bot_eq_false, singletonSubgraph_adj, Pi.bot_apply, iff_false_iff]
    intro ha
    have ha1 := ha.fst_mem
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
H : Subgraph G
v : V
h : H.verts = {v}
x✝¹ x✝ : V
ha : Subgraph.Adj H x✝¹ x✝
ha1 : x✝¹ ∈ H.verts
⊢ False

Next tactic:
have ha2 := ha.snd_mem
theorem eq_singletonSubgraph_iff_verts_eq (H : G.Subgraph) {v : V} :
    H = G.singletonSubgraph v ↔ H.verts = {v} := by
  refine' ⟨fun h ↦ by rw [h, singletonSubgraph_verts], fun h ↦ _⟩
  ext
  · rw [h, singletonSubgraph_verts]
  · simp only [Prop.bot_eq_false, singletonSubgraph_adj, Pi.bot_apply, iff_false_iff]
    intro ha
    have ha1 := ha.fst_mem
    have ha2 := ha.snd_mem
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
H : Subgraph G
v : V
h : H.verts = {v}
x✝¹ x✝ : V
ha : Subgraph.Adj H x✝¹ x✝
ha1 : x✝¹ ∈ H.verts
ha2 : x✝ ∈ H.verts
⊢ False

Next tactic:
rw [h, Set.mem_singleton_iff] at ha1 ha2
theorem eq_singletonSubgraph_iff_verts_eq (H : G.Subgraph) {v : V} :
    H = G.singletonSubgraph v ↔ H.verts = {v} := by
  refine' ⟨fun h ↦ by rw [h, singletonSubgraph_verts], fun h ↦ _⟩
  ext
  · rw [h, singletonSubgraph_verts]
  · simp only [Prop.bot_eq_false, singletonSubgraph_adj, Pi.bot_apply, iff_false_iff]
    intro ha
    have ha1 := ha.fst_mem
    have ha2 := ha.snd_mem
    rw [h, Set.mem_singleton_iff] at ha1 ha2
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
H : Subgraph G
v : V
h : H.verts = {v}
x✝¹ x✝ : V
ha : Subgraph.Adj H x✝¹ x✝
ha1 : x✝¹ = v
ha2 : x✝ = v
⊢ False

Next tactic:
subst_vars
theorem eq_singletonSubgraph_iff_verts_eq (H : G.Subgraph) {v : V} :
    H = G.singletonSubgraph v ↔ H.verts = {v} := by
  refine' ⟨fun h ↦ by rw [h, singletonSubgraph_verts], fun h ↦ _⟩
  ext
  · rw [h, singletonSubgraph_verts]
  · simp only [Prop.bot_eq_false, singletonSubgraph_adj, Pi.bot_apply, iff_false_iff]
    intro ha
    have ha1 := ha.fst_mem
    have ha2 := ha.snd_mem
    rw [h, Set.mem_singleton_iff] at ha1 ha2
    subst_vars
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
H : Subgraph G
x✝ : V
ha : Subgraph.Adj H x✝ x✝
h : H.verts = {x✝}
⊢ False

Next tactic:
exact ha.ne rfl
instance nonempty_subgraphOfAdj_verts {v w : V} (hvw : G.Adj v w) :
    Nonempty (G.subgraphOfAdj hvw).verts :=
  ⟨⟨v, by 

Proof state:
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
⊢ v ∈ (subgraphOfAdj G hvw).verts

Next tactic:
simp
@[simp]
theorem edgeSet_subgraphOfAdj {v w : V} (hvw : G.Adj v w) :
    (G.subgraphOfAdj hvw).edgeSet = {⟦(v, w)⟧} := by
  

Proof state:
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
⊢ Subgraph.edgeSet (subgraphOfAdj G hvw) = {⟦(v, w)⟧}

Next tactic:
ext e
@[simp]
theorem edgeSet_subgraphOfAdj {v w : V} (hvw : G.Adj v w) :
    (G.subgraphOfAdj hvw).edgeSet = {⟦(v, w)⟧} := by
  ext e
  

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
e : Sym2 V
⊢ e ∈ Subgraph.edgeSet (subgraphOfAdj G hvw) ↔ e ∈ {⟦(v, w)⟧}

Next tactic:
refine' e.ind _
@[simp]
theorem edgeSet_subgraphOfAdj {v w : V} (hvw : G.Adj v w) :
    (G.subgraphOfAdj hvw).edgeSet = {⟦(v, w)⟧} := by
  ext e
  refine' e.ind _
  

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
e : Sym2 V
⊢ ∀ (x y : V), ⟦(x, y)⟧ ∈ Subgraph.edgeSet (subgraphOfAdj G hvw) ↔ ⟦(x, y)⟧ ∈ {⟦(v, w)⟧}

Next tactic:
simp only [eq_comm, Set.mem_singleton_iff, Subgraph.mem_edgeSet, subgraphOfAdj_adj, iff_self_iff,
    forall₂_true_iff]
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  

Proof state:
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ subgraphOfAdj G (_ : Adj G v w) ≤ H

Next tactic:
constructor
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · 

Proof state:
case left
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ (subgraphOfAdj G (_ : Adj G v w)).verts ⊆ H.verts

Next tactic:
intro x
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    

Proof state:
case left
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
x : V
⊢ x ∈ (subgraphOfAdj G (_ : Adj G v w)).verts → x ∈ H.verts

Next tactic:
rintro (rfl | rfl)
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> 

Proof state:
case left.inl
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
w : V
H : Subgraph G
x : V
h : Subgraph.Adj H x w
⊢ x ∈ H.verts

Next tactic:
simp [H.edge_vert h, H.edge_vert h.symm]
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> 

Proof state:
case left.inr
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v : V
H : Subgraph G
x : V
h : Subgraph.Adj H v x
⊢ x ∈ H.verts

Next tactic:
simp [H.edge_vert h, H.edge_vert h.symm]
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> simp [H.edge_vert h, H.edge_vert h.symm]
  · 

Proof state:
case right
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ ∀ ⦃v_1 w_1 : V⦄, Subgraph.Adj (subgraphOfAdj G (_ : Adj G v w)) v_1 w_1 → Subgraph.Adj H v_1 w_1

Next tactic:
simp only [subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> simp [H.edge_vert h, H.edge_vert h.symm]
  · simp only [subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    

Proof state:
case right
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ ∀ ⦃v_1 w_1 : V⦄, v = v_1 ∧ w = w_1 ∨ v = w_1 ∧ w = v_1 → Subgraph.Adj H v_1 w_1

Next tactic:
rintro _ _ (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> simp [H.edge_vert h, H.edge_vert h.symm]
  · simp only [subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    rintro _ _ (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩) <;> 

Proof state:
case right.inl.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ Subgraph.Adj H v w

Next tactic:
simp [h, h.symm]
set_option autoImplicit true in
lemma subgraphOfAdj_le_of_adj (H : G.Subgraph) (h : H.Adj v w) :
    G.subgraphOfAdj (H.adj_sub h) ≤ H := by
  constructor
  · intro x
    rintro (rfl | rfl) <;> simp [H.edge_vert h, H.edge_vert h.symm]
  · simp only [subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    rintro _ _ (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩) <;> 

Proof state:
case right.inr.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
H : Subgraph G
h : Subgraph.Adj H v w
⊢ Subgraph.Adj H w v

Next tactic:
simp [h, h.symm]
theorem subgraphOfAdj_symm {v w : V} (hvw : G.Adj v w) :
    G.subgraphOfAdj hvw.symm = G.subgraphOfAdj hvw := by
  

Proof state:
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
⊢ subgraphOfAdj G (_ : Adj G w v) = subgraphOfAdj G hvw

Next tactic:
ext
theorem subgraphOfAdj_symm {v w : V} (hvw : G.Adj v w) :
    G.subgraphOfAdj hvw.symm = G.subgraphOfAdj hvw := by
  ext <;> 

Proof state:
case verts.h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
x✝ : V
⊢ x✝ ∈ (subgraphOfAdj G (_ : Adj G w v)).verts ↔ x✝ ∈ (subgraphOfAdj G hvw).verts

Next tactic:
simp [or_comm, and_comm]
theorem subgraphOfAdj_symm {v w : V} (hvw : G.Adj v w) :
    G.subgraphOfAdj hvw.symm = G.subgraphOfAdj hvw := by
  ext <;> 

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
v w : V
hvw : Adj G v w
x✝¹ x✝ : V
⊢ Subgraph.Adj (subgraphOfAdj G (_ : Adj G w v)) x✝¹ x✝ ↔ Subgraph.Adj (subgraphOfAdj G hvw) x✝¹ x✝

Next tactic:
simp [or_comm, and_comm]
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  

Proof state:
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ Subgraph.map f (subgraphOfAdj G hvw) = subgraphOfAdj G' (_ : Adj G' (f v) (f w))

Next tactic:
ext
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · 

Proof state:
case verts.h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝ : W
⊢ x✝ ∈ (Subgraph.map f (subgraphOfAdj G hvw)).verts ↔ x✝ ∈ (subgraphOfAdj G' (_ : Adj G' (f v) (f w))).verts

Next tactic:
simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    

Proof state:
case verts.h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝ : W
⊢ (∃ x, (x = v ∨ x = w) ∧ f x = x✝) ↔ x✝ = f v ∨ x✝ = f w

Next tactic:
constructor
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · 

Proof state:
case verts.h.mp
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝ : W
⊢ (∃ x, (x = v ∨ x = w) ∧ f x = x✝) → x✝ = f v ∨ x✝ = f w

Next tactic:
rintro ⟨u, rfl | rfl, rfl⟩
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> 

Proof state:
case verts.h.mp.intro.intro.inl
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
w u : V
hvw : Adj G u w
⊢ f u = f u ∨ f u = f w

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> 

Proof state:
case verts.h.mp.intro.intro.inr
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v u : V
hvw : Adj G v u
⊢ f u = f v ∨ f u = f u

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · 

Proof state:
case verts.h.mpr
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝ : W
⊢ x✝ = f v ∨ x✝ = f w → ∃ x, (x = v ∨ x = w) ∧ f x = x✝

Next tactic:
rintro (rfl | rfl)
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · 

Proof state:
case verts.h.mpr.inl
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ ∃ x, (x = v ∨ x = w) ∧ f x = f v

Next tactic:
use v
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ (v = v ∨ v = w) ∧ f v = f v

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · 

Proof state:
case verts.h.mpr.inr
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ ∃ x, (x = v ∨ x = w) ∧ f x = f w

Next tactic:
use w
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ (w = v ∨ w = w) ∧ f w = f w

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · 

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝¹ x✝ : W
⊢ Subgraph.Adj (Subgraph.map f (subgraphOfAdj G hvw)) x✝¹ x✝ ↔
    Subgraph.Adj (subgraphOfAdj G' (_ : Adj G' (f v) (f w))) x✝¹ x✝

Next tactic:
simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    

Proof state:
case Adj.h.h.a
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝¹ x✝ : W
⊢ (∃ a b, (v = a ∧ w = b ∨ v = b ∧ w = a) ∧ f a = x✝¹ ∧ f b = x✝) ↔ f v = x✝¹ ∧ f w = x✝ ∨ f v = x✝ ∧ f w = x✝¹

Next tactic:
constructor
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · 

Proof state:
case Adj.h.h.a.mp
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝¹ x✝ : W
⊢ (∃ a b, (v = a ∧ w = b ∨ v = b ∧ w = a) ∧ f a = x✝¹ ∧ f b = x✝) → f v = x✝¹ ∧ f w = x✝ ∨ f v = x✝ ∧ f w = x✝¹

Next tactic:
rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> 

Proof state:
case Adj.h.h.a.mp.intro.intro.intro.inl.intro.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ f v = f v ∧ f w = f w ∨ f v = f w ∧ f w = f v

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> 

Proof state:
case Adj.h.h.a.mp.intro.intro.intro.inr.intro.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ f v = f w ∧ f w = f v ∨ f v = f v ∧ f w = f w

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> simp
    · 

Proof state:
case Adj.h.h.a.mpr
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
x✝¹ x✝ : W
⊢ f v = x✝¹ ∧ f w = x✝ ∨ f v = x✝ ∧ f w = x✝¹ → ∃ a b, (v = a ∧ w = b ∨ v = b ∧ w = a) ∧ f a = x✝¹ ∧ f b = x✝

Next tactic:
rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> simp
    · rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
      · 

Proof state:
case Adj.h.h.a.mpr.inl.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ ∃ a b, (v = a ∧ w = b ∨ v = b ∧ w = a) ∧ f a = f v ∧ f b = f w

Next tactic:
use v, w
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> simp
    · rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
      · use v, w
        

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ (v = v ∧ w = w ∨ v = w ∧ w = v) ∧ f v = f v ∧ f w = f w

Next tactic:
simp
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> simp
    · rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
      · use v, w
        simp
      · 

Proof state:
case Adj.h.h.a.mpr.inr.intro
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ ∃ a b, (v = a ∧ w = b ∨ v = b ∧ w = a) ∧ f a = f w ∧ f b = f v

Next tactic:
use w, v
@[simp]
theorem map_subgraphOfAdj (f : G →g G') {v w : V} (hvw : G.Adj v w) :
    Subgraph.map f (G.subgraphOfAdj hvw) = G'.subgraphOfAdj (f.map_adj hvw) := by
  ext
  · simp only [Subgraph.map_verts, subgraphOfAdj_verts, Set.mem_image, Set.mem_insert_iff,
      Set.mem_singleton_iff]
    constructor
    · rintro ⟨u, rfl | rfl, rfl⟩ <;> simp
    · rintro (rfl | rfl)
      · use v
        simp
      · use w
        simp
  · simp only [Relation.Map, Subgraph.map_adj, subgraphOfAdj_adj, Quotient.eq, Sym2.rel_iff]
    constructor
    · rintro ⟨a, b, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl, rfl⟩ <;> simp
    · rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
      · use v, w
        simp
      · use w, v
        

Proof state:
case h
ι : Sort u_1
V : Type u
W : Type v
G : SimpleGraph V
G' : SimpleGraph W
f : G →g G'
v w : V
hvw : Adj G v w
⊢ (v = w ∧ w = v ∨ v = v ∧ w = w) ∧ f w = f w ∧ f v = f v

Next tactic:
simp