Resolver ecuaciones funcionales para funciones desconocidas en cálculo lambda

14

¿Hay alguna técnica para resolver ecuaciones funcionales para funciones desconocidas en el cálculo lambda?

Supongamos que tengo la función de identidad definida extensivamente como tal:

Ix=x

(es decir, escribiendo una ecuación para el comportamiento esperado de esa función) y ahora quiero resolverlo por haciendo alguna transformación algebraica para obtener la fórmula intensional para esa función:I

I=λx.x

que indica cómo hace exactamente la función lo que se esperaba (es decir, cómo implementarla en el cálculo lambda).

Por supuesto, la función de identidad se usa solo como ejemplo. Estoy interesado en métodos más generales para resolver tales ecuaciones. En particular, me gustaría encontrar una función que satisfaga el siguiente requisito:B

Bf(λx.M)=(λx.fM)

es decir, "inyecta" la función dada en la función lambda dada antes de su "cuerpo" (que es una expresión lambda arbitraria), posiblemente separándola y construyendo una nueva, para que se convierta un parámetro al que se aplica la función .( λ x . M ) M ff(λx.M)Mf

BarbaraKwarc
fuente

Respuestas:

13

Este es un problema conocido, conocido como unificación de orden superior .

Desafortunadamente, este problema es indecidible en general. Hay un fragmento decidible, conocido como Fragmento de Patrón de Miller. Se usa ampliamente, entre otras cosas, para la verificación de tipos de programas de tipo dependiente con metavariables o coincidencia de patrones. Este fragmento es donde las variables de unificación se aplican solo a distintas variables del programa enlazado.

Este documento proporciona un excelente tutorial sobre cómo funciona la unificación de orden superior y explica su implementación (relativamente) simple.

Desafortunadamente, no parece que su función se encuentre en este fragmento de patrón. Dicho esto, lo que estoy viendo es bastante similar a la composición de funciones. ¿La siguiente función satisface su propiedad?

B=λf g x .f (g x)

Tenemos:

  • B f (λx.M)
  • α=B f (λy.[y/x]M) por -equivalenciaα
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M
jmite
fuente
1
Sí, parece que sí :) Lo curioso es que casi obtuve esa solución, pero por alguna razón pensé que llamar a algo "lo ejecutaría", confundiendo la expresión: q Lo que me perdí es que podemos sustituir la variable con otra variable ligada afuera. (λx.M)
BarbaraKwarc
1
Gracias por el enlace al documento también, lo revisaré y aceptaré su respuesta en un par de días para darles la oportunidad a otras personas también.
BarbaraKwarc
3
¿Es esta unificación de orden superior? La pregunta parece ser sobre el cálculo lambda sin tipo en lugar del cálculo lambda simplemente escrito.
Peter Taylor
2

Creo que tengo una respuesta parcial, con respecto a la ecuación con la función de identidad:

Ix=x

Queremos resolverlo encontrando la fórmula para , que tendrá la forma con alguna expresión aún desconocida como su cuerpo. Vamos a sustituirlo por en la ecuación original:( λ p . M ) M II(λp.M)MI

(λp.M)x=x

luego aplique la función a en el lado izquierdo:x

M[p/x]=x

¿Pero qué tenemos aquí? :> Esta ecuación es la fórmula para la expresión que estamos buscando, después de sustituir cada aparición de en ella con , y dice que después debería verse como el lado derecho :) En otras palabras, la función buscamos es:p xMpx

I=(λx.x)

cuál por supuesto es la respuesta correcta :)


Probemos el mismo enfoque para encontrar la fórmula del combinador de . Queremos que funcione de tal manera que, cuando se aplique a sí mismo, se produzca aplicado a sí mismo:ω

ωω=ωω

Ahora vamos a encontrar la fórmula para , que es de la forma por alguna expresión aún desconocido . Sustituyendo esto en la ecuación obtenemos:( λ x . M ) Mω(λx.M)M

(λx.M)ω=ωω

Al aplicarlo al parámetro en el lado izquierdo se obtiene la fórmula para :M

M[x/ω]=ωω

Esto dice que después de sustituir cada aparición de en con , produjo , por lo que podemos deducir que la expresión original antes de la sustitución debería haber sido , por lo que la función que estábamos buscando debería se parece a esto:M ω ωxMωM xωωMxx

ω=(λx.xx)

que es el caso :)


Sin embargo, tengo la sensación de que podría ser tan fácil solo porque el lado derecho ya estaba en la forma que estamos buscando.

BarbaraKwarc
fuente
M[x/ω]=ωωω=(λx.xx)
En estos dos casos simples, sí, los hay: simplemente invierta la sustitución. Pero como dije, estos casos podrían funcionar por pura "suerte": que el lado derecho ya está en la forma requerida. Cuando lo probé con algunos ejemplos más complejos, no funcionó. Sin embargo, eso es lo que estoy buscando: una forma algorítmica.
BarbaraKwarc
1
ωω=ωωωω