Theorem: SimpleGraph.Walk.IsEulerian.even_degree_iff
File: Mathlib/Combinatorics/SimpleGraph/Trails.lean

tactic: convert ht.isTrail.even_countP_edges_iff x
state_before: V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ Even (G.degree x) ↔ u ≠ v → x ≠ u ∧ x ≠ v
state_after: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ G.degree x = List.countP (fun e => decide (x ∈ e)) p.edges

tactic: rw [← Multiset.coe_countP, Multiset.countP_eq_card_filter, ← card_incidenceFinset_eq_degree]
state_before: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ G.degree x = List.countP (fun e => decide (x ∈ e)) p.edges
state_after: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).card = Multiset.card (Multiset.filter (Membership.mem x) ↑p.edges)

tactic: change Multiset.card _ = _
state_before: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).card = Multiset.card (Multiset.filter (Membership.mem x) ↑p.edges)
state_after: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ Multiset.card (G.incidenceFinset x).val = Multiset.card (Multiset.filter (Membership.mem x) ↑p.edges)

tactic: congr 1
state_before: case h.e'_1.h.e'_3
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ Multiset.card (G.incidenceFinset x).val = Multiset.card (Multiset.filter (Membership.mem x) ↑p.edges)
state_after: case h.e'_1.h.e'_3.h.e_6.h
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).val = Multiset.filter (Membership.mem x) ↑p.edges

tactic: convert_to _ = (ht.isTrail.edgesFinset.filter (Membership.mem x)).val
state_before: case h.e'_1.h.e'_3.h.e_6.h
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).val = Multiset.filter (Membership.mem x) ↑p.edges
state_after: case h.e'_1.h.e'_3.h.e_6.h.convert_2
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).val = (Finset.filter (Membership.mem x) ⋯.edgesFinset).val

tactic: have : Fintype G.edgeSet := fintypeEdgeSet ht
state_before: case h.e'_1.h.e'_3.h.e_6.h.convert_2
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
⊢ (G.incidenceFinset x).val = (Finset.filter (Membership.mem x) ⋯.edgesFinset).val
state_after: case h.e'_1.h.e'_3.h.e_6.h.convert_2
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
this : Fintype ↑G.edgeSet
⊢ (G.incidenceFinset x).val = (Finset.filter (Membership.mem x) ⋯.edgesFinset).val

tactic: rw [ht.edgesFinset_eq, G.incidenceFinset_eq_filter x]
state_before: case h.e'_1.h.e'_3.h.e_6.h.convert_2
V : Type u_1
G : SimpleGraph V
inst✝² : DecidableEq V
x u v : V
p : G.Walk u v
ht : p.IsEulerian
inst✝¹ : Fintype V
inst✝ : DecidableRel G.Adj
this : Fintype ↑G.edgeSet
⊢ (G.incidenceFinset x).val = (Finset.filter (Membership.mem x) ⋯.edgesFinset).val
state_after: no goals