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โ โงโ