# `2`-element decidable subtypes
```agda
module univalent-combinatorics.2-element-decidable-subtypes where
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.equality-natural-numbers
open import elementary-number-theory.natural-numbers
open import elementary-number-theory.well-ordering-principle-standard-finite-types
open import foundation.automorphisms
open import foundation.booleans
open import foundation.coproduct-types
open import foundation.decidable-equality
open import foundation.decidable-propositions
open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.equality-dependent-pair-types
open import foundation.equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.functoriality-coproduct-types
open import foundation.functoriality-dependent-pair-types
open import foundation.functoriality-propositional-truncation
open import foundation.identity-types
open import foundation.injective-maps
open import foundation.logical-equivalences
open import foundation.mere-equivalences
open import foundation.negated-equality
open import foundation.negation
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.sets
open import foundation.subtypes
open import foundation.transport-along-identifications
open import foundation.type-arithmetic-coproduct-types
open import foundation.univalence
open import foundation.universe-levels
open import univalent-combinatorics.2-element-subtypes
open import univalent-combinatorics.2-element-types
open import univalent-combinatorics.decidable-subtypes
open import univalent-combinatorics.dependent-function-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
</details>
## Idea
A 2-element decidable subtype of a type `A` is a decidable subtype of `A` of
which the underlying type has 2 elements.
## Definition
### The type of 2-element decidable subtypes
```agda
2-Element-Decidable-Subtype :
{l1 : Level} (l2 : Level) → UU l1 → UU (l1 ⊔ lsuc l2)
2-Element-Decidable-Subtype l2 X =
Σ (decidable-subtype l2 X) (λ P → has-two-elements (type-decidable-subtype P))
module _
{l1 l2 : Level} {X : UU l1} (P : 2-Element-Decidable-Subtype l2 X)
where
decidable-subtype-2-Element-Decidable-Subtype : decidable-subtype l2 X
decidable-subtype-2-Element-Decidable-Subtype = pr1 P
subtype-2-Element-Decidable-Subtype : subtype l2 X
subtype-2-Element-Decidable-Subtype =
subtype-decidable-subtype decidable-subtype-2-Element-Decidable-Subtype
is-decidable-subtype-subtype-2-Element-Decidable-Subtype :
is-decidable-subtype subtype-2-Element-Decidable-Subtype
is-decidable-subtype-subtype-2-Element-Decidable-Subtype =
is-decidable-decidable-subtype
decidable-subtype-2-Element-Decidable-Subtype
is-in-2-Element-Decidable-Subtype : X → UU l2
is-in-2-Element-Decidable-Subtype =
is-in-decidable-subtype decidable-subtype-2-Element-Decidable-Subtype
is-prop-is-in-2-Element-Decidable-Subtype :
(x : X) → is-prop (is-in-2-Element-Decidable-Subtype x)
is-prop-is-in-2-Element-Decidable-Subtype =
is-prop-is-in-decidable-subtype
decidable-subtype-2-Element-Decidable-Subtype
eq-is-in-2-Element-Decidable-Subtype :
{x : X} {y z : is-in-2-Element-Decidable-Subtype x} → Id y z
eq-is-in-2-Element-Decidable-Subtype {x} =
eq-is-prop (is-prop-is-in-2-Element-Decidable-Subtype x)
type-2-Element-Decidable-Subtype : UU (l1 ⊔ l2)
type-2-Element-Decidable-Subtype =
type-decidable-subtype decidable-subtype-2-Element-Decidable-Subtype
inclusion-2-Element-Decidable-Subtype : type-2-Element-Decidable-Subtype → X
inclusion-2-Element-Decidable-Subtype =
inclusion-decidable-subtype decidable-subtype-2-Element-Decidable-Subtype
is-emb-inclusion-2-Element-Decidable-Subtype :
is-emb inclusion-2-Element-Decidable-Subtype
is-emb-inclusion-2-Element-Decidable-Subtype =
is-emb-inclusion-decidable-subtype
decidable-subtype-2-Element-Decidable-Subtype
is-injective-inclusion-2-Element-Decidable-Subtype :
is-injective inclusion-2-Element-Decidable-Subtype
is-injective-inclusion-2-Element-Decidable-Subtype =
is-injective-inclusion-decidable-subtype
decidable-subtype-2-Element-Decidable-Subtype
has-two-elements-type-2-Element-Decidable-Subtype :
has-two-elements type-2-Element-Decidable-Subtype
has-two-elements-type-2-Element-Decidable-Subtype = pr2 P
2-element-type-2-Element-Decidable-Subtype : 2-Element-Type (l1 ⊔ l2)
pr1 2-element-type-2-Element-Decidable-Subtype =
type-2-Element-Decidable-Subtype
pr2 2-element-type-2-Element-Decidable-Subtype =
has-two-elements-type-2-Element-Decidable-Subtype
is-inhabited-type-2-Element-Decidable-Subtype :
type-trunc-Prop type-2-Element-Decidable-Subtype
is-inhabited-type-2-Element-Decidable-Subtype =
is-inhabited-2-Element-Type 2-element-type-2-Element-Decidable-Subtype
```
### The standard 2-element decidable subtypes in a type with decidable equality
```agda
module _
{l : Level} {X : UU l} (d : has-decidable-equality X) {x y : X}
(np : x ≠ y)
where
type-prop-standard-2-Element-Decidable-Subtype : X → UU l
type-prop-standard-2-Element-Decidable-Subtype =
type-prop-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
is-prop-type-prop-standard-2-Element-Decidable-Subtype :
(z : X) → is-prop (type-prop-standard-2-Element-Decidable-Subtype z)
is-prop-type-prop-standard-2-Element-Decidable-Subtype =
is-prop-type-prop-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
is-decidable-type-prop-standard-2-Element-Decidable-Subtype :
(z : X) → is-decidable (type-prop-standard-2-Element-Decidable-Subtype z)
is-decidable-type-prop-standard-2-Element-Decidable-Subtype z =
is-decidable-coproduct (d x z) (d y z)
subtype-standard-2-Element-Decidable-Subtype : subtype l X
subtype-standard-2-Element-Decidable-Subtype =
subtype-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
decidable-subtype-standard-2-Element-Decidable-Subtype :
decidable-subtype l X
pr1 (decidable-subtype-standard-2-Element-Decidable-Subtype z) =
type-prop-standard-2-Element-Decidable-Subtype z
pr1 (pr2 (decidable-subtype-standard-2-Element-Decidable-Subtype z)) =
is-prop-type-prop-standard-2-Element-Decidable-Subtype z
pr2 (pr2 (decidable-subtype-standard-2-Element-Decidable-Subtype z)) =
is-decidable-type-prop-standard-2-Element-Decidable-Subtype z
type-standard-2-Element-Decidable-Subtype : UU l
type-standard-2-Element-Decidable-Subtype =
type-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
equiv-type-standard-2-Element-Decidable-Subtype :
Fin 2 ≃ type-standard-2-Element-Decidable-Subtype
equiv-type-standard-2-Element-Decidable-Subtype =
equiv-type-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
has-two-elements-type-standard-2-Element-Decidable-Subtype :
has-two-elements type-standard-2-Element-Decidable-Subtype
has-two-elements-type-standard-2-Element-Decidable-Subtype =
has-two-elements-type-standard-2-Element-Subtype
( pair X (is-set-has-decidable-equality d))
( np)
2-element-type-standard-2-Element-Decidable-Subtype : 2-Element-Type l
pr1 2-element-type-standard-2-Element-Decidable-Subtype =
type-standard-2-Element-Decidable-Subtype
pr2 2-element-type-standard-2-Element-Decidable-Subtype =
has-two-elements-type-standard-2-Element-Decidable-Subtype
standard-2-Element-Decidable-Subtype : 2-Element-Decidable-Subtype l X
pr1 standard-2-Element-Decidable-Subtype =
decidable-subtype-standard-2-Element-Decidable-Subtype
pr2 standard-2-Element-Decidable-Subtype =
has-two-elements-type-standard-2-Element-Decidable-Subtype
module _
{l : Level} {X : UU l} (d : has-decidable-equality X) {x y : X}
(np : x ≠ y)
where
is-commutative-standard-2-Element-Decidable-Subtype :
Id
( standard-2-Element-Decidable-Subtype d np)
( standard-2-Element-Decidable-Subtype d (λ p → np (inv p)))
is-commutative-standard-2-Element-Decidable-Subtype =
eq-pair-Σ
( eq-htpy
(λ z →
eq-pair-Σ
( eq-equiv
( pair
( map-commutative-coproduct (Id x z) (Id y z))
( is-equiv-map-commutative-coproduct (Id x z) (Id y z))))
( eq-pair-Σ
( eq-is-prop
( is-prop-is-prop
( type-Decidable-Prop
( pr1
( standard-2-Element-Decidable-Subtype d
( λ p → np (inv p)))
( z)))))
( eq-is-prop
( is-prop-is-decidable
( is-prop-type-Decidable-Prop
( pr1
( standard-2-Element-Decidable-Subtype d
( λ p → np (inv p)))
( z))))))))
( eq-is-prop is-prop-type-trunc-Prop)
module _
{l : Level} {X : UU l} (d : has-decidable-equality X) {x y z w : X}
(np : x ≠ y) (nq : z ≠ w) (r : x = z) (s : y = w)
where
eq-equal-elements-standard-2-Element-Decidable-Subtype :
Id
( standard-2-Element-Decidable-Subtype d np)
( standard-2-Element-Decidable-Subtype d nq)
eq-equal-elements-standard-2-Element-Decidable-Subtype =
eq-pair-Σ
( eq-htpy
( λ v →
eq-pair-Σ
( eq-equiv
( equiv-coproduct
( equiv-concat (inv r) v)
( equiv-concat (inv s) v)))
( eq-pair-Σ
( eq-is-prop
( is-prop-is-prop
( type-Decidable-Prop
( pr1
( standard-2-Element-Decidable-Subtype d nq)
( v)))))
( eq-is-prop
( is-prop-is-decidable
( is-prop-type-Decidable-Prop
( pr1
( standard-2-Element-Decidable-Subtype d nq)
( v))))))))
( eq-is-prop is-prop-type-trunc-Prop)
```
### Swapping the elements in a 2-element subtype
```agda
module _
{l1 l2 : Level} {X : UU l1} (P : 2-Element-Decidable-Subtype l2 X)
where
swap-2-Element-Decidable-Subtype : Aut (type-2-Element-Decidable-Subtype P)
swap-2-Element-Decidable-Subtype =
swap-2-Element-Type (2-element-type-2-Element-Decidable-Subtype P)
map-swap-2-Element-Decidable-Subtype :
type-2-Element-Decidable-Subtype P → type-2-Element-Decidable-Subtype P
map-swap-2-Element-Decidable-Subtype =
map-swap-2-Element-Type (2-element-type-2-Element-Decidable-Subtype P)
compute-swap-2-Element-Decidable-Subtype :
(x y : type-2-Element-Decidable-Subtype P) → x ≠ y →
Id (map-swap-2-Element-Decidable-Subtype x) y
compute-swap-2-Element-Decidable-Subtype =
compute-swap-2-Element-Type (2-element-type-2-Element-Decidable-Subtype P)
module _
{l1 l2 : Level} (n : ℕ) (X : UU-Fin l1 n)
where
is-finite-2-Element-Decidable-Subtype :
is-finite (2-Element-Decidable-Subtype l2 (type-UU-Fin n X))
is-finite-2-Element-Decidable-Subtype =
is-finite-type-decidable-subtype
(λ P →
pair
( has-cardinality 2
( Σ (type-UU-Fin n X) (type-Decidable-Prop ∘ P)))
( pair
( is-prop-type-trunc-Prop)
( is-decidable-equiv
( equiv-has-cardinality-id-number-of-elements-is-finite
( Σ (type-UU-Fin n X) (type-Decidable-Prop ∘ P))
( is-finite-type-decidable-subtype P
( is-finite-type-UU-Fin n X))
( 2))
( has-decidable-equality-ℕ
( number-of-elements-is-finite
( is-finite-type-decidable-subtype P
( is-finite-type-UU-Fin n X)))
( 2)))))
( is-finite-Π
( is-finite-type-UU-Fin n X)
( λ x →
is-finite-equiv
( inv-equiv equiv-bool-Decidable-Prop ∘e equiv-bool-Fin-two-ℕ)
( is-finite-Fin 2)))
```
### 2-element decidable subtypes are closed under precomposition with an equivalence
```agda
precomp-equiv-2-Element-Decidable-Subtype :
{l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} → X ≃ Y →
2-Element-Decidable-Subtype l3 Y → 2-Element-Decidable-Subtype l3 X
pr1 (precomp-equiv-2-Element-Decidable-Subtype e (pair P H)) =
P ∘ (map-equiv e)
pr2 (precomp-equiv-2-Element-Decidable-Subtype e (pair P H)) =
transitive-mere-equiv
( Fin 2)
( type-subtype (prop-Decidable-Prop ∘ P))
( type-subtype (prop-Decidable-Prop ∘ (P ∘ pr1 e)))
( unit-trunc-Prop
( equiv-subtype-equiv
( inv-equiv e)
( subtype-decidable-subtype P)
( subtype-decidable-subtype (P ∘ (map-equiv e)))
( λ x →
iff-equiv
( tr
( λ g →
( type-Decidable-Prop (P x)) ≃
( type-Decidable-Prop (P (map-equiv g x))))
( inv (right-inverse-law-equiv e))
( id-equiv)))))
( H)
preserves-comp-precomp-equiv-2-Element-Decidable-Subtype :
{ l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} {Z : UU l3} (e : X ≃ Y) →
( f : Y ≃ Z) →
Id
( precomp-equiv-2-Element-Decidable-Subtype {l3 = l4} (f ∘e e))
( ( precomp-equiv-2-Element-Decidable-Subtype e) ∘
( precomp-equiv-2-Element-Decidable-Subtype f))
preserves-comp-precomp-equiv-2-Element-Decidable-Subtype e f =
eq-htpy
( λ (pair P H) →
eq-pair-eq-fiber
( eq-is-prop is-prop-type-trunc-Prop))
```
## Properties
### Any 2-element decidable subtype of a standard finite type is a standard 2-element decidable subtype
```agda
module _
{l : Level} {n : ℕ} (P : 2-Element-Decidable-Subtype l (Fin n))
where
element-subtype-2-element-decidable-subtype-Fin :
type-2-Element-Decidable-Subtype P
element-subtype-2-element-decidable-subtype-Fin =
ε-operator-decidable-subtype-Fin n
( decidable-subtype-2-Element-Decidable-Subtype P)
( is-inhabited-type-2-Element-Decidable-Subtype P)
element-2-element-decidable-subtype-Fin : Fin n
element-2-element-decidable-subtype-Fin =
pr1 element-subtype-2-element-decidable-subtype-Fin
in-subtype-element-2-element-decidable-subtype-Fin :
is-in-2-Element-Decidable-Subtype P
element-2-element-decidable-subtype-Fin
in-subtype-element-2-element-decidable-subtype-Fin =
pr2 element-subtype-2-element-decidable-subtype-Fin
other-element-subtype-2-element-decidable-subtype-Fin :
type-2-Element-Decidable-Subtype P
other-element-subtype-2-element-decidable-subtype-Fin =
map-swap-2-Element-Type
( 2-element-type-2-Element-Decidable-Subtype P)
( element-subtype-2-element-decidable-subtype-Fin)
other-element-2-element-decidable-subtype-Fin : Fin n
other-element-2-element-decidable-subtype-Fin =
pr1 other-element-subtype-2-element-decidable-subtype-Fin
in-subtype-other-element-2-element-decidable-subtype-Fin :
is-in-2-Element-Decidable-Subtype P
other-element-2-element-decidable-subtype-Fin
in-subtype-other-element-2-element-decidable-subtype-Fin =
pr2 other-element-subtype-2-element-decidable-subtype-Fin
abstract
unequal-elements-2-element-decidable-subtype-Fin :
¬ ( Id
( element-2-element-decidable-subtype-Fin)
( other-element-2-element-decidable-subtype-Fin))
unequal-elements-2-element-decidable-subtype-Fin p =
has-no-fixed-points-swap-2-Element-Type
( 2-element-type-2-Element-Decidable-Subtype P)
{ element-subtype-2-element-decidable-subtype-Fin}
( eq-type-subtype
( subtype-2-Element-Decidable-Subtype P)
( inv p))
```
### Types of decidable subtypes of any universe level are equivalent
```agda
module _
{l1 : Level} (X : UU l1)
where
equiv-universes-2-Element-Decidable-Subtype :
(l l' : Level) →
2-Element-Decidable-Subtype l X ≃ 2-Element-Decidable-Subtype l' X
equiv-universes-2-Element-Decidable-Subtype l l' =
equiv-subtype-equiv
( equiv-universes-decidable-subtype X l l')
( λ P →
pair
( has-two-elements (type-decidable-subtype P))
( is-prop-type-trunc-Prop))
( λ P →
pair
( has-two-elements (type-decidable-subtype P))
( is-prop-type-trunc-Prop))
( λ S →
pair
( λ h →
map-trunc-Prop
( λ h' →
equiv-Σ
( λ x →
type-Decidable-Prop
( map-equiv
( equiv-universes-decidable-subtype X l l')
( S)
( x)))
( id-equiv)
( λ x →
equiv-iff'
( prop-Decidable-Prop (S x))
( prop-Decidable-Prop
( map-equiv
( equiv-universes-decidable-subtype X l l')
( S)
( x)))
( iff-universes-decidable-subtype X l l' S x)) ∘e
( h'))
( h))
( λ h →
map-trunc-Prop
( λ h' →
equiv-Σ
( λ x → type-Decidable-Prop (S x))
( id-equiv)
( λ x →
inv-equiv
( equiv-iff'
( prop-Decidable-Prop (S x))
( prop-Decidable-Prop
( map-equiv
( equiv-universes-decidable-subtype X l l')
( S)
( x)))
( iff-universes-decidable-subtype X l l' S x))) ∘e
( h'))
( h)))
```