Properties of the disjoint sum _+_ of types. \begin{code} {-# OPTIONS --without-K --exact-split --safe #-} module Plus-Properties where open import Plus open import Universes open import Negation open import Id open import Empty open import Unit open import Unit-Properties +-commutative : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ A + B โ B + A +-commutative = cases inr inl +disjoint : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {x : X} {y : Y} โ ยฌ (inl x โก inr y) +disjoint {๐ค} {๐ฅ} {X} {Y} p = ๐-is-not-๐ q where f : X + Y โ ๐คโ ฬ f (inl x) = ๐ f (inr y) = ๐ q : ๐ โก ๐ q = ap f p +disjoint' : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {x : X} {y : Y} โ ยฌ (inr y โก inl x) +disjoint' p = +disjoint (p โปยน) inl-lc : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {x x' : X} โ inl {๐ค} {๐ฅ} {X} {Y} x โก inl x' โ x โก x' inl-lc refl = refl inr-lc : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {y y' : Y} โ inr {๐ค} {๐ฅ} {X} {Y} y โก inr y' โ y โก y' inr-lc refl = refl equality-cases : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {A : ๐ฆ ฬ } (z : X + Y) โ ((x : X) โ z โก inl x โ A) โ ((y : Y) โ z โก inr y โ A) โ A equality-cases (inl x) f g = f x refl equality-cases (inr y) f g = g y refl Cases-equality-l : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {A : ๐ฆ ฬ } (f : X โ A) (g : Y โ A) โ (z : X + Y) (x : X) โ z โก inl x โ Cases z f g โก f x Cases-equality-l f g .(inl x) x refl = refl Cases-equality-r : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {A : ๐ฆ ฬ } (f : X โ A) (g : Y โ A) โ (z : X + Y) (y : Y) โ z โก inr y โ Cases z f g โก g y Cases-equality-r f g .(inr y) y refl = refl Left-fails-gives-right-holds : {P : ๐ค ฬ } {Q : ๐ฅ ฬ } โ P + Q โ ยฌ P โ Q Left-fails-gives-right-holds (inl p) u = ๐-elim (u p) Left-fails-gives-right-holds (inr q) u = q Right-fails-gives-left-holds : {P : ๐ค ฬ } {Q : ๐ฅ ฬ } โ P + Q โ ยฌ Q โ P Right-fails-gives-left-holds (inl p) u = p Right-fails-gives-left-holds (inr q) u = ๐-elim (u q) open import Unit open import Sigma open import GeneralNotation inl-preservation : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } (f : X + ๐ {๐ฆ} โ Y + ๐ {๐ฃ}) โ f (inr *) โก inr * โ left-cancellable f โ (x : X) โ ฮฃ y ๊ Y , f (inl x) โก inl y inl-preservation {๐ค} {๐ฅ} {๐ฆ} {๐ฃ} {X} {Y} f p l x = ฮณ x (f (inl x)) refl where ฮณ : (x : X) (z : Y + ๐) โ f (inl x) โก z โ ฮฃ y ๊ Y , z โก inl y ฮณ x (inl y) q = y , refl ฮณ x (inr *) q = ๐-elim (+disjoint (l r)) where r : f (inl x) โก f (inr *) r = q โ p โปยน \end{code}