Permutations of tuples

Content created by Louis Wasserman.

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

module lists.permutation-tuples where
Imports
open import elementary-number-theory.natural-numbers

open import finite-group-theory.permutations-standard-finite-types
open import finite-group-theory.transpositions-standard-finite-types

open import foundation.action-on-identifications-functions
open import foundation.cartesian-product-types
open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.equivalence-extensionality
open import foundation.equivalences
open import foundation.function-types
open import foundation.functoriality-coproduct-types
open import foundation.identity-types
open import foundation.negated-equality
open import foundation.transport-along-identifications
open import foundation.universe-levels

open import lists.arrays
open import lists.equivalence-tuples-finite-sequences
open import lists.finite-sequences
open import lists.functoriality-finite-sequences
open import lists.functoriality-tuples
open import lists.functoriality-tuples-finite-sequences
open import lists.lists
open import lists.tuples

open import univalent-combinatorics.standard-finite-types

Idea

Given a finite sequence t of length n and an automorphism σ of Fin n, the permutation of t according to σ is the finite sequence where the indices are permuted by σ. Then, we can define what is a permutation of a tuple of length n via the equivalence between finite sequences and tuples.

Definitions

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

  permute-tuple : (n : )  tuple A n  Permutation n  tuple A n
  permute-tuple n v s =
    tuple-fin-sequence n (fin-sequence-tuple n v  (map-equiv s))

The predicate that a function from tuple to tuple is just permuting tuples

  is-permutation-tuple : (n : )  (tuple A n  tuple A n)  UU l
  is-permutation-tuple n f =
    (v : tuple A n) 
    Σ ( Permutation n)
      ( λ t  f v  permute-tuple n v t)

  permutation-is-permutation-tuple :
    (n : ) (f : tuple A n  tuple A n)  is-permutation-tuple n f 
    (v : tuple A n)  Permutation n
  permutation-is-permutation-tuple n f P v = pr1 (P v)

  eq-permute-tuple-permutation-is-permutation-tuple :
    (n : ) (f : tuple A n  tuple A n)  (P : is-permutation-tuple n f) 
    (v : tuple A n) 
    (f v  permute-tuple n v (permutation-is-permutation-tuple n f P v))
  eq-permute-tuple-permutation-is-permutation-tuple n f P v = pr2 (P v)

Properties

Computational rules

  compute-permute-tuple-id-equiv :
    (n : )
    (v : tuple A n) 
    permute-tuple n v id-equiv  v
  compute-permute-tuple-id-equiv n v =
    ap  f  map-equiv f v) (right-inverse-law-equiv (compute-tuple n))

  compute-composition-permute-tuple :
    (n : )
    (v : tuple A n) 
    (a b : Permutation n) 
    permute-tuple n v (a ∘e b)  permute-tuple n (permute-tuple n v a) b
  compute-composition-permute-tuple n v a b =
    ap
      ( λ f  tuple-fin-sequence n (f  (map-equiv b)))
      ( inv
        ( is-retraction-fin-sequence-tuple n
          ( fin-sequence-tuple n v  map-equiv a)))

  compute-swap-two-last-elements-transposition-Fin-permute-tuple :
    (n : )
    (v : tuple A n) 
    (x y : A) 
    permute-tuple
      (succ-ℕ (succ-ℕ n))
      (x  y  v)
      (swap-two-last-elements-transposition-Fin n) 
    (y  x  v)
  compute-swap-two-last-elements-transposition-Fin-permute-tuple n v x y =
    eq-Eq-tuple
      ( succ-ℕ (succ-ℕ n))
      ( permute-tuple
          ( succ-ℕ (succ-ℕ n))
          ( x  y  v)
          ( swap-two-last-elements-transposition-Fin n))
      ( y  x  v)
      ( refl ,
        refl ,
        Eq-eq-tuple
          ( n)
          ( permute-tuple n v id-equiv)
          ( v)
          ( compute-permute-tuple-id-equiv n v))

  compute-equiv-coproduct-permutation-id-equiv-permute-tuple :
    (n : )
    (v : tuple A n)
    (x : A)
    (t : Permutation n) 
    permute-tuple (succ-ℕ n) (x  v) (equiv-coproduct t id-equiv) 
    (x  permute-tuple n v t)
  compute-equiv-coproduct-permutation-id-equiv-permute-tuple n v x t =
    eq-Eq-tuple
      ( succ-ℕ n)
      ( permute-tuple (succ-ℕ n) (x  v) (equiv-coproduct t id-equiv))
      ( x  permute-tuple n v t)
      ( refl ,
        ( Eq-eq-tuple
          ( n)
          ( _)
          ( permute-tuple n v t)
          ( refl)))

  ap-permute-tuple :
    {n : }
    (a : Permutation n)
    {v w : tuple A n} 
    v  w 
    permute-tuple n v a  permute-tuple n w a
  ap-permute-tuple a refl = refl

