Cálculo lambda P86813


Statement
 

pdf   zip

thehtml

Tu programa tiene que leer expresiones lambda y saber realizar 3 operaciones básicas del lambda cálculo: calcular las variables “gastadas”, calcular las variables libres, y realizar substituciones.

Expresiones lambda.

El lenguaje de las expresiones lambda (expresiones a partir de ahora) se describe con los siguientes tres casos y con ninguno más:

  • Cadenas de caracteres de la 'a' a la 'z' son expresiones (variables).
  • Dada una expresión B y una variable v, la cadena formada por el caracter '\', seguido de v, seguido del caracter '.' seguido de B (\v.B) es una expresión (abstracción).
  • Dadas dos expresiones F y A, la cadena formada por el caracter '(', seguido de F, seguido del caracter ' ' (blanco), seguido de A, seguido del caracter ')' ((F A)) es una expresión (aplicación).

Variables gastadas.

El conjunto de variables gastadas VG(E) de una expresión E es el conjunto de todas las variables de la 'a' a la 'z' que aparecen en la expresión E, de cualquier forma. Equivalentemente,

  VG(E)=



      {v}Si E = v
      VG(B) ⋃ {v}Si E = \v.B
      VG(F) ⋃ VG(A)Si E = (F A)
    

Variables libres.

El conjunto de variables libres VL(E) de una expresión E se define de esta forma:

  VL(E) =



        {v}Si E = v
        VL(B) − {v}Si E = \v.B
        VL(F) ⋃ VL(A)Si E = (F A)
      

Substitución.

La substitución E[x := E′] de una variable v en una expresión E por otra expresión E′ se define de la siguiente forma:

  E[x := E′] =







        vSi E  es una variable v distinta de x
        ESi E = x
        \v.BSi E = \v.B  y  v=x
        \v.B[x := E′]Si E = \v.B ,  v≠ x  y  v ∉VL(E′)
        (F[x := E′] A[x := E′])Si E = (F A)
      

Observad que, cuando E es de la forma \v.B, no siempre es posible realizar la substitución. Esto siempre puede corregirse aplicando una conversión alpha, descritas a continuación, en la expresión \v.B reemplazando v por una variable no gastada. Sin embargo, las entradas del problema serán tales que nunca os va a ser necesario hacer una conversión alpha para hacer la substitución.

Entrada

Un juego de pruebas es una secuencia de cálculos, cada uno de los cuales ocupa una línea. Los cálculos pueden ser de la forma “G E”, “L E” o “S x E E′”, donde E y E′ son expresiones válidas y x es una variable. Ninguna de las líneas ocupará más de 2000 caracteres. En los cálculos de tipo S se os garantiza que la substitución puede hacerse, sin que sea necesario que hagáis ninguna conversión alpha en ningún momento.

Salida

Por cada cálculo, tu programa debe escribir una línea con la respuesta. Escribe las variables gastadas VG(E) de E si la petición es de tipo G, las variables libres VL(E) de E si es de tipo L, y la substitución E[x := E′] si la petición es de tipo S. Escribe un conjunto de variables como una secuencia ordenada alfabéticamente de las mismas (fíjate en los ejemplos). Observa que el resultado de la substitución puede ser más largo de 2000 caracteres.

Puntuación

  • TestA:  ‍25 Puntos ‍

    Pruebas de no más de 200 expresiones que sólo contienen peticiones de cálculo de tipo ‍G.

  • TestA:  ‍40 Puntos ‍

    Pruebas de no más de 200 expresiones que sólo contienen peticiones de cálculo de tipo ‍L.

  • TestA:  ‍35 Puntos ‍

    Pruebas de no más de 200 expresiones que sólo contienen peticiones de cálculo de tipo ‍S.

Observación (no relacionada con el problema)

Si sois capaces de resolver este problema, estáis muy cerca de poder evaluar expresiones lambda. A continuación describimos los pasos necesarios.

Conversión alpha.

El cambio en el nombre de la variable v en expresiones de la forma \v.B crea expresiones equivalentes.

Reducciones beta.

Cualquier expresión de la forma (\x.B A) se reduce a B[x := A], donde puede haber sido necesario aplicar una conversión alpha sobre ||x.B renombrando x en una variable no gastada.

Forma normal.

Una expresión se dice que está en forma normal cuando no pueden aplicarse más reducciones beta a ninguna de sus subexpresiones.

Public test cases
  • Input

    G x
    G \x.(x \y.(x y))
    G (x y)
    G \x.(x y)
    G (\x.x f)
    G (\x.(x \x.x) f)
    G (\y.\x.y x)
    G (((\c.\t.\e.((c t) e) \a.\b.a) a) b)
    

    Output

    x
    xy
    xy
    xy
    fx
    fx
    xy
    abcet
    
  • Input

    L x
    L \x.(x \y.(x y))
    L (x y)
    L \x.(x y)
    L (\x.x f)
    L (\x.(x \x.x) f)
    L (\y.\x.y x)
    L (((\c.\t.\e.((c t) e) \a.\b.a) a) b)
    

    Output

    x
    
    xy
    y
    f
    f
    x
    ab
    
  • Input

    S x x y
    S y y y
    S x x (x z)
    S x (x x) (x z)
    S x (x (y x)) (\x.(f f) g)
    S x \x.x (a a)
    S x \y.x (a a)
    S x \y.(x \x.(x x)) (a z)
    

    Output

    y
    y
    (x z)
    ((x z) (x z))
    ((\x.(f f) g) (y (\x.(f f) g)))
    \x.x
    \y.(a a)
    \y.((a z) \x.(x x))
    
  • Information
    Author
    Ángel Herranz
    Language
    Spanish
    Other languages
    English
    Official solutions
    C++
    User solutions
    C++