cubical-0.2.0: examples/spector.cub
-- An example similar to Martin Escardo on Cantor's search
-- implement Spector double negation shift, following the presentation in
-- a proof of strong normalization using domain theory
-- needs mutual recursion
module spector where
import prelude
leqN : N -> N -> U
leqN = split
zero -> \ m -> Unit
suc n -> split
zero -> N0
suc m -> leqN n m
lessN : (n:N) (m:N) -> or (leqN (suc n) m) (leqN m n)
lessN = split
zero -> split
zero -> inr tt
suc m -> inl tt
suc n -> split
zero -> inr tt
suc m -> lessN n m
vect : (N->U) -> N -> U
vect B = split
zero -> Unit
suc n -> and (vect B n) (B n)
head : (B:N->U) (n:N) -> vect B (suc n) -> B n
head B n p = p.2
tail : (B:N->U) (n:N) -> vect B (suc n) -> vect B n
tail B n p = p.1
-- we follow the notation of the paper
get : (B:N-> U) (n m:N) -> (leqN (suc m) n) -> vect B n -> B m
get B n m p v = head B m (trim (suc m) n p (vect B) (tail B) v)
where
T : (N -> U) -> U
T P = (k:N) -> P (suc k) -> P k
trim : (n m:N) -> (leqN n m) -> (P:N->U) -> T P -> P m -> P n
trim = split
zero -> split
zero -> \ p P h v -> v
suc m -> \ p P h v -> trim zero m p P h (h m v)
suc n -> split
zero -> \ p P h v -> efq (P (suc n)) p
suc m -> \ p P h v -> trim n m p (\ x -> P (suc x)) (\ x -> h (suc x)) v
mutual
Phi : (B:N->U) -> ((n:N) -> neg (neg (B n))) ->
neg (Pi N B) -> (n:N) -> neg (vect B n)
Psi : (B:N->U) -> ((n:N) -> neg (neg (B n))) ->
neg (Pi N B) -> (n:N) -> vect B n ->
(x : N) -> (or (leqN (suc x) n) (leqN n x)) -> B x
Phi B H K n v = K (\x -> Psi B H K n v x (lessN x n))
Psi B H K n v x = split
inl p -> get B n x p v
inr p -> efq (B x) (H n (\ y -> Phi B H K (suc n) (v, y)))
spector : (B:N->U) -> ((n:N) -> neg (neg (B n))) -> neg (neg (Pi N B))
spector B H K = Phi B H K zero tt