Documentation

LeanPool.NashWilliams.Combinatorics.Front.Rank

The tree of a front is well-founded #

The tree of a front F is the set of all prefixes (initial segments) of elements of F, ordered by proper end-extension (treeExt F a b : a properly extends b). This file proves that this relation is well-founded, so a front has an ordinal rank.

Well-foundedness is proved directly, by showing there is no infinite descending chain. A descending chain is an ascending tower f 0 ⊏ f 1 ⊏ ⋯ of proper extensions inside the tree. Its lengths grow without bound, so the tower has a limit b : ℕ → ℕ, a strictly increasing subsequence of M. By Density some t ∈ F is an initial segment of b; extending it by one more entry of b lands inside some u ∈ F with t <+: u, so Incomparability forces t = u — impossible, as u is strictly longer.

Main results #

theorem RelHom.rank_le {α β : Type u} {r : ααProp} {s : ββProp} [IsWellFounded α r] [IsWellFounded β s] (f : r →r s) (a : α) :

A relation homomorphism does not increase rank. If f : r →r s maps r into a well-founded relation s, then the r-rank of a is at most the s-rank of f a. This is the cross-relation companion to IsWellFounded.rank_lt_of_rel (which only compares ranks within a single relation), and the tool underlying the rank comparisons for the ray and the restriction of a front. General; Mathlib-bound (belongs next to IsWellFounded.rank_lt_of_rel).

def Front.tree (F : Set (List )) :

The tree of a front F: all prefixes (initial segments) of elements of F.

Equations
Instances For
    def Front.treeExt (F : Set (List )) (a b : List ) :

    Proper end-extension inside the tree of F: treeExt F a b holds when a properly extends b and both lie in the tree. Its well-foundedness is what allows ranking a front. Note the recursion direction: IsWellFounded.rank (treeExt F) s is the supremum of succ (rank s') over the proper extensions s' of s, matching the usual rank of a front.

    Equations
    Instances For
      theorem Front.strictMono_of_pairwise_map {b : } (h : ∀ (n : ), List.Pairwise (fun (x1 x2 : ) => x1 < x2) (List.map b (List.range n))) :

      If every finite initial segment of b is strictly increasing, then b is strictly monotone.

      theorem Front.exists_strictMono_comp {M b : } (hM : StrictMono M) (hb : StrictMono b) (hsub : ∀ (i : ), b i Set.range M) :
      ∃ (g : ), StrictMono g M g = b

      Enumeration bridge. A strictly monotone b whose range is contained in that of a strictly monotone M is a subsequence M ∘ g of M, for a unique strictly monotone g.

      theorem Front.IsFront.wellFounded_treeExt {F : Set (List )} {M : } (hF : IsFront F M) :

      Proper end-extension is well-founded on the tree of a front. Proved directly: there is no infinite descending chain.

      noncomputable def Front.IsFront.rank {F : Set (List )} {M : } (hF : IsFront F M) :

      The ordinal rank of a front: the rank of the root [] in the well-founded tree of proper end-extensions.

      Equations
      Instances For
        theorem Front.IsFront.nil_mem_tree {F : Set (List )} {M : } (hF : IsFront F M) :

        The root [] is in the tree of any front (fronts are nonempty by Density).

        theorem Front.exists_gt_range {M : } (hM : StrictMono M) (n : ) :
        xSet.range M, n < x

        M being a strictly monotone enumeration, there is an element of M above any bound.

        theorem Front.exists_extend_gt {M : } (hM : StrictMono M) (s : List ) :
        xSet.range M, ys, y < x

        An increasing list contained in M can be extended by one further element of M.

        theorem Front.exists_extend_len {M : } (hM : StrictMono M) (L : ) (s : List ) :
        List.Pairwise (fun (x1 x2 : ) => x1 < x2) s(∀ xs, x Set.range M)s.length L∃ (t : List ), s <+: t List.Pairwise (fun (x1 x2 : ) => x1 < x2) t (∀ xt, x Set.range M) t.length = L

        Any increasing list in M extends to an increasing list in M of any prescribed length.

        theorem Front.rank_eq_sub {F : Set (List )} {M : } (hF : IsFront F M) {s0 : List } (L : ) (hbound : ∀ (s : List ), s0 <+: ss tree Fs.length L) (hext : ∀ (s : List ), s0 <+: ss tree Fs.length < L∃ (x : ), treeExt F (s ++ [x]) s) (s : List ) (hs0 : s0 <+: s) (hs : s tree F) :

        General rank formula. If, above a fixed node s0, every tree node has length ≤ L and every tree node of length < L has a one-step extension in the tree, then the rank of a node s above s0 is L - s.length.

        theorem Front.mem_tree_powK {M : } (hM : StrictMono M) {k : } {s : List } :
        s tree (powK M k) List.Pairwise (fun (x1 x2 : ) => x1 < x2) s (∀ xs, x Set.range M) s.length k

        Membership in the tree of [M]^k: increasing lists in M of length at most k.

        theorem Front.powK_rank {M : } (hM : StrictMono M) (k : ) :
        .rank = k

        The uniform front [M]^k has rank k.

        theorem Front.mem_tree_schreier {M : } (hM : StrictMono M) {s : List } :
        s tree (schreier M) List.Pairwise (fun (x1 x2 : ) => x1 < x2) s (∀ xs, x Set.range M) ∀ (a : ), s.head? = some as.length a + 1

        Membership in the tree of the Schreier front.

        theorem Front.schreier_rank_node {M : } (hM : StrictMono M) {s : List } {a : } (hsmem : s tree (schreier M)) (hhead : s.head? = some a) :

        Interior of the Schreier front. A node s in the tree with first element a has rank a + 1 - s.length.

        theorem Front.schreier_rank {M : } (hM : StrictMono M) :

        The Schreier front has rank ω.