# Symmetric difference of subtypes ```agda module foundation.symmetric-difference where ``` <details><summary>Imports</summary> ```agda open import foundation.decidable-subtypes open import foundation.decidable-types open import foundation.dependent-pair-types open import foundation.exclusive-sum open import foundation.intersections-subtypes open import foundation.universe-levels open import foundation-core.coproduct-types open import foundation-core.decidable-propositions open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.subtypes open import foundation-core.transport-along-identifications ``` </details> ## Idea The **symmetric difference** of two [subtypes](foundation-core.subtypes.md) `A` and `B` is the subtype that contains the elements that are either in `A` or in `B` but not in both. ## Definition ```agda module _ {l l1 l2 : Level} {X : UU l} where symmetric-difference-subtype : subtype l1 X → subtype l2 X → subtype (l1 ⊔ l2) X symmetric-difference-subtype P Q x = exclusive-sum-Prop (P x) (Q x) symmetric-difference-decidable-subtype : decidable-subtype l1 X → decidable-subtype l2 X → decidable-subtype (l1 ⊔ l2) X symmetric-difference-decidable-subtype P Q x = exclusive-sum-Decidable-Prop (P x) (Q x) ``` ## Properties ### The coproduct of two decidable subtypes is equivalent to their symmetric difference plus two times their intersection This is closely related to the _inclusion-exclusion principle_. ```agda module _ {l l1 l2 : Level} {X : UU l} where left-cases-equiv-symmetric-difference : (P : decidable-subtype l1 X) (Q : decidable-subtype l2 X) → (x : X) → type-Decidable-Prop (P x) → is-decidable (type-Decidable-Prop (Q x)) → ( type-decidable-subtype ( symmetric-difference-decidable-subtype P Q)) + ( ( type-decidable-subtype (intersection-decidable-subtype P Q)) + ( type-decidable-subtype (intersection-decidable-subtype P Q))) left-cases-equiv-symmetric-difference P Q x p (inl q) = inr (inl (pair x (pair p q))) left-cases-equiv-symmetric-difference P Q x p (inr nq) = inl (pair x (inl (pair p nq))) right-cases-equiv-symmetric-difference : ( P : decidable-subtype l1 X) (Q : decidable-subtype l2 X) → (x : X) → type-Decidable-Prop (Q x) → is-decidable (type-Decidable-Prop (P x)) → ( type-decidable-subtype ( symmetric-difference-decidable-subtype P Q)) + ( ( type-decidable-subtype (intersection-decidable-subtype P Q)) + ( type-decidable-subtype (intersection-decidable-subtype P Q))) right-cases-equiv-symmetric-difference P Q x q (inl p) = inr (inr (pair x (pair p q))) right-cases-equiv-symmetric-difference P Q x q (inr np) = inl (pair x (inr (pair q np))) equiv-symmetric-difference : (P : decidable-subtype l1 X) (Q : decidable-subtype l2 X) → ( (type-decidable-subtype P + type-decidable-subtype Q) ≃ ( ( type-decidable-subtype (symmetric-difference-decidable-subtype P Q)) + ( ( type-decidable-subtype (intersection-decidable-subtype P Q)) + ( type-decidable-subtype (intersection-decidable-subtype P Q))))) pr1 (equiv-symmetric-difference P Q) (inl (pair x p)) = left-cases-equiv-symmetric-difference P Q x p ( is-decidable-Decidable-Prop (Q x)) pr1 (equiv-symmetric-difference P Q) (inr (pair x q)) = right-cases-equiv-symmetric-difference P Q x q ( is-decidable-Decidable-Prop (P x)) pr2 (equiv-symmetric-difference P Q) = is-equiv-is-invertible i r s where i : ( type-decidable-subtype (symmetric-difference-decidable-subtype P Q)) + ( ( type-decidable-subtype (intersection-decidable-subtype P Q)) + ( type-decidable-subtype (intersection-decidable-subtype P Q))) → type-decidable-subtype P + type-decidable-subtype Q i (inl (pair x (inl (pair p nq)))) = inl (pair x p) i (inl (pair x (inr (pair q np)))) = inr (pair x q) i (inr (inl (pair x (pair p q)))) = inl (pair x p) i (inr (inr (pair x (pair p q)))) = inr (pair x q) r : (C : ( type-decidable-subtype (symmetric-difference-decidable-subtype P Q)) + ( ( type-decidable-subtype (intersection-decidable-subtype P Q)) + ( type-decidable-subtype (intersection-decidable-subtype P Q)))) → ((pr1 (equiv-symmetric-difference P Q)) ∘ i) C = C r (inl (pair x (inl (pair p nq)))) = tr ( λ q' → ( left-cases-equiv-symmetric-difference P Q x p q') = ( inl (pair x (inl (pair p nq))))) ( eq-is-prop (is-prop-is-decidable (is-prop-type-Decidable-Prop (Q x)))) ( refl) r (inl (pair x (inr (pair q np)))) = tr ( λ p' → ( right-cases-equiv-symmetric-difference P Q x q p') = ( inl (pair x (inr (pair q np))))) ( eq-is-prop (is-prop-is-decidable (is-prop-type-Decidable-Prop (P x)))) ( refl) r (inr (inl (pair x (pair p q)))) = tr ( λ q' → (left-cases-equiv-symmetric-difference P Q x p q') = (inr (inl (pair x (pair p q))))) ( eq-is-prop (is-prop-is-decidable (is-prop-type-Decidable-Prop (Q x)))) ( refl) r (inr (inr (pair x (pair p q)))) = tr ( λ p' → (right-cases-equiv-symmetric-difference P Q x q p') = (inr (inr (pair x (pair p q))))) ( eq-is-prop (is-prop-is-decidable (is-prop-type-Decidable-Prop (P x)))) ( refl) left-cases-s : (x : X) (p : type-Decidable-Prop (P x)) (q : is-decidable (type-Decidable-Prop (Q x))) → i (left-cases-equiv-symmetric-difference P Q x p q) = inl (pair x p) left-cases-s x p (inl q) = refl left-cases-s x p (inr nq) = refl right-cases-s : (x : X) (q : type-Decidable-Prop (Q x)) (p : is-decidable (type-Decidable-Prop (P x))) → i (right-cases-equiv-symmetric-difference P Q x q p) = inr (pair x q) right-cases-s x q (inl p) = refl right-cases-s x q (inr np) = refl s : (C : type-decidable-subtype P + type-decidable-subtype Q) → (i ∘ pr1 (equiv-symmetric-difference P Q)) C = C s (inl (pair x p)) = left-cases-s x p (is-decidable-Decidable-Prop (Q x)) s (inr (pair x q)) = right-cases-s x q (is-decidable-Decidable-Prop (P x)) ``` ## See also - [Complements of subtypes](foundation.complements-subtypes.md)