{"id":15063753,"url":"https://github.com/joangq/edsl","last_synced_at":"2026-01-03T00:12:00.043Z","repository":{"id":256863735,"uuid":"856647896","full_name":"joangq/edsl","owner":"joangq","description":"Abordaje Funcional a los lenguajes de dominio específico embebidos - Curso de ECI 2024","archived":false,"fork":false,"pushed_at":"2024-09-13T00:55:25.000Z","size":3237,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T08:37:31.639Z","etag":null,"topics":["applicative","applicative-functor","computer-science","domain-specific-language","dsl","edsl","functional-programming","functor","haskell","monad","parser","parser-combinators","plt","programming-language-theory"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joangq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-13T00:20:17.000Z","updated_at":"2024-09-13T01:05:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"cda77b54-e07f-4a68-aaee-9c14f267cc57","html_url":"https://github.com/joangq/edsl","commit_stats":null,"previous_names":["joangq/edsl"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joangq%2Fedsl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joangq%2Fedsl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joangq%2Fedsl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joangq%2Fedsl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joangq","download_url":"https://codeload.github.com/joangq/edsl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243779017,"owners_count":20346650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["applicative","applicative-functor","computer-science","domain-specific-language","dsl","edsl","functional-programming","functor","haskell","monad","parser","parser-combinators","plt","programming-language-theory"],"created_at":"2024-09-25T00:06:49.755Z","updated_at":"2026-01-03T00:12:00.005Z","avatar_url":"https://github.com/joangq.png","language":"Haskell","readme":"# Abordaje Funcional a EDSLs\n\n**ECI 2024**\n\nSe desea implementar un pequeño EDSL para representar proposiciones basadas en comparaciones entre números naturales, el cual tiene las siguientes construcciones:\n\n- `val`: valor natural\n- `eq`: igualdad entre naturales\n- `lt`: relación de menor entre naturales\n- `not`: negación\n- `and`: conjunción\n- `or`: disyunción\n\n## Sistema de Tipos\n\nAsociado 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`).\n\n$$\n\\frac{}{\\vdash\\texttt{val} \\ n : \\texttt{integer}} \\tag{Val}\n$$\n\n$$\n\\frac{ \\vdash p_1 : \\texttt{integer} \\quad \\vdash p_2 : \\texttt{integer}}{\\vdash \\texttt{eq} \\ p_1 \\ p_2 : \\texttt{boolean}} \\tag{Eq}\n$$\n\n$$\n\\frac{\\vdash p_1 : \\texttt{integer} \\quad \\vdash p_2 : \\texttt{integer}}{\\vdash \\texttt{lt} \\ p_1 \\ p_2 : \\texttt{boolean}} \\tag{Lt}\n$$\n\n$$\n\\frac{\\vdash p : \\texttt{boolean}}{\\vdash \\texttt{not} \\ p : \\texttt{boolean}} \\tag{Not}\n$$\n\n$$\n\\frac{\\vdash p_1 : \\texttt{boolean} \\quad \\vdash p_2 : \\texttt{boolean}}{\\vdash \\texttt{and} \\ p_1 \\ p_2 : \\texttt{boolean}} \\tag{And}\n$$\n\n$$\n\\frac{\\vdash p_1 : \\texttt{boolean} \\quad \\vdash p_2 : \\texttt{boolean}}{\\vdash \\texttt{or} \\ p_1 \\ p_2 : \\texttt{boolean}} \\tag{Or}\n$$\n\n\u003c!-- \\newpage --\u003e\n\n### Ejemplos de expresiones bien tipadas:\n\n- `var 4 : integer`\n- `lt (var 4) (var 5) : boolean`\n- `or (not (lt (var 4) (var 3))) (eq (var 4) (var 3)) : boolean`\n\n### Ejemplos de expresiones no tipadas:\n\n- `or (var 4) (var 5)`\n- `not (var 4)`\n- `eq (lt (var 4) (var 3)) (var 5)`\n\n## Requisitos\n\nConsiderando 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:\n\n1. Implementar el EDSL como un **shallow embedding** bien tipado en Haskell siguiendo el enfoque *tagless-final*. Interprete los tipos `integer` y `boolean` como tipos de Haskell.\n\n2. Implementar el EDSL como un **deep embedding** bien tipado en Haskell utilizando GADTs. Definir la función `eval` que evalúa una expresión bien tipada de tipo `t` y retorna un valor de ese tipo.\n\n3. Dada la siguiente gramática que describe una sintaxis concreta para el lenguaje:\n\n   ```bnf\n   prop ::= term \"\\/\" prop | term\n   term ::= factor \"/\\\" term | factor\n   factor ::= '~' prop \n           | '(' prop ')' \n           | '(' prop '=' prop ')' \n           | '(' prop '\u003c' prop ')' \n           | N\n   ```\n\n   - (a) Definir una nueva interpretación para los puntos 1 y 2 que retorne un `String` que represente el programa en esa sintaxis.\n   - (b) Definir un tipo `UProp`, de kind `*`, que represente el árbol de sintaxis abstracta no tipado del lenguaje.\n   - (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 `UProp` correspondiente.\n\n\u003c!-- \\newpage --\u003e\n\n4. (OPCIONAL) Considere la siguiente extensión al lenguaje, en la que se agrega:\n\n   - `var`: variable proposicional\n\n   Con la siguiente regla de tipado:\n\n   - `var x : boolean`\n\n   Ahora la interpretación depende de un ambiente de variables en el que se le asocian valores de verdad a las variables.\n\n   - (a) Extender el EDSL definido en 1.\n   - (b) Extender el EDSL definido en 2.\n   - (c) Extender el tipo definido en 3.a y el parser definido en 3.b.\n   - (d) Definir una función `typeProp :: Ty t -\u003e UProp -\u003e Prop t` donde `Prop t` es el GADT que definió para el *deep embedding* y `Ty t` es el siguiente tipo que representa tipos:\n\n   ```haskell\n   data Ty :: * -\u003e * where\n       TInt :: Ty Int\n       TBool :: Ty Bool\n   ```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoangq%2Fedsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoangq%2Fedsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoangq%2Fedsl/lists"}