Core.bracket
import Core.prop (propExt)
import Core.equality (cong, sym, trans, pairext)
import Core.id (Id, refl, idToEq)
import Core.uip (uip, idCanon)
Br : π β π
Br = Ξ»a. a / (x y. β₯πβ₯)
br : {a : π} β a β Br a using (Br.unfold)
br = Ξ»a x. class x
brElim : {a b : π} (f : a β b) (c : (x y : a) β f x β‘ f y) (t : Br a) β b using (Br.unfold)
brElim = Ξ»a b f c t. quot-elim (x. f x) t
brBeta : {a b : π} (f : a β b) (c : (x y : a) β f x β‘ f y) (x : a) β brElim f c (br x) β‘ f x
using (Br.unfold, br.eq, brElim.eq)
brBeta f c x = β
brIsProp : {a : π} (u v : Br a) β u β‘ v using (Br.unfold)
brIsProp u v = quot-elim (y. quot-elim (x. β) u) v
brOutConst : {a b : π} (g : Br a β b) (x y : a) β g (br x) β‘ g (br y)
brOutConst = Ξ»a b g x y. cong (Ξ»w. b) g (brIsProp (br x) (br y))
brEta : {a b : π} (g : Br a β b) (t : Br a) β brElim (Ξ»x. g (br x)) (brOutConst g) t β‘ g t
using (Br.unfold, br.eq, brElim.eq, brOutConst.eq)
brEta = Ξ»a b g t. quot-elim (x. β) t
brSurj : {a : π} (t : Br a) β β₯(x : a) Γ br x β‘ tβ₯ using (Br.unfold, br.eq)
brSurj = Ξ»a t. quot-elim (x. β (x, β)) t
brToSquash : {a : π} β Br a β β₯aβ₯ using (Br.unfold)
brToSquash = Ξ»a t. quot-elim (x. β x) t
brSquashEq : {a : π} β β₯Br aβ₯ β‘ β₯aβ₯ using (Br.unfold, br.eq, brToSquash.eq)
brSquashEq = Ξ»a. propExt (Ξ»h. squash-elim h (t. brToSquash t)) (Ξ»h. squash-elim h (x. β (br x)))
brMap : {a b : π} (f : a β b) (t : Br a) β Br b using (Br.unfold, br.eq)
brMap = Ξ»a b f t. quot-elim (x. br (f x)) t
brMapBeta : (a b : π) (f : a β b) (x : a) β brMap f (br x) β‘ br (f x)
using (Br.unfold, br.eq, brMap.eq)
brMapBeta = Ξ»a b f x. β
brJoin : {a : π} (s : Br (Br a)) β Br a
brJoin s = brElim (Ξ»t. t) brIsProp s
brJoinUnit : {a : π} (t : Br a) β brJoin (br t) β‘ t using (Br.unfold, br.eq, brJoin.eq, brElim.eq)
brJoinUnit t = β
brUnitJoin : {a : π} (s : Br (Br a)) β br (brJoin s) β‘ s
brUnitJoin s = brIsProp _ _
zeroConst : {b : π} (f : π β b) (x y : π) β f x β‘ f y
zeroConst f x y = π-elim x
brEmpty : Br π β π using (Br.unfold, zeroConst.eq)
brEmpty t = quot-elim (x. π-elim x) t
brDescr : {a : π} (s : (x y : a) β x β‘ y) (t : Br a) β a using (Br.unfold)
brDescr s t = quot-elim (x. x) t
brDescrBeta : {a : π} (s : (x y : a) β x β‘ y) (x : a) β brDescr s (br x) β‘ x
using (Br.unfold, br.eq, brDescr.eq)
brDescrBeta = Ξ»a s x. β
brDescrEta' : {a : π} (s : (x y : a) β x β‘ y) (t : Br a) β br (brDescr s t) β‘ t
brDescrEta' s t = brIsProp _ _
Fib : β β π
Fib n = (m : β) Γ Id _ m n
fibCanon : {n : β} (u : Fib n) β u β‘ (n, refl β n)
using (Fib.unfold, hyp.rw, sigma.eta, Core.id.Id.unfold, Core.id.Id.eq)
fibCanon =
Ξ»n u. let h = idToEq _ _ _ (u .Οβ)
pairext {β} {Ξ»m. Id _ m n} {_} {n, refl β n} h (idCanon (u .Οβ) h)
fibIsProp : (n : β) (u v : Fib n) β u β‘ v using (Fib.unfold, Core.id.Id.unfold, Core.id.Id.eq)
fibIsProp = Ξ»n u v. trans _ _ _ (fibCanon u) (sym _ _ (fibCanon v))
fibWitness : (n : β) (t : Br (Fib n)) β β using (Fib.unfold)
fibWitness = Ξ»n t. brDescr (fibIsProp n) t .Οβ
fibWitnessComputes : fibWitness 2 (br (2, refl β 2)) β‘ 2
using (Fib.unfold, br.eq, brDescr.eq, fibWitness.eq, Core.id.Id.eq)
fibWitnessComputes = β
brProdIsProp : {a b : π} (u v : Br a Γ Br b) β u β‘ v using (sigma.eta)
brProdIsProp = Ξ»a b u v. pairext (brIsProp (u .Οβ) (v .Οβ)) (brIsProp (u .Οβ) (v .Οβ))
brPairIn : {a b : π} (t : Br (a Γ b)) β Br a Γ Br b
brPairIn =
Ξ»a b t. brElim
Ξ»p. br (p .Οβ), br (p .Οβ)
Ξ»p q. brProdIsProp (br (p .Οβ), br (p .Οβ)) (br (q .Οβ), br (q .Οβ))
t
brPairOutAt : {a b : π} (x : a) (v : Br b) β Br (a Γ b)
brPairOutAt = Ξ»a b x v. brElim (Ξ»y. br (x, y)) (Ξ»y y'. brIsProp (br (x, y)) (br (x, y'))) v
brPairOut : {a b : π} (p : Br a Γ Br b) β Br (a Γ b)
brPairOut =
Ξ»a b p. brElim
Ξ»x. brPairOutAt x (p .Οβ)
Ξ»x x'. brIsProp (brPairOutAt x (p .Οβ)) (brPairOutAt x' (p .Οβ))
p .Οβ
brProdIso1 : {a b : π} (t : Br (a Γ b)) β brPairOut (brPairIn t) β‘ t
brProdIso1 = Ξ»a b t. brIsProp _ _
brProdIso2 : {a b : π} (p : Br a Γ Br b) β brPairIn (brPairOut p) β‘ p
brProdIso2 = Ξ»a b p. brProdIsProp _ _