Existe um algoritmo geral para preencher buracos em termos de Cálculo de Construções?

9

Suponha que você estenda o Cálculo de construções com "furos" - ou seja, trechos incompletos de código que você ainda não preencheu. Gostaria de saber se existe um algoritmo para preencher essas funções automaticamente. Por exemplo (usando a sintaxe de Morte ):

Caso A:

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

Nesta situação, um algoritmo de inferência de tipos pode identificar que ?, obviamente, pode ser apenas ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Natporque predrecebe Nat : *, Succ : Nat -> Nat, Zero : Nat, e deve retornar Nat, porque é o primeiro argumento Succ.

Caso B:

(Id ? 4)

Onde 4 é codificado em λ e Idé a função de identidade (ou seja, ∀ (t:*) -> λ (x:t) -> x). Nessa situação, '?' É novamente claro ∀ (N:*) -> (N -> N) -> N -> N, porque esse é o tipo de 4.

Caso C:

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

Aqui, Equalse Reflsão definidos de maneira semelhante a Idris. ?obviamente só pode ser 4, mas como você descobre isso? Uma maneira seria usar o fato de que ? : Nat, e Naté um tipo que sabemos enumerar, para que possamos tentar tudo Natsaté verificar o tipo. Isso pode ser feito para qualquer tipo enumerável.

Caso D:

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

Aqui, ?só pode ser do tipo Pair Nat; ele tem apenas mais de uma resposta válida, porém: ele pode ser (Pair 10 1), (Pair 2 5), (Pair 5 2)e (Pair 1 10).

Caso E:

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

Aqui, não há resposta válida, pois 7não é um múltiplo de 2.


Todos esses exemplos me fizeram perceber que podemos criar um algoritmo geral que identifica alguns padrões conhecidos e dá uma resposta escolhendo um algoritmo específico (inferência de tipo, força bruta etc.), como Wolfram Alpha descobre a estratégia certa para resolver um integral. Mas isso soa como uma abordagem de engenharia / codificada. Existe uma maneira básica de resolver esse problema? Existe algum estudo / área de pesquisa?

MaiaVictor
fonte

Respostas:

9

Certamente há muita pesquisa sobre esse problema! Muitas vezes, leva o nome de elaboração . É um problema indecidível em geral, como você deve ter adivinhado. Os "buracos" são freqüentemente chamados de metavariáveis ou variáveis ​​de unificação .

Como explico um pouco nesta resposta , o problema se reduz à unificação de ordem superior , na qual várias pessoas escreveram dissertações de doutorado inteiras.

Como você observa em seus exemplos, alguns casos são um pouco fáceis e podem ser resolvidos pela aplicação de regras simples, enquanto outros parecem significativamente mais difíceis e têm mais a sensação de "prova do teorema".

Um terceiro caso possível é um problema do tipo "classe de tipo", onde ?representa algum tipo de estrutura , como uma estrutura de grupo ou campo, como em

mul ? 2 3

com mul : forall G:Group, G.carrier -> G.carrier -> G.carrierou alguma variante. Aqui precisamos encontrar um Gtal que G.carrier == nat.

Em geral, você deseja ter três "regimes" diferentes para cada tipo de problema, os problemas de unificação simples, comprovação de teoremas e resolução de classe de tipo, respectivamente.

Nós explicamos isso um pouco no seguinte artigo:

Elaboração em Teoria do Tipo Dependente , de Moura, Avigad, Kong & Roux.

Você pode consultar as referências desse documento para obter mais informações.


Eu tenho um estômago forte, aqui está o código aberto para elaboração no Lean.

Aqui está um post na wiki que descreve a interface para o elaborador em Idris.

cody
fonte
Essas são as palavras que eu queria ouvir! Obrigado por todos esses links, referências e palavras-chave, você me deu muito o que fazer agora. Existem ferramentas disponíveis que eu posso usar para concluir os programas Morte hoje? Claro que não necessariamente Morte, mas algo próximo o suficiente para extrair programas Morte.
MaiaVictor
1
Todo provador de teoremas e verificador de tipos para um sistema tipicamente dependente (Idris, Agda, Coq, Lean) terá um solucionador tão profundo em suas entranhas. No entanto, eles tendem a ser muito específicos do programa; portanto, não estou otimista de que você possa usá-los para seus próprios propósitos sem grandes modificações.
Cody