Types.lagda 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. %include agda.fmt
  2. \subsection{Types}
  3. \label{types}
  4. \AgdaHide{
  5. \begin{code}
  6. module Issue854.Types where
  7. open import Data.Product
  8. open import Data.List
  9. open import Issue854.Context
  10. infixr 3 _⇒_
  11. infixr 4 _⊗_
  12. infixr 4 _&_
  13. infixr 5 _⋆_
  14. \end{code}
  15. }
  16. \begin{code}
  17. mutual
  18. -- Value types.
  19. data VType : Set where
  20. -- Thunk
  21. ⁅_⁆ : (C : CType) → VType
  22. -- Products
  23. 𝟙 : VType
  24. _⊗_ : (U V : VType) → VType
  25. -- Sums
  26. 𝟘 : VType
  27. _⊕_ : (U V : VType) → VType
  28. μ : (Δ : Sig) → VType
  29. -- Computation types.
  30. data CType : Set where
  31. -- Returns
  32. _⋆_ : (Σ : Sig)(V : VType) → CType
  33. -- Function space
  34. _⇒_ : (V : VType)(C : CType) → CType
  35. -- Products
  36. ⊤′ : CType
  37. _&_ : (B C : CType) → CType
  38. Op = VType × VType
  39. Sig = List Op
  40. \end{code}
  41. \begin{code}
  42. Ctx = Snoc VType
  43. OpAlg : Op → CType → CType
  44. OpAlg (P , A) C = P ⇒ ⁅ A ⇒ C ⁆ ⇒ C
  45. Alg : Sig → CType → List CType
  46. Alg [] C = []
  47. Alg (ω ∷ Ω) C = OpAlg ω C ∷ Alg Ω C
  48. OpPHomo : Op → Sig → VType → VType → Sig → VType → CType
  49. OpPHomo (P , A) Σ U I Σ′ V =
  50. P ⇒ ⁅ A ⇒ ((Σ ++ Σ′) ⋆ U & (I ⇒ Σ′ ⋆ V)) ⁆ ⇒ I ⇒ Σ′ ⋆ V
  51. PHomo′ : Sig → Sig → VType → VType → Sig → VType → List CType
  52. PHomo′ [] Σ U I Σ′ V = (U ⇒ I ⇒ Σ′ ⋆ V) ∷ []
  53. PHomo′ (ω ∷ Ω) Σ U I Σ′ V = OpPHomo ω Σ U I Σ′ V ∷ PHomo′ Ω Σ U I Σ′ V
  54. PHomo : Sig → VType → VType → Sig → VType → List CType
  55. PHomo Σ U I Σ′ V = PHomo′ Σ Σ U I Σ′ V
  56. \end{code}