sum
import equality (cong, transport)
def swap : (a : 𝕌) (b : 𝕌) → El (a ⊎ b) → El (b ⊎ a) ≔
λa. λb. λt. ⊎-elim (w. El (b ⊎ a)) (x. inj₂ x) (y. inj₁ y) t
def swapBeta1 : (a : 𝕌) (b : 𝕌) (x : El a) → swap _ _ (inj₁ x) ≡ inj₂ x ∈ El (b ⊎ _) ≔
λa. λb. λx. ⋆
def swapBeta2 : (a : 𝕌) (b : 𝕌) (y : El b) → swap _ _ (inj₂ y) ≡ inj₁ y ∈ El (_ ⊎ a) ≔
λa. λb. λy. ⋆
def swapInvol : (a : 𝕌) (b : 𝕌) (t : El (a ⊎ b)) → swap _ _ (swap _ _ t) ≡ t ∈ _ ≔
λa. λb. λt. ⊎-elim (w. swap _ _ (swap _ _ w) ≡ w ∈ _) (x. ⋆) (y. ⋆) t
def sumEta : (a : 𝕌) (b : 𝕌) (c : 𝕌) (f : El (a ⊎ b) → El c) (t : El (a ⊎ b)) →
⊎-elim (w. El c) (x. f (inj₁ x)) (y. f (inj₂ y)) t ≡ f t ∈ _ ≔
λa. λb. λc. λf. λt.
⊎-elim (w. ⊎-elim (v. El c) (x. f (inj₁ x)) (y. f (inj₂ y)) w ≡ f w ∈ _)
(x. ⋆) (y. ⋆) t
def toCode : (a : 𝕌) (b : 𝕌) → El a ⊎ El b → El (a ⊎ b) ≔
λa. λb. λt. ⊎-elim (w. El (a ⊎ b)) (x. inj₁ x) (y. inj₂ y) t
def fromCode : (a : 𝕌) (b : 𝕌) → El (a ⊎ b) → El a ⊎ El b ≔
λa. λb. λt. ⊎-elim (w. El a ⊎ El b) (x. inj₁ x) (y. inj₂ y) t
def toFromId : (a : 𝕌) (b : 𝕌) (t : El (a ⊎ b)) → toCode _ _ (fromCode _ _ t) ≡ t ∈ _ ≔
λa. λb. λt. ⊎-elim (w. toCode a b (fromCode a b w) ≡ w ∈ El (a ⊎ b)) (x. ⋆) (y. ⋆) t
def outl : (a : 𝕌) (b : 𝕌) → El a → El (a ⊎ b) → El a ≔
λa. λb. λd. λt. ⊎-elim (w. El a) (x. x) (y. d) t
def inj1Injective : (a : 𝕌) (b : 𝕌) (x : El a) (x' : El a) →
(inj₁ x ≡ inj₁ x' ∈ El (_ ⊎ b)) → x ≡ x' ∈ _ ≔
λa. λb. λx. λx'. λh. cong _ (λw. a) (outl _ _ x) _ _ h
def isLeftCode : (a : 𝕌) (b : 𝕌) → El (a ⊎ b) → 𝕌 ≔
λa. λb. λt. ⊎-elim (w. 𝕌) (x. 𝟙) (y. 𝟘) t
def inj1NotInj2 : (a : 𝕌) (b : 𝕌) (x : El a) (y : El b) →
(inj₁ x ≡ inj₂ y ∈ El (a ⊎ b)) → 𝟘 ≔
λa. λb. λx. λy. λh. transport _ (isLeftCode _ _) _ _ h ()