Estou lutando para entender o objetivo da quantificação universal e existencial de tipos. Estou brincando de escrever uma linguagem de brinquedo baseada no cálculo de construções . Eu tenho lido sobre Morte e Henk para me ajudar a entender melhor.
Não entendo por que o CoC tem abstração lambda e forall.
Parece-me que o lambda subsume tudo em um sistema em que os tipos são passados manualmente. Em outras palavras, que as seguintes
Pode ser substituído por
Se foi aplicado primeiro ao tipo que está sendo usado.
o que estou perdendo? Que artigos, blogs ou artigos existem para ler que possam me ajudar?
Obrigado.
Lembre-se de que tipos existenciais e universais são bastante diferentes. É lógica construtiva, não lógica clássica, e na lógica construtiva e ∃ não são tão relacionadas quanto na lógica clássica.∀ ∃
é o tipo de programa que recebe um objeto do tipo A e retorna um objeto do tipo B ( x ) . O importante aqui é que o tipo B ( x ) dependede x e não é o mesmo para todos os x . Pode variar dependendo do que x é. Para uma entrada x, podemos gerar um número inteiro. Para outro, podemos gerar um número real. Para mais uma, poderíamos gerar uma função sobre números reais. Se B ( x )∀x:A.B(x) A B(x) B(x) x x x x B(x) não varia com , em seguida, você pode usar A → B no lugar que é o tipo de funções de A para B .x A→B A B
é aversãodependenteda disjunção (construtiva). Você pode pensar em disjunção construtiva A ∨ B x∃x:A.B(x) A∨B de dois tipos e B como a união disjunta de A e B .
∃ x : A . B ( x ) é a união disjunta de uma coleção de tipos B ( x )
indexados por x : A . O fato de o tipo B (A B A B ∃x:A.B(x) B(x) x:A van varia de acordo com o valor de x : A o
torna um tipo dependente. Compare com o caso em que B não depende de x : A : ∃ x : A . B . Estamos levando uma cópia do mesmo B para cada x : A . Esta é isomorphic a A × B .B(x) x:A B x:A ∃x:A.B B x:A A×B
Agora você pode perguntar por que precisamos de tipos de produtos e somas dependentes ? Porque eles nos dão um poder mais expressivo. Agora podemos ignorar completamente os tipos e ter teoria de tipos / programação funcional sem tipo. Mas isso remove os benefícios de ter tipos em primeiro lugar, por exemplo, você não saberá se todos os programas sempre serão encerrados (forte normalização). Consulte Cubo Lambda e tipo de dependente . Penso que uma boa maneira de entender bem os tipos dependentes é examinar as regras para introduzir e eliminar os tipos dependentes na teoria dos tipos de Martin-Lof .
O ponto principal dos tipos dependentes é: queremos permanecer dentro de uma boa teoria de tipos por vários motivos (por exemplo, evitando bugs, prova automática de terminação etc.). Não queremos ir para algo como cálculo lambda sem tipo, onde podemos tornar a expressão como as que você declarou e coisas muito mais poderosas. Podemos dizer que os tipos dependentes foram inventados para permitir expressar mais coisas enquanto ainda permaneciam dentro de uma boa teoria de tipos.
fonte