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}