Cubo lambda

Em lógica matemática e teoria dos tipos, o λ-cubo (também escrito cubo lambda) é uma estrutura introduzida por Henk Barendregt[1] para investigar as diferentes dimensões nas quais o cálculo das construções é uma generalização do cálculo lambda 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 depender de termos, correspondendo a tipos dependentes.
- eixo y (): termos que podem depender de tipos, correspondendo ao polimorfismo.
- eixo z (): tipos que podem depender de outros tipos, correspondendo a operadores de tipo (de ligaçã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 sistema de tipos puro.
Exemplos de sistemas
[editar | editar código](λ→) Cálculo lambda simplesmente tipado
[editar | editar código]O sistema mais simples encontrado no λ-cubo é o cálculo lambda simplesmente tipado, também chamado de λ→. Neste sistema, a única maneira de construir uma abstração é fazendo um termo depender de um termo, com a regra de tipagem:
(λ2) Sistema F
[editar | editar código]No Sistema F (também chamado de λ2 para o "cálculo lambda tipado de segunda ordem")[2] há outro tipo de abstração, escrito com um , que permite que termos dependam de tipos, com a seguinte regra:
Os termos que começam com um são chamados de polimórficos, pois podem ser aplicados a diferentes tipos para obter diferentes funções, similarmente a funções polimórficas em linguagens do tipo ML. Por exemplo, a identidade polimórfica
fun x -> x
do OCaml tem tipo
'a -> 'a
significando que pode receber um argumento de qualquer tipo 'a e retornar um elemento desse tipo. Este tipo corresponde em λ2 ao tipo .
(λω) Sistema Fω
[editar | editar código]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".[3] Um exemplo de tal construtor de tipo é o tipo de árvores binárias com folhas rotuladas por dados de um determinado tipo : , onde "" significa informalmente " é um tipo". Esta é uma função que recebe um parâmetro de tipo como argumento e retorna o tipo de s de valores do tipo . Na programação concreta, esta característica corresponde à capacidade de definir construtores de tipo dentro da linguagem, em vez 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 o tipo de árvores de inteiros:
type int_tree = int tree
O Sistema F geralmente não é usado por si só, mas é útil para isolar a característica independente dos construtores de tipo.[4]
(λP) Lambda-P
[editar | editar código]No sistema λP, também chamado de λΠ, que está intimamente relacionado ao LF Logical Framework, tem-se os chamados tipos dependentes. Estes 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 via isomorfismo de Curry-Howard a um quantificador universal, e o sistema λP como um todo corresponde à lógica de primeira ordem com implicação como único conectivo. Um exemplo desses tipos dependentes na programação concreta é o tipo de vetores de um determinado comprimento: o comprimento é um termo, do qual o tipo depende.
(λω) Sistema Fω
[editar | editar código]O Sistema Fω combina tanto o construtor do Sistema F quanto os construtores de tipo do Sistema F. Assim, o Sistema Fω fornece tanto termos que dependem de tipos quanto tipos que dependem de tipos.
(λC) Cálculo das construções
[editar | editar código]No cálculo das construções, denotado como λC no cubo ou como λPω,[1]:130 essas quatro características coexistem, de modo que tanto tipos quanto termos podem depender de tipos e termos. A fronteira clara que existe em λ→ entre termos e tipos é um tanto abolida, pois todos os tipos, exceto o universal , são eles próprios termos com um tipo.
Definição formal
[editar | editar código]Como para todos os sistemas baseados no cálculo lambda simplesmente tipado, todos os sistemas no cubo são dados em duas etapas: primeiro, termos brutos, juntamente com uma noção de β-redução, e depois regras de tipagem que permitem tipar esses termos.
O conjunto de sortes é definido como ; as sortes são representadas pela letra . Há também um conjunto de variáveis, representado pelas letras . Os termos brutos dos oito sistemas do cubo são dados pela seguinte sintaxe:
e denotando quando não ocorre livre em .
Os ambientes, como é usual em sistemas tipados, são dados por
A noção de β-redução é comum a todos os sistemas do cubo. É escrita e dada pelas regrasSeu fecho reflexivo e transitivo é escrito .
As seguintes regras de tipagem também são comuns a todos os sistemas do cubo:
A diferença entre os sistemas está nos pares de sortes que são permitidos nas duas seguintes regras de tipagem:
A correspondência entre os sistemas e os pares permitidos nas regras é a seguinte:
| λ→ | —comentário não assinado de Usuário não informado (data/hora não informada) | —comentário não assinado de Usuário não informado (data/hora não informada) | —comentário não assinado de Usuário não informado (data/hora não informada) | |
| λP | —comentário não assinado de Usuário não informado (data/hora não informada) | —comentário não assinado de Usuário não informado (data/hora não informada) | ||
| λ2 | —comentário não assinado de Usuário não informado (data/hora não informada) | —comentário não assinado de Usuário não informado (data/hora não informada) | ||
| λω | —comentário não assinado de Usuário não informado (data/hora não informada) | —comentário não assinado de Usuário não informado (data/hora não informada) | ||
| λP2 | —comentário não assinado de Usuário não informado (data/hora não informada) | |||
| λPω | —comentário não assinado de Usuário não informado (data/hora não informada) | |||
| λω | —comentário não assinado de Usuário não informado (data/hora não informada) | |||
| λ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 termos dependam de termos.
- permite que tipos dependam de termos.
- permite que termos dependam de tipos.
- permite que tipos dependam de tipos.
Comparação entre os sistemas
[editar | editar código]λ→
[editar | editar código]Uma derivação típica que pode ser obtida éou com o atalho da setaassemelhando-se fortemente à identidade (do tipo ) do λ→ usual. Note que todos os tipos usados devem aparecer no contexto, porque a única derivação que pode ser feita em um contexto vazio é .
O poder computacional é bastante fraco, corresponde aos polinômios estendidos (polinômios juntamente com um operador condicional).[5]
λ2
[editar | editar código]Em λ2, tais termos podem ser obtidos comocom . Se lê-se 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 , isto é, termos que quantificam sobre todos os tipos, incluindo eles mesmos.
O polimorfismo também permite a construção de funções que não eram construíveis em λ→. Mais precisamente, as funções definíveis em λ2 são aquelas provavelmente totais na aritmética de Peano de segunda ordem.[6] Em particular, todas as funções recursivas primitivas são definíveis.
λP
[editar | editar código]Em λP, a capacidade de ter tipos dependendo de termos significa que se pode expressar predicados lógicos. Por exemplo, o seguinte é derivável:que corresponde, via isomorfismo de Curry-Howard, a uma prova de .
Do ponto de vista computacional, no entanto, ter tipos dependentes não aumenta o poder computacional, apenas a possibilidade de expressar propriedades de tipo mais precisas.[7]
A regra de conversão é fortemente necessária ao lidar com tipos dependentes, porque permite realizar computação nos termos do tipo. Por exemplo, se tem-se e , precisa-se aplicar a regra de conversão[a] para obter para poder tipar .
λω
[editar | editar código]Em λω, o seguinte operadoré definível, isto é, . A derivaçãojá pode ser obtida em λ2, no entanto 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 como uma base para linguagens de programação.[10]
λC
[editar | editar código]O cálculo das construções tem tanto a expressividade predicativa de λP quanto o poder computacional de λω, por isso λC também é chamado de λPω,[1]:130 sendo, portanto, muito poderoso, tanto no lado lógico quanto no lado computacional.
Relação com outros sistemas
[editar | editar código]O sistema Automath é similar ao λ2 do ponto de vista lógico. As linguagens do tipo ML, do ponto de vista da tipagem, situam-se em algum lugar entre λ→ e λ2, pois admitem um tipo restrito de tipos polimórficos, isto é, os tipos na forma normal prenex. No entanto, como apresentam alguns operadores de recursão, seu poder computacional é maior que o do λ2.[7] O sistema Coq é baseado em uma extensão do λC com uma hierarquia linear de universos, em vez de apenas um único não tipável, e a capacidade de construir tipos indutivos.
Sistemas de tipos puros podem ser vistos como uma generalização do cubo, com um conjunto arbitrário de sortes, axiomas, regras de produto e abstração. Inversamente, os sistemas do cubo lambda podem ser expressos como sistemas de tipos puros com duas sortes , o único axioma , e um conjunto de regras tal que .[1]
Via isomorfismo de Curry-Howard, há uma correspondência biunívoca entre os sistemas no cubo lambda e sistemas lógicos,[1] a saber:
| Sistema do cubo | Sistema Lógico |
|---|---|
| λ→ | Cálculo Proposicional (de ordem zero) |
| λ2 | Cálculo Proposicional de Segunda Ordem |
| λω | Cálculo Proposicional de Ordem Superior Fraco |
| λω | Cálculo Proposicional de Ordem Superior |
| λP | Lógica de Predicados (de primeira ordem) |
| λP2 | Cálculo de Predicados de Segunda Ordem |
| λPω | Cálculo de Predicados de Ordem Superior Fraco |
| λC | Cálculo das construções |
Todas as lógicas são implicativas (ou seja, os únicos conectivos são e ); no entanto, pode-se definir outros conectivos como ou de maneira impredicativa em lógicas de segunda ordem e ordem superior. Nas lógicas fracas de ordem superior, existem variáveis para predicados de ordem superior, mas não se pode fazer quantificação sobre elas.
Propriedades comuns
[editar | editar código]Todos os sistemas no cubo possuem:
- a propriedade de Church-Rosser: se e então existe tal que e ;
- a propriedade de redução de sujeito: se e então ;
- a unicidade de tipos: se e então .
Todas essas podem ser provadas em sistemas de tipos puros genéricos.[11]
Qualquer termo bem tipado em um sistema do cubo é fortemente normalizante,[1] embora esta propriedade não seja comum a todos os sistemas de tipos puros. Nenhum sistema no cubo é Turing completo.[7]
Subtipagem
[editar | editar código]A subtipagem no entanto não é representada no cubo, embora sistemas como , conhecido como quantificação limitada de ordem superior, que combinam subtipagem e polimorfismo sejam de interesse prático, e podem ser generalizados ainda mais para operadores de tipo limitados. Extensões adicionais ao permitem a definição de objetos puramente funcionais; esses sistemas foram geralmente desenvolvidos após a publicação do artigo do cubo lambda.[12]
A ideia do cubo é devida ao matemático Henk Barendregt (1991). O arcabouço dos sistemas de tipos puros generaliza o cubo lambda no sentido de que todos os cantos do cubo, bem como muitos outros sistemas, podem ser representados como instâncias deste arcabouço geral.[13] Este arcabouço antecede o cubo lambda em alguns anos. Em seu artigo de 1991, Barendregt também define os cantos do cubo neste arcabouço.
Ver também
[editar | editar código]- Em sua Habilitation à diriger les recherches,[14] Olivier Ridoux fornece um modelo recortável 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.
- Cubo lógico
- Hexágono lógico
- Quadrado de oposição
- Triângulo de oposição
Notas e Referências
[editar | editar código]- 1 2 3 4 5 6 Barendregt, Henk (1991). «Introduction to generalized type systems». Journal of Functional Programming. 1 (2): 125–154. ISSN 0956-7968. doi:10.1017/s0956796800020025. hdl:2066/17240

- ↑ Nederpelt, Rob; Geuvers, Herman (2014). Type Theory and Formal Proof. [S.l.]: Cambridge University Press. p. 69. ISBN 9781107036505
- ↑ Nederpelt & Geuvers 2014, p. 85
- ↑ Nederpelt & Geuvers 2014, p. 100
- ↑ Schwichtenberg, Helmut (1975). «Definierbare Funktionen imλ-Kalkül mit Typen». Archiv für Mathematische Logik und Grundlagenforschung (em alemão). 17 (3–4): 113–114. ISSN 0933-5846. doi:10.1007/bf02276799
- ↑ Girard, Jean-Yves; Lafont, Yves; Taylor, Paul (1989). Proofs and Types. Col: Cambridge Tracts in Theoretical Computer Science. 7. [S.l.]: Cambridge University Press. ISBN 9780521371810
- 1 2 3 Ridoux, Olivier (1998). Lambda-Prolog de A à Z ... ou presque (PDF). [S.l.]: [s.n.] OCLC 494473554
- ↑ Angiuli, Carlo; Gratzer, Daniel (2024). «2.1.3 Who type-checks the typing rules? and 2.2 Towards the syntax of dependent type theory». Principles of Dependent Type Theory (PDF). [S.l.]: Indiana University and Aarhus University. Consultado em 7 de setembro de 2024
- ↑ Favier, Naïm (17 de agosto de 2023). «In the Conversion inference rule of the lambda cube, why is Γ ⊢ B′:s necessary?». Computer Science Stack Exchange. Consultado em 7 de setembro de 2024
- ↑ Pierce, Benjamin; Dietzen, Scott; Michaylov, Spiro (1989). Programming in higher-order typed lambda-calculi. [S.l.]: Computer Science Department, Carnegie Mellon University. OCLC 20442222. CMU-CS-89-111 ERGO-89-075
- ↑ Sørensen, Morten Heine; Urzyczyin, Pawel (2006). «Pure type systems and the λ-cube». Lectures on the Curry-Howard Isomorphism. [S.l.]: Elsevier. pp. 343–359. ISBN 9780444520777. doi:10.1016/s0049-237x(06)80015-7
- ↑ Pierce, Benjamin (2002). Types and programming languages. [S.l.]: MIT Press. pp. 467–490. ISBN 978-0262162098. OCLC 300712077
- ↑ Pierce 2002, p. 466
- ↑ Ridoux 1998, p. 70
Leitura adicional
[editar | editar código]- Peyton Jones, Simon; Meijer, Erik (1997). «Henk: A Typed Intermediate Language» (PDF). Microsoft.
Henk é baseado diretamente no cubo lambda, uma família expressiva de cálculos lambda tipados.
Ligações externas
[editar | editar código]- O Cubo Lambda de Barendregt no contexto de sistema de tipo puro por Roger Bishop Jones