\begin{code}
module Scheme.Domain-Equations where

open import Scheme.Domain-Notation
open import Scheme.Abstract-Syntax
  using (Ide)

-- 7.2.2. Domain equations

-- Domain definitions

postulate Loc  :  Set
𝐋              =  Loc +βŠ₯       -- locations
𝐍              =  β„• +βŠ₯         -- natural numbers
𝐓              =  Bool +βŠ₯      -- booleans
postulate 𝐐    :  Domain       -- symbols
postulate 𝐇    :  Domain       -- characters
postulate 𝐑    :  Domain       -- numbers
𝐄𝐩             =  (𝐋 Γ— 𝐋 Γ— 𝐓)  -- pairs
𝐄𝐯             =  (𝐋 ⋆ Γ— 𝐓)    -- vectors
𝐄𝐬             =  (𝐋 ⋆ Γ— 𝐓)    -- strings
data Misc      :  Set where    false true null undefined unspecified : Misc
𝐌              =  Misc +βŠ₯      -- miscellaneous
𝐗              =  String +βŠ₯    -- errors

-- Domain isomorphisms

open import Function
  using (_↔_) public

postulate
  𝐅            :  Domain       -- procedure values
  𝐄            :  Domain       -- expressed values
  𝐒            :  Domain       -- stores
  𝐔            :  Domain       -- environments
  𝐂            :  Domain       -- command continuations
  𝐊            :  Domain       -- expression continuations
  𝐀            :  Domain       -- answers

postulate instance
  iso-𝐅        : 𝐅  ↔  (𝐋 Γ— (𝐄 ⋆ β†’ 𝐊 β†’ 𝐂))
  iso-𝐄        : 𝐄  ↔  (𝕃 (𝐐 + 𝐇 + 𝐑 + 𝐄𝐩 + 𝐄𝐯 + 𝐄𝐬 + 𝐌 + 𝐅))
  iso-𝐒        : 𝐒  ↔  (𝐋 β†’ 𝐄 Γ— 𝐓)
  iso-𝐔        : 𝐔  ↔  (Ide β†’ 𝐋)
  iso-𝐂        : 𝐂  ↔  (𝐒 β†’ 𝐀)
  iso-𝐊        : 𝐊  ↔  (𝐄 ⋆ β†’ 𝐂)

open Function.Inverse {{ ... }}
  renaming (to to β–» ; from to β—… ) public
  -- iso-D : D ↔ Dβ€² declares β–» : D β†’ Dβ€² and β—… : Dβ€² β†’ D
\end{code}
\clearpage
\begin{code}
variable
  Ξ±   : 𝐋
  α⋆  : 𝐋 ⋆
  ν   : 𝐍
  μ   : 𝐌
  Ο†   : 𝐅
  Ο΅   : 𝐄
  ϡ⋆  : 𝐄 ⋆
  Οƒ   : 𝐒
  ρ   : 𝐔
  ΞΈ   : 𝐂
  κ   : 𝐊

pattern
  inj-𝐄𝐩 ep  = injβ‚‚ (injβ‚‚ (injβ‚‚ (inj₁ ep)))
pattern
  inj-𝐌 ΞΌ    = injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (inj₁ ΞΌ))))))
pattern
  inj-𝐅 Ο†    = injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ (injβ‚‚ Ο†))))))

_βˆˆπ…          : 𝐄 β†’ Bool +βŠ₯
Ο΅ βˆˆπ…         = ((Ξ» { (inj-𝐅 _) β†’ Ξ· true ; _ β†’ Ξ· false }) β™―) (β–» Ο΅)

_|𝐅          : 𝐄 β†’ 𝐅
Ο΅ |𝐅         = ((Ξ» { (inj-𝐅 Ο†) β†’ Ο† ; _ β†’ βŠ₯ }) β™―) (β–» Ο΅)

_βˆˆπ‹          : 𝕃 (𝐋 + 𝐗) β†’ Bool +βŠ₯
_βˆˆπ‹          = [ (Ξ» _ β†’ Ξ· true), (Ξ» _ β†’ Ξ· false) ] β™―

_|𝐋          : 𝕃 (𝐋 + 𝐗) β†’ 𝐋
_|𝐋          = [ id , (Ξ» _ β†’ βŠ₯) ] β™―

_𝐄𝐩-in-𝐄          : 𝐄𝐩 β†’ 𝐄
ep 𝐄𝐩-in-𝐄        = β—… (Ξ· (inj-𝐄𝐩 ep))

_𝐅-in-𝐄           : 𝐅 β†’ 𝐄
Ο† 𝐅-in-𝐄          = β—… (Ξ· (inj-𝐅 Ο†))

unspecified-in-𝐄  : 𝐄
unspecified-in-𝐄  = β—… (Ξ· (inj-𝐌 (Ξ· unspecified)))
\end{code}