module SF.PHOAS where
open import Agda.Primitive using (_โ_)
module Prelude where
infixr 3 โ๐ ๐ก
infixl 5 _โจ_
infixr 20 _โท_
data ๐น : Set where
T : ๐น
F : ๐น
data _โจ_ {โโ โโ} (A : Set โโ) (B : Set โโ) : Set (โโ โ โโ) where
Inl : A โ A โจ B
Inr : B โ A โจ B
syntax โ๐ ๐ก A (ฮป x โ B) = โ x โฆ A ๐ ๐ก B
data โ๐ ๐ก {โโ โโ} (A : Set โโ) (B : A โ Set โโ) : Set (โโ โ โโ) where
โจโ_,_โฉ : โ (x : A) โ B x โ โ x โฆ A ๐ ๐ก B x
data โฌ_โญ {โ} (A : Set โ) : Set โ where
[] : โฌ A โญ
_โท_ : A โ โฌ A โญ โ โฌ A โญ
open Prelude
data type : Set where
_โจโโฉ_ : type โ type โ type
data exp-phoas (var : type โ โฌ type โญ โ Set) : โ (ฮ : โฌ type โญ) (ฯ : type) โ Set where
Var : โ {ฮ ฯ}
(x : var ฯ ฮ)
โ exp-phoas var ฮ ฯ
โจฮปโฉ : โ {ฮ ฯโ ฯโ}
(e : var ฯโ (ฯโ โท ฮ) โ exp-phoas var (ฯโ โท ฮ) ฯโ)
โ exp-phoas var ฮ (ฯโ โจโโฉ ฯโ)
_โจโ
โฉ_ : โ {ฮ ฯโ ฯโ}
(eโ : exp-phoas var ฮ (ฯโ โจโโฉ ฯโ))
(eโ : exp-phoas var ฮ ฯโ)
โ exp-phoas var ฮ ฯโ
infix 10 _โ_
data _โ_ {โ} {A : Set โ} (x : A) : โ (xs : โฌ A โญ) โ Set โ where
Z : โ {xs} โ x โ x โท xs
S : โ {xโฒ xs} โ x โ xs โ x โ xโฒ โท xs
infix 10 _โข_
data _โข_ : โ (ฮ : โฌ type โญ) (ฯ : type) โ Set where
Var : โ {ฮ ฯ}
(x : ฯ โ ฮ)
โ ฮ โข ฯ
โจฮปโฉ : โ {ฮ ฯโ ฯโ}
(e : ฯโ โท ฮ โข ฯโ)
โ ฮ โข ฯโ โจโโฉ ฯโ
_โจโ
โฉ_ : โ {ฮ ฯโ ฯโ}
(eโ : ฮ โข ฯโ โจโโฉ ฯโ)
(eโ : ฮ โข ฯโ)
โ ฮ โข ฯโ
โฆ_โงโ : โ {ฮ ฯ} (e : exp-phoas _โ_ ฮ ฯ) โ ฮ โข ฯ
โฆ Var x โงโ = Var x
โฆ โจฮปโฉ e โงโ = โจฮปโฉ โฆ e Z โงโ
โฆ eโ โจโ
โฉ eโ โงโ = โฆ eโ โงโ โจโ
โฉ โฆ eโ โงโ
โฆ_โงโ : โ {ฮ ฯ} (e : ฮ โข ฯ) โ exp-phoas _โ_ ฮ ฯ
โฆ Var x โงโ = Var x
โฆ โจฮปโฉ e โงโ = โจฮปโฉ (ฮป _ โ โฆ e โงโ)
โฆ eโ โจโ
โฉ eโ โงโ = โฆ eโ โงโ โจโ
โฉ โฆ eโ โงโ