# Decidable propositions
```agda
module foundation-core.decidable-propositions where
```
<details><summary>Imports</summary>
```agda
open import foundation.coproduct-types
open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.double-negation
open import foundation.negation
open import foundation.propositional-truncations
open import foundation.unit-type
open import foundation.universe-levels
open import foundation-core.cartesian-product-types
open import foundation-core.empty-types
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.propositions
open import foundation-core.subtypes
```
</details>
## Idea
A {{#concept "decidable proposition" Agda=is-decidable-Prop}} is a
[proposition](foundation-core.propositions.md) that has a
[decidable](foundation.decidable-types.md) underlying type.
## Definition
### The subtype of decidable propositions
```agda
is-decidable-prop : {l : Level} → UU l → UU l
is-decidable-prop A = is-prop A × is-decidable A
is-prop-is-decidable :
{l : Level} {A : UU l} → is-prop A → is-prop (is-decidable A)
is-prop-is-decidable is-prop-A =
is-prop-coproduct intro-double-negation is-prop-A is-prop-neg
is-decidable-Prop :
{l : Level} → Prop l → Prop l
pr1 (is-decidable-Prop P) = is-decidable (type-Prop P)
pr2 (is-decidable-Prop P) = is-prop-is-decidable (is-prop-type-Prop P)
is-prop-is-decidable-prop :
{l : Level} (X : UU l) → is-prop (is-decidable-prop X)
is-prop-is-decidable-prop X =
is-prop-has-element
( λ H →
is-prop-product
( is-prop-is-prop X)
( is-prop-is-decidable (pr1 H)))
is-decidable-prop-Prop :
{l : Level} (A : UU l) → Prop l
pr1 (is-decidable-prop-Prop A) = is-decidable-prop A
pr2 (is-decidable-prop-Prop A) = is-prop-is-decidable-prop A
```
### Decidable propositions
```agda
Decidable-Prop :
(l : Level) → UU (lsuc l)
Decidable-Prop l = type-subtype is-decidable-prop-Prop
module _
{l : Level} (P : Decidable-Prop l)
where
prop-Decidable-Prop : Prop l
prop-Decidable-Prop = tot (λ x → pr1) P
type-Decidable-Prop : UU l
type-Decidable-Prop = type-Prop prop-Decidable-Prop
abstract
is-prop-type-Decidable-Prop : is-prop type-Decidable-Prop
is-prop-type-Decidable-Prop = is-prop-type-Prop prop-Decidable-Prop
is-decidable-Decidable-Prop : is-decidable type-Decidable-Prop
is-decidable-Decidable-Prop = pr2 (pr2 P)
is-decidable-prop-type-Decidable-Prop : is-decidable-prop type-Decidable-Prop
is-decidable-prop-type-Decidable-Prop = pr2 P
is-decidable-prop-Decidable-Prop : Prop l
pr1 is-decidable-prop-Decidable-Prop = is-decidable type-Decidable-Prop
pr2 is-decidable-prop-Decidable-Prop =
is-prop-is-decidable is-prop-type-Decidable-Prop
```
### The empty type is a decidable proposition
```agda
is-decidable-prop-empty : is-decidable-prop empty
pr1 is-decidable-prop-empty = is-prop-empty
pr2 is-decidable-prop-empty = inr id
empty-Decidable-Prop : Decidable-Prop lzero
pr1 empty-Decidable-Prop = empty
pr2 empty-Decidable-Prop = is-decidable-prop-empty
```
### The unit type is a decidable proposition
```agda
is-decidable-prop-unit : is-decidable-prop unit
pr1 is-decidable-prop-unit = is-prop-unit
pr2 is-decidable-prop-unit = inl star
unit-Decidable-Prop : Decidable-Prop lzero
pr1 unit-Decidable-Prop = unit
pr2 unit-Decidable-Prop = is-decidable-prop-unit
```
### The product of two decidable propositions is a decidable proposition
```agda
module _
{l1 l2 : Level} (P : Decidable-Prop l1) (Q : Decidable-Prop l2)
where
type-product-Decidable-Prop : UU (l1 ⊔ l2)
type-product-Decidable-Prop =
type-product-Prop (prop-Decidable-Prop P) (prop-Decidable-Prop Q)
is-prop-product-Decidable-Prop : is-prop type-product-Decidable-Prop
is-prop-product-Decidable-Prop =
is-prop-product-Prop (prop-Decidable-Prop P) (prop-Decidable-Prop Q)
is-decidable-product-Decidable-Prop : is-decidable type-product-Decidable-Prop
is-decidable-product-Decidable-Prop =
is-decidable-product
( is-decidable-Decidable-Prop P)
( is-decidable-Decidable-Prop Q)
is-decidable-prop-product-Decidable-Prop :
is-decidable-prop type-product-Decidable-Prop
pr1 is-decidable-prop-product-Decidable-Prop = is-prop-product-Decidable-Prop
pr2 is-decidable-prop-product-Decidable-Prop =
is-decidable-product-Decidable-Prop
product-Decidable-Prop : Decidable-Prop (l1 ⊔ l2)
pr1 product-Decidable-Prop = type-product-Decidable-Prop
pr2 product-Decidable-Prop = is-decidable-prop-product-Decidable-Prop
```
### Decidability of a propositional truncation
```agda
abstract
is-prop-is-decidable-trunc-Prop :
{l : Level} (A : UU l) → is-prop (is-decidable (type-trunc-Prop A))
is-prop-is-decidable-trunc-Prop A =
is-prop-is-decidable is-prop-type-trunc-Prop
is-decidable-trunc-Prop : {l : Level} → UU l → Prop l
pr1 (is-decidable-trunc-Prop A) = is-decidable (type-trunc-Prop A)
pr2 (is-decidable-trunc-Prop A) = is-prop-is-decidable-trunc-Prop A
is-decidable-trunc-Prop-is-merely-decidable :
{l : Level} (A : UU l) →
is-merely-decidable A → is-decidable (type-trunc-Prop A)
is-decidable-trunc-Prop-is-merely-decidable A =
map-universal-property-trunc-Prop
( is-decidable-trunc-Prop A)
( f)
where
f : is-decidable A → type-Prop (is-decidable-trunc-Prop A)
f (inl a) = inl (unit-trunc-Prop a)
f (inr f) = inr (map-universal-property-trunc-Prop empty-Prop f)
is-merely-decidable-is-decidable-trunc-Prop :
{l : Level} (A : UU l) →
is-decidable (type-trunc-Prop A) → is-merely-decidable A
is-merely-decidable-is-decidable-trunc-Prop A (inl x) =
apply-universal-property-trunc-Prop x
( is-merely-decidable-Prop A)
( unit-trunc-Prop ∘ inl)
is-merely-decidable-is-decidable-trunc-Prop A (inr f) =
unit-trunc-Prop (inr (f ∘ unit-trunc-Prop))
```