Meet and Join

Definition 1.76. Let (P, ≤) be a preorder, and let A ⊆ P be a subset. We say that an element p ∈ P is a meet of A if

(a) for all a ∈ A, we have p ≤ a,

(b) for all q such that q ≤ a for all a ∈ A, we have that q ≤ p.

We write p = ⋀ A, p = ⋀_{a∈A} a, or, if the dummy variable a is clear from context, just p = ⋀_A a. If A just consists of two elements, say A = {a, b}, we can denote ⋀ A simply by a ∧ b.

Similarly, we say that p is a join of A if

(a) for all a ∈ A we have a ≤ p,

(b) for all q such that a ≤ q for all a ∈ A, we have that p ≤ q.

We write p = ⋁ A or p = ⋁_{a∈A} a, or when A = {a, b} we may simply write p = a ∨ b.

module definitions.chapter1.MeetJoin where

open import Data.Product using (_×_)

Subset : Set  Set₁
Subset A = A  Set

-- Lower bound for a subset
-- (a) for all a ∈ A, we have p ≤ a
IsLowerBound : {A : Set}  (_≤_ : A  A  Set)  A  Subset A  Set
IsLowerBound _≤_ x P =  {y}  P y  x  y

-- Upper bound for a subset
-- (a) for all a ∈ A we have a ≤ p
IsUpperBound : {A : Set}  (_≤_ : A  A  Set)  A  Subset A  Set
IsUpperBound _≤_ x P =  {y}  P y  y  x

-- Meet (infimum/greatest lower bound)
-- p = ⋀ A
IsMeet : {A : Set}  (_≤_ : A  A  Set)  A  Subset A  Set
IsMeet _≤_ m P = IsLowerBound _≤_ m P × (∀ {x}  IsLowerBound _≤_ x P  x  m)

-- Join (supremum/least upper bound)
-- p = ⋁ A
IsJoin : {A : Set}  (_≤_ : A  A  Set)  A  Subset A  Set
IsJoin _≤_ j P = IsUpperBound _≤_ j P × (∀ {x}  IsUpperBound _≤_ x P  j  x)

-- Binary meet notation: a ∧ b
_∧_ : {A : Set}  (_≤_ : A  A  Set)  A  A  A  Set
(_≤_  a) b m = IsMeet _≤_ m  x  (x  a)  (x  b))
  where
    open import Data.Sum using (_⊎_)
    open import Relation.Binary.PropositionalEquality using (_≡_)

-- Binary join notation: a ∨ b
_∨_ : {A : Set}  (_≤_ : A  A  Set)  A  A  A  Set
(_≤_  a) b j = IsJoin _≤_ j  x  (x  a)  (x  b))
  where
    open import Data.Sum using (_⊎_)
    open import Relation.Binary.PropositionalEquality using (_≡_)

-- Notation for meet of a subset: ⋀ A
 : {A : Set}  (_≤_ : A  A  Set)  Subset A  A  Set
 _≤_ P m = IsMeet _≤_ m P

-- Notation for join of a subset: ⋁ A
 : {A : Set}  (_≤_ : A  A  Set)  Subset A  A  Set
 _≤_ P j = IsJoin _≤_ j P

Definition 1.87: Preserves Meets and Joins

Definition 1.87. We say that a monotone map f : P → Q preserves meets if f(a ∧ b) ≅ f(a) ∧ f(b) for all a, b ∈ P. We similarly say f preserves joins if f(a ∨ b) ≅ f(a) ∨ f(b) for all a, b ∈ P.

open import definitions.chapter1.Preorder as DP using (Preorder)
open import definitions.chapter1.MonotoneMap using (_⇒_)
open import Data.Product using (proj₁; Σ; Σ-syntax; _×_)
open import Data.Sum using (_⊎_)
open import Relation.Binary.PropositionalEquality using (_≡_)

module PreservesMeetsJoins where
  -- A monotone map f : P → Q preserves meets if
  -- f(a ∧ b) ≅ f(a) ∧ f(b) for all a, b ∈ P
  PreservesMeets : (P Q : Preorder)  (P  Q)  Set
  PreservesMeets P Q f-mono =
    let open DP.Preorder P renaming (Carrier to A; _≤_ to _≤P_)
        open DP.Preorder Q renaming (Carrier to B; _≤_ to _≤Q_; _≅_ to _≅Q_)
        f = proj₁ f-mono
    in  (a b m : A)  IsMeet _≤P_ m  x  (x  a)  (x  b)) 
        (n : B)  IsMeet _≤Q_ n  y  (y  f a)  (y  f b)) 
       f m ≅Q n

  -- A monotone map f : P → Q preserves joins if
  -- f(a ∨ b) ≅ f(a) ∨ f(b) for all a, b ∈ P
  PreservesJoins : (P Q : Preorder)  (P  Q)  Set
  PreservesJoins P Q f-mono =
    let open DP.Preorder P renaming (Carrier to A; _≤_ to _≤P_)
        open DP.Preorder Q renaming (Carrier to B; _≤_ to _≤Q_; _≅_ to _≅Q_)
        f = proj₁ f-mono
    in  (a b j : A)  IsJoin _≤P_ j  x  (x  a)  (x  b)) 
        (k : B)  IsJoin _≤Q_ k  y  (y  f a)  (y  f b)) 
       f j ≅Q k

Definition 1.88: Generative Effect

Definition 1.88. We say that a monotone map f : P → Q has a generative effect if there exist elements a, b ∈ P such that

f(a) ∨ f(b) ≠ f(a ∨ b).

module GenerativeEffect where
  open import Relation.Nullary using (¬_)

  -- A monotone map f : P → Q has a generative effect if
  -- there exist a, b ∈ P such that f(a) ∨ f(b) ≠ f(a ∨ b)
  HasGenerativeEffect : (P Q : Preorder)  (P  Q)  Set
  HasGenerativeEffect P Q f-mono =
    let open DP.Preorder P renaming (Carrier to A; _≤_ to _≤P_)
        open DP.Preorder Q renaming (Carrier to B; _≤_ to _≤Q_)
        f = proj₁ f-mono
    in Σ[ a  A ] Σ[ b  A ] Σ[ j  A ] Σ[ k  B ]
       (IsJoin _≤P_ j  x  (x  a)  (x  b)) ×
        IsJoin _≤Q_ k  y  (y  f a)  (y  f b)) ×
        ¬ (f j  k))