\begin{code} {-# OPTIONS --safe --without-K #-} module MLTT.Vector where open import MLTT.Spartan open import MLTT.Fin open import MLTT.Bool data Vector (A : 𝓤 ̇ ) : ℕ → 𝓤 ̇ where [] : Vector A 0 _∷_ : {n : ℕ} → A → Vector A n → Vector A (succ n) head : {A : 𝓤 ̇ } {n : ℕ} → Vector A (succ n) → A head (x ∷ xs) = x tail : {A : 𝓤 ̇ } {n : ℕ} → Vector A (succ n) → Vector A n tail (x ∷ xs) = xs _!!_ : {X : 𝓤 ̇ } {n : ℕ} → Vector X n → Fin n → X (x ∷ xs) !! 𝟎 = x (x ∷ xs) !! suc n = xs !! n vmap : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → (X → Y) → {n : ℕ} → Vector X n → Vector Y n vmap f [] = [] vmap f (x ∷ xs) = f x ∷ vmap f xs module vector-util {𝓤 : Universe} {X : 𝓤 ̇ } {{_ : Eq X}} where data _is-in_ : X → {n : ℕ} → Vector X n → 𝓤 ̇ where in-head : {x : X} {n : ℕ} {xs : Vector X n} → x is-in (x ∷ xs) in-tail : {x y : X} {n : ℕ} {xs : Vector X n} → x is-in xs → x is-in (y ∷ xs) insert : X → {n : ℕ} → Vector X n → Vector X (succ n) insert x xs = x ∷ xs remove : (x : X) {n : ℕ} (xs : Vector X (succ n)) → x is-in xs → Vector X n remove x {0} (_ ∷ []) in-head = [] remove x {succ n} (_ ∷ xs) in-head = xs remove x {succ n} (y ∷ xs) (in-tail p) = y ∷ remove x {n} xs p has-no-repetitions : {n : ℕ} → Vector X n → 𝓤 ̇ has-no-repetitions [] = 𝟙 has-no-repetitions (x ∷ xs) = ¬ (x is-in xs) × has-no-repetitions xs \end{code}