Skip to content

Instantly share code, notes, and snippets.

@pedrominicz
Last active November 17, 2019 19:22
Show Gist options
  • Select an option

  • Save pedrominicz/7dfbf34d6cfd266409bcd2f0916da05a to your computer and use it in GitHub Desktop.

Select an option

Save pedrominicz/7dfbf34d6cfd266409bcd2f0916da05a to your computer and use it in GitHub Desktop.
Programming Language Foundations in Agda: Untyped
module Untyped where
infixr 7 _β‡’_
infixl 5 _,_
data Type : Set where
β˜… : Type
_β‡’_ : Type β†’ Type β†’ Type
β˜… β‡’ β˜… = β˜…
data Context : Set where
βˆ… : Context
_,_ : Context β†’ Type β†’ Context
infix 4 _∈_
infix 4 _⊒_
data _∈_ : Type β†’ Context β†’ Set where
zero : βˆ€ {Ξ“ A}
-----------
β†’ A ∈ Ξ“ , A
suc : βˆ€ {Ξ“ A B}
β†’ A ∈ Ξ“
-----------
β†’ A ∈ Ξ“ , B
data _⊒_ : Context β†’ Type β†’ Set where
` : βˆ€ {Ξ“ A}
β†’ A ∈ Ξ“
-------
β†’ Ξ“ ⊒ A
Ζ› : βˆ€ {Ξ“}
β†’ Ξ“ , β˜… ⊒ β˜…
-----------
β†’ Ξ“ ⊒ β˜…
_Β·_ : βˆ€ {Ξ“}
β†’ Ξ“ ⊒ β˜…
β†’ Ξ“ ⊒ β˜…
-------
β†’ Ξ“ ⊒ β˜…
infix 4 _βŠ†_
_βŠ†_ : Context β†’ Context β†’ Set
Ξ“ βŠ† Ξ” = βˆ€ {A} β†’ A ∈ Ξ“ β†’ A ∈ Ξ”
ext : βˆ€ {Ξ“ Ξ” A}
β†’ Ξ“ βŠ† Ξ”
---------------
β†’ Ξ“ , A βŠ† Ξ” , A
ext ρ zero = zero
ext ρ (suc x) = suc (ρ x)
rename : βˆ€ {Ξ“ Ξ” A}
β†’ Ξ“ βŠ† Ξ”
β†’ Ξ“ ⊒ A
-------
β†’ Ξ” ⊒ A
rename ρ (` x) = ` (ρ x)
rename ρ (Ζ› M) = Ζ› (rename (ext ρ) M)
rename ρ (M · N) = rename ρ M · rename ρ N
infix 4 _βŠ‘_
_βŠ‘_ : Context β†’ Context β†’ Set
Ξ“ βŠ‘ Ξ” = βˆ€ {A} β†’ A ∈ Ξ“ β†’ Ξ” ⊒ A
exts : βˆ€ {Ξ“ Ξ” A}
β†’ Ξ“ βŠ‘ Ξ”
---------------
β†’ Ξ“ , A βŠ‘ Ξ” , A
exts Οƒ zero = ` zero
exts Οƒ (suc x) = rename suc (Οƒ x)
subst : βˆ€ {Ξ“ Ξ” A}
β†’ Ξ“ βŠ‘ Ξ”
β†’ Ξ“ ⊒ A
-------
β†’ Ξ” ⊒ A
subst Οƒ (` x) = Οƒ x
subst Οƒ (Ζ› M) = Ζ› (subst (exts Οƒ) M)
subst Οƒ (M Β· N) = subst Οƒ M Β· subst Οƒ N
_[_] : βˆ€ {Ξ“ A B}
β†’ Ξ“ , A ⊒ B
β†’ Ξ“ ⊒ A
-----------
β†’ Ξ“ ⊒ B
_[_] {Ξ“} {A} M N = subst Οƒ M
where
Οƒ : Ξ“ , A βŠ‘ Ξ“
Οƒ zero = N
Οƒ (suc x) = ` x
data Neutral : βˆ€ {Ξ“ A} β†’ Ξ“ ⊒ A β†’ Set
data Normal : βˆ€ {Ξ“ A} β†’ Ξ“ ⊒ A β†’ Set
data Neutral where
` : βˆ€ {Ξ“ A} (x : A ∈ Ξ“)
---------------
β†’ Neutral (` x)
_Β·_ : βˆ€ {Ξ“} {M N : Ξ“ ⊒ β˜…}
β†’ Neutral M
β†’ Normal N
-----------------
β†’ Neutral (M Β· N)
data Normal where
` : βˆ€ {Ξ“ A} {M : Ξ“ ⊒ A}
β†’ Neutral M
-----------
β†’ Normal M
Ζ› : βˆ€ {Ξ“} {M : Ξ“ , β˜… ⊒ β˜…}
β†’ Normal M
--------------
β†’ Normal (Ζ› M)
infix 3 _β€”β†’_
data _β€”β†’_ : βˆ€ {Ξ“ A} β†’ Ξ“ ⊒ A β†’ Ξ“ ⊒ A β†’ Set where
ξ₁ : βˆ€ {Ξ“} {M M' N : Ξ“ ⊒ β˜…}
β†’ M β€”β†’ M'
-----------------
β†’ M Β· N β€”β†’ M' Β· N
ΞΎβ‚‚ : βˆ€ {Ξ“} {M N N' : Ξ“ ⊒ β˜…}
β†’ N β€”β†’ N'
-----------------
β†’ M Β· N β€”β†’ M Β· N'
Ξ² : βˆ€ {Ξ“} {M : Ξ“ , β˜… ⊒ β˜…} {N : Ξ“ ⊒ β˜…}
----------------------
β†’ (Ζ› M) Β· N β€”β†’ M [ N ]
ΞΆ : βˆ€ {Ξ“} {M M' : Ξ“ , β˜… ⊒ β˜…}
β†’ M β€”β†’ M'
-------------
β†’ Ζ› M β€”β†’ Ζ› M'
data _β€”β†’*_ : βˆ€ {Ξ“ A} β†’ Ξ“ ⊒ A β†’ Ξ“ ⊒ A β†’ Set where
_∎ : βˆ€ {Ξ“ A} (M : Ξ“ ⊒ A)
---------
β†’ M β€”β†’* M
_β€”β†’βŸ¨_⟩_ : βˆ€ {Ξ“ A} (L : Ξ“ ⊒ A) {M N : Ξ“ ⊒ A}
β†’ L β€”β†’ M
β†’ M β€”β†’* N
---------
β†’ L β€”β†’* N
data Progress {Ξ“ A} (M : Ξ“ ⊒ A) : Set where
step : βˆ€ {N : Ξ“ ⊒ A}
β†’ M β€”β†’ N
------------
β†’ Progress M
done :
Normal M
------------
β†’ Progress M
progress : βˆ€ {Ξ“ A}
β†’ (M : Ξ“ ⊒ A)
-------------
β†’ Progress M
progress (` x) = done (` (` x))
progress (M Β· N) with progress M
... | step Mβ€”β†’M' = step (ξ₁ Mβ€”β†’M')
... | done (Ζ› NM) = step Ξ²
... | done (` x) with progress N
... | step Nβ€”β†’N' = step (ΞΎβ‚‚ Nβ€”β†’N')
... | done NN = done (` (x Β· NN))
progress (Ζ› M) with progress M
... | step Mβ€”β†’M' = step (ΞΆ Mβ€”β†’M')
... | done NM = done (Ζ› NM)
data Gas : Set where
zero : Gas
suc : Gas β†’ Gas
{-# BUILTIN NATURAL Gas #-}
data Finished {Ξ“ A} (M : Ξ“ ⊒ A) : Set where
done :
Normal M
------------
β†’ Finished M
out-of-gas :
----------
Finished M
data Steps : βˆ€ {Ξ“ A} β†’ Ξ“ ⊒ A β†’ Set where
steps : βˆ€ {Ξ“ A} {M N : Ξ“ ⊒ A}
β†’ M β€”β†’* N
β†’ Finished N
------------
β†’ Steps M
eval : βˆ€ {Ξ“ A}
β†’ Gas
β†’ (M : Ξ“ ⊒ A)
-------------
β†’ Steps M
eval zero M = steps (M ∎) out-of-gas
eval (suc x) M with progress M
... | done NM = steps (M ∎) (done NM)
... | step {M'} Mβ€”β†’M' with eval x M'
... | steps M'β€”β†’*M'' fin = steps (M β€”β†’βŸ¨ Mβ€”β†’M' ⟩ M'β€”β†’*M'') fin
-- eval 100 (Ζ› (` zero))
-- eval 100 ((Ζ› (` zero)) Β· (Ζ› (` zero)))
-- eval 100 (Ζ› (Ζ› (` (suc zero))))
-- eval 100 (Ζ› (Ζ› (Ζ› ((` (suc (suc zero)) Β· ` zero) Β· (` (suc zero) Β· ` zero)))))
-- eval 100 (((Ζ› (Ζ› (Ζ› ((` (suc (suc zero)) Β· ` zero) Β· (` (suc zero) Β· ` zero))))) Β· (Ζ› (Ζ› (` (suc zero))))) Β· (Ζ› (Ζ› (` (suc zero)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment