Documentation

Mathlib.Order.Fin.Basic

Fin n forms a bounded linear order #

This file contains the linear ordered instance on Fin n.

Fin n is the type whose elements are natural numbers smaller than n. This file expands on the development in the core library.

Main definitions #

Instances #

@[implicit_reducible]
instance Fin.instMax_mathlib {n : โ„•} :
Max (Fin n)
@[implicit_reducible]
instance Fin.instMin_mathlib {n : โ„•} :
Min (Fin n)
@[simp]
theorem Fin.coe_max {n : โ„•} (a b : Fin n) :
โ†‘(max a b) = max โ†‘a โ†‘b
@[simp]
theorem Fin.coe_min {n : โ„•} (a b : Fin n) :
โ†‘(min a b) = min โ†‘a โ†‘b
theorem Fin.compare_eq_compare_val {n : โ„•} (a b : Fin n) :
compare a b = compare โ†‘a โ†‘b
@[implicit_reducible]
instance Fin.instLinearOrder {n : โ„•} :
LinearOrder (Fin n)
@[implicit_reducible]
instance Fin.instBoundedOrder {n : โ„•} [NeZero n] :
BoundedOrder (Fin n)
@[implicit_reducible]
instance Fin.instBiheytingAlgebra {n : โ„•} [NeZero n] :

Extra instances to short-circuit type class resolution #

These also prevent non-computable instances being used to construct these instances non-computably.

@[implicit_reducible]
instance Fin.instPartialOrder {n : โ„•} :
PartialOrder (Fin n)
@[implicit_reducible]
instance Fin.instLattice {n : โ„•} :
Lattice (Fin n)
@[implicit_reducible]
instance Fin.instHeytingAlgebra {n : โ„•} [NeZero n] :
@[implicit_reducible]
instance Fin.instCoheytingAlgebra {n : โ„•} [NeZero n] :

Miscellaneous lemmas #

theorem Fin.top_eq_last (n : โ„•) :
โŠค = last n
theorem Fin.bot_eq_zero (n : โ„•) [NeZero n] :
@[simp]
theorem Fin.rev_bot {n : โ„•} [NeZero n] :
@[simp]
theorem Fin.rev_top {n : โ„•} [NeZero n] :
theorem Fin.rev_zero_eq_top (n : โ„•) [NeZero n] :
rev 0 = โŠค
theorem Fin.rev_last_eq_bot (n : โ„•) :
(last n).rev = โŠฅ
@[simp]
theorem Fin.succ_top (n : โ„•) [NeZero n] :
@[simp]
theorem Fin.val_top (n : โ„•) [NeZero n] :
โ†‘โŠค = n - 1
@[simp]
theorem Fin.zero_eq_top {n : โ„•} [NeZero n] :
0 = โŠค โ†” n = 1
@[simp]
theorem Fin.top_eq_zero {n : โ„•} [NeZero n] :
โŠค = 0 โ†” n = 1
@[simp]
theorem Fin.cast_top {m n : โ„•} [NeZero m] [NeZero n] (h : m = n) :
Fin.cast h โŠค = โŠค
theorem Fin.strictMono_pred_comp {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : ฮฑ โ†’ Fin (n + 1)} (hf : โˆ€ (a : ฮฑ), f a โ‰  0) (hfโ‚‚ : StrictMono f) :
StrictMono fun (a : ฮฑ) => (f a).pred โ‹ฏ
theorem Fin.monotone_pred_comp {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : ฮฑ โ†’ Fin (n + 1)} (hf : โˆ€ (a : ฮฑ), f a โ‰  0) (hfโ‚‚ : Monotone f) :
Monotone fun (a : ฮฑ) => (f a).pred โ‹ฏ
theorem Fin.strictMono_castPred_comp {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : ฮฑ โ†’ Fin (n + 1)} (hf : โˆ€ (a : ฮฑ), f a โ‰  last n) (hfโ‚‚ : StrictMono f) :
StrictMono fun (a : ฮฑ) => (f a).castPred โ‹ฏ
theorem Fin.monotone_castPred_comp {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : ฮฑ โ†’ Fin (n + 1)} (hf : โˆ€ (a : ฮฑ), f a โ‰  last n) (hfโ‚‚ : Monotone f) :
Monotone fun (a : ฮฑ) => (f a).castPred โ‹ฏ
theorem Fin.strictMono_iff_lt_succ {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : Fin (n + 1) โ†’ ฮฑ} :
StrictMono f โ†” โˆ€ (i : Fin n), f i.castSucc < f i.succ

