------------------------------------------------------------------------
-- The Agda standard library
--
-- Documentation for pointwise lifting of relations over `List`s
------------------------------------------------------------------------

module README.Data.List.Relation.Binary.Pointwise where

open import Data.Nat using (; _<_; s≤s; z≤n)
open import Data.List.Base using (List; []; _∷_; length)
open import Relation.Binary.PropositionalEquality
  using (_≡_; refl; sym; cong; setoid)
open import Relation.Nullary.Negation using (¬_)

------------------------------------------------------------------------
-- Pointwise

-- One of the most basic ways to form a binary relation between two
-- lists of type `List A`, given a binary relation over `A`, is to say
-- that two lists are related if they are the same length and:
--   i) the first elements in the lists are related
--   ii) the second elements in the lists are related
--   iii) the third elements in the lists are related etc.
--   etc.
--
-- A formalisation of this "pointwise" lifting of a relation to lists
-- is found in:

open import Data.List.Relation.Binary.Pointwise

-- The same syntax to construct a list (`[]` & `_∷_`) is used to
-- construct proofs for the `Pointwise` relation. For example if you
-- want to prove that one list is strictly less than another list:

lem₁ : Pointwise _<_ (0  2  1  []) (1  4  2  [])
lem₁ = 0<1  2<4  1<2  []
  where
  0<1 = s≤s z≤n
  2<4 = s≤s (s≤s (s≤s z≤n))
  1<2 = s≤s 0<1

-- Lists that are related by `Pointwise` must be of the same length.
-- For example:

lem₂ : ¬ Pointwise _<_ (0  2  []) (1  [])
lem₂ (0<1  ())

-- Proofs about pointwise, including that of the above fact are
-- also included in the module:

lem₃ :  {xs ys}  Pointwise _<_ xs ys  length xs  length ys
lem₃ = Pointwise-length