Cubo lambda - Lambda cube
Na lógica matemática e na teoria dos tipos , o λ-cubo é uma estrutura introduzida por Henk Barendregt para investigar as diferentes dimensões nas quais o cálculo das construções é uma generalização do λ-cálculo simplesmente tipado . Cada dimensão do cubo corresponde a um novo tipo de dependência entre termos e tipos. Aqui, "dependência" refere-se à capacidade de um termo ou tipo de ligar um termo ou tipo. As respectivas dimensões do cubo λ correspondem a:
- eixo x ( ): tipos que podem vincular termos, correspondendo a tipos dependentes .
- eixo y ( ): termos que podem ligar tipos, correspondendo ao polimorfismo .
- eixo z ( ): tipos que podem vincular tipos, correspondendo a operadores de tipo (vinculação) .
As diferentes maneiras de combinar essas três dimensões produzem os 8 vértices do cubo, cada um correspondendo a um tipo diferente de sistema tipado. O cubo λ pode ser generalizado no conceito de um sistema de tipo puro .
Exemplos de sistemas
(λ →) Cálculo lambda simplesmente digitado
O sistema mais simples encontrado no cubo λ é o cálculo lambda simplesmente digitado , também chamado de λ →. Nesse sistema, a única maneira de construir uma abstração é fazer um termo depender de um termo , com a regra de digitação
(λ2) Sistema F
No Sistema F (também denominado λ2 para o "cálculo lambda tipado de segunda ordem") há outro tipo de abstração, escrito com a , que permite que os termos dependam de tipos , com a seguinte regra:
Os termos que começam com a são chamados de polimórficos , pois podem ser aplicados a diferentes tipos para obter funções diferentes, de forma semelhante a funções polimórficas em linguagens do tipo ML . Por exemplo, a identidade polimórfica
fun x -> x
de OCaml tem tipo
'a -> 'a
o que significa que pode receber um argumento de qualquer tipo 'a
e retornar um elemento desse tipo. Este tipo corresponde em λ2 ao tipo .
(λ ω ) Sistema F ω
No Sistema F, uma construção é introduzida para fornecer tipos que dependem de outros tipos . Isso é chamado de construtor de tipo e fornece uma maneira de construir "uma função com um tipo como valor ". Um exemplo de um construtor de tipo é , onde " " informalmente significa " é um tipo". Esta é uma função que recebe um parâmetro de tipo como argumento e retorna o tipo de valores de tipo . Na programação concreta, esse recurso corresponde à capacidade de definir construtores de tipo dentro da linguagem, ao invés de considerá-los como primitivos. O construtor de tipo anterior corresponde aproximadamente à seguinte definição de uma árvore com folhas rotuladas em OCaml:
type 'a tree = | Leaf of 'a | Node of 'a tree * 'a tree
Este construtor de tipo pode ser aplicado a outros tipos para obter novos tipos. Por exemplo, para obter tipos de árvores de inteiros:
type int_tree = int tree
O sistema F geralmente não é usado sozinho, mas é útil para isolar o recurso independente dos construtores de tipo.
(λP) Lambda-P
No λP sistema, também chamado ΛΠ, e intimamente relacionado com o LF Quadro Lógico , se tem chamado tipos dependentes . Esses são tipos que podem depender de termos . A regra de introdução crucial do sistema é
onde representa tipos válidos. O novo construtor de tipo corresponde através do isomorfismo de Curry-Howard a um quantificador universal, e o sistema λP como um todo corresponde à lógica de primeira ordem com a implicação apenas como conectiva. Um exemplo desses tipos dependentes na programação concreta é o tipo de vetores em um determinado comprimento: o comprimento é um termo, do qual o tipo depende.
(Fω) Sistema Fω
Sistema Fω combina tanto o construtor do sistema de F eo tipo construtores de sistema F . Assim, System Fω fornece termos que dependem de tipos e tipos que dependem de tipos .
(λC) Cálculo de construções
No cálculo de construções , denotadas como λC no cubo ou como λPω, essas quatro características coabitam, de modo que ambos os tipos e termos podem depender de tipos e termos. A fronteira clara que existe em λ → entre termos e tipos é um tanto abolida, já que todos os tipos, exceto o universal, são eles próprios termos com um tipo.
Definição formal
Como para todos os sistemas baseados no cálculo lambda simplesmente digitado, todos os sistemas no cubo são dados em duas etapas: primeiro, termos brutos, junto com uma noção de redução β e , em seguida, regras de digitação que permitem digitar esses termos.
O conjunto de classificações é definido como , as classificações são representadas com a letra . Existe também um conjunto de variáveis, representadas pelas letras . Os termos brutos dos oito sistemas do cubo são dados pela seguinte sintaxe:
e denotando quando não ocorre gratuitamente em .
O ambiente, como é usual em sistemas tipados, são dados por
A noção de redução β é comum a todos os sistemas no cubo. É escrito e dado pelas regras
As seguintes regras de digitação também são comuns a todos os sistemas no cubo:
A correspondência entre os sistemas e os pares permitidos nas regras é a seguinte:
λ → | ||||
λP | ||||
λ2 | ||||
λ ω | ||||
λP2 | ||||
λP ω | ||||
λω | ||||
λC |
Cada direção do cubo corresponde a um par (excluindo o par compartilhado por todos os sistemas), e por sua vez cada par corresponde a uma possibilidade de dependência entre termos e tipos:
- permite que os termos dependam dos termos.
- permite que os tipos dependam dos termos.
- permite que os termos dependam dos tipos.
- permite que os tipos dependam de tipos.
Comparação entre os sistemas
λ →
Uma derivação típica que pode ser obtida é
O poder de computação é bastante fraco, corresponde aos polinômios estendidos (polinômios junto com um operador condicional).
λ2
Em λ2, tais termos podem ser obtidos como
λP
Em λP, a capacidade de ter tipos dependendo dos termos significa que se pode expressar predicados lógicos. Por exemplo, o seguinte é derivável:
A regra de conversão é fortemente necessária ao lidar com tipos dependentes, porque permite realizar cálculos nos termos do tipo. Por exemplo, se você tem e , você precisa aplicar a regra de conversão para conseguir digitar .
λω
Em λω, o seguinte operador
Do ponto de vista computacional, λω é extremamente forte e tem sido considerado a base para linguagens de programação.
λC
O cálculo das construções tem a expressividade do predicado de λP e o poder computacional de λω, daí porque λC também é chamado de λPω, por isso é muito poderoso, tanto do lado lógico quanto do lado computacional.
Relação com outros sistemas
O sistema Automath é semelhante a λ2 do ponto de vista lógico. As linguagens do tipo ML , do ponto de vista da tipificação, situam-se em algum lugar entre λ → e λ2, pois admitem um tipo restrito de tipos polimórficos, ou seja, os tipos na forma normal prenex. No entanto, como eles apresentam alguns operadores de recursão, seu poder de computação é maior do que o de λ2. O sistema Coq é baseado em uma extensão de λC com uma hierarquia linear de universos, ao invés de apenas um não tipável , e a capacidade de construir tipos indutivos.
Os Pure Type Systems podem ser vistos como uma generalização do cubo, com um conjunto arbitrário de tipos, axiomas, produtos e regras de abstração. Por outro lado, os sistemas do cubo lambda podem ser expressos como Sistemas de Tipo Puro com dois tipos , o único axioma e um conjunto de regras como esse .
Por meio do isomorfismo de Curry-Howard, há uma correspondência um a um entre os sistemas no cubo lambda e os sistemas lógicos, a saber:
Sistema do cubo | Sistema Lógico |
---|---|
λ → | (Primeira ordem) Cálculo proposicional |
λ2 | Cálculo proposicional de segunda ordem |
λ ω | Cálculo proposicional de ordem fracamente superior |
λω | Cálculo proposicional de ordem superior |
λP | (Primeira ordem) Lógica de Predicado |
λP2 | Cálculo de predicado de segunda ordem |
λP ω | Cálculo de predicado de ordem superior fraca |
λC | Cálculo de Construções |
Todas as lógicas são implicativas (isto é, os únicos conectivos são e ), no entanto, pode-se definir outros conectivos como ou de uma forma
impredicativa em lógicas de segunda ordem e superiores. Nas lógicas fracas de ordem superior, existem variáveis para predicados de ordem superior, mas nenhuma quantificação pode ser feita.Propriedades comuns
Todos os sistemas do cubo desfrutam
- a propriedade Church-Rosser : se e então existe tal que e ;
- a propriedade de redução de assunto : se e então ;
- a singularidade dos tipos: se e então .
Tudo isso pode ser comprovado em sistemas de tipo puro genérico.
Qualquer termo bem digitado em um sistema do cubo é fortemente normalizado, embora essa propriedade não seja comum a todos os sistemas de tipo puro. Nenhum sistema no cubo é Turing completo.
Subtipagem
A subtipagem, no entanto, não é representada no cubo, embora sistemas como , conhecido como
quantificação limitada de ordem superior , que combina subtipagem e polimorfismo, sejam de interesse prático e possam ser generalizados para operadores de tipo limitado . Outras extensões para permitir a definição de objetos puramente funcionais ; esses sistemas foram geralmente desenvolvidos depois que o papel do cubo lambda foi publicado.A ideia do cubo deve-se ao matemático Henk Barendregt (1991). A estrutura dos sistemas de tipo puro generaliza o cubo lambda no sentido de que todos os cantos do cubo, bem como muitos outros sistemas, podem ser representados como instâncias dessa estrutura geral. Essa estrutura é anterior ao cubo lambda em alguns anos. Em seu artigo de 1991, Barendregt também define os cantos do cubo nesta estrutura.
Veja também
- Em sua Habilitation à diriger les recherches, Olivier Ridoux fornece um molde recortado do cubo lambda e também uma representação dual do cubo como um octaedro, onde os 8 vértices são substituídos por faces, bem como uma representação dual como um dodecaedro , onde as 12 arestas são substituídas por faces.
- Teoria do tipo de homotopia
Notas
Leitura adicional
-
Peyton Jones, Simon; Meijer, Erik (1997). "Henk: A Typed Intermediate Language" (PDF) .
Henk é baseado diretamente no cubo lambda , uma família expressiva de cálculos lambda digitados.
links externos
- Lambda Cube de Barendregt no contexto de sistemas de tipo puro por Roger Bishop Jones