Documentation

Mathlib.Logic.Equiv.Fin.Basic

Equivalences for Fin n #

Miscellaneous #

This is currently not very sorted. PRs welcome!

theorem Fin.preimage_apply_01_prod {ฮฑ : Fin 2 โ†’ Type u} (s : Set (ฮฑ 0)) (t : Set (ฮฑ 1)) :
(fun (f : (i : Fin 2) โ†’ ฮฑ i) => (f 0, f 1)) โปยน' s ร—หข t = Set.univ.pi (cons s (cons t finZeroElim))
theorem Fin.preimage_apply_01_prod' {ฮฑ : Type u} (s t : Set ฮฑ) :
(fun (f : Fin 2 โ†’ ฮฑ) => (f 0, f 1)) โปยน' s ร—หข t = Set.univ.pi ![s, t]
def prodEquivPiFinTwo (ฮฑ ฮฒ : Type u) :
ฮฑ ร— ฮฒ โ‰ƒ ((i : Fin 2) โ†’ ![ฮฑ, ฮฒ] i)

A product space ฮฑ ร— ฮฒ is equivalent to the space ฮ  i : Fin 2, ฮณ i, where ฮณ = Fin.cons ฮฑ (Fin.cons ฮฒ finZeroElim). See also piFinTwoEquiv and finTwoArrowEquiv.

