Por que dois pontos para indicar que um valor pertence a um tipo?

19

Pierce (2002) introduz a relação de digitação na página 92 ​​escrevendo:

A relação de digitação para expressões aritméticas, escrita "t: T", é definida por um conjunto de regras de inferência que atribuem tipos a termos

e a nota de rodapé diz O símbolo é frequentemente usado em vez de:. Minha pergunta é simplesmente por que os teóricos do tipo preferem usar: over ? Se um tipo é um conjunto de valores, faz todo sentido escrever , nenhuma nova notação é necessária.TtT

É semelhante à forma como alguns escritores de cs preferem mesmo que seja um abuso de notação e devem ser escritos ?3n2=O(n2)3n2O(n2)

Björn Lindqvist
fonte
7
O predicado de associação pode ser verdadeiro ou falso, enquanto uma declaração de digitação é geralmente interpretada como uma declaração factual declarada verdadeira ou verdadeira, que pode ser derivada por meios puramente sintáticos. Compare isso com um número primo, para o qual nenhum método sintático de associação é suficiente. xX x:X
Musa Al-hassy
4
@ MusaAl-hassy: é uma deturpação do que está acontecendo. Não é declarado verdadeiro, pois isso significaria que eu posso "declarar" que " false: int", por exemplo. Tampouco acontece que o julgamento deva ser necessariamente derivado de "meios puramente sintáticos", por exemplo, no caso da teoria interna do tipo de uma categoria com famílias.
Andrej Bauer
3
Pergunta relacionada no cs.se: Qual é exatamente a diferença semântica entre conjunto e tipo?
Lagarto discreto
2
Para adicionar ao comentário de @ MusaAl-hassy, ​​na teoria computacional de tipos de Bob Constable, Stuart Allen, Bob Harper e outros, é usada rotineiramente para digitar julgamentos, porque é mais semelhante a um predicado de associação (veja esta palestra, slide 25 , Por exemplo).
xrq
3
Certamente também é um abuso de notação e deve realmente ser escrito ? (Os matemáticos podem preferir .)λ n .3 n 2O ( λ n . N 2 ) n 3 n 2O ( n n 2 )3n2O(n2)λn.3n2O(λn.n2)n3n2O(nn2)
Oscar Cunningham

Respostas:

12

Porque o que está à direita dos dois pontos não é necessariamente um conjunto e o que está à esquerda dos dois pontos não é necessariamente um membro desse conjunto.

A teoria dos tipos começou no início do século XX como uma abordagem para o fundamento da matemática. Bertrand Russel descobriu um paradoxo na teoria dos conjuntos ingênua e trabalhou na teoria dos tipos como uma maneira de limitar o poder expressivo da teoria dos conjuntos para evitar esse (e qualquer outro) paradoxo. Ao longo dos anos, Russel e outros definiram muitas teorias de tipos. Em algumas teorias de tipos, os tipos são conjuntos com certas propriedades, mas em outras são um tipo diferente de animal.

Em particular, muitas teorias de tipos têm uma formulação sintática . Existem regras que fazem uma coisa ter um tipo. Quando as regras de digitação são usadas como base para uma teoria, é importante distinguir o que as regras de digitação dizem do que se pode inferir aplicando conhecimento externo adicional. Isso é especialmente importante se as regras de digitação são a base de uma teoria da prova: os teoremas que se sustentam com base na teoria dos conjuntos com lógica clássica e o axioma da escolha podem ou não se sustentar em uma lógica construtiva, por exemplo. Um dos trabalhos seminais neste domínio é Igreja 's A formulação da teoria simples de Tipos (1940)

Talvez a maneira pela qual a distinção entre tipos e conjuntos seja a mais aparente seja que a regra mais básica para conjuntos, ou seja, que dois conjuntos sejam iguais se tiverem os mesmos elementos, geralmente não se aplica a tipos. Veja a resposta de Andrej Bauer aqui e sua resposta em uma pergunta relacionada para alguns exemplos. Essa segunda discussão tem outras respostas que vale a pena ler.

Em um cálculo digitado, dizer que os tipos são conjuntos é de fato dar uma semântica aos tipos. Dar a um cálculo uma semântica da teoria dos tipos não é trivial. Por exemplo, suponha que você esteja definindo um idioma com funções. Que conjunto é um tipo de função? As funções totais são determinadas pelo seu gráfico, como aprendemos na teoria dos conjuntos 101. Mas e as funções parciais? Deseja atribuir a todas as funções que não terminam a mesma semântica? Você não pode interpretar tipos como conjuntos para um cálculo que permite funções recursivas até responder a essa pergunta. Dar linguagens de programação ou cálculos a uma semântica denotacional foi um problema difícil no início da década de 1970. O artigo seminal aqui é Para uma semântica matemática para linguagens de computador (1971) porDana Scott e Christopher Strachey . O wikibook Haskell tem uma boa apresentação do tópico.

