Finite sequences

Content created by Louis Wasserman.

Created on 2025-05-14.
Last modified on 2025-05-14.

module lists.finite-sequences where
Imports
open import elementary-number-theory.natural-numbers

open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.sets
open import foundation.truncated-types
open import foundation.truncation-levels
open import foundation.unit-type
open import foundation.universe-levels

open import univalent-combinatorics.involution-standard-finite-types
open import univalent-combinatorics.standard-finite-types

Idea

A finite sequence of length n is a map from the standard finite type of cardinality n, Fin n, to A. These are equivalent to the related concept of tuples, but are structured like arrays instead of lists.

Definition

fin-sequence : {l : Level}  UU l    UU l
fin-sequence A n = Fin n  A

module _
  {l : Level} {A : UU l}
  where

  empty-fin-sequence : fin-sequence A 0
  empty-fin-sequence ()

  head-fin-sequence : (n : )  fin-sequence A (succ-ℕ n)  A
  head-fin-sequence n v = v (inr star)

  tail-fin-sequence :
    (n : )  fin-sequence A (succ-ℕ n)  fin-sequence A n
  tail-fin-sequence n v = v  (inl-Fin n)

  cons-fin-sequence :
    (n : )  A  fin-sequence A n  fin-sequence A (succ-ℕ n)
  cons-fin-sequence n a v (inl x) = v x
  cons-fin-sequence n a v (inr x) = a

  snoc-fin-sequence :
    (n : )  fin-sequence A n  A  fin-sequence A (succ-ℕ n)
  snoc-fin-sequence zero-ℕ v a i = a
  snoc-fin-sequence (succ-ℕ n) v a (inl x) =
    snoc-fin-sequence n (tail-fin-sequence n v) a x
  snoc-fin-sequence (succ-ℕ n) v a (inr x) = head-fin-sequence n v

  revert-fin-sequence :
    (n : )  fin-sequence A n  fin-sequence A n
  revert-fin-sequence n v i = v (opposite-Fin n i)

  in-fin-sequence : (n : )  A  fin-sequence A n  UU l
  in-fin-sequence n a v = Σ (Fin n)  k  a  v k)

  index-in-fin-sequence :
    (n : ) (x : A) (v : fin-sequence A n) 
    in-fin-sequence n x v  Fin n
  index-in-fin-sequence n x v I = pr1 I

  eq-component-fin-sequence-index-in-fin-sequence :
    (n : ) (x : A) (v : fin-sequence A n) (I : in-fin-sequence n x v) 
    x  v (index-in-fin-sequence n x v I)
  eq-component-fin-sequence-index-in-fin-sequence n x v I = pr2 I

Properties

The type of finite sequences of elements in a truncated type is truncated

module _
  {l : Level} {A : UU l}
  where

  is-trunc-fin-sequence :
    (k : 𝕋) (n : )  is-trunc k A  is-trunc k (fin-sequence A n)
  is-trunc-fin-sequence k n H = is-trunc-function-type k H

The type of finite sequences of elements in a set is a set

module _
  {l : Level} {A : UU l}
  where

  is-set-fin-sequence : (n : )  is-set A  is-set (fin-sequence A n)
  is-set-fin-sequence = is-trunc-fin-sequence zero-𝕋

fin-sequence-Set : {l : Level}  Set l    Set l
pr1 (fin-sequence-Set A n) = fin-sequence (type-Set A) n
pr2 (fin-sequence-Set A n) = is-set-fin-sequence n (is-set-type-Set A)

Adding the tail to the head gives the same finite sequence

module _
  {l : Level} {A : UU l}
  where
  htpy-cons-head-tail-fin-sequence :
    ( n : ) 
    ( v : fin-sequence A (succ-ℕ n)) 
    ( cons-fin-sequence n
      ( head-fin-sequence n v)
      ( tail-fin-sequence n v)) ~
      ( v)
  htpy-cons-head-tail-fin-sequence n v (inl x) = refl
  htpy-cons-head-tail-fin-sequence n v (inr star) = refl

  cons-head-tail-fin-sequence :
    ( n : ) 
    ( v : fin-sequence A (succ-ℕ n)) 
    ( cons-fin-sequence n
      ( head-fin-sequence n v)
      ( tail-fin-sequence n v)) 
      ( v)
  cons-head-tail-fin-sequence n v =
    eq-htpy (htpy-cons-head-tail-fin-sequence n v)

See also

Recent changes