Source code on Github
------------------------------------------------------------------------
-- The Agda standard library
--
-- Properties of binary relations
------------------------------------------------------------------------

-- The contents of this module should be accessed via `3Relation.Ternary`.

{-# OPTIONS --without-K --safe #-}

module Relation.Ternary.Definitions where

open import Agda.Builtin.Equality using (_≡_)

open import Data.Maybe.Base using (Maybe)
open import Data.Product using (_×_)
open import Data.Sum.Base using (_⊎_)
open import Function.Base using (_on_; flip)
open import Level
open import Relation.Ternary.Core
open import Relation.Nullary using (Dec; ¬_)

private
  variable
    a b c  ℓ₁ ℓ₂ ℓ₃ : Level
    A : Set a
    B : Set b
    C : Set c

------------------------------------------------------------------------
-- Definitions
------------------------------------------------------------------------

-- Reflexivity - defined without an underlying equality. It could
-- alternatively be defined as `_≈_ ⇒ _~_~_` for some equality `_≈_`.

-- Confusingly the convention in the library is to use the name "refl"
-- for proofs of Reflexive and `reflexive` for proofs of type `_≈_ ⇒ _~_~_`,
-- e.g. in the definition of `IsEquivalence` later in this file. This
-- convention is a legacy from the early days of the library.

Reflexive : 3Rel A   Set _
Reflexive _~_~_ =  {x}  x ~ x ~ x

-- Decidability - it is possible to determine whether a given pair of
-- elements are related.

Decidable : 3REL A B C   Set _
Decidable _~_~_ =  x y z  Dec (x ~ y ~ z)

-- Weak decidability - it is sometimes possible to determine if a given
-- pair of elements are related.

WeaklyDecidable : 3REL A B C   Set _
WeaklyDecidable _~_~_ =  x y z  Maybe (x ~ y ~ z)

-- Irrelevancy - all proofs that a given pair of elements are related
-- are indistinguishable.

Irrelevant : 3REL A B C   Set _
Irrelevant _~_~_ =  {x y z} (a b : x ~ y ~ z)  a  b

-- Recomputability - we can rebuild a relevant proof given an
-- irrelevant one.

Recomputable : 3REL A B A   Set _
Recomputable _~_~_ =  {x y z}  .(x ~ y ~ z)  x ~ y ~ z

-- Universal - all pairs of elements are related

Universal : 3REL A B C   Set _
Universal _~_~_ =  x y z  x ~ y ~ z

-- Non-emptiness - at least one triple of elements are related.

record NonEmpty {A : Set a} {B : Set b} {C : Set c}
                (T : 3REL A B C ) : Set (a  b  c  ) where
  constructor nonEmpty
  field
    {x}   : A
    {y}   : B
    {z}   : C
    proof : T x y z