Documentation

TauCeti.Combinatorics.SimpleGraph.Connectivity.Ear.Basic

Ear decompositions of simple graphs #

An open ear over a subgraph H : G.Subgraph of a simple graph G is a path in G whose two distinct endpoints lie in H, whose internal vertices lie outside H, and whose edges lie outside H (in particular, a single unused edge between two vertices already in H is an open ear). A closed ear over H is a cycle in G meeting H solely at its base vertex; in a simple graph, the unused-edge property follows automatically because every edge of the cycle has at least one endpoint different from the base vertex (SimpleGraph.Ear.closed_edges_notMem_edgeSet).

An ear decomposition d : G.EarDecomposition H is data recording an initial subgraph (either a single vertex or a cycle), a finite sequence of open or closed ears, and the prefix subgraph after each step, ending at H. An ear decomposition is open (SimpleGraph.EarDecomposition.IsOpen) when it starts from a cycle and every ear is open.

This file defines ears, initial subgraphs, and ear decompositions of subgraphs of a simple graph, establishes their extensionality, prefix, and induction API, shows that the initial subgraph and the ears partition the edges of H, and proves without finiteness hypotheses that every ear decomposition builds connected, 2-edge-connected subgraphs (so a decomposition of ⊤ certifies that G is connected and 2-edge-connected). Preservation of 2-vertex-connectivity by open ears and Whitney's open ear characterization are proved in TauCeti.Combinatorics.SimpleGraph.Connectivity.Ear.Open.

Main definitions #

Main results #

Implementation notes #

All projection and predicate bodies (Ear.kind, Ear.toWalk, Ear.toSubgraph, Ear.adjoin, EarStart.IsCycle, EarDecomposition.initial, EarDecomposition.kindAt, EarDecomposition.walkAt, EarDecomposition.IsOpen) remain unexposed, with characteristic @[simp] lemmas proved via := (rfl) so downstream consumers do not rely on definitional unfolding. Only the three length-transforming combinators EarDecomposition.copy, EarDecomposition.snoc, and EarDecomposition.prefix carry @[expose] so dependent Fin indices over .length compute in types.

References #

Whether an ear is open (a path between two distinct vertices) or closed (a cycle at one base vertex).

