Por que o algoritmo Hindley-Milner nunca produz um tipo como t1 -> t2?

14

Estou lendo sobre o algoritmo de digitação Hindley-Milner ao escrever uma implementação e vejo que, desde que todas as variáveis ​​sejam vinculadas, você sempre terá tipos atômicos ou tipos em que os argumentos determinarão o tipo final, como t1 -> t1ou (t1 -> t2) -> (t1 -> t2)onde t1e t2são variáveis ​​de tipo.

Não consigo pensar em uma maneira de obter algo assim t1 -> t2ou simplesmente t1, o que entendo significaria que o algoritmo está quebrado, pois não haveria maneira de determinar o tipo real da expressão. Como você sabe que nunca obterá um tipo como esses "quebrados", desde que cada variável esteja vinculada?

Eu sei que o algoritmo gera tipos com variáveis, mas elas sempre são resolvidas quando você passa os argumentos para a função, o que não seria o caso de uma função com type t1 -> t2. É por isso que quero saber como sabemos com certeza que o algoritmo nunca produzirá esses tipos.

(Parece que você pode obter esses tipos "quebrados" no ML , mas estou perguntando sobre o cálculo lambda.)

Juan
fonte

Respostas:

16

No cálculo lambda sem constantes com o sistema do tipo Hindley-Milner, você não pode obter nenhum desses tipos em que o resultado de uma função é uma variável do tipo não resolvida. Todas as variáveis ​​de tipo precisam ter uma "origem" em algum lugar. Por exemplo, não existe um termo do tipo , mas existe um termo do tipoα .α,β.αβ (a função de identidade λ x . x ).α.ααλx.x

Intuitivamente, um termo do tipo α,β.αββββββ

Δ=λx.xx(α.α)(α.α)ΔΔ

UMA,B,UMABα,β.αβ

YY(λx.x)α.αUMA,B,UMAB

Encontrar a linha tênue entre sistemas de tipos que garantem forte normalização e sistemas de tipos que não o fazem é um problema difícil e interessante. É um problema importante porque determina quais lógicas são válidas, ou seja, quais programas incorporam provas de teoremas. Você pode ir muito além do Sistema F, mas as regras se tornam mais complexas. Por exemplo, o cálculo de construções indutivas, que é a base do assistente de prova Coq , está fortemente normalizando, mas é capaz de descrever estruturas de dados indutivos e algoritmos comuns sobre elas, e muito mais.

Assim que você chega a linguagens de programação reais, a correspondência se decompõe. Linguagens de programação reais têm recursos como funções recursivas gerais (que podem não terminar), exceções (uma expressão que sempre gera uma exceção nunca retorna um valor e, portanto, pode ter qualquer tipo na maioria dos sistemas de tipos), tipos recursivos (que permitem a não terminação para esgueirar-se), etc.

Gilles 'SO- parar de ser mau'
fonte
"É uma conseqüência do fato de o Sistema F estar normalizando fortemente". Como é possível mostrar que a HM está fortemente normalizando é uma conseqüência do Sistema F está fortemente normalizando?
Rafael Castro
1
@RafaelCastro Todo termo bem digitado no HM é bem digitado no Sistema F. Todo termo bem digitado no Sistema F é SN. Portanto, todo termo que é bem digitado no HM é SN.
Gilles 'SO- stop be evil'