A function f on Fin (n + 1) is strictly monotone if and only if f i < f (i + 1) for all i.

theorem Fin.monotone_iff_le_succ {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : Fin (n + 1) โ†’ ฮฑ} :
Monotone f โ†” โˆ€ (i : Fin n), f i.castSucc โ‰ค f i.succ

A function f on Fin (n + 1) is monotone if and only if f i โ‰ค f (i + 1) for all i.

theorem Fin.strictAnti_iff_succ_lt {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : Fin (n + 1) โ†’ ฮฑ} :
StrictAnti f โ†” โˆ€ (i : Fin n), f i.succ < f i.castSucc

A function f on Fin (n + 1) is strictly antitone if and only if f (i + 1) < f i for all i.

theorem Fin.antitone_iff_succ_le {n : โ„•} {ฮฑ : Type u_1} [Preorder ฮฑ] {f : Fin (n + 1) โ†’ ฮฑ} :
Antitone f โ†” โˆ€ (i : Fin n), f i.succ โ‰ค f i.castSucc

A function f on Fin (n + 1) is antitone if and only if f (i + 1) โ‰ค f i for all i.

theorem Fin.orderHom_injective_iff {ฮฑ : Type u_2} [PartialOrder ฮฑ] {n : โ„•} (f : Fin (n + 1) โ†’o ฮฑ) :
Function.Injective โ‡‘f โ†” โˆ€ (i : Fin n), f i.castSucc โ‰  f i.succ

Monotonicity #

theorem Fin.cast_strictMono {k l : โ„•} (h : k = l) :
StrictMono (Fin.cast h)
theorem Fin.strictMono_castLE {m n : โ„•} (h : n โ‰ค m) :
StrictMono (castLE h)
theorem Fin.strictMono_castAdd {n : โ„•} (m : โ„•) :
StrictMono (castAdd m)
theorem Fin.strictMono_natAdd {m : โ„•} (n : โ„•) :
StrictMono (natAdd n)
theorem Fin.strictMono_addNat {n : โ„•} (m : โ„•) :
StrictMono fun (x : Fin n) => x.addNat m
theorem Fin.strictMono_succAbove {n : โ„•} (p : Fin (n + 1)) :
@[simp]
theorem Fin.succAbove_inj {n : โ„•} {p : Fin (n + 1)} {i j : Fin n} :
p.succAbove i = p.succAbove j โ†” i = j
@[simp]
theorem Fin.succAbove_le_succAbove_iff {n : โ„•} {p : Fin (n + 1)} {i j : Fin n} :
p.succAbove i โ‰ค p.succAbove j โ†” i โ‰ค j
@[simp]
theorem Fin.succAbove_lt_succAbove_iff {n : โ„•} {p : Fin (n + 1)} {i j : Fin n} :
p.succAbove i < p.succAbove j โ†” i < j
@[simp]
theorem Fin.natAdd_inj {n : โ„•} (m : โ„•) {i j : Fin n} :
natAdd m i = natAdd m j โ†” i = j
theorem Fin.natAdd_injective (m n : โ„•) :
Function.Injective (natAdd n)
@[simp]
theorem Fin.natAdd_le_natAdd_iff {n : โ„•} (m : โ„•) {i j : Fin n} :
natAdd m i โ‰ค natAdd m j โ†” i โ‰ค j
@[simp]
theorem Fin.natAdd_lt_natAdd_iff {n : โ„•} (m : โ„•) {i j : Fin n} :
natAdd m i < natAdd m j โ†” i < j
@[simp]
theorem Fin.addNat_inj {n : โ„•} (m : โ„•) {i j : Fin n} :
i.addNat m = j.addNat m โ†” i = j
@[simp]
theorem Fin.addNat_le_addNat_iff {n : โ„•} (m : โ„•) {i j : Fin n} :
i.addNat m โ‰ค j.addNat m โ†” i โ‰ค j
@[simp]
theorem Fin.addNat_lt_addNat_iff {n : โ„•} (m : โ„•) {i j : Fin n} :
i.addNat m < j.addNat m โ†” i < j
@[simp]
theorem Fin.castLE_le_castLE_iff {m n : โ„•} {i j : Fin n} (h : n โ‰ค m) :
castLE h i โ‰ค castLE h j โ†” i โ‰ค j
@[simp]
theorem Fin.castLE_lt_castLE_iff {m n : โ„•} {i j : Fin n} (h : n โ‰ค m) :
castLE h i < castLE h j โ†” i < j
theorem Fin.predAbove_left_monotone {n : โ„•} (i : Fin (n + 1)) :
Monotone fun (p : Fin n) => p.predAbove i
theorem Fin.predAbove_le_predAbove {n : โ„•} {p q : Fin n} (hpq : p โ‰ค q) {i j : Fin (n + 1)} (hij : i โ‰ค j) :
def Fin.predAboveOrderHom {n : โ„•} (p : Fin n) :
Fin (n + 1) โ†’o Fin n