Instances For
    inductive SimpleGraph.Ear {V : Type u} (G : SimpleGraph V) (H : G.Subgraph) :

    An ear in G over a subgraph H: either an open ear (a path with distinct endpoints in H, internal vertices outside H, and edges outside H) or a closed ear (a cycle meeting H only at its base vertex). Single-edge open ears are permitted.

    Instances For
      def SimpleGraph.Ear.kind {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} :
      G.Ear H → EarKind

      Whether an ear is open or closed.

      Instances For
        @[simp]
        theorem SimpleGraph.Ear.kind_open {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u v : V} (p : G.Walk u v) (hp : p.IsPath) (hu : u ∈ H.verts) (hv : v ∈ H.verts) (huv : u ≠ v) (hint : ∀ w ∈ p.support, w ≠ u → w ≠ v → w ∉ H.verts) (hedge : ∀ e ∈ p.edges, e ∉ H.edgeSet) :
        («open» p hp hu hv huv hint hedge).kind = EarKind.open
        @[simp]
        theorem SimpleGraph.Ear.kind_closed {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u : V} (c : G.Walk u u) (hc : c.IsCycle) (hu : u ∈ H.verts) (hint : ∀ w ∈ c.support, w ≠ u → w ∉ H.verts) :
        (closed c hc hu hint).kind = EarKind.closed
        def SimpleGraph.Ear.toWalk {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} :
        G.Ear H → (u : V) × (v : V) × G.Walk u v

        The underlying walk of an ear, packaged with its endpoints.

        Instances For
          @[simp]
          theorem SimpleGraph.Ear.toWalk_open {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u v : V} (p : G.Walk u v) (hp : p.IsPath) (hu : u ∈ H.verts) (hv : v ∈ H.verts) (huv : u ≠ v) (hint : ∀ w ∈ p.support, w ≠ u → w ≠ v → w ∉ H.verts) (hedge : ∀ e ∈ p.edges, e ∉ H.edgeSet) :
          («open» p hp hu hv huv hint hedge).toWalk = ⟨u, ⟨v, p⟩⟩
          @[simp]
          theorem SimpleGraph.Ear.toWalk_closed {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u : V} (c : G.Walk u u) (hc : c.IsCycle) (hu : u ∈ H.verts) (hint : ∀ w ∈ c.support, w ≠ u → w ∉ H.verts) :
          (closed c hc hu hint).toWalk = ⟨u, ⟨u, c⟩⟩
          theorem SimpleGraph.Ear.ext {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {e₁ e₂ : G.Ear H} (h : e₁.toWalk = e₂.toWalk) :
          e₁ = e₂

          Ears over H are determined by their underlying walk; distinctness vs. equality of the walk's endpoints distinguishes open ears from closed ears.

          theorem SimpleGraph.Ear.ext_iff {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {e₁ e₂ : G.Ear H} :
          e₁ = e₂ ↔ e₁.toWalk = e₂.toWalk
          def SimpleGraph.Ear.toSubgraph {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} :
          G.Ear H → G.Subgraph

          The subgraph traced by the vertices and edges of an ear.

          Instances For
            @[simp]
            theorem SimpleGraph.Ear.toSubgraph_open {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u v : V} (p : G.Walk u v) (hp : p.IsPath) (hu : u ∈ H.verts) (hv : v ∈ H.verts) (huv : u ≠ v) (hint : ∀ w ∈ p.support, w ≠ u → w ≠ v → w ∉ H.verts) (hedge : ∀ e ∈ p.edges, e ∉ H.edgeSet) :
            («open» p hp hu hv huv hint hedge).toSubgraph = p.toSubgraph
            @[simp]
            theorem SimpleGraph.Ear.toSubgraph_closed {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u : V} (c : G.Walk u u) (hc : c.IsCycle) (hu : u ∈ H.verts) (hint : ∀ w ∈ c.support, w ≠ u → w ∉ H.verts) :
            (closed c hc hu hint).toSubgraph = c.toSubgraph
            def SimpleGraph.Ear.adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :

            The subgraph obtained by adjoining an ear e to H.

            Instances For
              theorem SimpleGraph.Ear.adjoin_def {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
              e.adjoin = H ⊔ e.toSubgraph
              @[simp]
              theorem SimpleGraph.Ear.verts_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
              @[simp]
              theorem SimpleGraph.Ear.edgeSet_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
              @[simp]
              theorem SimpleGraph.Ear.adj_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) {u v : V} :
              e.adjoin.Adj u v ↔ H.Adj u v ∨ e.toSubgraph.Adj u v
              theorem SimpleGraph.Ear.le_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
              def SimpleGraph.Ear.copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (e : G.Ear H) (h : H = H') :
              G.Ear H'

              Transport an ear along an equality of base subgraphs without altering its walk data.

              Instances For
                @[simp]
                theorem SimpleGraph.Ear.copy_rfl {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
                e.copy ⋯ = e
                @[simp]
                theorem SimpleGraph.Ear.kind_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (e : G.Ear H) (h : H = H') :
                (e.copy h).kind = e.kind
                @[simp]
                theorem SimpleGraph.Ear.toWalk_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (e : G.Ear H) (h : H = H') :
                @[simp]
                theorem SimpleGraph.Ear.toSubgraph_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (e : G.Ear H) (h : H = H') :
                @[simp]
                theorem SimpleGraph.Ear.adjoin_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (e : G.Ear H) (h : H = H') :
                (e.copy h).adjoin = H' ⊔ e.toSubgraph
                theorem SimpleGraph.Ear.fst_mem_verts {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :

                The starting vertex of an ear lies in H.

                theorem SimpleGraph.Ear.snd_mem_verts {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :

                The ending vertex of an ear lies in H.

                theorem SimpleGraph.Ear.isTrail {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :

                Every ear is a trail (its edges are pairwise distinct).

                theorem SimpleGraph.Ear.not_nil {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :

                Every ear has positive length (is not a trivial nil walk).

                theorem SimpleGraph.Ear.length_pos {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
                theorem SimpleGraph.Ear.closed_edges_notMem_edgeSet {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {u : V} {c : G.Walk u u} (hint : ∀ w ∈ c.support, w ≠ u → w ∉ H.verts) {x : Sym2 V} (hx : x ∈ c.edges) :
                x ∉ H.edgeSet

                Closed-ear unused-edge property. In a simple graph, a cycle meeting H only at its base vertex uses no edge of H.

                theorem SimpleGraph.Ear.edges_notMem_edgeSet {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) {x : Sym2 V} (hx : x ∈ e.toWalk.snd.snd.edges) :
                x ∉ H.edgeSet

                No edge of an open or closed ear belongs to H.edgeSet.

                theorem SimpleGraph.Ear.lt_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (e : G.Ear H) :
                H < e.adjoin

                Adjoining an ear strictly enlarges H.

                theorem SimpleGraph.Ear.connected_adjoin {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (hH : H.Preconnected) (e : G.Ear H) :

                Adjoining any open or closed ear to a preconnected subgraph yields a connected subgraph.

                Adjoining any open or closed ear to a 2-edge-connected subgraph preserves 2-edge-connectivity, with no finiteness assumption.

                Initial subgraphs #

                inductive SimpleGraph.EarStart {V : Type u} (G : SimpleGraph V) :
                G.Subgraph → Type u

                Witness that an initial subgraph H : G.Subgraph of an ear decomposition is either a single vertex or traced by a cycle.

                Instances For
                  def SimpleGraph.EarStart.IsCycle {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} :
                  G.EarStart H → Prop

                  Whether the initial subgraph is a cycle rather than a single vertex.

                  Instances For
                    @[simp]
                    theorem SimpleGraph.EarStart.isCycle_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :
                    theorem SimpleGraph.EarStart.connected {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} :
                    ∀ (x : G.EarStart H), H.Connected

                    Every valid initial subgraph is connected.

                    Every valid initial subgraph of an ear decomposition is 2-edge-connected.

                    Ear decompositions #

                    structure SimpleGraph.EarDecomposition {V : Type u} (G : SimpleGraph V) (H : G.Subgraph) :

                    A finite ear decomposition in G with final subgraph H, storing the prefix subgraphs, the initial vertex or cycle witness, and the ear added at each step.

                    Instances For

                      The initial subgraph (subgraphAfter 0) of an ear decomposition.

                      Instances For

                        The kind (open or closed) of the i-th ear.

                        Instances For
                          def SimpleGraph.EarDecomposition.walkAt {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (i : Fin d.length) :
                          (u : V) × (v : V) × G.Walk u v

                          The underlying walk (with endpoints) of the i-th ear.

                          Instances For
                            theorem SimpleGraph.EarDecomposition.ext {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {d₁ d₂ : G.EarDecomposition H} (hlen : d₁.length = d₂.length) (hinit : d₁.initial = d₂.initial) (hstart : d₁.start ≍ d₂.start) (hwalk : ∀ (i : Fin d₁.length), d₁.walkAt i = d₂.walkAt (Fin.cast hlen i)) :
                            d₁ = d₂

                            An ear decomposition is determined by its length, initial subgraph and witness, and displayed ear walks; the intermediate prefix subgraphs and ear records are uniquely forced.

                            theorem SimpleGraph.EarDecomposition.ext_iff {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {d₁ d₂ : G.EarDecomposition H} :
                            d₁ = d₂ ↔ ∃ (hlen : d₁.length = d₂.length), d₁.initial = d₂.initial ∧ d₁.start ≍ d₂.start ∧ ∀ (i : Fin d₁.length), d₁.walkAt i = d₂.walkAt (Fin.cast hlen i)

                            An ear decomposition is open if it starts from a cycle and every added ear is open.

                            Instances For
                              def SimpleGraph.EarDecomposition.copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :

                              Reindex the target subgraph of an ear decomposition along H = H' without changing any data fields.

                              Instances For
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.copy_rfl {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) :
                                d.copy ⋯ = d
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.length_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.initial_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.start_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :
                                (d.copy h).start = d.start
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.earAt_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :
                                (d.copy h).earAt = d.earAt
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.walkAt_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') (i : Fin d.length) :
                                (d.copy h).walkAt i = d.walkAt i
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.kindAt_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') (i : Fin d.length) :
                                (d.copy h).kindAt i = d.kindAt i
                                @[simp]
                                theorem SimpleGraph.EarDecomposition.isOpen_copy {V : Type u} {G : SimpleGraph V} {H H' : G.Subgraph} (d : G.EarDecomposition H) (h : H = H') :

                                Constructors: vertex, cycle, snoc, and prefix #

                                The zero-ear decomposition starting at a single vertex v.

                                Instances For
                                  @[simp]
                                  def SimpleGraph.EarDecomposition.cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :

                                  The zero-ear decomposition starting at a cycle c.

                                  Instances For
                                    @[simp]
                                    theorem SimpleGraph.EarDecomposition.length_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :
                                    (cycle c hc).length = 0
                                    @[simp]
                                    theorem SimpleGraph.EarDecomposition.subgraphAfter_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) (k : Fin ((cycle c hc).length + 1)) :
                                    @[simp]
                                    theorem SimpleGraph.EarDecomposition.initial_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :
                                    @[simp]
                                    theorem SimpleGraph.EarDecomposition.start_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :
                                    (cycle c hc).start = ⋯ ▸ EarStart.cycle c hc
                                    @[simp]
                                    theorem SimpleGraph.EarDecomposition.isOpen_cycle {V : Type u} {G : SimpleGraph V} {u : V} (c : G.Walk u u) (hc : c.IsCycle) :
                                    (cycle c hc).IsOpen

                                    Append one ear e : G.Ear H to the end of an ear decomposition d : G.EarDecomposition H.

                                    Instances For
                                      @[simp]
                                      theorem SimpleGraph.EarDecomposition.length_snoc {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (e : G.Ear H) :
                                      (d.snoc e).length = d.length + 1
                                      @[simp]
                                      theorem SimpleGraph.EarDecomposition.initial_snoc {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (e : G.Ear H) :
                                      @[simp]
                                      theorem SimpleGraph.EarDecomposition.start_snoc {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (e : G.Ear H) :
                                      (d.snoc e).start = ⋯ ▸ d.start
                                      @[simp]
                                      theorem SimpleGraph.EarDecomposition.walkAt_snoc_castSucc {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (e : G.Ear H) (i : Fin d.length) :
                                      @[simp]
                                      @[simp]
                                      theorem SimpleGraph.EarDecomposition.kindAt_snoc_castSucc {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (e : G.Ear H) (i : Fin d.length) :
                                      @[simp]

                                      The initial segment of d consisting of its first k ears, forming an ear decomposition of d.subgraphAfter k.

                                      Instances For
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.length_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) :
                                        (d.prefix k).length = ↑k
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.subgraphAfter_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) (j : Fin (↑k + 1)) :
                                        @[simp]
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.start_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) :
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.earAt_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) (j : Fin ↑k) :
                                        (d.prefix k).earAt j = d.earAt (Fin.castLE ⋯ j)
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.walkAt_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) (j : Fin ↑k) :
                                        (d.prefix k).walkAt j = d.walkAt (Fin.castLE ⋯ j)
                                        @[simp]
                                        theorem SimpleGraph.EarDecomposition.kindAt_prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (k : Fin (d.length + 1)) (j : Fin ↑k) :
                                        (d.prefix k).kindAt j = d.kindAt (Fin.castLE ⋯ j)
                                        theorem SimpleGraph.EarDecomposition.IsOpen.prefix {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} {d : G.EarDecomposition H} (hd : d.IsOpen) (k : Fin (d.length + 1)) :

                                        Prefix monotonicity and induction #

                                        Prefix subgraphs of an ear decomposition are strictly increasing.

                                        Prefix subgraphs of an ear decomposition are monotone.

                                        theorem SimpleGraph.EarDecomposition.subgraphAfter_induction {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) {P : G.Subgraph → Prop} (h0 : P d.initial) (hstep : ∀ (i : Fin d.length), P (d.subgraphAfter i.castSucc) → P (d.earAt i).adjoin) (k : Fin (d.length + 1)) :

                                        Induction along the prefix subgraphs of an ear decomposition in construction order.

                                        theorem SimpleGraph.EarDecomposition.final_induction {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) {P : G.Subgraph → Prop} (h0 : P d.initial) (hstep : ∀ (i : Fin d.length), P (d.subgraphAfter i.castSucc) → P (d.earAt i).adjoin) :
                                        P H

                                        Induction in construction order proving a property of the final subgraph H.

                                        theorem SimpleGraph.EarDecomposition.prefix_induction {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) {P : ⦃K : G.Subgraph⦄ → G.EarDecomposition K → Prop} (h0 : P (d.prefix 0)) (hstep : ∀ (i : Fin d.length), P (d.prefix i.castSucc) → P (d.prefix i.succ)) (k : Fin (d.length + 1)) :
                                        P (d.prefix k)

                                        Induction along the prefix ear decompositions d.prefix k.

                                        Edge partition and coverage #

                                        Every edge of H belongs either to d.initial or to one of the added ears.

                                        theorem SimpleGraph.EarDecomposition.notMem_initial_of_mem_walkAt {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) (i : Fin d.length) {x : Sym2 V} (hx : x ∈ (d.walkAt i).snd.snd.edges) :

                                        No edge of an added ear belongs to the initial subgraph.

                                        theorem SimpleGraph.EarDecomposition.eq_of_mem_walkAt {V : Type u} {G : SimpleGraph V} {H : G.Subgraph} (d : G.EarDecomposition H) {i j : Fin d.length} {x : Sym2 V} (hi : x ∈ (d.walkAt i).snd.snd.edges) (hj : x ∈ (d.walkAt j).snd.snd.edges) :
                                        i = j

                                        Distinct ears of an ear decomposition share no edges.

                                        An ear decomposition of ⊤ covers every vertex of G.

                                        An ear decomposition of ⊤ partitions every edge of G outside d.initial into a unique added ear.

                                        Preservation of connectedness and 2-edge-connectivity #

                                        Every prefix subgraph of an ear decomposition is connected.

                                        The final subgraph of an ear decomposition is connected.

                                        A simple graph with an ear decomposition of ⊤ is connected, with no finiteness assumption.

                                        Every prefix subgraph of an ear decomposition is 2-edge-connected.

                                        The final subgraph of an ear decomposition is 2-edge-connected.

                                        A simple graph with an ear decomposition of ⊤ is 2-edge-connected, with no finiteness assumption.