Skip to content

Instantly share code, notes, and snippets.

@bond15
Created July 26, 2022 16:32
Show Gist options
  • Save bond15/15a7ba3a6158da9ee86e6d7614f1ab53 to your computer and use it in GitHub Desktop.
Save bond15/15a7ba3a6158da9ee86e6d7614f1ab53 to your computer and use it in GitHub Desktop.
module Multiverse where
module types where
open import Data.Nat
open import Data.String
open import Data.Bool
open import Data.Product
data Type₁ : Set where
𝕓 π•Ÿ 𝕀 : Type₁
El₁ : Type₁ β†’ Set
El₁ 𝕓 = Bool
El₁ π•Ÿ = β„•
El₁ 𝕀 = String
data Typeβ‚‚ : Set where
𝕓 π•Ÿ 𝕀 : Typeβ‚‚
_&_ _β‡’_ : Typeβ‚‚ β†’ Typeβ‚‚ β†’ Typeβ‚‚
Elβ‚‚ : Typeβ‚‚ β†’ Set
Elβ‚‚ 𝕓 = Bool
Elβ‚‚ π•Ÿ = β„•
Elβ‚‚ 𝕀 = String
Elβ‚‚ (x & y) = Elβ‚‚ x Γ— Elβ‚‚ y
Elβ‚‚ (x β‡’ y) = Elβ‚‚ x β†’ Elβ‚‚ y
module univ where
-- note this is equivalent to Poly
-- Poly can be seen as a datatype and a universe..
record Univ : Set₁ where
field
U : Set
El : U β†’ Set
open Univ
-- fixes a universe, vs the multiverse definition
-- this is an element of Poly
record UniverseElement (𝒰 : Univ) : Set where
constructor _βˆ‹_
field
ty : 𝒰 .U
elem : (𝒰 .El) ty
open UniverseElement
⟦_⟧ : Univ β†’ Set
⟦_⟧ = UniverseElement
open import Data.Product
open import Relation.Binary.PropositionalEquality
open types
𝒰₁ : Univ
𝒰₁ .U = Type₁
𝒰₁ .El = El₁
𝒰₂ : Univ
𝒰₂ .U = Typeβ‚‚
𝒰₂ .El = Elβ‚‚
-- set of universe elements with a particual type
pick : {𝒰 : Univ} β†’ (type : 𝒰 .U ) β†’ Set
pick {𝒰} type = Ξ£ ⟦ 𝒰 ⟧ (Ξ» e β†’ ty e ≑ type)
_ : pick {𝒰₂} (𝕓 β‡’ 𝕓)
_ = ((𝕓 β‡’ 𝕓) βˆ‹ Ξ» b β†’ b) , refl
open import Data.Nat
_ : ⟦ 𝒰₂ ⟧
_ = ((π•Ÿ & π•Ÿ) β‡’ π•Ÿ) βˆ‹ Ξ»{(n , m) β†’ n + m}
data βŠ₯ : Set where
data ⊀ : Set where tt : ⊀
{-
nary' : β„• β†’ Univ β†’ Set
nary' zero 𝒰 = 𝒰 .U --⟦ 𝒰 ⟧
nary' (suc n) 𝒰 = 𝒰 .U Γ— nary' n 𝒰 --⟦ u ⟧ Γ— nary' n u
nary : β„• β†’ Univ β†’ Set
nary zero 𝒰 = ⊀
nary (suc n) 𝒰 = nary' n 𝒰
_ : nary 3 𝒰₁
_ = 𝕓 , (𝕓 , π•Ÿ)
-}
open import Data.Product
open import Data.Bool
nary' : β„• β†’ Univ β†’ Set
nary' zero 𝒰 = ⟦ 𝒰 ⟧
nary' (suc x) 𝒰 = ⟦ 𝒰 ⟧ Γ— nary' x 𝒰
nary : β„• β†’ Univ β†’ Set
nary zero 𝒰 = ⊀
nary (suc n) 𝒰 = nary' n 𝒰
record DSL (𝒰 : Univ) : Set where
field
β„± : βˆ€(n : β„•) β†’ nary n 𝒰 β†’ ⟦ 𝒰 ⟧
open DSL
hmm : DSL 𝒰₂
hmm .β„± zero x = {! !}
hmm .β„± (suc n) x = {! x !}
module multi where
record Univ : Set₁ where
field
U : Set
El : U β†’ Set
open Univ
record MultiverseElement : Set₁ where
constructor _βˆ‹_βˆ‹_
field
𝒰 : Univ
ty : 𝒰 .U
elem : (𝒰 .El) ty
open import Data.Nat
open import Data.String
open import Data.Bool
open import Function hiding (_βˆ‹_)
data Types₁ : Set where 𝕓 π•Ÿ : Types₁
data Typesβ‚‚ : Set where
𝕀 : Typesβ‚‚
_β‡’_ : Typesβ‚‚ β†’ Typesβ‚‚ β†’ Typesβ‚‚
U₁ : Univ
U₁ .U = Types₁
U₁ .El 𝕓 = Bool
U₁ .El π•Ÿ = β„•
Uβ‚‚ : Univ
Uβ‚‚ .U = Typesβ‚‚
Uβ‚‚ .El = El'
where
El' : Typesβ‚‚ β†’ Set
El' 𝕀 = String
El' (x β‡’ y) = El' x β†’ El' y
ex : MultiverseElement
ex = Uβ‚‚ βˆ‹ (𝕀 β‡’ 𝕀) βˆ‹ (Ξ» s β†’ s ++ "foo")
ex2 : MultiverseElement
ex2 = U₁ βˆ‹ 𝕓 βˆ‹ false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment