Monoidal Closed Preorder

Textbook Definition

Definition 2.55. A symmetric monoidal preorder $\mathcal{V} = (V, \leq, I, \otimes)$ is called symmetric monoidal closed (or just closed) if, for every two elements $v, w \in V$, there is an element $v \multimap w$ in $\mathcal{V}$, called the hom-element, with the property

\[(a \otimes v) \leq w \quad \text{iff} \quad a \leq (v \multimap w)\]

for all $a, v, w \in V$.

Interpretation

The condition says that $(-\otimes v)$ and $(v \multimap -)$ form a Galois connection. The hom-element $v \multimap w$ can be thought of as a “single-use $v$-to-$w$ converter”: having $a$ resources and $v$ resources is enough to get $w$ if and only if $a$ alone is enough to get a $v$-to-$w$ converter.

Agda Setup

module definitions.chapter2.MonoidalClosed where

open import definitions.chapter2.SymmetricMonoidalPreorder
  using (SymmetricMonoidalPreorder)
open import Data.Product using (_×_; _,_)

Agda Formalization

-- A symmetric monoidal preorder is closed if it has hom-elements
record IsMonoidalClosed (V : SymmetricMonoidalPreorder) : Set where
  open SymmetricMonoidalPreorder V

  field
    -- The hom-element (internal hom)
    _⊸_ : Carrier  Carrier  Carrier

    -- The closure condition: (a ⊗ v) ≤ w iff a ≤ (v ⊸ w)
    -- We express this as two implications
    curry :  {a v w}  (a  v)  w  a  (v  w)
    uncurry :  {a v w}  a  (v  w)  (a  v)  w

-- A monoidal closed preorder
record MonoidalClosedPreorder : Set₁ where
  field
    base : SymmetricMonoidalPreorder
    closed : IsMonoidalClosed base

  open SymmetricMonoidalPreorder base public
  open IsMonoidalClosed closed public

Derived Properties

From the closure condition, we can derive useful properties.

module ClosedProperties (MCP : MonoidalClosedPreorder) where
  open MonoidalClosedPreorder MCP

  -- Evaluation: (v ⊸ w) ⊗ v ≤ w
  -- (Using uncurry with a = v ⊸ w and reflexivity)
  eval :  {v w}  ((v  w)  v)  w
  eval = uncurry reflexive

  -- The hom functor is monotone in the second argument
  -- If w ≤ w', then (v ⊸ w) ≤ (v ⊸ w')
  ⊸-mono-r :  {v w w'}  w  w'  (v  w)  (v  w')
  ⊸-mono-r {v} {w} {w'} w≤w' = curry (transitive eval w≤w')