let Id : (A : Type) -> A -> A -> Type = \A x y -> Path (\i -> A) x y in let the : (A : Type) -> A -> A = \A x -> x in let fill : (i : I) (A : I -> Type) (phi : I) (u : (i : I) -> Partial phi (A i)) -> Sub (A i0) phi (u i0) -> A i = \i A phi u a0 -> comp (\j -> A (i && j)) (phi || ~i) (\j -> [ phi -> u (i && j), ~i -> a0 ]) a0 in let trans : (A : Type) (a b c : A) -> Path (\i -> A) a b -> Path (\i -> A) b c -> Path (\i -> A) a c = \A a b c p q i -> comp (\j -> A) (i || ~i) (\j -> [ ~i -> a, i -> q j ]) (p i) in let isContr : Type -> Type = \A -> (x : A) * (y : A) -> Path (\i -> A) x y in let fiber : (T A : Type) -> (T -> A) -> A -> Type = \T A f y -> (x : T) * Path (\i -> A) y (f x) in let isEquiv : (T A : Type) -> (T -> A) -> Type = \T A f -> (y : A) -> isContr (fiber T A f y) in let idFun : (B : Type) -> B -> B = \A x -> x in let idEquiv : (B : Type) -> isEquiv B B (idFun B) = \B y -> ((y, \i -> y), \u -> \i -> (u.2 i, \j -> u.2 (i && j))) in let equiv : (A B : Type) -> Type = \A B -> (f : A -> B) * isEquiv A B f in let univalence : (A B : Type) -> equiv A B -> Path (\i -> Type) A B = \A B fun i -> Glue B (i || ~i) [~i -> A, i -> B] [~i -> fun, i -> (idFun B, idEquiv B)] in let idToEquiv : (A B : Type) -> Path (\i -> Type) A B -> equiv A B = \A B p -> comp (\i -> equiv A (p i)) i0 (\i -> []) (idFun A, idEquiv A) in let transp : (A B : Type) (p : Path (\i -> Type) A B) -> A -> B = \A B p -> comp (\i -> p i) i0 (\j -> []) in let univalenceBeta : (A B : Type) (f : equiv A B) -> Id (A -> B) (transp A B (univalence A B f)) f.1 = \A B f i a -> let b : B = transp B B (\i -> B) (f.1 a) in let rem1 : Id B b (f.1 a) = \i -> fill ~i (\i -> B) i0 (\j -> []) (f.1 a) in let rem2 : Id B (transp B B (\i -> B) b) b = \i -> fill ~i (\i -> B) i0 (\j -> []) b in let goal : Id B (transp B B (\i -> B) b) (f.1 a) = trans B (transp B B (\i -> B) b) b (f.1 a) rem2 rem1 in goal i in let not : Bool -> Bool = if (\x -> Bool) ff tt in let notInv : (b : Bool) -> Id Bool b (not (not b)) = if (\x -> Id Bool x (not (not x))) (\i -> tt) (\i -> ff) in let trueNotFalse : (A : Type) -> Id Bool tt ff -> A = \A p -> comp (\i -> if (\b -> Type) (A -> A) A (p i)) i0 (\j -> []) (\x -> x) in let notEquiv : isEquiv Bool Bool not = let contract1 : (a : Bool) (b : Path (\i -> Bool) tt (not a)) -> Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (a, b) = \a -> if (\a -> (b : Path (\i -> Bool) tt (not a)) -> Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (a, b)) (\b -> trueNotFalse (Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (tt, b)) b) (\b i -> (ff, \j -> b (i && j))) a in let contract2 : (a : Bool) (b : Path (\i -> Bool) ff (not a)) -> Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (a, b) = \a -> if (\a -> (b : Path (\i -> Bool) ff (not a)) -> Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (a, b)) (\b i -> (tt, \j -> b (i && j))) (\b -> trueNotFalse (Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (ff, b)) (\j -> b ~j)) a in \b -> if (\b -> isContr (fiber Bool Bool not b)) ((ff, \i -> tt), \fiber -> contract1 fiber.1 fiber.2) ((tt, \i -> ff), \fiber -> contract2 fiber.1 fiber.2) b in the (Id Bool (not ff) tt) (\i -> transp Bool Bool (univalence Bool Bool (not, notEquiv)) ff)