Cubo lambda - Lambda cube

O cubo lambda. A direção de cada seta é a direção de inclusão.

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 'ae 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

Seu fechamento reflexivo e transitivo é escrito .

As seguintes regras de digitação também são comuns a todos os sistemas no cubo:

A diferença entre os sistemas está nos pares de tipos permitidos nas duas regras de digitação a seguir:

A correspondência entre os sistemas e os pares permitidos nas regras é a seguinte:

λ → sim Não Não Não
λP sim sim Não Não
λ2 sim Não sim Não
λ ω sim Não Não sim
λP2 sim sim sim Não
λP ω sim sim Não sim
λω sim Não sim sim
λC sim sim sim sim

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 é

ou com o atalho de seta
muito semelhante à identidade (de tipo ) do usual λ →. Observe que todos os tipos usados ​​devem aparecer no contexto, porque a única derivação que pode ser feita em um contexto vazio é .

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

com . Se for lido como uma quantificação universal, via isomorfismo de Curry-Howard, isso pode ser visto como uma prova do princípio da explosão. Em geral, λ2 adiciona a possibilidade de ter tipos impredicativos , como , ou seja, termos que quantificam sobre todos os tipos, incluindo eles próprios. O polimorfismo também permite a construção de funções que não eram construtíveis em λ →. Mais precisamente, as funções definíveis em λ2 são aquelas comprovadamente totais na aritmética de Peano de segunda ordem . Em particular, todas as funções recursivas primitivas são definíveis.

λ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:

que corresponde, através do isomorfismo de Curry-Howard, a uma prova de . Do ponto de vista computacional, entretanto, ter tipos dependentes não aumenta o poder computacional, apenas a possibilidade de expressar propriedades de tipo mais precisas.

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

é definível, isto é . A derivação
pode ser obtido já em λ2, porém o polimórfico só pode ser definido se a regra também estiver presente.

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

links externos