------------------------------------------------------------------------
-- The Agda standard library
--
-- Core properties related to negation
------------------------------------------------------------------------
{-# OPTIONS --cubical-compatible --safe #-}
module Relation.Nullary.Negation.Core where
open import Data.Empty using (⊥; ⊥-elim-irr)
open import Data.Sum.Base using (_⊎_; [_,_]; inj₁; inj₂)
open import Function.Base using (flip; _∘_; const)
open import Level
private
variable
a p q w : Level
A B C : Set a
Whatever : Set w
------------------------------------------------------------------------
-- Negation.
infix 3 ¬_
¬_ : Set a → Set a
¬ A = A → ⊥
------------------------------------------------------------------------
-- Stability.
-- Double-negation
DoubleNegation : Set a → Set a
DoubleNegation A = ¬ ¬ A
-- Stability under double-negation.
Stable : Set a → Set a
Stable A = ¬ ¬ A → A
------------------------------------------------------------------------
-- Relationship to sum
infixr 1 _¬-⊎_
_¬-⊎_ : ¬ A → ¬ B → ¬ (A ⊎ B)
_¬-⊎_ = [_,_]
------------------------------------------------------------------------
-- Uses of negation
contradiction-irr : .A → ¬ A → Whatever
contradiction-irr a ¬a = ⊥-elim-irr (¬a a)
contradiction : A → ¬ A → Whatever
contradiction a = contradiction-irr a
contradiction₂ : A ⊎ B → ¬ A → ¬ B → Whatever
contradiction₂ (inj₁ a) ¬a ¬b = contradiction a ¬a
contradiction₂ (inj₂ b) ¬a ¬b = contradiction b ¬b
contraposition : (A → B) → ¬ B → ¬ A
contraposition f ¬b a = contradiction (f a) ¬b
-- Everything is stable in the double-negation monad.
stable : ¬ ¬ Stable A
stable ¬[¬¬a→a] = ¬[¬¬a→a] (contradiction (¬[¬¬a→a] ∘ const))
-- Negated predicates are stable.
negated-stable : Stable (¬ A)
negated-stable ¬¬¬a a = ¬¬¬a (contradiction a)
¬¬-map : (A → B) → ¬ ¬ A → ¬ ¬ B
¬¬-map f = contraposition (contraposition f)
-- Note also the following use of flip:
private
note : (A → ¬ B) → B → ¬ A
note = flip