Como escrevi acima, uma segunda parte da resposta é que, mesmo que você tenha conseguido dar aos tipos uma semântica teórica do conjunto, a coisa à esquerda do cólon nem sempre é um elemento do conjunto. Os valores têm tipos, mas o mesmo acontece com outras coisas, como expressões e variáveis . Por exemplo, uma expressão em uma linguagem de programação digitada tem um tipo mesmo que não seja finalizado. Você poderia estar disposto a confundir integere , mas não é um elemento de .ZZ(x := 0; while true; do x := x + 1; x)Z

Não sei quando surgiu a notação do cólon para tipos. Agora é padrão em semântica e comum em linguagens de programação, mas nem Russel nem Church o usavam. Algol não o usou, mas a linguagem fortemente inspirada em Algol que Pascal usou em 1971. Porém, suspeito que não tenha sido o primeiro, porque muitos trabalhos teóricos do início dos anos 1970 usam a notação, mas não conheço um uso anterior. Curiosamente, isso ocorreu logo após a unificação dos conceitos de tipos de programação e de lógica - como mostra Simon Martini em Vários tipos de tipos em linguagens de programação , o que foi chamado de “tipo” em linguagens de programação até os anos 1960 veio do vernáculo uso da palavra e não da teoria dos tipos.

Gilles 'SO- parar de ser mau'
fonte
37

O principal motivo para preferir a notação de dois pontos t:T à relação de associação tT é que a relação de associação pode ser enganosa porque os tipos não são (apenas) coleções .

[ Complementar: devo observar que a teoria do tipo historicamente foi escrita usando . A concepção de tipo de Martin-Löf destinava-se a capturar conjuntos construtivamente, e Russell e Whitehead já usavam ϵ para a memória de classe. Seria interessante rastrear o momento em que : tornou - se mais prevalente que .]

Um tipo descreve um certo tipo de construção, ou seja, como criar objetos com uma certa estrutura, como usá-los e quais equações têm sobre eles.

Por exemplo, um tipo de produto A×B tem regras de introdução que explicam como fazer pares ordenados e regras de eliminação explicando que podemos projetar o primeiro eo segundo componentes de qualquer elemento de A×B . A definição de A×B se não começar com as palavras "a coleção de tudo ..." e também não dizer em qualquer lugar qualquer coisa como "todos os elementos de A×B são pares" (mas segue da definição que cada elemento do A×B é proposicionalmenteigual a um par). Em contraste, a definição da teoria dos conjuntos de X×Y é declarada como "o conjunto de todos os pares ordenados ...".

A notação t:T significa o facto de que t tem a estrutura descrita por T .

Um tipo T não deve ser confundido com a sua extensão , que é o conjunto de todos os objetos do tipo T . Um tipo não é determinado por sua extensão, assim como um grupo não é determinado por seu conjunto de operadoras. Além disso, pode acontecer que dois tipos tenham a mesma extensão, mas são diferentes, por exemplo:

  1. Σ(n:N).isprime(n)×iseven(n)×(n>2)
  2. Σ(n:N).isprime(n)×isodd(n)×(n<2)

A extensão de ambos está vazia, mas eles não são do mesmo tipo.

:at:Tt:UTUtTt

aA¬(aA)aAt:T

Andrej Bauer
fonte
11
Andrej, ótima resposta. Você conhece a origem histórica da notação do cólon?
Andreas Rossberg
xααϵ
11
gG
2
f:STfSTf(ST)amplamente utilizado muito antes de a teoria dos tipos se tornar popular.
user21820
11
f(ST)STf:ST
5

Björn,

Provavelmente existe uma referência anterior, mas, por um lado, o cólon foi usado na linguagem de programação Pascal:

Primeiro hit do Google para Pascal

Bjørn Kjos-Hanssen
fonte
2
Não havia nenhuma linguagem de programação anterior usada :?
Andrej Bauer
@AndrejBauer, de fato, escrevi "Provavelmente há uma referência anterior, mas ..." para evitar esse fato provável.
Bjørn Kjos-Hanssen
@AndrejBauer Algol não. Foi :usado em trabalhos teóricos antes dos anos 1970?
Gilles 'SO- stop be evil'
11
Fortran tem, REAL :: xmas não sei se isso aconteceu antes de Pascal.
Michael
11
@ Michael Fortran veio antes de Pascal (ca. 1955 vs. ca. 1970), mas acho que essa sintaxe específica foi introduzida apenas no Fortran 90, muito mais tarde que Pascal. Veja, por exemplo, aqui fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico Poloni