File: Mathlib/Combinatorics/SimpleGraph/Trails.lean

full_name: SimpleGraph.Walk.IsTrail.edgesFinset
code: /-- The edges of a trail as a finset, since each edge in a trail appears exactly once. -/
abbrev IsTrail.edgesFinset {u v : V} {p : G.Walk u v} (h : p.IsTrail) : Finset (Sym2 V) 
goal: Finset (Sym2 V)

full_name: SimpleGraph.Walk.IsTrail.even_countP_edges_iff
code: theorem IsTrail.even_countP_edges_iff {u v : V} {p : G.Walk u v} (ht : p.IsTrail) (x : V) :
    Even (p.edges.countP fun e => x ∈ e) ↔ u ≠ v → x ≠ u ∧ x ≠ v 
goal: Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ u ≠ v → x ≠ u ∧ x ≠ v

full_name: SimpleGraph.Walk.IsEulerian
code: /-- An *Eulerian trail* (also known as an "Eulerian path") is a walk
`p` that visits every edge exactly once.  The lemma `SimpleGraph.Walk.IsEulerian.IsTrail` shows
that these are trails.

Combine with `p.IsCircuit` to get an Eulerian circuit (also known as an "Eulerian cycle"). -/
def IsEulerian {u v : V} (p : G.Walk u v) : Prop 
goal: Prop

full_name: SimpleGraph.Walk.IsEulerian.isTrail
code: theorem IsEulerian.isTrail {u v : V} {p : G.Walk u v} (h : p.IsEulerian) : p.IsTrail 
goal: p.IsTrail

full_name: SimpleGraph.Walk.IsEulerian.mem_edges_iff
code: theorem IsEulerian.mem_edges_iff {u v : V} {p : G.Walk u v} (h : p.IsEulerian) {e : Sym2 V} :
    e ∈ p.edges ↔ e ∈ G.edgeSet 
goal: e ∈ p.edges ↔ e ∈ G.edgeSet

full_name: SimpleGraph.Walk.IsEulerian.fintypeEdgeSet
code: /-- The edge set of an Eulerian graph is finite. -/
def IsEulerian.fintypeEdgeSet {u v : V} {p : G.Walk u v} (h : p.IsEulerian) :
    Fintype G.edgeSet 
goal: Fintype ↑G.edgeSet

full_name: SimpleGraph.Walk.IsTrail.isEulerian_of_forall_mem
code: theorem IsTrail.isEulerian_of_forall_mem {u v : V} {p : G.Walk u v} (h : p.IsTrail)
    (hc : ∀ e, e ∈ G.edgeSet → e ∈ p.edges) : p.IsEulerian 
goal: p.IsEulerian

full_name: SimpleGraph.Walk.isEulerian_iff
code: theorem isEulerian_iff {u v : V} (p : G.Walk u v) :
    p.IsEulerian ↔ p.IsTrail ∧ ∀ e, e ∈ G.edgeSet → e ∈ p.edges 
goal: p.IsEulerian ↔ p.IsTrail ∧ ∀ e ∈ G.edgeSet, e ∈ p.edges

full_name: SimpleGraph.Walk.IsEulerian.edgesFinset_eq
code: theorem IsEulerian.edgesFinset_eq [Fintype G.edgeSet] {u v : V} {p : G.Walk u v}
    (h : p.IsEulerian) : h.isTrail.edgesFinset = G.edgeFinset 
goal: ⋯.edgesFinset = G.edgeFinset

full_name: SimpleGraph.Walk.IsEulerian.even_degree_iff
code: theorem IsEulerian.even_degree_iff {x u v : V} {p : G.Walk u v} (ht : p.IsEulerian) [Fintype V]
    [DecidableRel G.Adj] : Even (G.degree x) ↔ u ≠ v → x ≠ u ∧ x ≠ v 
goal: Even (G.degree x) ↔ u ≠ v → x ≠ u ∧ x ≠ v

full_name: SimpleGraph.Walk.IsEulerian.card_filter_odd_degree
code: theorem IsEulerian.card_filter_odd_degree [Fintype V] [DecidableRel G.Adj] {u v : V}
    {p : G.Walk u v} (ht : p.IsEulerian) {s}
    (h : s = (Finset.univ : Finset V).filter fun v => Odd (G.degree v)) :
    s.card = 0 ∨ s.card = 2 
goal: s.card = 0 ∨ s.card = 2

full_name: SimpleGraph.Walk.IsEulerian.card_odd_degree
code: theorem IsEulerian.card_odd_degree [Fintype V] [DecidableRel G.Adj] {u v : V} {p : G.Walk u v}
    (ht : p.IsEulerian) : Fintype.card { v : V | Odd (G.degree v) } = 0 ∨
      Fintype.card { v : V | Odd (G.degree v) } = 2 
goal: Fintype.card ↑{v | Odd (G.degree v)} = 0 ∨ Fintype.card ↑{v | Odd (G.degree v)} = 2