Instances For
    @[simp]
    theorem prodEquivPiFinTwo_symm_apply (ฮฑ ฮฒ : Type u) :
    โ‡‘(prodEquivPiFinTwo ฮฑ ฮฒ).symm = fun (f : (i : Fin 2) โ†’ Fin.cons ฮฑ (Fin.cons ฮฒ finZeroElim) i) => (f 0, f 1)
    @[simp]
    theorem prodEquivPiFinTwo_apply (ฮฑ ฮฒ : Type u) :
    โ‡‘(prodEquivPiFinTwo ฮฑ ฮฒ) = fun (p : Fin.cons ฮฑ (Fin.cons ฮฒ finZeroElim) 0 ร— Fin.cons ฮฑ (Fin.cons ฮฒ finZeroElim) 1) => Fin.cons p.1 (Fin.cons p.2 finZeroElim)
    def finTwoArrowEquiv (ฮฑ : Type u_1) :
    (Fin 2 โ†’ ฮฑ) โ‰ƒ ฮฑ ร— ฮฑ

    The space of functions Fin 2 โ†’ ฮฑ is equivalent to ฮฑ ร— ฮฑ. See also piFinTwoEquiv and prodEquivPiFinTwo.

    Instances For
      @[simp]
      theorem finTwoArrowEquiv_apply (ฮฑ : Type u_1) :
      โ‡‘(finTwoArrowEquiv ฮฑ) = (piFinTwoEquiv fun (x : Fin 2) => ฮฑ).toFun
      @[simp]
      theorem finTwoArrowEquiv_symm_apply (ฮฑ : Type u_1) :
      โ‡‘(finTwoArrowEquiv ฮฑ).symm = fun (x : ฮฑ ร— ฮฑ) => ![x.1, x.2]
      def finSuccEquiv' {n : โ„•} (i : Fin (n + 1)) :
      Fin (n + 1) โ‰ƒ Option (Fin n)

      An equivalence that removes i and maps it to none. This is a version of Fin.predAbove that produces Option (Fin n) instead of mapping both i.castSucc and i.succ to i.

      Instances For
        @[simp]
        theorem finSuccEquiv'_at {n : โ„•} (i : Fin (n + 1)) :
        (finSuccEquiv' i) i = none
        @[simp]
        theorem finSuccEquiv'_succAbove {n : โ„•} (i : Fin (n + 1)) (j : Fin n) :
        (finSuccEquiv' i) (i.succAbove j) = some j
        theorem finSuccEquiv'_below {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : m.castSucc < i) :
        (finSuccEquiv' i) m.castSucc = some m
        theorem finSuccEquiv'_above {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : i โ‰ค m.castSucc) :
        (finSuccEquiv' i) m.succ = some m
        @[simp]
        theorem finSuccEquiv'_symm_none {n : โ„•} (i : Fin (n + 1)) :
        (finSuccEquiv' i).symm none = i
        @[simp]
        theorem finSuccEquiv'_symm_some {n : โ„•} (i : Fin (n + 1)) (j : Fin n) :
        (finSuccEquiv' i).symm (some j) = i.succAbove j
        @[simp]
        theorem finSuccEquiv'_eq_some {n : โ„•} {i j : Fin (n + 1)} {k : Fin n} :
        (finSuccEquiv' i) j = some k โ†” j = i.succAbove k
        @[simp]
        theorem finSuccEquiv'_eq_none {n : โ„•} {i j : Fin (n + 1)} :
        (finSuccEquiv' i) j = none โ†” i = j
        theorem finSuccEquiv'_symm_some_below {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : m.castSucc < i) :
        (finSuccEquiv' i).symm (some m) = m.castSucc
        theorem finSuccEquiv'_symm_some_above {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : i โ‰ค m.castSucc) :
        (finSuccEquiv' i).symm (some m) = m.succ
        theorem finSuccEquiv'_symm_coe_below {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : m.castSucc < i) :
        (finSuccEquiv' i).symm (some m) = m.castSucc
        theorem finSuccEquiv'_symm_coe_above {n : โ„•} {i : Fin (n + 1)} {m : Fin n} (h : i โ‰ค m.castSucc) :
        (finSuccEquiv' i).symm (some m) = m.succ
        def finSuccEquiv (n : โ„•) :
        Fin (n + 1) โ‰ƒ Option (Fin n)

        Equivalence between Fin (n + 1) and Option (Fin n). This is a version of Fin.pred that produces Option (Fin n) instead of requiring a proof that the input is not 0.

        Instances For
          @[simp]
          theorem finSuccEquiv_zero {n : โ„•} :
          (finSuccEquiv n) 0 = none
          @[simp]
          theorem finSuccEquiv_succ {n : โ„•} (m : Fin n) :
          (finSuccEquiv n) m.succ = some m
          @[simp]
          theorem finSuccEquiv_symm_none {n : โ„•} :
          (finSuccEquiv n).symm none = 0
          @[simp]
          theorem finSuccEquiv_symm_some {n : โ„•} (m : Fin n) :
          (finSuccEquiv n).symm (some m) = m.succ
          @[simp]
          theorem finSuccEquiv_eq_some {n : โ„•} {i : Fin (n + 1)} {j : Fin n} :
          (finSuccEquiv n) i = some j โ†” i = j.succ
          @[simp]
          theorem finSuccEquiv_eq_none {n : โ„•} {i : Fin (n + 1)} :
          (finSuccEquiv n) i = none โ†” i = 0
          theorem finSuccEquiv'_last_apply_castSucc {n : โ„•} (i : Fin n) :
          (finSuccEquiv' (Fin.last n)) i.castSucc = some i
          theorem finSuccEquiv'_last_apply {n : โ„•} {i : Fin (n + 1)} (h : i โ‰  Fin.last n) :
          (finSuccEquiv' (Fin.last n)) i = some (i.castLT โ‹ฏ)
          theorem finSuccEquiv'_ne_last_apply {n : โ„•} {i j : Fin (n + 1)} (hi : i โ‰  Fin.last n) (hj : j โ‰  i) :
          (finSuccEquiv' i) j = some ((i.castLT โ‹ฏ).predAbove j)
          def finSuccAboveEquiv {n : โ„•} (p : Fin (n + 1)) :
          Fin n โ‰ƒ { x : Fin (n + 1) // x โ‰  p }

          Fin.succAbove as an order isomorphism between Fin n and {x : Fin (n + 1) // x โ‰  p}.

          Instances For
            theorem finSuccAboveEquiv_apply {n : โ„•} (p : Fin (n + 1)) (i : Fin n) :
            (finSuccAboveEquiv p) i = โŸจp.succAbove i, โ‹ฏโŸฉ
            theorem finSuccAboveEquiv_symm_apply_last {n : โ„•} (x : { x : Fin (n + 1) // x โ‰  Fin.last n }) :
            (finSuccAboveEquiv (Fin.last n)).symm x = (โ†‘x).castLT โ‹ฏ
            theorem finSuccAboveEquiv_symm_apply_ne_last {n : โ„•} {p : Fin (n + 1)} (h : p โ‰  Fin.last n) (x : { x : Fin (n + 1) // x โ‰  p }) :
            (finSuccAboveEquiv p).symm x = (p.castLT โ‹ฏ).predAbove โ†‘x
            def finSuccEquivLast {n : โ„•} :
            Fin (n + 1) โ‰ƒ Option (Fin n)

            Equiv between Fin (n + 1) and Option (Fin n) sending Fin.last n to none

            Instances For
              @[simp]
              theorem finSuccEquivLast_castSucc {n : โ„•} (i : Fin n) :
              finSuccEquivLast i.castSucc = some i
              @[simp]
              theorem finSuccEquivLast_last {n : โ„•} :
              finSuccEquivLast (Fin.last n) = none
              @[simp]
              theorem finSuccEquivLast_symm_some {n : โ„•} (i : Fin n) :
              finSuccEquivLast.symm (some i) = i.castSucc
              @[simp]
              theorem finSuccEquivLast_symm_none {n : โ„•} :
              finSuccEquivLast.symm none = Fin.last n
              def Equiv.embeddingFinSucc (n : โ„•) (ฮน : Type u_1) :
              (Fin (n + 1) โ†ช ฮน) โ‰ƒ (e : Fin n โ†ช ฮน) ร— { i : ฮน // i โˆ‰ Set.range โ‡‘e }

              An embedding e : Fin (n+1) โ†ช ฮน corresponds to an embedding f : Fin n โ†ช ฮน (corresponding the last n coordinates of e) together with a value not taken by f (corresponding to e 0).

              Instances For
                @[simp]
                theorem Equiv.embeddingFinSucc_fst {n : โ„•} {ฮน : Type u_1} (e : Fin (n + 1) โ†ช ฮน) :
                โ‡‘((embeddingFinSucc n ฮน) e).fst = โ‡‘e โˆ˜ Fin.succ
                @[simp]
                theorem Equiv.embeddingFinSucc_snd {n : โ„•} {ฮน : Type u_1} (e : Fin (n + 1) โ†ช ฮน) :
                โ†‘((embeddingFinSucc n ฮน) e).snd = e 0
                @[simp]
                theorem Equiv.coe_embeddingFinSucc_symm {n : โ„•} {ฮน : Type u_1} (f : (e : Fin n โ†ช ฮน) ร— { i : ฮน // i โˆ‰ Set.range โ‡‘e }) :
                โ‡‘((embeddingFinSucc n ฮน).symm f) = Fin.cons โ†‘f.snd โ‡‘f.fst
                def finSumFinEquiv {m n : โ„•} :
                Fin m โŠ• Fin n โ‰ƒ Fin (m + n)

                Equivalence between Fin m โŠ• Fin n and Fin (m + n)

                Instances For
                  @[simp]
                  theorem finSumFinEquiv_apply_left {m n : โ„•} (i : Fin m) :
                  finSumFinEquiv (Sum.inl i) = Fin.castAdd n i
                  @[simp]
                  theorem finSumFinEquiv_apply_right {m n : โ„•} (i : Fin n) :
                  finSumFinEquiv (Sum.inr i) = Fin.natAdd m i
                  @[simp]
                  theorem finSumFinEquiv_symm_apply_castAdd {m n : โ„•} (x : Fin m) :
                  finSumFinEquiv.symm (Fin.castAdd n x) = Sum.inl x
                  @[simp]
                  theorem finSumFinEquiv_symm_apply_castSucc {m : โ„•} (x : Fin m) :
                  finSumFinEquiv.symm x.castSucc = Sum.inl x
                  @[simp]
                  theorem finSumFinEquiv_symm_apply_natAdd {m n : โ„•} (x : Fin n) :
                  finSumFinEquiv.symm (Fin.natAdd m x) = Sum.inr x
                  @[simp]
                  theorem finSumFinEquiv_symm_last {n : โ„•} :
                  finSumFinEquiv.symm (Fin.last n) = Sum.inr 0
                  def finSumNatEquiv (n : โ„•) :
                  Fin n โŠ• โ„• โ‰ƒ โ„•

                  Equivalence between Fin n โŠ• โ„• and โ„• that sends inl (a : Fin n) to (a : โ„•) and inr a to n + a.

                  Instances For
                    @[simp]
                    theorem finSumNatEquiv_apply_left {n : โ„•} (i : Fin n) :
                    (finSumNatEquiv n) (Sum.inl i) = โ†‘i
                    @[simp]
                    theorem finSumNatEquiv_apply_right {n : โ„•} (i : โ„•) :
                    (finSumNatEquiv n) (Sum.inr i) = n + i
                    @[simp]
                    theorem finSumNatEquiv_symm_apply_of_lt {n i : โ„•} (hi : i < n) :
                    (finSumNatEquiv n).symm i = Sum.inl โŸจi, hiโŸฉ
                    @[simp]
                    theorem finSumNatEquiv_symm_apply_of_ge {n i : โ„•} (hi : n โ‰ค i) :
                    (finSumNatEquiv n).symm i = Sum.inr (i - n)
                    theorem finSumNatEquiv_symm_apply_fin {n : โ„•} (i : Fin n) :
                    (finSumNatEquiv n).symm โ†‘i = Sum.inl i
                    theorem finSumNatEquiv_symm_apply_add_left {n : โ„•} (i : โ„•) :
                    (finSumNatEquiv n).symm (i + n) = Sum.inr i
                    theorem finSumNatEquiv_symm_apply_add_right {n : โ„•} (i : โ„•) :
                    (finSumNatEquiv n).symm (n + i) = Sum.inr i
                    @[simp]
                    theorem isLeft_finSumNatEquiv_symm_apply {n : โ„•} (i : โ„•) :
                    ((finSumNatEquiv n).symm i).isLeft = decide (i < n)
                    @[simp]
                    theorem isRight_finSumNatEquiv_symm_apply {n : โ„•} (i : โ„•) :
                    ((finSumNatEquiv n).symm i).isRight = decide (n โ‰ค i)
                    def finAddFlip {m n : โ„•} :
                    Fin (m + n) โ‰ƒ Fin (n + m)

                    The equivalence between Fin (m + n) and Fin (n + m) which rotates by n.

                    Instances For
                      @[simp]
                      theorem finAddFlip_apply_castAdd {m : โ„•} (k : Fin m) (n : โ„•) :
                      finAddFlip (Fin.castAdd n k) = Fin.natAdd n k
                      @[simp]
                      theorem finAddFlip_apply_natAdd {n : โ„•} (k : Fin n) (m : โ„•) :
                      finAddFlip (Fin.natAdd m k) = Fin.castAdd m k
                      @[simp]
                      theorem finAddFlip_apply_mk_left {m n k : โ„•} (h : k < m) (hk : k < m + n := โ‹ฏ) (hnk : n + k < n + m := โ‹ฏ) :
                      finAddFlip โŸจk, hkโŸฉ = โŸจn + k, hnkโŸฉ
                      @[simp]
                      theorem finAddFlip_apply_mk_right {m n k : โ„•} (hโ‚ : m โ‰ค k) (hโ‚‚ : k < m + n) :
                      finAddFlip โŸจk, hโ‚‚โŸฉ = โŸจk - m, โ‹ฏโŸฉ
                      def finProdFinEquiv {m n : โ„•} :
                      Fin m ร— Fin n โ‰ƒ Fin (m * n)

                      Equivalence between Fin m ร— Fin n and Fin (m * n)

                      Instances For
                        @[simp]
                        theorem finProdFinEquiv_apply_val {m n : โ„•} (x : Fin m ร— Fin n) :
                        โ†‘(finProdFinEquiv x) = โ†‘x.2 + n * โ†‘x.1
                        @[simp]
                        theorem finProdFinEquiv_symm_apply {m n : โ„•} (x : Fin (m * n)) :
                        finProdFinEquiv.symm x = (x.divNat, x.modNat)
                        def Nat.divModEquiv (n : โ„•) [NeZero n] :
                        โ„• โ‰ƒ โ„• ร— Fin n

                        The equivalence induced by a โ†ฆ (a / n, a % n) for nonzero n. This is like finProdFinEquiv.symm but with m infinite. See Nat.div_mod_unique for a similar propositional statement.

                        Instances For
                          @[simp]
                          theorem Nat.divModEquiv_symm_apply (n : โ„•) [NeZero n] (p : โ„• ร— Fin n) :
                          n.divModEquiv.symm p = p.1 * n + โ†‘p.2
                          @[simp]
                          theorem Nat.divModEquiv_apply (n : โ„•) [NeZero n] (a : โ„•) :
                          n.divModEquiv a = (a / n, Fin.ofNat n a)
                          def Int.divModEquiv (n : โ„•) [NeZero n] :
                          โ„ค โ‰ƒ โ„ค ร— Fin n

                          The equivalence induced by a โ†ฆ (a / n, a % n) for nonzero n. See Int.ediv_emod_unique for a similar propositional statement.

                          Instances For
                            @[simp]
                            theorem Int.divModEquiv_apply (n : โ„•) [NeZero n] (a : โ„ค) :
                            (divModEquiv n) a = (a / โ†‘n, Fin.ofNat n (a.natMod โ†‘n))
                            @[simp]
                            theorem Int.divModEquiv_symm_apply (n : โ„•) [NeZero n] (p : โ„ค ร— Fin n) :
                            (divModEquiv n).symm p = p.1 * โ†‘n + โ†‘โ†‘p.2
                            def Fin.castLEquiv {n m : โ„•} (h : n โ‰ค m) :
                            Fin n โ‰ƒ { i : Fin m // โ†‘i < n }

                            Promote a Fin n into a larger Fin m, as a subtype where the underlying values are retained.

                            This is the Equiv version of Fin.castLE.

                            Instances For
                              @[simp]
                              theorem Fin.castLEquiv_apply {n m : โ„•} (h : n โ‰ค m) (i : Fin n) :
                              (castLEquiv h) i = โŸจcastLE h i, โ‹ฏโŸฉ
                              @[simp]
                              theorem Fin.castLEquiv_symm_apply {n m : โ„•} (h : n โ‰ค m) (i : { i : Fin m // โ†‘i < n }) :
                              (castLEquiv h).symm i = โŸจโ†‘โ†‘i, โ‹ฏโŸฉ
                              def Fin.appendEquiv {ฮฑ : Type u_1} (m n : โ„•) :
                              (Fin m โ†’ ฮฑ) ร— (Fin n โ†’ ฮฑ) โ‰ƒ (Fin (m + n) โ†’ ฮฑ)

                              The natural Equiv between (Fin m โ†’ ฮฑ) ร— (Fin n โ†’ ฮฑ) and Fin (m + n) โ†’ ฮฑ

                              Instances For
                                @[simp]
                                theorem Fin.appendEquiv_apply {ฮฑ : Type u_1} (m n : โ„•) (fg : (Fin m โ†’ ฮฑ) ร— (Fin n โ†’ ฮฑ)) (aโœ : Fin (m + n)) :
                                (appendEquiv m n) fg aโœ = append fg.1 fg.2 aโœ
                                @[simp]
                                theorem Fin.appendEquiv_symm_apply {ฮฑ : Type u_1} (m n : โ„•) (f : Fin (m + n) โ†’ ฮฑ) :
                                (appendEquiv m n).symm f = (fun (i : Fin m) => f (castAdd n i), fun (i : Fin n) => f (natAdd m i))
                                def Fin.succFunEquiv (ฮฑ : Type u_1) (n : โ„•) :
                                (Fin (n + 1) โ†’ ฮฑ) โ‰ƒ (Fin n โ†’ ฮฑ) ร— ฮฑ

                                Fin (n + 1) โ†’ ฮฑ and (Fin n โ†’ ฮฑ) ร— ฮฑ are equivalent.

                                Instances For
                                  @[simp]
                                  theorem Fin.succFunEquiv_apply (ฮฑ : Type u_1) (n : โ„•) (aโœ : Fin (n + 1) โ†’ ฮฑ) :
                                  (succFunEquiv ฮฑ n) aโœ = (fun (i : Fin n) => aโœ (castAdd 1 i), aโœ (natAdd n 0))
                                  @[simp]
                                  theorem Fin.succFunEquiv_symm_apply (ฮฑ : Type u_1) (n : โ„•) (aโœ : (Fin n โ†’ ฮฑ) ร— ฮฑ) (aโœยน : Fin (n + 1)) :
                                  (succFunEquiv ฮฑ n).symm aโœ aโœยน = append aโœ.1 (uniqueElim aโœ.2) aโœยน