|
|
@ -297,10 +297,10 @@ rightCancel p j i = cube p i1 j i where |
|
|
|
cube : {A : Type} {x : A} {y : A} (p : Path x y) -> I -> I -> I -> A |
|
|
|
cube {A} {x} p k j i = |
|
|
|
hfill {A} (\ k [ (i = i0) -> x |
|
|
|
, (i = i1) -> p (iand (inot k) (inot j)) |
|
|
|
, (j = i1) -> x |
|
|
|
]) |
|
|
|
(inS (p (iand i (inot j)))) k |
|
|
|
, (i = i1) -> p (iand (inot k) (inot j)) |
|
|
|
, (j = i1) -> x |
|
|
|
]) |
|
|
|
(inS (p (iand i (inot j)))) k |
|
|
|
|
|
|
|
leftCancel : {A : Type} {x : A} {y : A} (p : Path x y) -> Path (trans (sym p) p) refl |
|
|
|
leftCancel p = rightCancel (sym p) |
|
|
@ -487,30 +487,7 @@ idToEquiv p = lineToEquiv (\i -> p i) |
|
|
|
-- we need to come up with a filler for the Bottom and right faces. |
|
|
|
|
|
|
|
univalenceBeta : {A : Type} {B : Type} (f : Equiv A B) -> Path (transp (\i -> univalence f i)) f.1 |
|
|
|
univalenceBeta {A} {B} f i a = |
|
|
|
let |
|
|
|
-- The Bottom left corner |
|
|
|
botLeft : B |
|
|
|
botLeft = transp (\i -> B) (f.1 a) |
|
|
|
|
|
|
|
-- The "Bottom face" filler connects the Bottom-left corner, f.1 a, |
|
|
|
-- and the Bottom-right corner, which is the transport of f.1 a |
|
|
|
-- along \i -> B. |
|
|
|
botFace : Path (f.1 a) botLeft |
|
|
|
botFace i = fill (\i -> B) (\j []) (inS (f.1 a)) i |
|
|
|
|
|
|
|
-- The "right face" filler connects the Bottom-right corner and the |
|
|
|
-- upper-right corner, which is again a simple transport along |
|
|
|
-- \i -> B. |
|
|
|
rightFace : Path (transp (\i -> B) botLeft) botLeft |
|
|
|
rightFace i = fill (\i -> B) (\j []) (inS botLeft) (inot i) |
|
|
|
|
|
|
|
-- The goal is a path between the Bottom-left and top-right corners, |
|
|
|
-- which we can get by composing (in the path sense) the Bottom and |
|
|
|
-- right faces. |
|
|
|
goal : Path (transp (\i -> B) botLeft) (f.1 a) |
|
|
|
goal = trans rightFace (\i -> botFace (inot i)) |
|
|
|
in goal i |
|
|
|
univalenceBeta {A} {B} f i a = transpFill {\i -> B} (f.1 a) (inot i) |
|
|
|
|
|
|
|
-- The terms univalence + univalenceBeta suffice to prove the "full" |
|
|
|
-- univalence axiom of Voevodsky, as can be seen in the paper |
|
|
@ -1127,6 +1104,25 @@ isProp_isSet h a b p q j i = |
|
|
|
isProp_isProp : {A : Type} -> isProp (isProp A) |
|
|
|
isProp_isProp f g i a b = isProp_isSet f a b (f a b) (g a b) i |
|
|
|
|
|
|
|
sigmaPath : {A : Type} {B : A -> Type} {s1 : (x : A) * B x} {s2 : (x : A) * B x} |
|
|
|
-> (p : Path s1.1 s2.1) |
|
|
|
-> PathP (\i -> B (p i)) s1.2 s2.2 |
|
|
|
-> Path s1 s2 |
|
|
|
sigmaPath p q i = (p i, q i) |
|
|
|
|
|
|
|
propExt : {A : Type} {B : Type} |
|
|
|
-> isProp A -> isProp B |
|
|
|
-> (A -> B) |
|
|
|
-> (B -> A) |
|
|
|
-> Equiv A B |
|
|
|
propExt {A} {B} propA propB f g = (f, contract) where |
|
|
|
contract : (y : B) -> isContr (fiber f y) |
|
|
|
contract y = |
|
|
|
let arg : A |
|
|
|
arg = g y |
|
|
|
in ( (arg, propB y (f arg)) |
|
|
|
, \fib -> sigmaPath (propA _ _) (isProp_isSet {B} propB y (f fib.1) _ _)) |
|
|
|
|
|
|
|
Sq_rec : {A : Type} {B : Type} |
|
|
|
-> isProp B |
|
|
|
-> (f : A -> B) |
|
|
@ -1270,6 +1266,17 @@ pathToEq_isSet {A} p_to_s = axK_to_isSet {A} (\{x} -> pathToEqS_K {A} {x} p_to_s |
|
|
|
Nat_isSet : isHSet Nat |
|
|
|
Nat_isSet = pathToEq_isSet {Nat} (\{x} {y} -> Path_nat_strict_nat x y) |
|
|
|
|
|
|
|
Bool_isSet : isHSet Bool |
|
|
|
Bool_isSet = pathToEq_isSet {Bool} (\{x} {y} -> p x y) where |
|
|
|
p : (x : Bool) (y : Bool) -> Path x y -> Eq_s x y |
|
|
|
p = \case |
|
|
|
true -> \case |
|
|
|
true -> \p -> refl_s |
|
|
|
false -> \p -> absurd (trueNotFalse p) |
|
|
|
false -> \case |
|
|
|
false -> \p -> refl_s |
|
|
|
true -> \p -> absurd (trueNotFalse (sym p)) |
|
|
|
|
|
|
|
equivCtr : {A : Type} {B : Type} (e : Equiv A B) (y : B) -> fiber e.1 y |
|
|
|
equivCtr e y = (e.2 y).1 |
|
|
|
|
|
|
@ -1294,26 +1301,28 @@ rightIsOne {a} {b} p = J_s {I} {i1} (\i p -> IsOne (ior a i)) refl_s (sym_s p) |
|
|
|
bothAreOne : {a : I} {b : I} -> Eq_s a i1 -> Eq_s b i1 -> Eq_s (iand a b) i1 |
|
|
|
bothAreOne {a} {b} p q = J_s {I} {i1} (\i p -> IsOne (iand i b)) q (sym_s p) |
|
|
|
|
|
|
|
test : {X : Type} -> (S1 -> X) -> (a : X) * Path a a |
|
|
|
test {X} f = (f base, \i -> f (loop i)) |
|
|
|
S1Map_to_baseLoop : {X : Type} -> (S1 -> X) -> (a : X) * Path a a |
|
|
|
S1Map_to_baseLoop {X} f = (f base, \i -> f (loop i)) |
|
|
|
|
|
|
|
test' : {X : Type} -> ((a : X) * Path a a) -> S1 -> X |
|
|
|
test' {X} p = \case |
|
|
|
baseLoop_to_S1Map : {X : Type} -> ((a : X) * Path a a) -> S1 -> X |
|
|
|
baseLoop_to_S1Map {X} p = \case |
|
|
|
base -> p.1 |
|
|
|
loop i -> p.2 i |
|
|
|
|
|
|
|
test_test' : {X : Type} -> (f : S1 -> X) -> Path (test' (test f)) f |
|
|
|
test_test' {X} f = funext {S1} {\s -> X} {\x -> test' (test f) x} {f} h where |
|
|
|
h : (x : S1) -> Path (test' (test f) x) (f x) |
|
|
|
h = \case |
|
|
|
base -> refl |
|
|
|
loop i -> refl |
|
|
|
S1_univ : {X : Type} -> Path (S1 -> X) ((a : X) * Path a a) |
|
|
|
S1_univ = IsoToId {S1 -> X} {(a : X) * Path a a} (S1Map_to_baseLoop, baseLoop_to_S1Map, ret, sec) where |
|
|
|
to = S1Map_to_baseLoop |
|
|
|
fro = baseLoop_to_S1Map |
|
|
|
|
|
|
|
test'_test : {X : Type} -> (x : (a : X) * Path a a) -> Path (test (test' x)) x |
|
|
|
test'_test x = refl |
|
|
|
sec : {X : Type} -> (f : S1 -> X) -> Path (fro (to f)) f |
|
|
|
sec {X} f = funext {S1} {\s -> X} {\x -> fro (to f) x} {f} h where |
|
|
|
h : (x : S1) -> Path (fro (to f) x) (f x) |
|
|
|
h = \case |
|
|
|
base -> refl |
|
|
|
loop i -> refl |
|
|
|
|
|
|
|
test'' : {X : Type} -> Path (S1 -> X) ((a : X) * Path a a) |
|
|
|
test'' = IsoToId {S1 -> X} {(a : X) * Path a a} (test, test', test'_test, test_test') |
|
|
|
ret : {X : Type} -> (x : (a : X) * Path a a) -> Path (to (fro x)) x |
|
|
|
ret x = refl |
|
|
|
|
|
|
|
-- HoTT book lemma 8.9.1 |
|
|
|
encodeDecode : {A : Type} {a0 : A} |
|
|
@ -1323,14 +1332,124 @@ encodeDecode : {A : Type} {a0 : A} |
|
|
|
-> ((c : code a0) -> Path (transp (\i -> code (decode a0 c i)) c0) c) |
|
|
|
-> Path (decode a0 c0) refl |
|
|
|
-> Path (Path a0 a0) (code a0) |
|
|
|
encodeDecode code c0 decode encDec based = IsoToId (encode {a0}, decode a0, encDec, decEnc) where |
|
|
|
encodeDecode code c0 decode encDec based = IsoToId (encode {a0}, decode _, encDec, decEnc) where |
|
|
|
encode : {x : A} -> Path a0 x -> code x |
|
|
|
encode alpha = transp (\i -> code (alpha i)) c0 |
|
|
|
|
|
|
|
encodeRefl : Path (encode refl) c0 |
|
|
|
encodeRefl = sym (transpFill {\i -> code a0} c0) |
|
|
|
|
|
|
|
decEnc : {x : A} (p : Path a0 x) -> Path (decode x (encode p)) p |
|
|
|
decEnc p = J (\x p -> Path (decode x (encode p)) p) q p where |
|
|
|
q : Path (decode a0 (encode refl)) refl |
|
|
|
q = transp (\i -> Path (decode a0 (encodeRefl (inot i))) refl) based |
|
|
|
decEnc : {x : A} (p : Path a0 x) -> Path (decode _ (encode p)) p |
|
|
|
decEnc p = J (\x p -> Path (decode _ (encode p)) p) q p where |
|
|
|
q : Path (decode _ (encode refl)) refl |
|
|
|
q = transp (\i -> Path (decode _ (encodeRefl (inot i))) refl) based |
|
|
|
|
|
|
|
S1_elim : (P : S1 -> Type) |
|
|
|
-> (pb : P base) |
|
|
|
-> PathP (\i -> P (loop i)) pb pb |
|
|
|
-> (x : S1) -> P x |
|
|
|
S1_elim P pb pq = \case |
|
|
|
base -> pb |
|
|
|
loop i -> pq i |
|
|
|
|
|
|
|
PathP_is_Path : (P : I -> Type) (p : P i0) (q : P i1) -> Path (PathP P p q) (Path {P i1} (transp (\i -> P i) p) q) |
|
|
|
PathP_is_Path P p q i = PathP (\j -> P (ior i j)) (transpFill {\j -> P j} p i) q |
|
|
|
|
|
|
|
Constant : {A : Type} {B : Type} -> (A -> B) -> Type |
|
|
|
Constant f = (y : B) * (x : A) -> Path y (f x) |
|
|
|
|
|
|
|
Weakly : {A : Type} {B : Type} -> (A -> B) -> Type |
|
|
|
Weakly f = (x : A) (y : A) -> Path (f x) (f y) |
|
|
|
|
|
|
|
Conditionally : {A : Type} {B : Type} -> (A -> B) -> Type |
|
|
|
Conditionally f = (f' : Sq A -> B) * Path f (\x -> f' (inc x)) |
|
|
|
|
|
|
|
Constant_weakly : {A : Type} {B : Type} (f : A -> B) -> Constant f -> Weakly f |
|
|
|
Constant_weakly f p x y = trans (sym (p.2 x)) (p.2 y) |
|
|
|
|
|
|
|
Constant_conditionally : {A : Type} {B : Type} -> (f : A -> B) -> Constant f -> Conditionally f |
|
|
|
Constant_conditionally {A} {B} f p = transp (\i -> Conditionally (c_const (inot i))) (const_c p.1) where |
|
|
|
c_const : Path f (\y -> p.1) |
|
|
|
c_const i x = p.2 x (inot i) |
|
|
|
|
|
|
|
const_c : (y : B) -> Conditionally {A} (\x -> y) |
|
|
|
const_c y = (\x -> y, refl) |
|
|
|
|
|
|
|
S1_connected : (f : S1 -> Bool) -> Constant f |
|
|
|
S1_connected f = (f'.1, p) where |
|
|
|
f' : (x : Bool) * Path x x |
|
|
|
f' = S1Map_to_baseLoop f |
|
|
|
|
|
|
|
p : (y : S1) -> Path f'.1 (f y) |
|
|
|
p = S1_elim P refl loopc where |
|
|
|
P : S1 -> Type |
|
|
|
P = \y -> Path f'.1 (f y) |
|
|
|
|
|
|
|
rr = refl {Bool} {f base} |
|
|
|
|
|
|
|
loopc : PathP (\i -> P (loop i)) rr rr |
|
|
|
loopc = transp (\i -> PathP_is_Path (\i -> P (loop i)) rr rr (inot i)) |
|
|
|
(Bool_isSet _ _ rr (transp (\i -> P (loop i)) rr)) |
|
|
|
|
|
|
|
isProp_isEquiv : {A : Type} {B : Type} {f : A -> B} -> isProp (isEquiv f) |
|
|
|
isProp_isEquiv {f} p q i y = |
|
|
|
let |
|
|
|
p2 = (p y).2 |
|
|
|
q2 = (q y).2 |
|
|
|
in |
|
|
|
( p2 (q y).1 i |
|
|
|
, \w j -> hcomp (\k [ (i = i0) -> p2 w j |
|
|
|
, (i = i1) -> q2 w (ior j (inot k)) |
|
|
|
, (j = i0) -> p2 (q2 w (inot k)) i |
|
|
|
, (j = i1) -> w ]) |
|
|
|
(inS (p2 w (ior i j))) |
|
|
|
) |
|
|
|
|
|
|
|
isProp_EqvSq : {P : Type} (x : Equiv P (Sq P)) (y : Equiv P (Sq P)) -> Path x y |
|
|
|
isProp_EqvSq x y = sigmaPath x1_is_y1 (isProp_isEquiv {P} {Sq P} {y.1} (transp (\i -> isEquiv (x1_is_y1 i)) x.2) y.2) where |
|
|
|
x1_is_y1 : Path x.1 y.1 |
|
|
|
x1_is_y1 i e = sq (x.1 e) (y.1 e) i |
|
|
|
|
|
|
|
equivLemma : {A : Type} {B : Type} {e : Equiv A B} {e' : Equiv A B} |
|
|
|
-> Path e.1 e'.1 |
|
|
|
-> Path e e' |
|
|
|
equivLemma {A} {B} {e} {e'} p = sigmaPath p (isProp_isEquiv {A} {B} {e'.1} (transp (\i -> isEquiv (p i)) e.2) e'.2) |
|
|
|
|
|
|
|
isProp_to_Sq_equiv : {P : Type} -> isProp P -> Equiv P (Sq P) |
|
|
|
isProp_to_Sq_equiv {P} prop = propExt prop sqProp inc proj where |
|
|
|
proj : Sq P -> P |
|
|
|
proj = Sq_rec prop (\x -> x) |
|
|
|
|
|
|
|
sqProp : isProp (Sq P) |
|
|
|
sqProp x y i = sq x y i |
|
|
|
|
|
|
|
Sq_equiv_to_isProp : {P : Type} -> Equiv P (Sq P) -> isProp P |
|
|
|
Sq_equiv_to_isProp eqv = transp (\i -> isProp (univalence eqv (inot i))) (\x y i -> sq x y i) |
|
|
|
|
|
|
|
exercise_3_21 : {P : Type} -> Equiv (isProp P) (Equiv P (Sq P)) |
|
|
|
exercise_3_21 {P} = propExt (isProp_isProp {P}) (isProp_EqvSq {P}) isProp_to_Sq_equiv Sq_equiv_to_isProp |
|
|
|
|
|
|
|
uaBeta : {A : Type} {B : Type} (e : Equiv A B) -> Path (idToEquiv (univalence e)).1 e.1 |
|
|
|
uaBeta {A} {B} e i a = univalenceBeta e i a |
|
|
|
|
|
|
|
uaret : {A : Type} {B : Type} -> retract {Equiv A B} {Path A B} (univalence {A} {B}) (idToEquiv {A} {B}) |
|
|
|
uaret eqv = equivLemma (uaBeta eqv) |
|
|
|
|
|
|
|
f1 : {A : Type} -> (p : (B : Type) * Equiv A B) -> (B : Type) * Path A B |
|
|
|
f1 {A} p = (p.1, univalence p.2) |
|
|
|
|
|
|
|
f2 : {A : Type} -> (p : (B : Type) * Path A B) -> (B : Type) * Equiv A B |
|
|
|
f2 {A} p = (p.1, idToEquiv p.2) |
|
|
|
|
|
|
|
uaretSig : {A : Type} (a : (B : Type) * Equiv A B) -> Path (f2 (f1 a)) a |
|
|
|
uaretSig {A} p = sigmaPath (\i -> p.1) (uaret {A} {p.1} p.2) |
|
|
|
|
|
|
|
retContr : {A : Type} {B : Type} |
|
|
|
-> (f : A -> B) -> (g : B -> A) |
|
|
|
-> (h : retract f g) |
|
|
|
-> isContr B -> isContr A |
|
|
|
retContr {A} {B} f g h v = (g b, p) where |
|
|
|
b = v.1 |
|
|
|
|
|
|
|
p : (x : A) -> Path (g b) x |
|
|
|
p x i = comp (\i -> A) (\j [ (i = i0) -> g b, (i = i1) -> h x j ]) (inS (g (v.2 (f x) i))) |