Algoritmos de inversión de programas para programas de orden superior.


10

El término inversión de programa tiene múltiples matices de significado, pero probablemente comenzó con el trabajo de J. McCarthy de 1956 La inversión de las funciones definidas por las máquinas de Turing en el contexto de la IA. Hasta ahora se han descubierto muchas conexiones entre la inversión del programa y otros campos, por ejemplo, programación reversible (física y lógica), evaluación parcial, verificación, programación bidireccional, programación lógica y aprendizaje automático.

¿Qué es la inversión del programa? En primera aproximación es algo como esto: Dado un programa tomar argumentos de tipo A y devolver resultados de tipo B , producir un programa de P - 1 que es "de alguna manera" el inverso de P . Estoy deliberadamente siendo vago aquí, ya que el concepto se puede (y se) aclara de varias maneras: por ejemplo, ¿se requiere que P sea ​​inyectable? En caso de que P - 1 ( b ) devuelva todo o solo algo a tal que P ( a ) = bPAG:UNAsiUNAsiPAG-1PAGPAGPAG-1(si)unaPAG(una)=si?

Hay formas genéricas de invertir un programa, por ejemplo, utilizando la diagonalización como ya señaló McCarthy, o utilizando una evaluación parcial, pero tienden a no ser eficientes. Además, la mayoría del trabajo sobre inversión de programas con el que estoy familiarizado no parece tratar con lenguajes de programación completos de orden superior (es decir, cálculos ).λ

Solicitud de referencia. ¿Cuál es el estado de la técnica en algoritmos explícitos para la inversión de programas decálculos λ (sin restricción en el orden superior)?λ

Respuestas:


5

No ha habido una gran cantidad de trabajo en este espacio, pero lo que hay es bastante interesante.

  1. Torben Mogensen ha trabajado en este problema. Aquí hay dos documentos suyos.

    El primer documento proporciona un algoritmo para programas funcionales de primer orden, y el segundo lo extiende a un orden superior. La caracterización precisa de cuándo este algoritmo tendrá éxito se deja para el trabajo futuro.

  2. Tetsuo Yokoyama, Holger Bock Axelsen y Robert Glück.

    Esto describe el lenguaje de programación RFun, que invierte los programas funcionales de primer orden, pero impone restricciones de inyectividad y determinismo hacia atrás que aseguran que la evaluación hacia atrás sea tan rápida como hacia adelante. (Han escrito una serie de otros documentos sobre este tema, que he tenido problemas para conseguir).

  3. Stefan Bohne y Baltasar Trancón Widemann.

    ¡Este es un papel realmente bueno! Observa que (a) puede construir una categoría donde los morfismos son funciones emparejadas con su inversa (para cualquier noción particular de inversa que esté usando), y (b) esta categoría tiene una estructura compacta de daga. Esto significa que puede escribir un programa con una disciplina de tipo lineal ligeramente funky, y luego leer las interpretaciones hacia adelante y hacia atrás de la semántica.

    Dan un lenguaje funcional con una sintaxis bastante salvaje: las expresiones casi arbitrarias se pueden usar como patrones, y la reversibilidad lo hace sensible.

  4. Francesco Tiezzia, Nobuko Yoshida

    No he leído este, pero solo lo descubrí cuando busqué en Google los otros documentos. Teniendo en cuenta los autores y el tema, ¡sospecho que esto está en tu callejón!


Gracias. (2, 3, 4) no invierte programas, sino que diseña lenguajes de programación donde los programas son reversibles / invertibles por definición. Este es un problema estrechamente relacionado, pero diferente. De hecho, no tengo totalmente claro cómo se relacionan estos problemas. No había visto la semiinversión antes, ¿tal vez ya resuelva el problema ya que la inversión parece ser un caso marginal de semiinversión? Por cierto, el segundo artículo de Mogensen solo sube al segundo orden.
Martin Berger

@MartinBerger: ¡Supongo que la relación depende de para qué quieres usar la inversión del programa! Me interesé en el problema porque estaba buscando inferencia de tipos (si tiene funciones de nivel de tipo, es útil poder invertir esas funciones para descubrir las instancias de cuantificador), por lo que restringir el idioma no fue un obstáculo para yo. ¿Que estás tratando de hacer?
Neel Krishnaswami

Ahora mismo estoy interesado en el problema general y abstracto. Mi interés en la inversión del programa proviene de la verificación del programa. Y no pude encontrar ningún lugar que simplemente tome un término lambda (de PCF say o STLC) y lo invierta. ¿Es porque no estoy buscando en el lugar correcto?
Martin Berger
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.