Estou tentando entender os conceitos de tipos existenciais e universais, mas em todos os lugares que vejo, vejo intuições ou implementações lógicas ou operacionais (por exemplo, livro TAPL de B. Pierce), o que, bem ... é bom , mas gostaria de ver as definições (onde as vemos como conjuntos) - e a partir delas, derivações de algumas leis, bem como justificativas para nossas intuições.
Portanto, como não consigo encontrar essas definições, decidi fazer isso sozinho e acho que estas podem ser razoáveis:
Mas, no mencionado livro TAPL, recebemos essa definição (embora eu a chamasse de identidade)
Eu tenho dois problemas com isso:
- No LHS de eu esperaria que fosse a única variável livre de (porque como visualizar um tipo "ainda não construído" com algumas variáveis livres penduradas nele?), Mas no RHS parece que pode ter algum impacto sobre , então é melhor que seja uma variável livre em . Portanto, o LHS não pode ser igual ao RHS porque conjuntos de variáveis livres de diferem nos dois lados, certo?
- Mesmo desconsiderando a preocupação no ponto 1. - Tentei reescrever o RHS usando minhas definições e ver se consigo obter minha definição de tipo existencial, mas fiquei preso:
Nem lembra remotamente minha definição. É possível simplificar a fórmula que cheguei? Intuitivamente, porque existem tipos de função, provavelmente nunca será igual à minha definição. Mas se eles não são iguais - são pelo menos 'isomórficos' em algum sentido? Se não - o que "deu errado"?
Respostas:
A teoria dos conjuntos está prejudicando você aqui e, quanto mais cedo você se libertar dela, melhor será para a sua compreensão da ciência da computação.
Esqueça as interseções e uniões. As pessoas têm a idéia de que e são como e , que é o tipo de coisa que a escola polonesa fazia há muito tempo com álgebras booleanas, mas realmente não é o caminho a seguir (definitivamente não no computador Ciência).∃ ⋂ ⋃∀ ∃ ⋂ ⋃
Você gostaria de vê-los como conjuntos. Ok, mas precisamos ignorar questões de tamanho e fingir que existe um conjunto de todos os conjuntos. (É possível corrigir os problemas de tamanho passando para uma categoria diferente.) O tipo é realmente como o produto cartesiano Ou seja, um elemento de é uma função de conjuntos para conjuntos: para cada conjunto , fornece um elemento do tipo . Por exemplo, um elemento de é uma função que recebe um conjunto∀ X . T : = Π S : S e T T [ X ↦ S ] . ∀ X . T f S f ( S ( S → S ) f 0 ( S ) ( g ) ( x ) : = x f 1 ( S ) ( g ) ( x)∀x.T
A seguir, vejamos os tipos existenciais. Em primeiro lugar, a codificação correta de em termos de é onde a variável não aparece em ! (Isso deve ser mencionado no TAPL de Pierce.) Antes de examinarmos essa codificação, vamos fazer diretamente em termos de conjuntos. Desta vez, é um coproduto: Um elemento de é um par onde é um conjunto e é um elemento de∀ ∃ X . T : = ∀ Y . ( ∀ X . ( T → Y ) ) → Y Y T ∃ X . T ∃ X . T : = ∐ S : S e T T [ X ↦ S ] . ∃ X . T ( S , a ) S a T [∃ ∀
Vamos ver como a codificação de em termos de funciona. É errado esperar que obteremos uma igualdade entre e (NB: é recente) - apenas a teoria dos conjuntos daria às pessoas tais expectativas. Deveríamos esperar que os dois fossem isomórficos . Portanto, a tarefa é encontrar uma bijeção entre e Este é um exercício em∃ ∀ ∃ X. T ∀ Y. ( ∀ X. ( T→ Y) ) → Y Y
Acontece que na teoria dos conjuntos a codificação de em termos de faz não trabalho. Mas funciona em outras configurações, onde tipos não são conjuntos. Por exemplo, você pode se convencer de que na lógica as declarações é equivalente a que varia sobre todas as proposições (valores de verdade, declarações lógicas). Novamente, a variável não deve ocorrer em .∃ ∀
fonte
Em relação à questão 1): a variável não deve aparecer em ; de fato, ela precisa ser irrestrita. Se você quiser ter alguma esperança dos lhs sendo igual à rhs, certamente você deve ter o mesmo número de variáveis livres de cada lado, que é impossível se é capturado em . A intuição é que deve ser igual à conjunção infinita para todo tipo possível . De fato, não é difícil mostrar para qualquer tipo específico queY Y T ∃ T ( ( ∀ x . T → U 0 ) → U 0 ) ∧ ( ( ∀ x . T → U 1 ) → U 1 ) ∧ …Y Y Y T ∃ T
Em palavras:
Note que não deve depender de .você x
A intuição por trás da igualdade é que esse fato, para todo possível,você é suficiente para caracterizar o quantificador existencial.
Para 2), a intuição teórica dos conjuntos é um pouco difícil aqui, receio. Não é ingenuamente possível pensar nos tipos como conjuntos de elementos e setas como as funções da teoria dos conjuntos entre eles. No entanto, intuitivamente, se alguma interseção não estiver vazia, deverá estar não vazia. No seu caso, isso fornece⋂SA ( S) A ( ∅ )
(observe o parêntese) que precisa estar vazio. Mas a única maneira para isso é que exista um tal que esteja vazio, o que significa que precisa estar vazio.T [ x : = R ] → ∅ T [ x : = R ]R T[ x : = R ] → ∅ T[ x : = R ]
fonte
Sugiro não desistir da intuição operacional. Operacional é primário, todas as semânticas são derivadas e são apenas técnicas de prova para semântica operacional. As idéias principais são as seguintes.
Um programa usa uma variável universal-polimorficamente , desde que não faça nada com que exija conhecimento do tipo de . Por exemplo, no -calculus, as seguintes operações podem ser polimórficas (se são ou não, depende da semântica precisa da linguagem).P x P x x λ
Agora, o polimofismo existencial é o exato dual do polimorfismo universal: um programa usa uma variável existencial-polimofialmente , se fornece somente para contextos que não exigem conhecimento do tipo de . Em outras palavras, fornece somente para contextos que usam polimorficamente universal.xP x
x x P x xP x x P x x
Na minha opinião, essa bela simetria é obscurecida quando se pensa em polimorfismo universal / existencial no . O motivo é a forte dependência do operador do espaço de funções que, infelizmente, não é realmente um operador dualizador, mas algo mais complicado (covariante em um argumento, contravariante no outro).λ
fonte