# Binary type duality ```agda module foundation.binary-type-duality where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.equivalences-spans open import foundation.function-extensionality open import foundation.function-types open import foundation.multivariable-homotopies open import foundation.retractions open import foundation.sections open import foundation.spans open import foundation.univalence open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.homotopies open import foundation-core.identity-types ``` </details> ## Idea The principle of {{#concept "binary type duality" Agda=binary-type-duality}} asserts that the type of [binary relations](foundation.binary-relations.md) `A → B → 𝒰` is [equivalent](foundation-core.equivalences.md) to the type of [binary spans](foundation.spans.md) from `A` to `B`. The binary type duality principle is a binary version of the [type duality](foundation.type-duality.md) principle, which asserts that type families over a type `A` are equivalently described as maps into `A`, and makes essential use of the [univalence axiom](foundation.univalence.md). The equivalence of binary type duality takes a binary relation `R : A → B → 𝒰` to the span ```text A <----- Σ (a : A), Σ (b : B), R a b -----> B. ``` and its inverse takes a span `A <-f- S -g-> B` to the binary relation ```text a b ↦ Σ (s : S), (f s = a) × (g s = b). ``` ## Definitions ### The span associated to a binary relation Given a binary relation `R : A → B → 𝒰`, we obtain a span ```text A <----- Σ (a : A), Σ (b : B), R a b -----> B. ``` ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (R : A → B → UU l3) where spanning-type-span-binary-relation : UU (l1 ⊔ l2 ⊔ l3) spanning-type-span-binary-relation = Σ A (λ a → Σ B (λ b → R a b)) left-map-span-binary-relation : spanning-type-span-binary-relation → A left-map-span-binary-relation = pr1 right-map-span-binary-relation : spanning-type-span-binary-relation → B right-map-span-binary-relation = pr1 ∘ pr2 span-binary-relation : span (l1 ⊔ l2 ⊔ l3) A B pr1 span-binary-relation = spanning-type-span-binary-relation pr1 (pr2 span-binary-relation) = left-map-span-binary-relation pr2 (pr2 span-binary-relation) = right-map-span-binary-relation ``` ### The binary relation associated to a span Given a span ```text f g A <----- S -----> B ``` we obtain the binary relation `a b ↦ Σ (s : S), (f s = a) × (g s = b)`. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} where binary-relation-span : span l3 A B → A → B → UU (l1 ⊔ l2 ⊔ l3) binary-relation-span S a b = Σ ( spanning-type-span S) ( λ s → (left-map-span S s = a) × (right-map-span S s = b)) ``` ## Properties ### Any span `S` is equivalent to the span associated to the binary relation associated to `S` The construction of this equivalence of span diagrams is simply by pattern matching all the way. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (S : span l3 A B) where map-equiv-spanning-type-span-binary-relation-span : spanning-type-span S → spanning-type-span-binary-relation (binary-relation-span S) map-equiv-spanning-type-span-binary-relation-span s = ( left-map-span S s , right-map-span S s , s , refl , refl) map-inv-equiv-spanning-type-span-binary-relation-span : spanning-type-span-binary-relation (binary-relation-span S) → spanning-type-span S map-inv-equiv-spanning-type-span-binary-relation-span (a , b , s , _) = s is-section-map-inv-equiv-spanning-type-span-binary-relation-span : is-section ( map-equiv-spanning-type-span-binary-relation-span) ( map-inv-equiv-spanning-type-span-binary-relation-span) is-section-map-inv-equiv-spanning-type-span-binary-relation-span ( ._ , ._ , s , refl , refl) = refl is-retraction-map-inv-equiv-spanning-type-span-binary-relation-span : is-retraction ( map-equiv-spanning-type-span-binary-relation-span) ( map-inv-equiv-spanning-type-span-binary-relation-span) is-retraction-map-inv-equiv-spanning-type-span-binary-relation-span s = refl is-equiv-map-equiv-spanning-type-span-binary-relation-span : is-equiv ( map-equiv-spanning-type-span-binary-relation-span) is-equiv-map-equiv-spanning-type-span-binary-relation-span = is-equiv-is-invertible ( map-inv-equiv-spanning-type-span-binary-relation-span) ( is-section-map-inv-equiv-spanning-type-span-binary-relation-span) ( is-retraction-map-inv-equiv-spanning-type-span-binary-relation-span) equiv-spanning-type-span-binary-relation-span : spanning-type-span S ≃ spanning-type-span-binary-relation (binary-relation-span S) pr1 equiv-spanning-type-span-binary-relation-span = map-equiv-spanning-type-span-binary-relation-span pr2 equiv-spanning-type-span-binary-relation-span = is-equiv-map-equiv-spanning-type-span-binary-relation-span equiv-span-binary-relation-span : equiv-span S (span-binary-relation (binary-relation-span S)) pr1 equiv-span-binary-relation-span = equiv-spanning-type-span-binary-relation-span pr1 (pr2 equiv-span-binary-relation-span) = refl-htpy pr2 (pr2 equiv-span-binary-relation-span) = refl-htpy ``` ### Any binary relation `R` is equivalent to the binary relation associated to the span associated to `R` ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (R : A → B → UU l3) (a : A) (b : B) where map-equiv-binary-relation-span-binary-relation : R a b → binary-relation-span (span-binary-relation R) a b map-equiv-binary-relation-span-binary-relation r = ((a , b , r) , refl , refl) map-inv-equiv-binary-relation-span-binary-relation : binary-relation-span (span-binary-relation R) a b → R a b map-inv-equiv-binary-relation-span-binary-relation ((.a , .b , r) , refl , refl) = r is-section-map-inv-equiv-binary-relation-span-binary-relation : is-section ( map-equiv-binary-relation-span-binary-relation) ( map-inv-equiv-binary-relation-span-binary-relation) is-section-map-inv-equiv-binary-relation-span-binary-relation ((.a , .b , r) , refl , refl) = refl is-retraction-map-inv-equiv-binary-relation-span-binary-relation : is-retraction ( map-equiv-binary-relation-span-binary-relation) ( map-inv-equiv-binary-relation-span-binary-relation) is-retraction-map-inv-equiv-binary-relation-span-binary-relation r = refl is-equiv-map-equiv-binary-relation-span-binary-relation : is-equiv map-equiv-binary-relation-span-binary-relation is-equiv-map-equiv-binary-relation-span-binary-relation = is-equiv-is-invertible map-inv-equiv-binary-relation-span-binary-relation is-section-map-inv-equiv-binary-relation-span-binary-relation is-retraction-map-inv-equiv-binary-relation-span-binary-relation equiv-binary-relation-span-binary-relation : R a b ≃ binary-relation-span (span-binary-relation R) a b pr1 equiv-binary-relation-span-binary-relation = map-equiv-binary-relation-span-binary-relation pr2 equiv-binary-relation-span-binary-relation = is-equiv-map-equiv-binary-relation-span-binary-relation ``` ## Theorem ### Binary spans are equivalent to binary relations ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : UU l2) where is-section-binary-relation-span : is-section ( span-binary-relation {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) ( binary-relation-span {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) is-section-binary-relation-span S = inv ( eq-equiv-span ( S) ( span-binary-relation (binary-relation-span S)) ( equiv-span-binary-relation-span S)) is-retraction-binary-relation-span : is-retraction ( span-binary-relation {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) ( binary-relation-span {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) is-retraction-binary-relation-span R = inv ( eq-multivariable-htpy 2 ( λ a b → eq-equiv (equiv-binary-relation-span-binary-relation R a b))) is-equiv-span-binary-relation : is-equiv (span-binary-relation {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) is-equiv-span-binary-relation = is-equiv-is-invertible ( binary-relation-span) ( is-section-binary-relation-span) ( is-retraction-binary-relation-span) binary-type-duality : (A → B → UU (l1 ⊔ l2 ⊔ l3)) ≃ span (l1 ⊔ l2 ⊔ l3) A B pr1 binary-type-duality = span-binary-relation pr2 binary-type-duality = is-equiv-span-binary-relation is-equiv-binary-relation-span : is-equiv (binary-relation-span {l3 = l1 ⊔ l2 ⊔ l3} {A} {B}) is-equiv-binary-relation-span = is-equiv-is-invertible ( span-binary-relation) ( is-retraction-binary-relation-span) ( is-section-binary-relation-span) inv-binary-type-duality : span (l1 ⊔ l2 ⊔ l3) A B ≃ (A → B → UU (l1 ⊔ l2 ⊔ l3)) pr1 inv-binary-type-duality = binary-relation-span pr2 inv-binary-type-duality = is-equiv-binary-relation-span ```