ECI 2024
Se desea implementar un pequeño EDSL para representar proposiciones basadas en comparaciones entre números naturales, el cual tiene las siguientes construcciones:
val: valor naturaleq: igualdad entre naturaleslt: relación de menor entre naturalesnot: negaciónand: conjunciónor: disyunción
Asociado al EDSL se tiene un sistema de tipos que está formado por las reglas que se presentan a continuación. Como es habitual, el juicio p : t significa que la expresión p tiene tipo t. El lenguaje maneja dos tipos (integer y boolean).
var 4 : integerlt (var 4) (var 5) : booleanor (not (lt (var 4) (var 3))) (eq (var 4) (var 3)) : boolean
or (var 4) (var 5)not (var 4)eq (lt (var 4) (var 3)) (var 5)
Considerando que la interpretación estándar de las proposiciones es su valor de verdad o el propio natural n en el caso de expresiones de la forma val n, se pide:
-
Implementar el EDSL como un shallow embedding bien tipado en Haskell siguiendo el enfoque tagless-final. Interprete los tipos
integerybooleancomo tipos de Haskell. -
Implementar el EDSL como un deep embedding bien tipado en Haskell utilizando GADTs. Definir la función
evalque evalúa una expresión bien tipada de tipoty retorna un valor de ese tipo. -
Dada la siguiente gramática que describe una sintaxis concreta para el lenguaje:
prop ::= term "\/" prop | term term ::= factor "/\" term | factor factor ::= '~' prop | '(' prop ')' | '(' prop '=' prop ')' | '(' prop '<' prop ')' | N- (a) Definir una nueva interpretación para los puntos 1 y 2 que retorne un
Stringque represente el programa en esa sintaxis. - (b) Definir un tipo
UProp, de kind*, que represente el árbol de sintaxis abstracta no tipado del lenguaje. - (c) Escribir un parser del lenguaje utilizando los combinadores vistos en el curso (puede optar por usar los combinadores aplicativos o monádicos) y que retorne el valor de tipo
UPropcorrespondiente.
- (a) Definir una nueva interpretación para los puntos 1 y 2 que retorne un
-
(OPCIONAL) Considere la siguiente extensión al lenguaje, en la que se agrega:
var: variable proposicional
Con la siguiente regla de tipado:
var x : boolean
Ahora la interpretación depende de un ambiente de variables en el que se le asocian valores de verdad a las variables.
- (a) Extender el EDSL definido en 1.
- (b) Extender el EDSL definido en 2.
- (c) Extender el tipo definido en 3.a y el parser definido en 3.b.
- (d) Definir una función
typeProp :: Ty t -> UProp -> Prop tdondeProp tes el GADT que definió para el deep embedding yTy tes el siguiente tipo que representa tipos:
data Ty :: * -> * where TInt :: Ty Int TBool :: Ty Bool