Sorted tuples
Content created by Louis Wasserman.
Created on 2025-05-14.
Last modified on 2025-05-14.
module lists.sorted-tuples where
Imports
open import elementary-number-theory.natural-numbers open import finite-group-theory.permutations-standard-finite-types open import foundation.coproduct-types open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.function-types open import foundation.propositions open import foundation.unit-type open import foundation.universe-levels open import lists.equivalence-tuples-finite-sequences open import lists.finite-sequences open import lists.permutation-tuples open import lists.tuples open import order-theory.decidable-total-orders open import univalent-combinatorics.standard-finite-types
Idea
We define a sorted tuple to be a tuple such that for every pair of consecutive
elements x
and y
, the inequality x ≤ y
holds.
Definitions
The proposition that a tuple is sorted
module _ {l1 l2 : Level} (X : Decidable-Total-Order l1 l2) where is-sorted-tuple-Prop : {n : ℕ} → tuple (type-Decidable-Total-Order X) n → Prop l2 is-sorted-tuple-Prop {0} v = raise-unit-Prop l2 is-sorted-tuple-Prop {1} v = raise-unit-Prop l2 is-sorted-tuple-Prop {succ-ℕ (succ-ℕ n)} (x ∷ y ∷ v) = product-Prop ( leq-Decidable-Total-Order-Prop X x y) ( is-sorted-tuple-Prop (y ∷ v)) is-sorted-tuple : {n : ℕ} → tuple (type-Decidable-Total-Order X) n → UU l2 is-sorted-tuple l = type-Prop (is-sorted-tuple-Prop l)
The proposition that an element is less than or equal to every element in a tuple
is-least-element-tuple-Prop : {n : ℕ} → type-Decidable-Total-Order X → tuple (type-Decidable-Total-Order X) n → Prop l2 is-least-element-tuple-Prop {0} x v = raise-unit-Prop l2 is-least-element-tuple-Prop {succ-ℕ n} x (y ∷ v) = product-Prop ( leq-Decidable-Total-Order-Prop X x y) ( is-least-element-tuple-Prop x v) is-least-element-tuple : {n : ℕ} → type-Decidable-Total-Order X → tuple (type-Decidable-Total-Order X) n → UU l2 is-least-element-tuple x v = type-Prop (is-least-element-tuple-Prop x v)
Properties
If a tuple is sorted, then its tail is also sorted
is-sorted-tail-is-sorted-tuple : {n : ℕ} → (v : tuple (type-Decidable-Total-Order X) (succ-ℕ n)) → is-sorted-tuple v → is-sorted-tuple (tail-tuple v) is-sorted-tail-is-sorted-tuple {zero-ℕ} (x ∷ empty-tuple) s = raise-star is-sorted-tail-is-sorted-tuple {succ-ℕ n} (x ∷ y ∷ v) s = pr2 s is-leq-head-head-tail-is-sorted-tuple : {n : ℕ} → (v : tuple (type-Decidable-Total-Order X) (succ-ℕ (succ-ℕ n))) → is-sorted-tuple v → leq-Decidable-Total-Order X (head-tuple v) (head-tuple (tail-tuple v)) is-leq-head-head-tail-is-sorted-tuple (x ∷ y ∷ v) s = pr1 s
If a tuple v' = y ∷ v
is sorted then for all elements x
less than or equal to y
, x
is less than or equal to every element in the tuple
is-least-element-tuple-is-leq-head-sorted-tuple : {n : ℕ} (x : type-Decidable-Total-Order X) (v : tuple (type-Decidable-Total-Order X) (succ-ℕ n)) → is-sorted-tuple v → leq-Decidable-Total-Order X x (head-tuple v) → is-least-element-tuple x v is-least-element-tuple-is-leq-head-sorted-tuple {zero-ℕ} x (y ∷ v) s p = p , raise-star is-least-element-tuple-is-leq-head-sorted-tuple {succ-ℕ n} x (y ∷ v) s p = p , ( is-least-element-tuple-is-leq-head-sorted-tuple ( x) ( v) ( is-sorted-tail-is-sorted-tuple (y ∷ v) s) ( transitive-leq-Decidable-Total-Order ( X) ( x) ( y) ( head-tuple v) ( is-leq-head-head-tail-is-sorted-tuple (y ∷ v) s) ( p)))
An equivalent definition of being sorted
is-sorted-least-element-tuple-Prop : {n : ℕ} → tuple (type-Decidable-Total-Order X) n → Prop l2 is-sorted-least-element-tuple-Prop {0} v = raise-unit-Prop l2 is-sorted-least-element-tuple-Prop {1} v = raise-unit-Prop l2 is-sorted-least-element-tuple-Prop {succ-ℕ (succ-ℕ n)} (x ∷ v) = product-Prop ( is-least-element-tuple-Prop x v) ( is-sorted-least-element-tuple-Prop v) is-sorted-least-element-tuple : {n : ℕ} → tuple (type-Decidable-Total-Order X) n → UU l2 is-sorted-least-element-tuple v = type-Prop (is-sorted-least-element-tuple-Prop v) is-sorted-least-element-tuple-is-sorted-tuple : {n : ℕ} (v : tuple (type-Decidable-Total-Order X) n) → is-sorted-tuple v → is-sorted-least-element-tuple v is-sorted-least-element-tuple-is-sorted-tuple {0} v x = raise-star is-sorted-least-element-tuple-is-sorted-tuple {1} v x = raise-star is-sorted-least-element-tuple-is-sorted-tuple {succ-ℕ (succ-ℕ n)} ( x ∷ y ∷ v) ( p , q) = is-least-element-tuple-is-leq-head-sorted-tuple x (y ∷ v) q p , is-sorted-least-element-tuple-is-sorted-tuple (y ∷ v) q is-sorted-tuple-is-sorted-least-element-tuple : {n : ℕ} (v : tuple (type-Decidable-Total-Order X) n) → is-sorted-least-element-tuple v → is-sorted-tuple v is-sorted-tuple-is-sorted-least-element-tuple {0} v x = raise-star is-sorted-tuple-is-sorted-least-element-tuple {1} v x = raise-star is-sorted-tuple-is-sorted-least-element-tuple {succ-ℕ (succ-ℕ n)} (x ∷ y ∷ v) (p , q) = ( pr1 p) , ( is-sorted-tuple-is-sorted-least-element-tuple (y ∷ v) q)
If the tail of a tuple v
is sorted and x ≤ head-tuple v
, then v
is sorted
is-sorted-tuple-is-sorted-tail-is-leq-head-tuple : {n : ℕ} (v : tuple (type-Decidable-Total-Order X) (succ-ℕ (succ-ℕ n))) → is-sorted-tuple (tail-tuple v) → (leq-Decidable-Total-Order X (head-tuple v) (head-tuple (tail-tuple v))) → is-sorted-tuple v is-sorted-tuple-is-sorted-tail-is-leq-head-tuple (x ∷ y ∷ v) s p = p , s
If an element x
is less than or equal to every element of a tuple v
, then it is less than or equal to every element of every permutation of v
is-least-element-fin-sequence-Prop : (n : ℕ) (x : type-Decidable-Total-Order X) (fv : fin-sequence (type-Decidable-Total-Order X) n) → Prop l2 is-least-element-fin-sequence-Prop n x fv = Π-Prop (Fin n) (λ k → leq-Decidable-Total-Order-Prop X x (fv k)) is-least-element-fin-sequence : (n : ℕ) (x : type-Decidable-Total-Order X) (fv : fin-sequence (type-Decidable-Total-Order X) n) → UU l2 is-least-element-fin-sequence n x fv = type-Prop (is-least-element-fin-sequence-Prop n x fv) is-least-element-permute-fin-sequence : (n : ℕ) (x : type-Decidable-Total-Order X) (fv : fin-sequence (type-Decidable-Total-Order X) n) (a : Permutation n) → is-least-element-fin-sequence n x fv → is-least-element-fin-sequence n x (fv ∘ map-equiv a) is-least-element-permute-fin-sequence n x fv a p k = p (map-equiv a k) is-least-element-tuple-is-least-element-fin-sequence : (n : ℕ) (x : type-Decidable-Total-Order X) (fv : fin-sequence (type-Decidable-Total-Order X) n) → is-least-element-fin-sequence n x fv → is-least-element-tuple x (tuple-fin-sequence n fv) is-least-element-tuple-is-least-element-fin-sequence 0 x fv p = raise-star is-least-element-tuple-is-least-element-fin-sequence (succ-ℕ n) x fv p = (p (inr star)) , ( is-least-element-tuple-is-least-element-fin-sequence ( n) ( x) ( tail-fin-sequence n fv) ( p ∘ inl)) is-least-element-fin-sequence-is-least-element-tuple : (n : ℕ) (x : type-Decidable-Total-Order X) (v : tuple (type-Decidable-Total-Order X) n) → is-least-element-tuple x v → is-least-element-fin-sequence n x (fin-sequence-tuple n v) is-least-element-fin-sequence-is-least-element-tuple ( succ-ℕ n) ( x) ( y ∷ v) ( p , q) ( inl k) = is-least-element-fin-sequence-is-least-element-tuple n x v q k is-least-element-fin-sequence-is-least-element-tuple ( succ-ℕ n) ( x) ( y ∷ v) ( p , q) ( inr star) = p is-least-element-permute-tuple : {n : ℕ} (x : type-Decidable-Total-Order X) (v : tuple (type-Decidable-Total-Order X) n) (a : Permutation n) → is-least-element-tuple x v → is-least-element-tuple x (permute-tuple n v a) is-least-element-permute-tuple {n} x v a p = is-least-element-tuple-is-least-element-fin-sequence ( n) ( x) ( fin-sequence-tuple n v ∘ map-equiv a) ( is-least-element-permute-fin-sequence ( n) ( x) ( fin-sequence-tuple n v) ( a) ( is-least-element-fin-sequence-is-least-element-tuple n x v p))
Recent changes
- 2025-05-14. Louis Wasserman. Refactor linear algebra to use “tuples” for what was “vectors” (#1397).