Documentation

Batteries.Data.Fin.Coding

Low-level coding recipes for Fin types #

This module collects encoding/decoding bijections to represent basic type constructors of Fin types as Fin types. These functions implement the isomorphism Option (Fin n) ≃ Fin (n+1), Fin m ⊕ Fin n ≃ Fin (m + n), Fin m × Fin n ≃ Fin (m * n), ..., including, dependent sums, dependent products, decidable subtypes and decidable quotients.

Only a minimal API is provided. These utility functions are intended for use in other constructions. Such constructions should avoid exposing these functions as they are not meant for public use.

Encode Empty into Fin 0.

Instances For

    Decode Empty from Fin 0.

    Instances For

      Encode PUnit into Fin 1.

      Equations
      Instances For

        Decode PUnit from Fin 1.

        Equations
        Instances For
          @[reducible, inline]
          abbrev Fin.encodeUnit :
          UnitFin 1

          Encode Unit into Fin 1.

          Equations
          Instances For
            @[reducible, inline]
            abbrev Fin.decodeUnit :
            Fin 1Unit

            Decode Unit from Fin 1.

            Equations
            Instances For

              Encode Bool into Fin 2.

              Equations
              Instances For

                Decode Bool from Fin 2.

                Equations
                Instances For

                  Encode Char into Fin Char.count.

                  Equations
                  Instances For

                    Decode Char from Fin Char.count.

                    Equations
                    Instances For
                      def Fin.encodeOption {n : Nat} :
                      Option (Fin n)Fin (n + 1)

                      Encode Option (Fin n) into Fin (n+1).

                      Equations
                      Instances For
                        def Fin.decodeOption {n : Nat} :
                        Fin (n + 1)Option (Fin n)

                        Decode Option (Fin n) from Fin (n+1).

                        Equations
                        Instances For
                          @[simp]
                          def Fin.encodeSum {n m : Nat} :
                          Fin n Fin mFin (n + m)

                          Encode Fin n ⊕ Fin m into Fin (n + m).

                          Equations
                          Instances For
                            def Fin.decodeSum {n m : Nat} (x : Fin (n + m)) :
                            Fin n Fin m

                            Decode Fin n ⊕ Fin m from Fin (n + m).

                            Equations
                            Instances For
                              @[simp]
                              theorem Fin.encodeSum_decodeSum {n m : Nat} (x : Fin (n + m)) :
                              @[simp]
                              theorem Fin.decodeSum_encodeSum {n m : Nat} (x : Fin n Fin m) :
                              def Fin.encodeProd {m n : Nat} :
                              Fin m × Fin nFin (m * n)

                              Encode Fin m × Fin n into Fin (m * n).

                              Equations
                              Instances For
                                def Fin.decodeProd {m n : Nat} (z : Fin (m * n)) :
                                Fin m × Fin n

                                Decode Fin m × Fin n from Fin (m * n).

                                Equations
                                Instances For
                                  @[simp]
                                  theorem Fin.encodeProd_decodeProd {m n : Nat} (x : Fin (m * n)) :
                                  @[simp]
                                  theorem Fin.decodeProd_encodeProd {m n : Nat} (x : Fin m × Fin n) :
                                  def Fin.encodeSigma {n : Nat} (f : Fin nNat) (x : (i : Fin n) × Fin (f i)) :

                                  Encode (i : Fin n) × Fin (f i) into Fin (Fin.sum f).

                                  Equations
                                  Instances For
                                    def Fin.decodeSigma {n : Nat} (f : Fin nNat) (x : Fin (Fin.sum f)) :
                                    (i : Fin n) × Fin (f i)

                                    Decode (i : Fin n) × Fin (f i) from Fin (Fin.sum f).

                                    Equations
                                    Instances For
                                      @[simp]
                                      theorem Fin.encodeSigma_decodeSigma {n : Nat} (f : Fin nNat) (x : Fin (Fin.sum f)) :
                                      @[simp]
                                      theorem Fin.decodeSigma_encodeSigma {n : Nat} (f : Fin nNat) (x : (i : Fin n) × Fin (f i)) :
                                      def Fin.encodeFun {n m : Nat} :
                                      (Fin mFin n)Fin (n ^ m)

                                      Encode Fin m → Fin n into Fin (n ^ m).

                                      Equations
                                      Instances For
                                        def Fin.decodeFun {n m : Nat} :
                                        Fin (n ^ m)Fin mFin n

                                        Decode Fin m → Fin n from Fin (n ^ m).

                                        Equations
                                        Instances For
                                          @[simp]
                                          theorem Fin.encodeFun_decodeFun {n m : Nat} (x : Fin (n ^ m)) :
                                          @[simp]
                                          theorem Fin.decodeFun_encodeFun {m n : Nat} (x : Fin mFin n) :
                                          def Fin.encodePi {n : Nat} (f : Fin nNat) (x : (i : Fin n) → Fin (f i)) :

                                          Encode (i : Fin n) → Fin (f i) into Fin (Fin.prod f).

                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          • Fin.encodePi x_2 x_3 = 0,
                                          Instances For
                                            def Fin.decodePi {n : Nat} (f : Fin nNat) (x : Fin (Fin.prod f)) (i : Fin n) :
                                            Fin (f i)

                                            Decode (i : Fin n) → Fin (f i) from Fin (Fin.prod f).

                                            Equations
                                            Instances For
                                              @[simp]
                                              theorem Fin.encodePi_decodePi {n : Nat} (f : Fin nNat) (x : Fin (Fin.prod f)) :
                                              encodePi f (decodePi f x) = x
                                              @[simp]
                                              theorem Fin.decodePi_encodePi {n : Nat} (f : Fin nNat) (x : (i : Fin n) → Fin (f i)) :
                                              decodePi f (encodePi f x) = x
                                              def Fin.encodeSubtype {n : Nat} (P : Fin nProp) [inst : DecidablePred P] (i : { i : Fin n // P i }) :
                                              Fin (Fin.countP fun (x : Fin n) => decide (P x))

                                              Encode { i : Fin n // P i } into Fin (Fin.countP P) where P is a decidable predicate.

                                              Equations
                                              Instances For
                                                def Fin.decodeSubtype {n : Nat} (P : Fin nProp) [inst : DecidablePred P] (k : Fin (Fin.countP fun (x : Fin n) => decide (P x))) :
                                                { i : Fin n // P i }

                                                Decode { i : Fin n // P i } from Fin (Fin.countP P) where P is a decidable predicate.

                                                Equations
                                                Instances For
                                                  theorem Fin.encodeSubtype_zero_pos {n : Nat} {P : Fin (n + 1)Prop} [DecidablePred P] (h₀ : P 0) :
                                                  encodeSubtype P 0, h₀ = 0,
                                                  theorem Fin.encodeSubtype_succ_pos {n : Nat} {P : Fin (n + 1)Prop} [DecidablePred P] (h₀ : P 0) {i : Fin n} (h : P i.succ) :
                                                  encodeSubtype P i.succ, h = Fin.cast (encodeSubtype (fun (i : Fin n) => P i.succ) i, h).succ
                                                  theorem Fin.encodeSubtype_succ_neg {n : Nat} {P : Fin (n + 1)Prop} [DecidablePred P] (h₀ : ¬P 0) {i : Fin n} (h : P i.succ) :
                                                  encodeSubtype P i.succ, h = Fin.cast (encodeSubtype (fun (i : Fin n) => P i.succ) i, h)
                                                  @[simp]
                                                  theorem Fin.encodeSubtype_decodeSubtype {n : Nat} (P : Fin nProp) [DecidablePred P] (x : Fin (Fin.countP fun (x : Fin n) => decide (P x))) :
                                                  @[simp]
                                                  theorem Fin.decodeSubtype_encodeSubtype {n : Nat} (P : Fin nProp) [DecidablePred P] (x : { x : Fin n // P x }) :
                                                  @[reducible, inline]
                                                  abbrev Fin.getRepr {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (x : Fin n) :
                                                  Fin n

                                                  Get representative for the equivalence class of x.

                                                  Equations
                                                  Instances For
                                                    @[simp]
                                                    theorem Fin.equiv_getRepr {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (x : Fin n) :
                                                    @[simp]
                                                    theorem Fin.getRepr_equiv {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (x : Fin n) :
                                                    theorem Fin.getRepr_eq_getRepr_of_equiv {n : Nat} {x y : Fin n} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (h : Setoid.r x y) :
                                                    getRepr s x = getRepr s y
                                                    @[simp]
                                                    theorem Fin.getRepr_getRepr {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (x : Fin n) :
                                                    getRepr s (getRepr s x) = getRepr s x
                                                    def Fin.encodeQuotient {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (x : Quotient s) :
                                                    Fin (Fin.countP fun (i : Fin n) => decide (getRepr s i = i))

                                                    Encode Quotient s into Fin m where s is a decidable setoid on Fin n.

                                                    Equations
                                                    Instances For
                                                      def Fin.decodeQuotient {n : Nat} (s : Setoid (Fin n)) [DecidableRel Setoid.r] (i : Fin (Fin.countP fun (i : Fin n) => decide (getRepr s i = i))) :

                                                      Decode Quotient s from Fin m where s is a decidable setoid on Fin n.

                                                      Equations
                                                      Instances For
                                                        @[simp]