Scheme.Domain Notation
\begin{code}
module Scheme.Domain-Notation where
open import Relation.Binary.PropositionalEquality.Core
using (_≡_; refl) public
Predomain = Set
Domain = Set
variable
P Q : Predomain
D E : Domain
postulate
⊥ : {D : Domain} → D
strict : {D E : Domain} → (D → E) → (D → E)
strict-⊥ : ∀ {D E} → (f : D → E) →
strict f ⊥ ≡ ⊥
postulate
fix : ∀ {D : Domain} → (D → D) → D
fix-fix : ∀ {D} (f : D → D) →
fix f ≡ f (fix f)
fix-app : ∀ {P D} (f : (P → D) → (P → D)) (p : P) →
fix f p ≡ f (fix f) p
postulate
𝕃 : Predomain → Domain
η : ∀ {P} → P → 𝕃 P
_♯ : ∀ {P} {D : Domain} → (P → D) → (𝕃 P → D)
elim-♯-η : ∀ {P D} (f : P → D) (p : P) →
(f ♯) (η p) ≡ f p
elim-♯-⊥ : ∀ {P D} (f : P → D) →
(f ♯) ⊥ ≡ ⊥
\end{code}
\clearpage
\begin{code}
_+⊥ : Set → Domain
S +⊥ = 𝕃 S
open import Agda.Builtin.Nat
using (_==_; _<_) public
open import Data.Nat.Base
using (ℕ; suc; NonZero; pred) public
open import Data.Bool.Base
using (Bool) public
_==⊥_ : ℕ +⊥ → ℕ → Bool +⊥
ν ==⊥ n = ((λ m → η (m == n)) ♯) ν
_>=⊥_ : ℕ +⊥ → ℕ → Bool +⊥
ν >=⊥ n = ((λ m → η (n < m)) ♯) ν
open import Data.Product.Base
using (_×_; _,_) renaming (proj₁ to _↓1; proj₂ to _↓2) public
open import Data.Sum.Base
using (inj₁; inj₂) renaming (_⊎_ to _+_; [_,_]′ to [_,_]) public
\end{code}
\clearpage
\begin{code}
open import Data.Vec.Recursive
using (_^_; []) public
open import Agda.Builtin.Sigma
using (Σ)
_⋆′ : Predomain → Predomain
P ⋆′ = Σ ℕ (P ^_)
#′ : ∀ {P} → P ⋆′ → ℕ
#′ (n , _) = n
_::′_ : ∀ {P} → P → P ⋆′ → P ⋆′
p ::′ (0 , ps) = (1 , p)
p ::′ (suc n , ps) = (suc (suc n) , p , ps)
_↓′_ : ∀ {P} → P ⋆′ → (n : ℕ) → .{{_ : NonZero n}} → 𝕃 P
(1 , p) ↓′ 1 = η p
(suc (suc n) , p , ps) ↓′ 1 = η p
(suc (suc n) , p , ps) ↓′ suc (suc i) = (suc n , ps) ↓′ suc i
(_ , _) ↓′ _ = ⊥
_†′_ : ∀ {P} → P ⋆′ → (n : ℕ) → .{{_ : NonZero n}} → 𝕃 (P ⋆′)
(1 , p) †′ 1 = η (0 , [])
(suc (suc n) , p , ps) †′ 1 = η (suc n , ps)
(suc (suc n) , p , ps) †′ suc (suc i) = (suc n , ps) †′ suc i
(_ , _) †′ _ = ⊥
_§′_ : ∀ {P} → P ⋆′ → P ⋆′ → P ⋆′
(0 , _) §′ p⋆′ = p⋆′
(1 , p) §′ p⋆′ = p ::′ p⋆′
(suc (suc n) , p , ps) §′ p⋆′ = p ::′ ((suc n , ps) §′ p⋆′)
_⋆ : Domain → Domain
D ⋆ = 𝕃 (Σ ℕ (D ^_))
⟨⟩ : ∀ {D} → D ⋆
⟨⟩ = η (0 , [])
⟨_⟩ : ∀ {n D} → D ^ suc n → D ⋆
⟨_⟩ {n = n} ds = η (suc n , ds)
\end{code}
\clearpage
\begin{code}
# : ∀ {D} → D ⋆ → ℕ +⊥
# d⋆ = ((λ p⋆′ → η (#′ p⋆′)) ♯) d⋆
_§_ : ∀ {D} → D ⋆ → D ⋆ → D ⋆
d⋆₁ § d⋆₂ = ((λ p⋆′₁ → ((λ p⋆′₂ → η (p⋆′₁ §′ p⋆′₂)) ♯) d⋆₂) ♯) d⋆₁
open import Function
using (id; _∘_) public
_↓_ : ∀ {D} → D ⋆ → (n : ℕ) → .{{_ : NonZero n}} → D
d⋆ ↓ n = (id ♯) (((λ p⋆′ → p⋆′ ↓′ n) ♯) d⋆)
_†_ : ∀ {D} → D ⋆ → (n : ℕ) → .{{_ : NonZero n}} → D ⋆
d⋆ † n = (id ♯) (((λ p⋆′ → η (p⋆′ †′ n)) ♯) d⋆)
open import Data.Bool.Base
using (Bool; true; false; if_then_else_) public
postulate
_⟶_,_ : {D : Domain} → Bool +⊥ → D → D → D
true-cond : ∀ {D} {d₁ d₂ : D} → (η true ⟶ d₁ , d₂) ≡ d₁
false-cond : ∀ {D} {d₁ d₂ : D} → (η false ⟶ d₁ , d₂) ≡ d₂
bottom-cond : ∀ {D} {d₁ d₂ : D} → (⊥ ⟶ d₁ , d₂) ≡ ⊥
open import Data.String.Base
using (String) public
\end{code}