Documentation

Mathlib.Combinatorics.Enumerative.DyckWord

Dyck words #

A Dyck word is a sequence consisting of an equal number n of symbols of two types such that for all prefixes one symbol occurs at least as many times as the other. If the symbols are ( and ) the latter restriction is equivalent to balanced brackets; if they are U = (1, 1) and D = (1, -1) the sequence is a lattice path from (0, 0) to (0, 2n) and the restriction requires the path to never go below the x-axis.

This file defines Dyck words and constructs their bijection with rooted binary trees, one consequence being that the number of Dyck words with length 2 * n is catalan n.

Main definitions #

Main results #

Implementation notes #

While any two-valued type could have been used for DyckStep, a new enumerated type is used here to emphasise that the definition of a Dyck word does not depend on that underlying type.

inductive DyckStep :

A DyckStep is either U or D, corresponding to ( and ) respectively.

Instances For
    theorem DyckStep.dichotomy (s : DyckStep) :
    s = U s = D

    Named in analogy to Bool.dichotomy.

    structure DyckWord :

    A Dyck word is a list of DyckSteps with as many Us as Ds and with every prefix having at least as many Us as Ds.

    Instances For
      theorem DyckWord.ext {x y : DyckWord} (toList : x = y) :
      x = y
      theorem DyckWord.ext_iff {x y : DyckWord} :
      x = y x = y
      def instDecidableEqDyckWord.decEq (x✝ x✝¹ : DyckWord) :
      Decidable (x✝ = x✝¹)
      Equations
        Instances For

          Dyck words form an additive cancellative monoid under concatenation, with the empty word as 0.

          Equations
            theorem DyckWord.toList_eq_nil {p : DyckWord} :
            p = [] p = 0

            The only Dyck word that is an additive unit is the empty word.

            Equations
              theorem DyckWord.head_eq_U (p : DyckWord) (h : p []) :
              (↑p).head h = DyckStep.U

              The first element of a nonempty Dyck word is U.

              theorem DyckWord.getLast_eq_D (p : DyckWord) (h : p []) :

              The last element of a nonempty Dyck word is D.

              Prefix of a Dyck word as a Dyck word, given that the count of Us and Ds in it are equal.

              Equations
                Instances For

                  Suffix of a Dyck word as a Dyck word, given that the count of Us and Ds in the prefix are equal.

                  Equations
                    Instances For

                      Nest p in one pair of brackets, i.e. x becomes (x).

                      Equations
                        Instances For
                          @[simp]

                          A property stating that p is nonempty and strictly positive in its interior, i.e. is of the form (x) with x a Dyck word.

                          Equations
                            Instances For

                              Denest p, i.e. (x) becomes x, given that p.IsNested.

                              Equations
                                Instances For
                                  theorem DyckWord.nest_denest (p : DyckWord) (hn : p.IsNested) :
                                  (p.denest hn).nest = p

                                  The semilength of a Dyck word is half of the number of DyckSteps in it, or equivalently its number of Us.

                                  Equations
                                    Instances For

                                      p.firstReturn is 0 if p = 0 and the index of the D matching the initial U otherwise.

                                      Equations
                                        Instances For

                                          The left part of the Dyck word decomposition, inside the U, D pair that firstReturn refers to. insidePart 0 = 0.

                                          Equations
                                            Instances For

                                              The right part of the Dyck word decomposition, outside the U, D pair that firstReturn refers to. outsidePart 0 = 0.

                                              Equations
                                                Instances For
                                                  @[simp]
                                                  theorem DyckWord.insidePart_add {p q : DyckWord} (h : p 0) :
                                                  @[simp]
                                                  theorem DyckWord.outsidePart_add {p q : DyckWord} (h : p 0) :
                                                  @[irreducible]
                                                  theorem DyckWord.le_add_self (p q : DyckWord) :
                                                  q p + q
                                                  theorem DyckWord.infix_of_le {p q : DyckWord} (h : p q) :
                                                  p <:+: q
                                                  theorem DyckWord.le_of_suffix {p q : DyckWord} (h : p <:+ q) :
                                                  p q

                                                  Partial order on Dyck words: p ≤ q if a (possibly empty) sequence of insidePart and outsidePart operations can turn q into p.

                                                  Equations
                                                    @[irreducible]

                                                    Convert a Dyck word to a binary rooted tree.

                                                    f(0) = nil. For a nonzero word find the D that matches the initial U, which has index p.firstReturn, then let x be everything strictly between said U and D, and y be everything strictly after said D. p = x.nest + y with x, y (possibly empty) Dyck words. f(p) = f(x) △ f(y), where △ (defined in Mathlib/Data/Tree/Basic.lean) joins two subtrees to a new root node.

                                                    Equations
                                                      Instances For

                                                        Convert a binary rooted tree to a Dyck word.

                                                        g(nil) = 0. A nonempty tree with left subtree l and right subtree r is sent to g(l).nest + g(r).

                                                        Equations
                                                          Instances For
                                                            @[irreducible]

                                                            Equivalence between Dyck words and rooted binary trees.

                                                            Equations
                                                              Instances For
                                                                @[simp]
                                                                @[simp, irreducible]
                                                                @[deprecated DyckWord.numNodes_toTree (since := "2026-02-03")]

                                                                Alias of DyckWord.numNodes_toTree.

                                                                Equivalence between Dyck words of semilength n and rooted binary trees with n internal nodes.

                                                                Equations
                                                                  Instances For
                                                                    @[simp]
                                                                    theorem DyckWord.equivTreesOfNumNodesEq_apply_coe (n : ) (a : { a : DyckWord // (fun (p : DyckWord) => p.semilength = n) a }) :
                                                                    ((equivTreesOfNumNodesEq n) a) = (↑a).toTree

                                                                    There are catalan n Dyck words of semilength n (or length 2 * n).

                                                                    Extension for the positivity tactic: p.firstReturn is positive if p is nonzero.

                                                                    Equations
                                                                      Instances For