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
∀ X. T: = ∏S: S e tT[ X↦ S] .
∀ X. T fST [ x ↦ S ] ∀ X . ( X → X ) → ( X → X ) f S ( S → S ) →f( S)T[ x ↦ S]∀ X. ( X→ X) → ( X→ X)fSe fornece uma função do tipo . Aqui estão algumas funções:
Portanto, obtemos um para cada número natural e é meio difícil pensar em outros exemplos . (Exercício: google "Codificação da Igreja de números naturais".)
( S→ S) → ( S→ S)f0 0( S) ( g) ( X )f1( S) ( g) ( X )f2( S) ( g) ( X )f3( S) ( g) ( X ): = x: = g( X ): = g( g( x ) ): = g( g( g( x ) ) )
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 [∃∀
∃ X. T: = ∀Y. ( ∀ X. ( T→ Y) ) → Y
YT∃ X. T∃ X. T: = ∐S: S e tT[ X↦ S] .
∃ X. T ( S, Um )SumaT[ X↦ S] . Um exemplo seria o tipo , cujos elementos são pares onde é um conjunto e é uma operação binária nele. Isso também é conhecido como
magma . Se você fica um pouco mais extravagante, pode expressar estruturas conhecidas, como grupos e anéis (é necessário inventar
tipos de identidade primeiro).
( S , m ) S m : S × S → S∃ X. ( X× X→ X)( S, M )Sm : S× S→ S
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) ) → YY
A : = ∐S: S e tT[ X↦ S]
B : = ∏R : S e t( ∏S: S e t( T[ X↦ S] → R ) ) → R .
λ-cálculo. Em uma direção, temos o mapa definido como
e na outra um mapa definido por
(A notação significa a função .) Agora podemos verificar se e são inversos um do outro. Uma direção é fácil:
A outra direção fica assim:
f: A → Bf( S, Um ) ( R ) ( h ) : = h ( S) ( Um )
g: B → Ag( ϕ ) : = ϕ ( A ) ( λ S. λ a . ( S, a ) ) .
λ S. λ a . ( S, Um )S↦ a ↦ ( S, Um )fgg( f( S, a ) ) = f( S, Um ) ( um ) ( λ S′. λ a′. ( S′, um′) ) = ( λ S′. λ a′. ( S′, um′) ( S) ( a ) = ( S, Um ) .
f( g( ϕ ) ) ( R ) ( h ) = h ( π1( g( ϕ ) ) ( π2( g( ϕ ) ) ) .
Poderíamos continuar reescrevendo para , mas ficaríamos presos!
g( ϕ )ϕ ( A ) ( λ S. λ a . ( S, Um ) )
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 .∃∀
∃ x . ϕ ( x )
∀ P: P r o p . (∀x.(Φ(x)⇒P) ) ⇒ P,
PPϕ