¿Existe un algoritmo general para llenar huecos en términos del cálculo de construcciones?

9

Suponga que extiende el cálculo de construcciones con "agujeros", es decir, piezas de código incompletas que aún no completó. Me pregunto si hay un algoritmo para llenar esos roles automáticamente. Por ejemplo (usando la sintaxis de Morte ):

Caso A:

λ (pred : ?) 
-> λ (Nat : *) 
-> λ (Succ : Nat -> Nat) 
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))

En esta situación, un algoritmo de inferencia de tipos puede identificar que ?obviamente sólo puede ser ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Nat, porque predrecibe Nat : *, Succ : Nat -> Nat, Zero : Nat, y debe volver Nat, porque es el primer argumento de Succ.

Caso B:

(Id ? 4)

Donde 4 está codificado en λ y Ides la función de identidad (es decir, ∀ (t:*) -> λ (x:t) -> x). En esa situación, ´? ´ es nuevamente claro ∀ (N:*) -> (N -> N) -> N -> N, porque ese es el tipo de 4.

Caso C:

(Id (Equals Nat 7 (add 3 ?)) (Refl 7))

Aquí, Equalsy Reflse definen de manera similar a Idris. ?obviamente, solo puede ser 4, pero ¿cómo se da cuenta de eso? Una forma sería usar el hecho de que ? : Nat, y Nates un tipo que sabemos enumerar, por lo que podemos intentarlo todo Natshasta que compruebe el tipo. Eso se puede hacer para cualquier tipo enumerable.

Caso D:

(Id (Equal Nat 10 (MulPair ?)) 10)

Aquí, ?solo puede ser de tipo Pair Nat; sólo tiene más de una respuesta válida, sin embargo: que puede ser (Pair 10 1), (Pair 2 5), (Pair 5 2)y (Pair 1 10).

Caso E:

(Id (Equal Nat 7 (Mul 2 ?)) 7)

Aquí, no hay una respuesta válida, ya 7que no es un múltiplo de 2.


Todos esos ejemplos me hicieron notar que podemos hacer un algoritmo general que identifica algunos patrones conocidos y da una respuesta seleccionando a mano un algoritmo específico (inferencia de tipo, fuerza bruta, etc.), algo así como Wolfram Alpha descubre la estrategia correcta para resolver una integral. Pero eso suena como un enfoque de ingeniería / codificado. ¿Hay alguna forma de principios para resolver este problema? ¿Hay algún estudio de investigación / área en él?

MaiaVictor
fuente

Respuestas:

9

¡Ciertamente hay mucha investigación sobre este problema! A menudo se conoce con el nombre de elaboración . Es un problema indecidible en general, como habrás adivinado. Los "agujeros" a menudo se denominan metavariables o variables de unificación .

Como explico un poco en esta respuesta , el problema se reduce a la unificación de orden superior , en el que varias personas han escrito disertaciones de doctorado completas.

Como observa en sus ejemplos, algunos casos son algo fáciles y pueden resolverse mediante la aplicación de reglas simples, mientras que algunos parecen significativamente más difíciles y tienen una sensación de "prueba de teorema".

Un tercer caso posible es un problema de tipo "clase de tipo", donde ?representa algún tipo de estructura , como una estructura de grupo o campo, como en

mul ? 2 3

con mul : forall G:Group, G.carrier -> G.carrier -> G.carriero alguna variante. Aquí necesitamos encontrar un Gtal que G.carrier == nat.

En general, desea tener 3 "regímenes" diferentes para cada tipo de problema, la unificación simple, la prueba de teoremas y los problemas de resolución de clase de tipo, respectivamente.

Explicamos esto un poco en el siguiente documento:

Elaboración en Teoría del tipo dependiente , de Moura, Avigad, Kong y Roux.

Es posible que desee ver las referencias de ese documento para obtener más información.


Tengo un estómago fuerte, aquí está el código abierto para elaborar en Lean.

Aquí hay una publicación wiki que describe la interfaz para el elaborador en Idris.

cody
fuente
¡Esas son las palabras que quería escuchar! Gracias por todos esos enlaces, referencias y palabras clave, me diste mucho que hacer ahora. ¿Hay herramientas disponibles que pueda usar para completar los programas de Morte hoy? Por supuesto, no necesariamente Morte, sino algo lo suficientemente cercano como para extraer programas de Morte.
MaiaVictor
1
Todos los verificadores de teoremas y verificadores de tipo para un sistema tipeado de forma dependiente (Idris, Agda, Coq, Lean) tendrán un solucionador tan profundo dentro de sus entrañas. Sin embargo, tienden a ser muy específicos del programa, por lo que no estoy optimista de que pueda usarlos para sus propios fines sin grandes modificaciones.
cody