Que funções o Sistema F não pode computar?


28

Em este artigo da Wikipedia sobre Turing completude afirma que:

O cálculo lambda não digitado é Turing completo, mas muitos cálculos lambda digitados, incluindo o Sistema F, não são. O valor dos sistemas digitados é baseado em sua capacidade de representar a maioria dos programas de computador típicos enquanto detecta mais erros.

Qual é um exemplo de uma função computável total que é incontestável pelo sistema F ?

Além disso, como hindley-milner é:

Uma restrição do Sistema F

devido ao facto de:

a verificação de tipo é indecidível para uma variante no estilo Curry do Sistema F, ou seja, que não possui anotações de digitação explícitas.

Isso significa que o cálculo lambda subjacente aos sistemas do tipo hindley-milner também não está completo?

Se isso for verdade, como o haskell está claramente completo e sabemos que sua base é o cálculo lambda e o sistema do tipo hindley-milner, que recursos que não estão presentes no cálculo lambda são adicionados para tornar o haskell completo?



Exemplo de recurso que completa o haskell turing é a interface de código nativo.
Trismegistos

Obrigado @ cody pelo seu comentário. Não estou familiarizado com o sistema T. Estou certo ao assumir que é o sistema T mencionado aqui ? como o sistema T se compara e contrasta com o sistema F?
Mike HR

OBSERVAÇÃO, ao pesquisar no Google system T vs. system F, encontrei algo que responde à minha subquestão final que é reformulada aqui como: Como o haskell adicionou o Turing-completeness ao System F
Mike HR

1
Acho que @Trismegistos levanta uma questão filosófica interessante: o que exatamente é Haskell, onde estão seus limites?
Martin Berger

Respostas:


45

O sistema é bastante expressivo. Conforme comprovado por Girard aqui , as funções do tipo (onde é definido como ) são exatamente as funções definíveis ( ) na segunda ordem Heyting Arithmetic . Observe que isso é o mesmo que as funções definíveis na aritmética Peano de segunda ordem .NN NX . X ( X X ) X NN H A 2FNNNX. X(XX)XNNHA2

Você provavelmente desejará verificar Provas e Tipos como uma referência mais legível. Observe que isso significa que muitos programas podem ser escritos no sistema F, da função Ackermann aos intérpretes do sistema Gödel . Como em qualquer linguagem de programação total (com algumas condições moderadas), o sistema não pode implementar um auto-intérprete , ou seja, uma função que usa como entrada um código para um termo do sistema e retorna um (código para a) forma normal paraF e v a l : NN t F tTFeval:NNtFt. A prova envolve uma variante do truque de diagonalização usado para indecidibilidade do problema de parada. Andrej explica lindamente aqui .

Para responder a outras perguntas: O -calculus subjacente aos idiomas Hindley-Milner (HM) também não está completo em Turing. De fato, é significativamente mais fraco que o sistema , mais próximo em expressividade do -calculus simplesmente digitado .F λλF λ

Haskell é realmente Turing completo. O recurso mais distintivo que permite isso (embora existam outros) é a presença de recursão irrestrita : a definição de qualquer programa (função) pode se referir ao próprio programa. Isso é semelhante à adição de um combinador , como é feito na definição de PCF que é de tipo simples, mas retém a completude de Turing com o combinadorYYY

Observe que existem outros recursos que tornam o Haskell Turing completo, mas geralmente não são considerados parte da linguagem principal, por exemplo, referências a funções, tipos de dados irrestritos etc.


1
Uau, esta é uma resposta incrível e responde tudo perfeitamente. Obrigado!
Mike HR

"Quanto a qualquer linguagem de programação total ..." Isso não está correto. Existem alguns auto-intérpretes para o total de idiomas que funcionam excluindo programas que não terminam como digitados incorretamente, pelo meu entendimento. Veja este documento
jmite 20/07

@ jmite, como afirmado, minha reivindicação está correta. Esse artigo é mencionado na discussão vinculada, e Andrej tem algumas observações de acompanhamento em seu blog: math.andrej.com/2016/01/04/…
cody

11

É um pouco enganador dizer que o sistema de digitação de Haskell é "o sistema do tipo hinley-milner". Os tipos de Haskell são muito mais poderosos, incluindo, entre outros, tipos de classe superior. De fato, o sistema de digitação é tão poderoso que você pode incorporar linguagens de programação completas do Turing no sistema de digitação, veja aqui . Esta não é a única razão para o poder de Haskell, Cody mencionou alguns outros.


Obrigado. minha principal exposição a hindley-milner foi através de haskell, então eu acho que posso ter assumido que tipos de classe superior faziam parte dela. Hindley-milner está simplesmente se referindo à inferência de tipo (provavelmente o algoritmo W)? ou é algo mais? Entendo que existe a base matemática disso no cálculo lambda, só estou tentando entender onde seriam os limites lógicos entre o poderoso sistema de haskell e qual seria a implementação mínima de um "sistema do tipo hindley-milner".
Mike HR

NB: Se alguém estiver interessado no poder do sistema de tipos haskell, eu recomendaria o vídeo de Edward Kmett sobre hask , que se aprofunda na teoria das categorias usando o sistema de tipos haskell.
Mike HR

1
λW
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.