Todd Waugh Ambridge, January 2024

# Sequences

\begin{code}
{-# OPTIONS --without-K --safe #-}

open import MLTT.Spartan
open import Notation.Order
open import Naturals.Order
open import UF.DiscreteAndSeparated
open import NotionsOfDecidability.Complemented

module TWA.Thesis.Chapter2.Sequences where

repeat : {X : š“¤ ̇ } → X → ā„• → X
repeat α _ = α

map : {X : š“¤ ̇ } {Y : š“„ ̇ }
    → (X → Y) → (ā„• → X) → (ā„• → Y)
map f α n = f (α n)

zipWith : {X : š“¤ ̇ } {Y : š“„ ̇ } {Z : š“¦ ̇ }
        → (X → Y → Z) → (ā„• → X) → (ā„• → Y) → (ā„• → Z)
zipWith f α β n = f (α n) (β n)

head : {X : š“¤ ̇ } → (ā„• → X) → X
head α = α 0

tail : {X : š“¤ ̇ } → (ā„• → X) → (ā„• → X)
tail α = α ∘ succ

_∷_ : {T : ā„• → š“¤ ̇ } → T 0 → Ī  (T ∘ succ) → Ī  T
(h ∷ α) 0 = h
(h ∷ α) (succ n) = α n

_∼ⁿ_ : {X : ā„• → š“¤ ̇ } → Ī  X → Ī  X → ā„• → š“¤ ̇
(α ∼ⁿ β) n = (i : ā„•) → i < n → α i ļ¼ β i

∼ⁿ-sym : {X : ā„• → š“¤ ̇ } (α β : Ī  X) (n : ā„•)
       → (α ∼ⁿ β) n
       → (β ∼ⁿ α) n
∼ⁿ-sym α β n f i i<n = f i i<n ⁻¹

bounded-decidable-Ī  : {X : ā„• → š“¤ ̇ }
                    → is-complemented X
                    → (n : ā„•)
                    → is-decidable (Ī  i źž‰ ā„• , (i < n → X i))
bounded-decidable-Ī  d 0 = inl (Ī» _ ())
bounded-decidable-Ī  {š“¤} {X} d (succ n)
 = Cases (bounded-decidable-Ī  d n) γ₁ (inr ∘ γ₂)
 where
  γ₁ : ((i : ā„•) → (i < n → X i))
     → is-decidable ((i : ā„•) → (i < succ n → X i))
  γ₁ f = Cases (d n) (inl ∘ γ₁₁) (inr ∘ γ₁₂)
   where
    γ₁₁ : X n → (i : ā„•) → i < succ n → X i
    γ₁₁ Xn i i<sn
     = Cases (<-split i n i<sn) (f i) (Ī» e → transport X (e ⁻¹) Xn)
    γ₁₂ : ¬ X n → ¬ ((i : ā„•) → i < succ n → X i)
    γ₁₂ g f = g (f n (<-succ n))
  γ₂ : ¬ ((i : ā„•) → i < n → X i) → ¬ ((i : ā„•) → i < succ n → X i)
  γ₂ g f = g (Ī» i i<n → f i (<-trans i n (succ n) i<n (<-succ n)))

bounded-decidable-Ī£ : {X : ā„• → š“¤ ̇ } → is-complemented X
                    → (n : ā„•)
                    → is-decidable (Ī£ i źž‰ ā„• , ((i < n) Ɨ X i))
bounded-decidable-Ī£ d 0 = inr (Ī» (i , i<0 , _) → i<0)
bounded-decidable-Ī£ {š“¤} {X} d (succ n)
 = Cases (bounded-decidable-Ī£ d n)
    (Ī» (i , i<n , Xi)
     → inl (i , <-trans i n (succ n) i<n (<-succ n) , Xi))
    (Ī» ¬Σi<n → Cases (d n)
      (Ī» Xn → inl (n , <-succ n , Xn))
      (Ī» ¬Xn → inr (Ī» (i , i<sn , Xi) → Cases (<-split i n i<sn)
        (Ī» i<n → ¬Σi<n (i , i<n , Xi))
        (Ī» iļ¼n → ¬Xn (transport X iļ¼n Xi)))))

∼ⁿ-decidable
 : {X : ā„• → š“¤ ̇ }
 → ((n : ā„•) → is-discrete (X n))
 → (α β : Ī  X) → (n : ā„•) → is-decidable ((α ∼ⁿ β) n)
∼ⁿ-decidable ds α β = bounded-decidable-Ī  (Ī» n → ds n (α n) (β n))
\end{code}