es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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]
|

Tags:  , ,

Answer

  1. Avatar for 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:

    import Data.List (nub)
    
    findVariables :: Term -> [String]
    findVariables (Var name) = [name]
    findVariables (Application t1 t2) = nub $ findVariables t1 ++ findVariables t2
    findVariables (Lambda varName body) = filter (/= varName) $ findVariables body
    

    La función nub se utiliza para eliminar duplicados de la lista de nombres de variables. La expresión filter (/= varName) en el caso de una Lambda eliminará la variable ligada por esa lambda de la lista de variables libres.

    Luego, puedes utilizar esta función de la siguiente manera:

    let t = Lambda "x" (Lambda "y" (Application (Var "x") (Var "z")))
    findVariables t -- Resultado: ["z"]
    

    Esto devolverá una lista que contiene "z", ya que es la única variable libre en el término t.

Comments are closed.