cubical-0.2.0: examples/nIso.cub
module nIso where
import univalence
-- an example with N and 1 + N isomorphic
NToOr : N -> or N Unit
NToOr = split
zero -> inr tt
suc n -> inl n
OrToN : or N Unit -> N
OrToN = split
inl n -> suc n
inr _ -> zero
secNO : (x:N) -> Id N (OrToN (NToOr x)) x
secNO = split
zero -> refl N zero
suc n -> refl N (suc n)
retNO : (z:or N Unit) -> Id (or N Unit) (NToOr (OrToN z)) z
retNO = split
inl n -> refl (or N Unit) (inl n)
inr y -> lem y
where lem : (y:Unit) -> Id (or N Unit) (inr tt) (inr y)
lem = split
tt -> refl (or N Unit) (inr tt)
isoNO : Id U N (or N Unit)
isoNO = isoId N (or N Unit) NToOr OrToN retNO secNO
isoNO2 : Id U N (or N Unit)
isoNO2 = comp U N N (or N Unit) (comp U N (or N Unit) N isoNO (inv U N (or N Unit) isoNO)) isoNO
isoNO4 : Id U N (or N Unit)
isoNO4 = comp U N N (or N Unit) (comp U N (or N Unit) N isoNO2 (inv U N (or N Unit) isoNO2)) isoNO2
-- trying to build an example which involves Kan filling for product
vect : U -> N -> U
vect A = split
zero -> A
suc n -> and A (vect A n)
pBool : N -> U
pBool = vect Bool
notSN : (x:N) -> pBool x -> pBool x
notSN = split
zero -> not
suc n -> \ z -> (not z.1,notSN n z.2)
sBool : (x:N) -> pBool x
sBool = split
zero -> true
suc n -> (false,sBool n)
stBool : (x:N) -> pBool x -> Bool
stBool = split
zero -> \ z -> z
suc n -> \ z -> andBool z.1 (stBool n z.2)
hasSec : U -> U
hasSec X = Sigma (X->U) (\ P -> (x:X) -> and (P x) (P x -> Bool))
hSN : hasSec N
hSN = (pBool,\ n -> (sBool n,stBool n))
hSN' : hasSec (or N Unit)
hSN' = subst U hasSec N (or N Unit) isoNO hSN
pB' : (or N Unit) -> U
pB' = hSN'.1
sB' : (z: or N Unit) -> and (pB' z) (pB' z -> Bool)
sB' = hSN'.2
appBool : (A : U) -> and A (A -> Bool) -> Bool
appBool A z = z.2 z.1
pred' : or N Unit -> or N Unit
pred' = subst U (\ X -> X -> X) N (or N Unit) isoNO pred
testPred : or N Unit
testPred = pred' (inr tt)
saB' : or N Unit -> Bool
saB' z = appBool (pB' z) (sB' z)
testSN : Bool
testSN = saB' (inr tt)
testSN1 : Bool
testSN1 = saB' (inl zero)
testSN2 : Bool
testSN2 = saB' (inl (suc zero))
testSN3 : Bool
testSN3 = saB' (inl (suc (suc zero)))
add : N -> N -> N
add x = split
zero -> x
suc y -> suc (add x y)
-- add' : (or N Unit) -> (or N Unit) -> or N Unit
-- add' = subst U (\ X -> X -> X -> X) N (or N Unit) isoNO add
-- a property that we can transport
propAdd : (x:N) -> Id N (add zero x) x
propAdd = split
zero -> refl N zero
suc n -> mapOnPath N N (\ x -> suc x) (add zero n) n (propAdd n)
-- a property of N
aZero : U -> U
aZero X = Sigma X (\ z -> Sigma (X -> X -> X) (\ f -> (x:X) -> Id X (f z x) x))
aZN : aZero N
aZN = (zero,(add,propAdd))
aZN' : aZero (or N Unit)
aZN' = subst U aZero N (or N Unit) isoNO aZN
zero' : or N Unit
zero' = aZN'.1
sndaZN' : Sigma ((or N Unit) -> (or N Unit) -> (or N Unit))
(\ f -> (x:(or N Unit)) -> Id (or N Unit) (f zero' x) x)
sndaZN' = aZN'.2
add' : (or N Unit) -> (or N Unit) -> or N Unit
add' = sndaZN'.1
propAdd' : (x:or N Unit) -> Id (or N Unit) (add' zero' x) x
propAdd' = sndaZN'.2
testNO : or N Unit
testNO = add' (inl zero) (inl (suc zero))
testNO1 : Id (or N Unit) (add' zero' zero') zero'
testNO1 = propAdd' zero'
testNO2 : or N Unit
testNO2 = zero'
testNO3 : or N Unit
testNO3 = add' zero' zero'
step : U -> U
step X = or X Unit
lemIt : (A:U) (f:A->A) (a:A) -> Id A a (f a) -> Id A a (f (f a))
lemIt A f a p = subst A (\ z -> Id A a (f z)) a (f a) p p
isoNOIt : Id U N (step (step N))
isoNOIt = lemIt U step N isoNO
isoNOIt2 : Id U N (step (step (step (step N))))
isoNOIt2 = lemIt U (\ x -> step (step x)) N isoNOIt
aZNIt : aZero (step (step N))
aZNIt = subst U aZero N (step (step N)) isoNOIt aZN
zeroIt : step (step N)
zeroIt = aZNIt.1
sndaZNIt : Sigma ((step (step N)) -> (step (step N)) -> (step (step N)))
(\ f -> (x:(step (step N))) -> Id (step (step N)) (f zeroIt x) x)
sndaZNIt = aZNIt.2
addIt : (step (step N)) -> (step (step N)) -> step (step N)
addIt = sndaZNIt.1
propAddIt : (x:step (step N)) -> Id (step (step N)) (addIt zeroIt x) x
propAddIt = sndaZNIt.2
testIt : step (step N)
testIt = addIt (inl (inl zero)) (inl (inl (suc zero)))
testIt1 : Id (step (step N)) (addIt zeroIt zeroIt) zeroIt
testIt1 = propAddIt zeroIt
testIt2 : step (step N)
testIt2 = zeroIt
testIt3 : step (step N)
testIt3 = addIt zeroIt zeroIt
step4 : U -> U
step4 x = step (step (step (step x)))
aZNIt2 : aZero (step4 N)
aZNIt2 = subst U aZero N (step4 N) isoNOIt2 aZN
zeroIt2 : step4 N
zeroIt2 = aZNIt2.1
sndaZNIt2 : Sigma ((step4 N) -> (step4 N) -> (step4 N))
(\ f -> (x:(step4 N)) -> Id (step4 N) (f zeroIt2 x) x)
sndaZNIt2 = aZNIt2.2
addIt2 : (step4 N) -> (step4 N) -> step4 N
addIt2 = sndaZNIt2.1
propAddIt2 : (x:step4 N) -> Id (step4 N) (addIt2 zeroIt2 x) x
propAddIt2 = sndaZNIt2.2
inl4 : N -> step4 N
inl4 x = inl (inl (inl (inl x)))
testIt2 : step4 N
testIt2 = addIt2 (inl4 zero) (inl4 zero)
testIt21 : Id (step4 N) (addIt2 zeroIt2 zeroIt2) zeroIt2
testIt21 = propAddIt2 zeroIt2
testIt22 : step4 N
testIt22 = zeroIt2
testIt23 : step4 N
testIt23 = addIt2 zeroIt2 zeroIt2