x is in a tuple v iff it is in permute v t

  is-in-fin-sequence-is-in-permute-fin-sequence :
    (n : ) (v : Fin n  A) (t : Permutation n) (x : A) 
    in-fin-sequence n x (v  map-equiv t)  in-fin-sequence n x v
  is-in-fin-sequence-is-in-permute-fin-sequence n v t x (k , refl) =
    map-equiv t k , refl

  is-in-tuple-is-in-permute-tuple :
    (n : ) (v : tuple A n) (t : Permutation n) (x : A) 
    x ∈-tuple (permute-tuple n v t)  x ∈-tuple v
  is-in-tuple-is-in-permute-tuple n v t x I =
    is-in-tuple-is-in-fin-sequence
      ( n)
      ( v)
      ( x)
      ( is-in-fin-sequence-is-in-permute-fin-sequence
        ( n)
        ( fin-sequence-tuple n v)
        ( t)
        ( x)
        ( tr
          ( λ p  in-fin-sequence n x p)
          ( is-retraction-fin-sequence-tuple n
            ( fin-sequence-tuple n v  map-equiv t))
          ( is-in-fin-sequence-is-in-tuple n (permute-tuple n v t) x I)))

  is-in-permute-fin-sequence-is-in-fin-sequence :
    (n : ) (v : Fin n  A) (t : Permutation n) (x : A) 
    in-fin-sequence n x v  in-fin-sequence n x (v  map-equiv t)
  is-in-permute-fin-sequence-is-in-fin-sequence n v t x (k , refl) =
    map-inv-equiv t k , ap v (inv (is-section-map-inv-equiv t k))

  is-in-permute-tuple-is-in-tuple :
    (n : ) (v : tuple A n) (t : Permutation n) (x : A) 
    x ∈-tuple v  x ∈-tuple (permute-tuple n v t)
  is-in-permute-tuple-is-in-tuple n v t x I =
    is-in-tuple-is-in-fin-sequence
      ( n)
      ( permute-tuple n v t)
      ( x)
      ( tr
        ( λ p  in-fin-sequence n x p)
        ( inv
          ( is-retraction-fin-sequence-tuple n
            ( fin-sequence-tuple n v  map-equiv t)))
        ( is-in-permute-fin-sequence-is-in-fin-sequence
          ( n)
          ( fin-sequence-tuple n v)
          ( t)
          ( x)
          ( is-in-fin-sequence-is-in-tuple n v x I)))

If μ : A → (B → B) satisfies a commutativity property, then fold-tuple b μ is invariant under permutation for every b : B

module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (μ : A  (B  B))
  where

  commutative-fold-tuple : UU (l1  l2)
  commutative-fold-tuple = (a1 a2 : A) (b : B)  μ a1 (μ a2 b)  μ a2 (μ a1 b)