Fin.predAbove p as an OrderHom.

Instances For
    @[simp]
    theorem Fin.predAboveOrderHom_coe {n : โ„•} (p : Fin n) (i : Fin (n + 1)) :
    theorem Fin.predAbove_left_injective {n : โ„•} :
    Function.Injective predAbove

    predAbove is injective at the pivot

    @[simp]
    theorem Fin.predAbove_left_inj {n : โ„•} {x y : Fin n} :
    x.predAbove = y.predAbove โ†” x = y

    predAbove is injective at the pivot

    Order isomorphisms #

    def Fin.orderIsoSubtype {n : โ„•} :
    Fin n โ‰ƒo { i : โ„• // i < n }

    The equivalence Fin n โ‰ƒ {i // i < n} is an order isomorphism.

    Instances For
      @[simp]
      theorem Fin.orderIsoSubtype_symm_apply {n : โ„•} (a : { i : โ„• // i < n }) :
      (RelIso.symm orderIsoSubtype) a = โŸจโ†‘a, โ‹ฏโŸฉ
      @[simp]
      theorem Fin.orderIsoSubtype_apply {n : โ„•} (a : Fin n) :
      orderIsoSubtype a = โŸจโ†‘a, โ‹ฏโŸฉ
      def Fin.castOrderIso {m n : โ„•} (eq : n = m) :
      Fin n โ‰ƒo Fin m

      Fin.cast as an OrderIso.

      castOrderIso eq i embeds i into an equal Fin type.

      Instances For
        @[simp]
        theorem Fin.castOrderIso_symm_apply {m n : โ„•} (eq : n = m) (i : Fin m) :
        (RelIso.symm (castOrderIso eq)) i = Fin.cast โ‹ฏ i
        @[simp]
        theorem Fin.castOrderIso_apply {m n : โ„•} (eq : n = m) (i : Fin n) :
        (castOrderIso eq) i = Fin.cast eq i
        @[simp]
        theorem Fin.symm_castOrderIso {m n : โ„•} (h : n = m) :
        @[simp]
        theorem Fin.castOrderIso_refl {n : โ„•} (h : n = n := โ‹ฏ) :
        theorem Fin.castOrderIso_toEquiv {m n : โ„•} (h : n = m) :

        While in many cases Fin.castOrderIso is better than Equiv.cast/cast, sometimes we want to apply a generic lemma about cast.

        def Fin.revOrderIso {n : โ„•} :

        Fin.rev n as an order-reversing isomorphism.

        Instances For
          @[simp]
          theorem Fin.revOrderIso_apply {n : โ„•} (aโœ : (Fin n)แต’แตˆ) :
          revOrderIso aโœ = (OrderDual.ofDual aโœ).rev
          @[simp]
          theorem Fin.revOrderIso_symm_apply {n : โ„•} (i : Fin n) :
          theorem Fin.rev_anti {n : โ„•} :

          Order embeddings #

          def Fin.valOrderEmb (n : โ„•) :
          Fin n โ†ชo โ„•

          The inclusion map Fin n โ†’ โ„• is an order embedding.

          Instances For
            @[simp]
            theorem Fin.valOrderEmb_apply (n : โ„•) (self : Fin n) :
            (valOrderEmb n) self = โ†‘self
            @[implicit_reducible]
            instance Fin.OrderEmbedding.instInhabitedOrderEmbeddingNat {n : โ„•} :
            Inhabited (Fin n โ†ชo โ„•)
            instance Fin.Lt.isWellOrder (n : โ„•) :
            IsWellOrder (Fin n) fun (x1 x2 : Fin n) => x1 < x2

            The ordering on Fin n is a well order.

            def Fin.succOrderEmb (n : โ„•) :
            Fin n โ†ชo Fin (n + 1)

            Fin.succ as an OrderEmbedding

            Instances For
              @[simp]
              theorem Fin.coe_succOrderEmb {n : โ„•} :
              โ‡‘(succOrderEmb n) = succ
              def Fin.castLEOrderEmb {m n : โ„•} (h : n โ‰ค m) :
              Fin n โ†ชo Fin m

              Fin.castLE as an OrderEmbedding.

              castLEEmb h i embeds i into a larger Fin type.

              Instances For
                @[simp]
                theorem Fin.castLEOrderEmb_apply {m n : โ„•} (h : n โ‰ค m) (i : Fin n) :
                (castLEOrderEmb h) i = castLE h i
                @[simp]
                theorem Fin.castLEOrderEmb_toEmbedding {m n : โ„•} (h : n โ‰ค m) :
                (castLEOrderEmb h).toEmbedding = { toFun := castLE h, inj' := โ‹ฏ }
                def Fin.castAddOrderEmb {n : โ„•} (m : โ„•) :
                Fin n โ†ชo Fin (n + m)

                Fin.castAdd as an OrderEmbedding.

                castAddEmb m i embeds i : Fin n in Fin (n+m). See also Fin.natAddEmb and Fin.addNatEmb.

                Instances For
                  @[simp]
                  theorem Fin.castAddOrderEmb_apply {n : โ„•} (m : โ„•) (aโœ : Fin n) :
                  (castAddOrderEmb m) aโœ = castAdd m aโœ
                  @[simp]
                  theorem Fin.castAddOrderEmb_toEmbedding {n : โ„•} (m : โ„•) :
                  (castAddOrderEmb m).toEmbedding = { toFun := castAdd m, inj' := โ‹ฏ }
                  def Fin.castSuccOrderEmb {n : โ„•} :
                  Fin n โ†ชo Fin (n + 1)

                  Fin.castSucc as an OrderEmbedding.

                  castSuccOrderEmb i embeds i : Fin n in Fin (n+1).

                  Instances For
                    @[simp]
                    theorem Fin.castSuccOrderEmb_apply {n : โ„•} (aโœ : Fin n) :
                    castSuccOrderEmb aโœ = aโœ.castSucc
                    @[simp]
                    theorem Fin.castSuccOrderEmb_toEmbedding {n : โ„•} :
                    castSuccOrderEmb.toEmbedding = { toFun := castSucc, inj' := โ‹ฏ }
                    def Fin.addNatOrderEmb {n : โ„•} (m : โ„•) :
                    Fin n โ†ชo Fin (n + m)

                    Fin.addNat as an OrderEmbedding.

                    addNatOrderEmb m i adds m to i, generalizes Fin.succ.

                    Instances For
                      @[simp]
                      theorem Fin.addNatOrderEmb_toEmbedding {n : โ„•} (m : โ„•) :
                      (addNatOrderEmb m).toEmbedding = { toFun := fun (x : Fin n) => x.addNat m, inj' := โ‹ฏ }
                      @[simp]
                      theorem Fin.addNatOrderEmb_apply {n : โ„•} (m : โ„•) (xโœ : Fin n) :
                      (addNatOrderEmb m) xโœ = xโœ.addNat m
                      def Fin.natAddOrderEmb {m : โ„•} (n : โ„•) :
                      Fin m โ†ชo Fin (n + m)

                      Fin.natAdd as an OrderEmbedding.

                      natAddOrderEmb n i adds n to i "on the left".

                      Instances For
                        @[simp]
                        theorem Fin.natAddOrderEmb_apply {m : โ„•} (n : โ„•) (i : Fin m) :
                        (natAddOrderEmb n) i = natAdd n i
                        @[simp]
                        theorem Fin.natAddOrderEmb_toEmbedding {m : โ„•} (n : โ„•) :
                        (natAddOrderEmb n).toEmbedding = { toFun := natAdd n, inj' := โ‹ฏ }
                        def Fin.succAboveOrderEmb {n : โ„•} (p : Fin (n + 1)) :
                        Fin n โ†ชo Fin (n + 1)

                        Fin.succAbove p as an OrderEmbedding.

                        Instances For
                          @[simp]
                          theorem Fin.succAboveOrderEmb_apply {n : โ„•} (p : Fin (n + 1)) (i : Fin n) :
                          @[simp]
                          theorem Fin.succAboveOrderEmb_toEmbedding {n : โ„•} (p : Fin (n + 1)) :
                          p.succAboveOrderEmb.toEmbedding = { toFun := p.succAbove, inj' := โ‹ฏ }

                          Uniqueness of order isomorphisms #

                          @[simp]
                          theorem Fin.coe_orderIso_apply {m n : โ„•} (e : Fin n โ‰ƒo Fin m) (i : Fin n) :
                          โ†‘(e i) = โ†‘i

                          If e is an orderIso between Fin n and Fin m, then n = m and e is the identity map. In this lemma we state that for each i : Fin n we have (e i : โ„•) = (i : โ„•).