Na prática, alegar que sendo do tipo T geralmente é usado para descrever a sintaxe , enquanto afirmar que x está no conjunto S é geralmente usado para indicar uma propriedade semântica . Vou dar alguns exemplos para esclarecer essa diferença no uso de tipos e conjuntos. Para a diferença de quais tipos e conjuntos são realmente , refiro-me à resposta de Andrej Bauer .xT xS
Um exemplo
Para esclarecer essa distinção, usarei o exemplo dado nas notas de aula de Herman Geuvers . Primeiro, olhamos para um exemplo de habitar um tipo:
e um exemplo de ser membro de um conjunto:
3 ∈ { n ∈ N | ∀ x , y , z ∈ N + ( x n + y n ≠ z n ) }
3 + ( 7 × 8 )5: N um t ,
3 ∈ { n ∈ N | ∀ x , y, z∈ N+( xn+ yn≠ zn) }
A principal diferença aqui é que, para testar se a primeira expressão é um número natural, não precisamos calcular algum significado semântico, apenas temos que 'ler' o fato de que todos os literais são do tipo Nat e que todos os operadores são fechado no tipo Nat.
No entanto, para o segundo exemplo do conjunto, temos que determinar o significado semântico dos no contexto do conjunto. Para este conjunto em particular, isso é bastante difícil: a participação de 3 nesse conjunto é equivalente a provar o último teorema de Fermat! Observe que, conforme declarado nas notas, a distinção entre sintaxe e semântica nem sempre pode ser desenhada com clareza. (e você pode até argumentar que mesmo este exemplo não é claro, como o Programmer2134 menciona nos comentários)33
Algoritmos vs Provas
Para resumir, os tipos são frequentemente usados para reivindicações 'simples' na sintaxe de alguma expressão, de modo que a associação de um tipo possa ser verificada por um algoritmo , enquanto que para testar a associação de um conjunto, geralmente exigiríamos uma prova .
Para ver por que essa distinção é útil, considere um compilador de uma linguagem de programação digitada. Se esse compilador precisar criar uma prova formal para 'verificar os tipos', o compilador será solicitado a executar uma tarefa quase impossível (a prova automatizada de teoremas é, em geral, difícil). Se, por outro lado, o compilador puder simplesmente executar um algoritmo (eficiente) para verificar os tipos, poderá executar a tarefa de forma realista.
Uma motivação para uma interpretação estrita
Existem múltiplas interpretações do significado semântico de conjuntos e tipos. Embora, sob a distinção feita aqui, tipos extensional e tipos com verificação de tipo indecidível (como os usados no NuPRL, como mencionado nos comentários) não sejam 'tipos', outros são naturalmente livres para chamá-los dessa maneira (da mesma forma que livre como eles podem chamá-los de outra coisa, desde que suas definições sejam adequadas).
No entanto, nós (Herman Geuvers e eu) preferimos não jogar essa interpretação pela janela, pela qual eu (não Herman, embora ele possa concordar) temos a seguinte motivação:
Antes de tudo, a intenção dessa interpretação não está muito longe da de Andrej Bauer. A intenção de uma sintaxe é geralmente descrever como construir algo e ter um algoritmo para construí-lo é geralmente útil. Além disso, os recursos de um conjunto geralmente são necessários apenas quando queremos uma descrição semântica, para a qual a indecidibilidade é permitida.
Portanto, a vantagem de nossa descrição mais rígida é manter a separação mais simples , obter uma distinção mais diretamente relacionada ao uso prático comum. Isso funciona bem, desde que você não precise ou queira diminuir o uso, como faria, por exemplo, NuPRL.