module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  (b : B)
  (μ : A  (B  B))
  (C : commutative-fold-tuple μ)
  where

  invariant-swap-two-last-elements-transposition-fold-tuple :
    {n : }  (v : tuple A (succ-ℕ (succ-ℕ n))) 
    fold-tuple b μ v 
    fold-tuple
      ( b)
      ( μ)
      ( permute-tuple (succ-ℕ (succ-ℕ n))
      ( v)
      ( swap-two-last-elements-transposition-Fin n))
  invariant-swap-two-last-elements-transposition-fold-tuple {n} (y  z  v) =
    C y z (fold-tuple b μ v) 
    inv
      ( ap
        ( fold-tuple b μ)
        ( compute-swap-two-last-elements-transposition-Fin-permute-tuple
          ( n)
          ( v)
          ( y)
          ( z)))

  invariant-adjacent-transposition-fold-tuple :
    {n : }  (v : tuple A (succ-ℕ n))  (k : Fin n) 
    fold-tuple b μ v 
    fold-tuple b μ (permute-tuple (succ-ℕ n) v (adjacent-transposition-Fin n k))
  invariant-adjacent-transposition-fold-tuple {succ-ℕ n} (x  v) (inl k) =
    ap
      ( μ x)
      ( invariant-adjacent-transposition-fold-tuple v k) 
    inv
      ( ap
        ( fold-tuple b μ)
        ( compute-equiv-coproduct-permutation-id-equiv-permute-tuple
          ( succ-ℕ n)
          ( v)
          ( x)
          ( adjacent-transposition-Fin n k)))
  invariant-adjacent-transposition-fold-tuple {succ-ℕ n} (x  v) (inr _) =
    invariant-swap-two-last-elements-transposition-fold-tuple (x  v)

  invariant-list-adjacent-transpositions-fold-tuple :
    {n : } (v : tuple A (succ-ℕ n)) (l : list (Fin n)) 
    fold-tuple b μ v 
    fold-tuple
      ( b)
      ( μ)
      ( permute-tuple
        ( succ-ℕ n)
        ( v)
        ( permutation-list-adjacent-transpositions n l))
  invariant-list-adjacent-transpositions-fold-tuple {n} v nil =
    ap (fold-tuple b μ) (inv (compute-permute-tuple-id-equiv (succ-ℕ n) v))
  invariant-list-adjacent-transpositions-fold-tuple {n} v (cons x l) =
    ( invariant-adjacent-transposition-fold-tuple v x 
      ( ( invariant-list-adjacent-transpositions-fold-tuple
          ( permute-tuple (succ-ℕ n) v (adjacent-transposition-Fin n x))
          ( l)) 
        ( ap
          ( fold-tuple b μ)
          ( inv
            ( compute-composition-permute-tuple
              ( succ-ℕ n)
              ( v)
              ( adjacent-transposition-Fin n x)
              ( permutation-list-adjacent-transpositions n l))))))

  invariant-transposition-fold-tuple :
    {n : } (v : tuple A (succ-ℕ n)) (i j : Fin (succ-ℕ n)) (neq : i  j) 
    fold-tuple b μ v 
    fold-tuple
      ( b)
      ( μ)
      ( permute-tuple (succ-ℕ n) v (transposition-Fin (succ-ℕ n) i j neq))
  invariant-transposition-fold-tuple {n} v i j neq =
    ( ( invariant-list-adjacent-transpositions-fold-tuple
        ( v)
        ( list-adjacent-transpositions-transposition-Fin n i j)) 
      ( ap
        ( λ t  fold-tuple b μ (permute-tuple (succ-ℕ n) v t))
        ( eq-htpy-equiv
          { e =
            permutation-list-adjacent-transpositions
              ( n)
              ( list-adjacent-transpositions-transposition-Fin n i j)}
          { e' = transposition-Fin (succ-ℕ n) i j neq}
          ( htpy-permutation-list-adjacent-transpositions-transposition-Fin
            ( n)
            ( i)
            ( j)
            ( neq)))))

  invariant-list-transpositions-fold-tuple :
    {n : }
    (v : tuple A n)
    (l : list (Σ (Fin n × Fin n)  (i , j)  i  j))) 
    fold-tuple b μ v 
    fold-tuple
      ( b)
      ( μ)
      ( permute-tuple
        ( n)
        ( v)
        ( permutation-list-standard-transpositions-Fin n l))
  invariant-list-transpositions-fold-tuple {n} v nil =
    ap
      ( fold-tuple b μ)
      ( inv ( compute-permute-tuple-id-equiv n v))
  invariant-list-transpositions-fold-tuple {0} v (cons _ _) = refl
  invariant-list-transpositions-fold-tuple
    {succ-ℕ n} v (cons ((i , j) , neq) l) =
    ( invariant-transposition-fold-tuple v i j neq 
      ( ( invariant-list-transpositions-fold-tuple
          ( permute-tuple (succ-ℕ n) v (transposition-Fin (succ-ℕ n) i j neq))
          ( l)) 
        ( ap
          ( fold-tuple b μ)
          ( inv
            ( compute-composition-permute-tuple
              ( succ-ℕ n)
              ( v)
              ( transposition-Fin (succ-ℕ n) i j neq)
              ( permutation-list-standard-transpositions-Fin (succ-ℕ n) l))))))

  invariant-permutation-fold-tuple :
    {n : }  (v : tuple A n)  (f : Permutation n) 
    fold-tuple b μ v  fold-tuple b μ (permute-tuple n v f)
  invariant-permutation-fold-tuple {n} v f =
    ( ( invariant-list-transpositions-fold-tuple
        ( v)
        ( list-standard-transpositions-permutation-Fin n f)) 
      ( ap
        ( λ f  fold-tuple b μ (permute-tuple n v f))
        ( eq-htpy-equiv
          {e =
            permutation-list-standard-transpositions-Fin
              ( n)
              ( list-standard-transpositions-permutation-Fin n f)}
          {e' = f}
          ( retraction-permutation-list-standard-transpositions-Fin n f))))

map-tuple of the permutation of a tuple

eq-map-tuple-permute-tuple :
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  (f : A  B) {n : } (v : tuple A n) (t : Permutation n) 
  permute-tuple n (map-tuple f v) t 
  map-tuple f (permute-tuple n v t)
eq-map-tuple-permute-tuple f {n} v t =
  ( ( ap
      ( λ w 
        ( tuple-fin-sequence
          ( n)
          ( fin-sequence-tuple n w  (map-equiv t)))))
      ( inv (map-tuple-map-fin-sequence f n v)) 
    ( ( ap
        ( λ p 
          tuple-fin-sequence
            ( n)
            ( p  map-equiv t))
        ( is-retraction-fin-sequence-tuple
          ( n)
          ( map-fin-sequence n f (fin-sequence-tuple n v)))) 
      ( ( ap
          ( tuple-fin-sequence n  map-fin-sequence n f)
          ( inv
            ( is-retraction-fin-sequence-tuple
              ( n)
              ( λ z  fin-sequence-tuple n v (map-equiv t z))))) 
        ( map-tuple-map-fin-sequence f n (permute-tuple n v t)))))

Recent changes