Created
April 6, 2014 14:09
-
-
Save aztek/10006634 to your computer and use it in GitHub Desktop.
Syntax of Roman numerals, checked on type level with Agda's dependent types and instance arguments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module RomanNumerals where | |
open import Data.List | |
open import Data.Unit using (β€; tt) | |
open import Data.Empty using (β₯) | |
data Literal : Set where | |
πΌ π π πΏ πΆ π· π : Literal | |
infix 4 ones_ | |
ones_ : List Literal β Set | |
ones [] = β€ | |
ones πΌ β· [] = β€ | |
ones πΌ β· πΌ β· [] = β€ | |
ones πΌ β· πΌ β· πΌ β· [] = β€ | |
ones πΌ β· π β· [] = β€ | |
ones π β· [] = β€ | |
ones π β· πΌ β· [] = β€ | |
ones π β· πΌ β· πΌ β· [] = β€ | |
ones π β· πΌ β· πΌ β· πΌ β· [] = β€ | |
ones πΌ β· π β· [] = β€ | |
ones _ = β₯ | |
infix 4 tens_ | |
tens_ : List Literal β Set | |
tens πΏ β· π β· π β· π β· β = ones β | |
tens π β· π β· π β· β = ones β | |
tens πΏ β· π β· π β· β = ones β | |
tens π β· π β· β = ones β | |
tens π β· πΏ β· β = ones β | |
tens πΏ β· π β· β = ones β | |
tens π β· πΆ β· β = ones β | |
tens π β· β = ones β | |
tens πΏ β· β = ones β | |
tens ls = ones ls | |
infix 4 hundreds_ | |
hundreds_ : List Literal β Set | |
hundreds π· β· πΆ β· πΆ β· πΆ β· β = tens β | |
hundreds πΆ β· πΆ β· πΆ β· β = tens β | |
hundreds π· β· πΆ β· πΆ β· β = tens β | |
hundreds πΆ β· πΆ β· β = tens β | |
hundreds πΆ β· π· β· β = tens β | |
hundreds π· β· πΆ β· β = tens β | |
hundreds πΆ β· π β· β = tens β | |
hundreds πΆ β· β = tens β | |
hundreds π· β· β = tens β | |
hundreds β = tens β | |
infix 4 thousands_ | |
thousands_ : List Literal β Set | |
thousands π β· π β· π β· β = hundreds β | |
thousands π β· π β· β = hundreds β | |
thousands π β· β = hundreds β | |
thousands β = hundreds β | |
infix 4 validRoman_ | |
validRoman_ : List Literal β Set | |
validRoman β = thousands β | |
infixl 5 _I _V _X _L _C _D _M | |
data Numeral : {r : List Literal} β Set where | |
_I : β {r} {{ _ : validRoman r β·Κ³ πΌ }} β Numeral {r} β Numeral { r β·Κ³ πΌ } | |
_V : β {r} {{ _ : validRoman r β·Κ³ π }} β Numeral {r} β Numeral { r β·Κ³ π } | |
_X : β {r} {{ _ : validRoman r β·Κ³ π }} β Numeral {r} β Numeral { r β·Κ³ π } | |
_L : β {r} {{ _ : validRoman r β·Κ³ πΏ }} β Numeral {r} β Numeral { r β·Κ³ πΏ } | |
_C : β {r} {{ _ : validRoman r β·Κ³ πΆ }} β Numeral {r} β Numeral { r β·Κ³ πΆ } | |
_D : β {r} {{ _ : validRoman r β·Κ³ π· }} β Numeral {r} β Numeral { r β·Κ³ π· } | |
_M : β {r} {{ _ : validRoman r β·Κ³ π }} β Numeral {r} β Numeral { r β·Κ³ π } | |
α΅£ : Numeral {[]} | |
-- 112 | |
cvii : Numeral | |
cvii = α΅£ C V I I | |
-- 3054 | |
mmmciv : Numeral | |
mmmciv = α΅£ M M M C I V | |
-- 999 | |
cmxcix : Numeral | |
cmxcix = α΅£ C M X C I X | |
-- Will not typecheck - I before M | |
-- im : Numeral | |
-- im = α΅£ I M | |
-- Will not type typecheck - more than three I in a row | |
-- iiii : Numeral | |
-- iiii = α΅£ I I I I | |
-- Will not typecheck - additives after substractive | |
-- ivii : Numeral | |
-- ivii = α΅£ I V I I |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment