Skip to content

Instantly share code, notes, and snippets.

@lykkin
Last active August 29, 2015 14:13
Show Gist options
  • Save lykkin/32537cca0ed8dcb6058b to your computer and use it in GitHub Desktop.
Save lykkin/32537cca0ed8dcb6058b to your computer and use it in GitHub Desktop.
more language stuff
data BExp = TRUE
| FALSE
| AND BExp BExp
| OR BExp BExp
| NOT BExp
| QUANT QExp
beval :: BExp -> Bool
beval TRUE = True
beval FALSE = False
beval (AND left right) = (beval left) && (beval right)
beval (OR left right) = (beval left) || (beval right)
beval (NOT ex) = not (beval ex)
beval (QUANT ex) = (qeval ex)
data AExp = I Integer
| PLUS AExp AExp
| SUB AExp AExp
| MULTI AExp AExp
| DIV AExp AExp
aeval :: AExp -> Integer
aeval (I i) = i
aeval (PLUS left right) = (aeval left) + (aeval right)
aeval (SUB left right) = (aeval left) - (aeval right)
aeval (MULTI left right) = (aeval left) * (aeval right)
aeval (DIV left right) = (aeval left) `div` (aeval right)
data QExp = GR AExp AExp
| LE AExp AExp
| EQU AExp AExp
| NEQ AExp AExp
| LEQ AExp AExp
| GEQ AExp AExp
qeval :: QExp -> Bool
qeval (GR left right) = (aeval left) > (aeval right)
qeval (LE left right) = (aeval left) < (aeval right)
qeval (EQU left right) = (aeval left) == (aeval right)
qeval (NEQ left right) = (aeval left) /= (aeval right)
qeval (LEQ left right) = (aeval left) <= (aeval right)
qeval (GEQ left right) = (aeval left) >= (aeval right)
data CExp = IF BExp AExp AExp
ceval :: CExp -> Integer
ceval (IF pred valid invalid) | (beval pred) = (aeval valid)
| otherwise = (aeval invalid)
test = (ceval
(IF
(NOT
(QUANT
(GR
(PLUS (I 1) (I 1))
(MULTI (I 2) (I 1))
)
)
)
(SUB (I 3) (I 2))
(DIV (I 6) (I 2))
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment