Chuangjie Xu, 2012

\begin{code}

module Continuous-combinator where

open import Mini-library
open import Cons
open import Space
open import Space-exponential
open import Space-product
open import Space-discrete
open import Extensionality


-- K combinator with its continuity

continuous-k : {A B : Space} 
               Σ \(k : U A  U (B  A)) 
                   continuous {A} {B  A} k
continuous-k {A} {B} = (k , continuity-of-k)
 where
  k : U A  U (B  A)
  k a =  b  a) , λ p pa  cond₀ A  b  a)  b b'  refl)
  continuity-of-k : continuous {A} {B  A} k
  continuity-of-k p pa q qb t uct = cond₁ A t uct p pa


-- S combinator with its continuity

continuous-s : {A B C : Space} 
               Σ \(s : U(A  B  C)  U((A  B)  A  C)) 
                   continuous {A  B  C} {(A  B)  A  C} s
continuous-s {A} {B} {C} = (s , continuity-of-s)
 where
  s : U(A  B  C)  U((A  B)  A  C)
  s f = (t , ct)
   where
    t : U(A  B)  U(A  C)
    t g = (h , ch)
     where
      h : U A  U C
      h a = π₀(π₀ f a)(π₀ g a)
      ch : continuous {A} {C} h
      ch p pa = claim₀ ((π₀ g)  p) claim₁ id Lemma[id-UC]
       where
        claim₀ : (π₀ f)  p  Probe(B  C)
        claim₀ = π₁ f p pa
        claim₁ : (π₀ g)  p  Probe B
        claim₁ = π₁ g p pa
    ct : continuous {A  B} {A  C} t
    ct p pab q qa r ucr = claim₀  α  (π₀  p)(r α)(q α)) claim₁ id Lemma[id-UC]
     where
      claim₀ : (π₀ f)  q  Probe(B  C)
      claim₀ = π₁ f q qa
      claim₁ :  α  (π₀  p)(r α)(q α))  Probe B
      claim₁ = pab q qa r ucr
  continuity-of-s : continuous {A  B  C} {(A  B)  A  C} s
  continuity-of-s p pabc q qab t uct r ra u ucu =
      claim₀  α  (π₀  q)(u α)(r α)) claim₁ id Lemma[id-UC]
   where
    claim₀ :  α  (π₀  p)(t(u α))(r α))  Probe (B  C)
    claim₀ = pabc r ra (t  u) (Lemma[∘-UC] t uct u ucu)
    claim₁ :  α  (π₀  q)(u α)(r α))  Probe B
    claim₁ = qab r ra u ucu


-- Case function with its continuity

continuous-if : {A : Space} 
                Σ \(If : U A  U(A  ₂Space  A)) 
                    continuous {A} {A  ₂Space  A} If
continuous-if {A} = (If , continuity-of-if)
 where
  If : U A  U(A  ₂Space  A)
  If a = (f , cf)
   where
    f : U A  U(₂Space  A)
    f a' = if a a' , Lemma[discreteness] {} {A} (if a a')
    cf : continuous {A} {₂Space  A} f
    cf p pa q q2 t uct = cond₂ A  α  if a (p(t α)) (q α)) (∃-intro n prf)
     where
      n : 
      n = ∃-witness q2
      prf : ∀(s : ₂Fin n)   α  if a (p (t (cons s α))) (q (cons s α)))  Probe A
      prf s = subst {₂ℕ  U A}  r  r  Probe A} claim' (lemma (q (cons s )))
       where
        ucts : uniformly-continuous-₂ℕ (t  (cons s))
        ucts = Lemma[∘-UC] t uct (cons s) (Lemma[cons-UC] s)
        lemma : ∀(b : )   α  if a (p (t (cons s α))) b)  Probe A
        lemma  = cond₀ A  α  a)  α β  refl)
        lemma  = cond₁ A (t  (cons s)) ucts p pa
        eq : ∀(α : ₂ℕ)  q (cons s )  q (cons s α)
        eq α = ∃-elim q2 (cons s ) (cons s α) (Lemma[cons-≣_≣] s  α)
        claim : ∀(α : ₂ℕ)  if a (p (t (cons s α))) (q (cons s )) 
                            if a (p (t (cons s α))) (q (cons s α))
        claim α = cong (if a (p (t (cons s α)))) (eq α)
        claim' :   α  if a (p (t (cons s α))) (q (cons s )))
                  α  if a (p (t (cons s α))) (q (cons s α)))
        claim' = extensionality claim
  continuity-of-if : continuous {A} {A  ₂Space  A} If
  continuity-of-if p pa q qa t uct r r2 u ucu = cond₂ A  α  if (p(t(u α))) (q(u α)) (r α)) (∃-intro n prf)
   where
    n : 
    n = ∃-witness r2
    prf : ∀(s : ₂Fin n)   α  if (p(t(u(cons s α)))) (q(u(cons s α))) (r(cons s α)))  Probe A
    prf s = subst {₂ℕ  U A}  x  x  Probe A} claim' (lemma (r (cons s )))
     where
      ucus : uniformly-continuous-₂ℕ (u  (cons s))
      ucus = Lemma[∘-UC] u ucu (cons s) (Lemma[cons-UC] s)
      uctus : uniformly-continuous-₂ℕ (t  u  (cons s))
      uctus = Lemma[∘-UC] t uct (u  (cons s)) ucus
      lemma : ∀(b : )   α  if (p(t(u(cons s α)))) (q(u(cons s α))) b)  Probe A
      lemma  = cond₁ A (t  u  (cons s)) uctus p pa
      lemma  = cond₁ A (u  (cons s)) ucus q qa
      eq : ∀(α : ₂ℕ)  r (cons s )  r (cons s α)
      eq α = ∃-elim r2 (cons s ) (cons s α)
                          (Lemma[cons-≣_≣] s  α)
      claim : ∀(α : ₂ℕ)  if (p(t(u(cons s α)))) (q(u(cons s α))) (r(cons s )) 
                          if (p(t(u(cons s α)))) (q(u(cons s α))) (r(cons s α))
      claim  α = cong (if (p(t(u(cons s α)))) (q(u(cons s α)))) (eq α)
      claim' :   α  if (p(t(u(cons s α)))) (q(u(cons s α))) (r(cons s )))
                α  if (p(t(u(cons s α)))) (q(u(cons s α))) (r(cons s α)))
      claim' = extensionality claim
               --------------


-- Successor with its continuity

continuous-succ : Σ \(s :   )  continuous {ℕSpace} {ℕSpace} s
continuous-succ = succ , Lemma[discreteness] {} {ℕSpace} succ


-- Rec function with its continuity

continuous-rec : {A : Space} 
                 Σ \(r : U(A  A)  U(A  ℕSpace  A)) 
                     continuous {A  A} {A  ℕSpace  A} r
continuous-rec {A} = (r , continuity-of-rec)
 where
  r : U(A  A)  U(A  ℕSpace  A)
  r f = (g , cg)
   where
    g : U A  U(ℕSpace  A)
    g a = rec (π₀ f) a , Lemma[discreteness] {} {A} (rec (π₀ f) a)
    cg : continuous {A} {ℕSpace  A} g
    cg p pa q qn t uct = cond₂ A  α  rec (π₀ f) (p(t α)) (q α)) (∃-intro n prf)
     where
      n : 
      n = ∃-witness qn
      prf : ∀(s : ₂Fin n)   α  rec (π₀ f) (p(t(cons s α))) (q(cons s α)))  Probe A
      prf s = subst {₂ℕ  U A}  x  x  Probe A} claim' (lemma (q(cons s )))
       where
        ucts : uniformly-continuous-₂ℕ (t  (cons s))
        ucts = Lemma[∘-UC] t uct (cons s) (Lemma[cons-UC] s)
        lemma : ∀(k : )   α  rec (π₀ f) (p(t(cons s α))) k)  Probe A
        lemma 0        = cond₁ A (t  (cons s)) ucts p pa
        lemma (succ k) = π₁ f  α  rec (π₀ f) (p(t(cons s α))) k) (lemma k)
        eq : ∀(α : ₂ℕ)  q (cons s )  q (cons s α)
        eq α = ∃-elim qn (cons s ) (cons s α) (Lemma[cons-≣_≣] s  α)
        claim : ∀(α : ₂ℕ)   rec (π₀ f) (p(t(cons s α))) (q(cons s ))
                            rec (π₀ f) (p(t(cons s α))) (q(cons s α))
        claim α = cong (rec (π₀ f) (p(t(cons s α)))) (eq α)
        claim' :   α  rec (π₀ f) (p(t(cons s α))) (q(cons s )))
                  α  rec (π₀ f) (p(t(cons s α))) (q(cons s α)))
        claim' = extensionality claim
                 --------------
  continuity-of-rec : continuous {A  A} {A  ℕSpace  A} r
  continuity-of-rec p paa q qa t uct u un v ucv =
               cond₂ A  α  rec (π₀(p(t(v α)))) (q(v α)) (u α)) (∃-intro n prf)
   where
    n : 
    n = ∃-witness un
    prf : ∀(s : ₂Fin n)   α  rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) (u(cons s α)))  Probe A
    prf s = subst {₂ℕ  U A}  x  x  Probe A} claim' (lemma (u(cons s )))
     where
      ucvs : uniformly-continuous-₂ℕ (v  (cons s))
      ucvs = Lemma[∘-UC] v ucv (cons s) (Lemma[cons-UC] s)
      uctvs : uniformly-continuous-₂ℕ (t  v  (cons s))
      uctvs = Lemma[∘-UC] t uct (v  (cons s)) ucvs
      lemma : ∀(k : )   α  rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) k)  Probe A
      lemma 0        = cond₁ A (v  (cons s)) ucvs q qa
      lemma (succ k) = paa  α  rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) k) (lemma k)
                           (t  v  (cons s)) uctvs
      eq : ∀(α : ₂ℕ)  u(cons s )  u(cons s α)
      eq α = ∃-elim un (cons s ) (cons s α) (Lemma[cons-≣_≣] s  α)
      claim : ∀(α : ₂ℕ) 
                rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) (u(cons s ))
               rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) (u(cons s α))
      claim α = cong (rec (π₀(p(t(v(cons s α))))) (q(v(cons s α)))) (eq α)
      claim' :   α  rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) (u(cons s )))
                α  rec (π₀(p(t(v(cons s α))))) (q(v(cons s α))) (u(cons s α)))
      claim' = extensionality claim
               --------------


-- Unit function with its continuity

continuous-unit : {A : Space} 
                  Σ \(u : U A  )  continuous {A} {⒈Space} u
continuous-unit = unit ,  p _  )


-- Projection functions with their continuity

continuous-π₀ : {A B : Space} 
                Σ \(p : U (A  B)  U A)  continuous {A  B} {A} p
continuous-π₀ {A} {B} = π₀ , λ p pr  ∧-elim₀ pr

continuous-π₁ : {A B : Space} 
                Σ \(p : U (A  B)  U B)  continuous {A  B} {B} p
continuous-π₁ {A} {B} = π₁ , λ p pr  ∧-elim₁ pr
 


\end{code}