Chuangjie Xu, 2012

\begin{code}

module Uniform-continuity where

open import Mini-library
open import Setoid


constant : {A B : Setoid}  E-map A B  Set
constant {A , _} {B , _≈_ , _} (f , _) = ∀(a a' : A)  f a  f a'

Lemma[unit-constant] : {A : Setoid}  ∀(u : E-map A E⒈)  constant {A} {E⒈} u
Lemma[unit-constant] {A} (u , _) x x' = singleton (u x) (u x')


_≣_≣_ : ₂ℕ    ₂ℕ  Set
α  n  β = ∀(i : )  i < n  α i  β i

Lemma[≣_≣-≤] : ∀(n : )  ∀(α β : ₂ℕ)  α  n  β 
                       ∀(m : )  m  n  α  m  β
Lemma[≣_≣-≤] n α β awn m r i l = awn i (Lemma[a<b≤c→a<c] l r)

Lemma[≣_≣-take] : ∀(n : )  ∀(α β : ₂ℕ)  α  n  β  take n α  take n β
Lemma[≣_≣-take] 0        α β e = refl
Lemma[≣_≣-take] (succ n) α β e = Lemma[Vec-≡] claim₀ claim₁
 where
  claim₀ : α 0  β 0
  claim₀ = e 0 (≤-succ ≤-zero)
  e' : (α  succ)  n  (β  succ)
  e' i r = e (succ i) (≤-succ r)
  claim₁ : take n (α  succ)  take n (β  succ)
  claim₁ = Lemma[≣_≣-take] n (α  succ) (β  succ) e'


Lemma[≣_≣-drop] : ∀(n m : )  ∀(α β : ₂ℕ)  α  n + m  β 
                   drop n α  m  drop n β
Lemma[≣_≣-drop] n m α β e i i<m = trans (trans (lemma n i α) claim)
                                        (sym (lemma n i β))
 where
  i+n<n+m : i + n < n + m
  i+n<n+m = subst {}  x  i + n < x}
                  (Lemma[n+m=m+n] m n) (Lemma[a<b→a+c<b+c] i m n i<m)
  claim : α (i + n)  β (i + n)
  claim = e (i + n) i+n<n+m
  lemma : ∀(n i : )  ∀(α : ₂ℕ)  drop n α i  α (i + n)
  lemma 0        i α = refl
  lemma (succ n) i α = lemma n i (α  succ)

Lemma[drop-≣] : ∀(n : )  ∀(α β : ₂ℕ)  α  β  drop n α  drop n β
Lemma[drop-≣] 0        α β e = e
Lemma[drop-≣] (succ n) α β e = Lemma[drop-≣] n (α  succ) (β  succ)
                                                i  e (succ i))
Lemma[≣_≣-cons] : ∀(n : )  ∀(α β : ₂ℕ)  α  n  β  α n  β n  α  succ n  β
Lemma[≣_≣-cons] 0        α β awn eq 0        r           = eq
Lemma[≣_≣-cons] 0        α β awn eq (succ i) (≤-succ ())
Lemma[≣_≣-cons] (succ n) α β awn eq 0 r                  = awn 0 (≤-succ ≤-zero)
Lemma[≣_≣-cons] (succ n) α β awn eq (succ i) (≤-succ r)  =
  Lemma[≣ n ≣-cons] (α  succ) (β  succ)  j z  awn (succ j) (≤-succ z)) eq i r


locally-constant : {A : Setoid}  E-map E₂ℕ A  Set
locally-constant {A , _~_ , _} (f , _) =  \(n : )  ∀(α β : ₂ℕ)  α  n  β  f α ~ f β


uniformly-continuous-₂ : E-map E₂ℕ E₂  Set
uniformly-continuous-₂ = locally-constant {E₂}


uniformly-continuous-ℕ : E-map E₂ℕ Eℕ  Set
uniformly-continuous-ℕ = locally-constant {Eℕ}


uniformly-continuous-₂ℕ : E-map E₂ℕ E₂ℕ  Set
uniformly-continuous-₂ℕ (f , _) = ∀(m : )   \(n : )  ∀(α β : ₂ℕ)  α  n  β  f α  m  f β


Lemma[id-UC] : uniformly-continuous-₂ℕ (E-id {E₂ℕ})
Lemma[id-UC] m = m ,  α β z  z)


Lemma[◎-UC] : ∀(t : E-map E₂ℕ E₂ℕ)  uniformly-continuous-₂ℕ t 
               ∀(t' : E-map E₂ℕ E₂ℕ)  uniformly-continuous-₂ℕ t' 
                uniformly-continuous-₂ℕ (t  t')
Lemma[◎-UC] (t , _) uc (t' , _) uc' m = n , prf
 where
  k : 
  k = ∃-witness (uc m)
  n : 
  n = ∃-witness (uc' k)
  e : ∀(α β : ₂ℕ)  α  k  β  t α  m  t β
  e = ∃-elim (uc m)
  e' : ∀(α β : ₂ℕ)  α  n  β  t' α  k  t' β
  e' = ∃-elim (uc' k)
  prf : ∀(α β : ₂ℕ)  α  n  β  t (t' α)  m  t (t' β)
  prf α β awn = e (t' α) (t' β) (e' α β awn)


uniformly-continuous : (₂ℕ  )  Set
uniformly-continuous f =  \(n : )  ∀(α β : ₂ℕ)  α  n  β  f α  f β

\end{code}