{-# OPTIONS --cubical --safe --postfix-projections #-}

module Relation.Nullary.Decidable.Logic where

open import Prelude
open import Data.Sum
open import Relation.Nullary.Decidable

disj : (A  C)  (B  C)  (¬ A  ¬ B  ¬ C)  Dec A  Dec B  Dec C
disj l r n x y .does = x .does or y .does
disj l r n (yes x) y .why = l x
disj l r n (no  x) (yes y) .why = r y
disj l r n (no ¬x) (no ¬y) .why = n ¬x ¬y

conj : (A  B  C)  (¬ A  ¬ C)  (¬ B  ¬ C)  Dec A  Dec B  Dec C
conj c l r x y .does = x .does and y .does
conj c l r (no ¬x) y .why = l ¬x
conj c l r (yes x) (no ¬y) .why = r ¬y
conj c l r (yes x) (yes y) .why = c x y

negate : (A  ¬ B)  (¬ A  B)  Dec A  Dec B
negate t f d .does = not (d .does)
negate t f (yes d) .why = t d
negate t f (no ¬d) .why = f ¬d

! : Dec A  Dec (¬ A)
! = negate  x ¬x  ¬x x) id

infixl 7 _&&_
_&&_ : Dec A  Dec B  Dec (A × B)
_&&_ = conj _,_ (_∘ fst) (_∘ snd)

infixl 6 _||_
_||_ : Dec A  Dec B  Dec (A  B)
_||_ = disj inl inr either