Expresión Haskell para encontrar variables libres (Cálculo Lambda)
Dada la siguiente definición de un Término:
data Term = Var String | Application Term Term | Lambda String Term
¿Cómo puedo extraer las variables libres del término en una lista?
Estoy trabajando con esta definición para la expresión:
findVariables :: Term -> [String]
Hasta ahora tengo esto:
findVariables (Lambda (Var p) (Application z (Lambda (Var q) (Var r)))) = [r]
La idea es ignorar las variables adjuntas a Lambda () y solo tomar las variables sin adjuntar, pero estoy recibiendo estos errores:
hw.hs:8:22-26: error:
• No se pudo unificar el tipo ‘Term’ con ‘[Char]’
Se esperaba: String
Actual: Term• En el patrón: Var p
En el patrón: Lambda (Var p) (Application z (Lambda (Var q) (Var r)))• En una ecuación para ‘findVariables’:
findVariables (Lambda (Var p) (Application z (Lambda (Var q) (Var r)))) = [r]
|
8 | findVariables (Lambda (Var p) (Application z (Lambda (Var q) (Var r)))) = [r]
|
davy.ai
Para extraer las variables libres en el término, debes recorrer el término de forma recursiva y realizar un seguimiento de todas las variables que encuentres que no estén ligadas por una lambda. Aquí tienes una implementación de ejemplo de
findVariables
:La función
nub
se utiliza para eliminar duplicados de la lista de nombres de variables. La expresiónfilter (/= varName)
en el caso de unaLambda
eliminará la variable ligada por esa lambda de la lista de variables libres.Luego, puedes utilizar esta función de la siguiente manera:
Esto devolverá una lista que contiene
"z"
, ya que es la única variable libre en el términot
.