Sistema F
O sistema F é um formalismo lógico que torna possível expressar funções de uma forma muito rica e rigorosa e demonstrar formalmente propriedades difíceis. Especificamente, o sistema F (também conhecido como cálculo polimórfico lambda ou cálculo lambda de segunda ordem ) é uma extensão do cálculo lambda simplesmente digitada, introduzida de forma independente pelo lógico Jean-Yves Girard e pelo cientista da computação John C. Reynolds . Este sistema se distingue do lambda-cálculo simplesmente tipado pela existência de uma quantificação universal dos tipos que torna possível expressar o polimorfismo.
O Sistema F tem duas propriedades cruciais:
- a redução de termos é fortemente normalizadora (de forma mais direta: todos os cálculos terminam);
- ela corresponde por correspondência Curry-Howard à lógica mínimo proposicional a segunda ordem . Quer dizer: o cálculo proposicional, sem a negação mas com os quantificadores .
Nota introdutória : A leitura deste artigo pressupõe a leitura preliminar do artigo " lambda-cálculo " e sua assimilação.
Introdução
Como atesta sua origem dupla, o sistema F pode ser estudado em dois contextos muito diferentes:
- No campo da programação funcional, onde surge como uma extensão muito expressiva do núcleo da linguagem ML. Sua expressividade é ilustrada pelo fato de que os tipos de dados comuns (booleanos, inteiros, listas, etc.) são definíveis no sistema F a partir das construções básicas;
- No campo da lógica e, mais particularmente, da teoria da prova. Por meio da correspondência Curry-Howard , o sistema F é de fato isomórfico à lógica mínima de segunda ordem. Além disso, esse sistema captura exatamente a classe de funções numéricas cuja existência pode ser comprovada na aritmética intuicionista de segunda ordem (às vezes chamada de análise intuicionista ). Além disso, é esta propriedade notável do sistema F que motivou historicamente a sua introdução por Jean-Yves Girard, na medida em que esta propriedade permite resolver o problema da eliminação de cortes na aritmética de segunda ordem, conjecturado por Takeuti (in) .
Historicamente, o sistema F desempenhou um papel essencial nos fundamentos da ciência da computação ao propor, desde o início da década de 1970, um formalismo de tipo rico, simples e muito expressivo de funções calculáveis muito gerais. Ele abriu o caminho para linguagens de programação digitadas modernas e assistentes de prova como COQ .
Como o cálculo lambda simplesmente digitado, o sistema F admite duas apresentações equivalentes:
- Uma apresentação à Igreja , em que cada termo contém todas as anotações de tipo necessárias para a reconstrução de seu tipo (inequivocamente);
- Uma apresentação à la Curry , do cientista da computação Daniel Leivant, em que os termos (que são os do lambda-cálculo puro) são desprovidos de qualquer tipo de anotação e, portanto, sujeitos aos problemas da ambigüidade típica.
Apresentação na Igreja
O sistema F admite dois tipos de objetos: tipos e termos . Os termos podem ser "recolhidos" e traduzir funções computáveis, enquanto os tipos anotam os termos e permitem que sejam categorizados.
A sintaxe
O tipo de sistema de F (denotado , , , etc.) são formados a partir de um conjunto de tipos de variáveis (classificado , , etc.) utilizando os seguintes três regras de construção:
NO{\ displaystyle A}
B{\ displaystyle B}
VS{\ displaystyle C}
α{\ displaystyle \ alpha}
β{\ displaystyle \ beta}
γ{\ displaystyle \ gamma}![\gama](https://wikimedia.org/api/rest_v1/media/math/render/svg/a223c880b0ce3da8f64ee33c4f0010beee400b1a)
- ( Variável de tipo ) Se for uma variável de tipo, então é um tipo;α{\ displaystyle \ alpha}
α{\ displaystyle \ alpha}![\alfa](https://wikimedia.org/api/rest_v1/media/math/render/svg/b79333175c8b3f0840bfb4ec41b8072c83ea88d3)
- ( Tipo de seta ) Se e são tipos, então é um tipo;NO{\ displaystyle A}
B{\ displaystyle B}
NO→B{\ displaystyle A \ a B}![A para B](https://wikimedia.org/api/rest_v1/media/math/render/svg/d5b8dd84619daff17b52a08b77d15db2b9ad6c2a)
- ( Tipo universal ) Se for uma variável de tipo e um tipo, então é um tipo.α{\ displaystyle \ alpha}
B{\ displaystyle B}
∀α B{\ displaystyle \ forall \ alpha ~ B}![{\ displaystyle \ forall \ alpha ~ B}](https://wikimedia.org/api/rest_v1/media/math/render/svg/431e4a70c7da3928c2ef4a14f11780a0369867a5)
Em resumo, os tipos do sistema F são dados pela gramática BNF :
NO,B :: = α | NO→B | ∀α B.{\ displaystyle A, B ~~ :: = ~~ \ alpha ~~ | ~~ A \ to B ~~ | ~~ \ forall \ alpha ~ B.}
Como em lambda-calculus ou em cálculo de predicado, a presença de um símbolo mutante requer distinguir as noções de variável livre e variável ligada , e introduzir os mecanismos usuais de renomeação que permitem trabalhar até a -conversão. Finalmente, a álgebra de tipo do sistema F é dotada de uma operação de substituição semelhante à do cálculo lambda, e denotamos o tipo obtido substituindo no tipo todas as ocorrências livres da variável de tipo pelo tipo .
∀{\ displaystyle \ forall}
α{\ displaystyle \ alpha}
B{α: =NO}{\ displaystyle B \ {\ alpha: = A \}}
B{\ displaystyle B}
α{\ displaystyle \ alpha}
NO{\ displaystyle A}![NO](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
Os termos (bruto) Sistema F (classificado , etc.) são formados a partir de um conjunto de termos de variáveis (denotado , , , etc.), utilizando as cinco seguintes regras de construção:
M{\ displaystyle M}
NÃO{\ displaystyle N}
x{\ displaystyle x}
y{\ displaystyle y}
z{\ displaystyle z}![z](https://wikimedia.org/api/rest_v1/media/math/render/svg/bf368e72c009decd9b6686ee84a375632e11de98)
- ( Variável ) Se for uma variável de termo, então é um termo;x{\ displaystyle x}
x{\ displaystyle x}![x](https://wikimedia.org/api/rest_v1/media/math/render/svg/87f9e315fd7e2ba406057a97300593c4802b53e4)
- ( Abstração ) Se for uma variável de termo, um tipo e um termo, então é um termo;x{\ displaystyle x}
NO{\ displaystyle A}
M{\ displaystyle M}
λx:NO.M{\ displaystyle \ lambda x: AM}![{\ displaystyle \ lambda x: AM}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dda806775412549996c38fc8814859343d3e3d18)
- ( Aplicação ) Se e forem termos, então é um termo;M{\ displaystyle M}
NÃO{\ displaystyle N}
MNÃO{\ displaystyle MN}![MN](https://wikimedia.org/api/rest_v1/media/math/render/svg/6fa6819fea85a0b616a35d340ad6461ababdbeee)
- ( Abstração de tipo ) Se for uma variável de tipo e um termo, então é um termo;α{\ displaystyle \ alpha}
M{\ displaystyle M}
Λα.M{\ displaystyle \ Lambda \ alpha .M}![{\ displaystyle \ Lambda \ alpha .M}](https://wikimedia.org/api/rest_v1/media/math/render/svg/df7ca0f6dcb7bb79b46d9c5f8724829d1243bdf8)
- ( Tipo de aplicação ) Se for um termo e um tipo, será um termo.M{\ displaystyle M}
NO{\ displaystyle A}
MNO{\ displaystyle MA}![{\ displaystyle MA}](https://wikimedia.org/api/rest_v1/media/math/render/svg/be6250feb34ae98d9b710a8b069d15811718a9c1)
Em resumo, os termos (brutos) do sistema F são dados pela gramática BNF:
M,NÃO :: = x | λx:NO.M | MNÃO | Λα.M | MNO.{\ displaystyle M, N ~~ :: = ~~ x ~~ | ~~ \ lambda x \, {:} \, A \ ,. \, M ~~ | ~~ MN ~~ | ~~ \ Lambda \ alpha \ ,. \, M ~~ | ~~ MA.}
Os termos do sistema F incorporam dois mecanismos de ligação variável: um mecanismo de ligação variável de termo (por construção ) e um mecanismo de ligação variável de tipo (por construção ), os quais são levados em consideração no nível da relação de conversão. Esse mecanismo duplo dá origem naturalmente a duas operações de substituição: uma substituição de termo anotada e uma substituição de tipo anotada .
λx:NO.M{\ displaystyle \ lambda x \, {:} \, A \ ,. \, M}
Λα.M{\ displaystyle \ Lambda \ alpha \ ,. \, M}
α{\ displaystyle \ alpha}
M{x: =NÃO}{\ displaystyle M \ {x: = N \}}
M{α: =NO}{\ displaystyle M \ {\ alpha: = A \}}![{\ displaystyle M \ {\ alpha: = A \}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/21877c20ec78fe08e30f474055852ba7df81891f)
A -reduçãoβ{\ displaystyle \ beta}
A presença de um duplo mecanismo de abstração e aplicação (abstração / aplicação de termo e abstração / aplicação de tipo) dá origem a duas regras de -redução, cuja união gera passando para o contexto a relação de -redução em uma etapa do sistema F:
β{\ displaystyle \ beta}
β{\ displaystyle \ beta}![\beta](https://wikimedia.org/api/rest_v1/media/math/render/svg/7ed48a5e36207156fb792fa79d29925d2f7901e8)
-
(λx:NO.M)NÃO⟶M{x: =NÃO}{\ displaystyle (\ lambda x \, {:} \, A \ ,. \, M) N \ longrightarrow M \ {x: = N \}}
;
-
(Λα.M)NO⟶M{α: =NO}{\ displaystyle (\ Lambda \ alpha \ ,. \, M) A \ longrightarrow M \ {\ alpha: = A \}}
.
Quanto ao cálculo lambda puro, a -redução do sistema F é confluente (nos termos brutos) e satisfaz a propriedade de Church-Rosser :
β{\ displaystyle \ beta}![\beta](https://wikimedia.org/api/rest_v1/media/math/render/svg/7ed48a5e36207156fb792fa79d29925d2f7901e8)
- (Confluência de -redução) Se e , então existe um termo tal que e ;β{\ displaystyle \ beta}
M⟶∗M1{\ displaystyle M \ longrightarrow ^ {*} M_ {1}}
M⟶∗M2{\ displaystyle M \ longrightarrow ^ {*} M_ {2}}
M′{\ displaystyle M '}
M1⟶∗M′{\ displaystyle M_ {1} \ longrightarrow ^ {*} M '}
M2⟶∗M′{\ displaystyle M_ {2} \ longrightarrow ^ {*} M '}![{\ displaystyle M_ {2} \ longrightarrow ^ {*} M '}](https://wikimedia.org/api/rest_v1/media/math/render/svg/981cb8c25dc25d52b268b157d954ee1b9c5300f5)
- (Propriedade de Church-Rosser) Para dois termos e para ser convertível, é necessário e suficiente que exista um termo como e .M1{\ displaystyle M_ {1}}
M2{\ displaystyle M_ {2}}
β{\ displaystyle \ beta}
M′{\ displaystyle M '}
M1⟶∗M′{\ displaystyle M_ {1} \ longrightarrow ^ {*} M '}
M2⟶∗M′{\ displaystyle M_ {2} \ longrightarrow ^ {*} M '}![{\ displaystyle M_ {2} \ longrightarrow ^ {*} M '}](https://wikimedia.org/api/rest_v1/media/math/render/svg/981cb8c25dc25d52b268b157d954ee1b9c5300f5)
O sistema de tipo
Chamado contexto tipagem (notação: , etc) qualquer lista finita de enunciados da forma (que é um termo variável e tipo) em que uma variável termo é declarado mais do que uma vez.
Γ{\ displaystyle \ Gamma}
Γ′{\ displaystyle \ Gamma '}
x:NO{\ displaystyle x: A}
x{\ displaystyle x}
NO{\ displaystyle A}![NO](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
O sistema de tipo do sistema F é construído em torno de um julgamento de digitação do formulário ("no contexto , o termo tem para tipo "), que é definido a partir das seguintes regras de inferência:
Γ⊢M:NO{\ displaystyle \ Gamma \ vdash M: A}
Γ{\ displaystyle \ Gamma}
M{\ displaystyle M}
NO{\ displaystyle A}![NO](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
- ( Axioma ) se ;Γ⊢x:NO{\ displaystyle {\ frac {} {\ Gamma \ vdash x: A}}}
(x:NO)∈Γ{\ displaystyle (x: A) \ in \ Gamma}![{\ displaystyle (x: A) \ in \ Gamma}](https://wikimedia.org/api/rest_v1/media/math/render/svg/cbb7f8119f3d2a5da8bcd8a2f296b9a48bf0470a)
- ( -intro ) ;→{\ displaystyle \ to}
Γ,x:NO⊢M:BΓ⊢λx:NO.M:NO→B{\ displaystyle {\ frac {\ Gamma, x: A \ vdash M: B} {\ Gamma \ vdash \ lambda x \, {:} \, A \ ,. \, M: A \ to B}}}![{\ displaystyle {\ frac {\ Gamma, x: A \ vdash M: B} {\ Gamma \ vdash \ lambda x \, {:} \, A \ ,. \, M: A \ to B}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ed3e69192184603b90bb5c8886eedb17dd3f25f6)
- ( -elim ) ;→{\ displaystyle \ to}
Γ⊢M:NO→BΓ⊢NÃO:NOΓ⊢MNÃO:B{\ displaystyle {\ frac {\ Gamma \ vdash M: A \ to B \ quad \ Gamma \ vdash N: A} {\ Gamma \ vdash MN: B}}}![{\ displaystyle {\ frac {\ Gamma \ vdash M: A \ to B \ quad \ Gamma \ vdash N: A} {\ Gamma \ vdash MN: B}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8fd4463d09a07857d852dd6e52f7f8e98d4bba6a)
- ( -intro ) se não tiver ocorrência livre em ;∀{\ displaystyle \ forall}
Γ⊢M:BΓ⊢Λα.M:∀α B{\ displaystyle {\ frac {\ Gamma \ vdash M: B} {\ Gamma \ vdash \ Lambda \ alpha \ ,. \, M: \ forall \ alpha ~ B}}}
α{\ displaystyle \ alpha}
Γ{\ displaystyle \ Gamma}![\Gama](https://wikimedia.org/api/rest_v1/media/math/render/svg/4cfde86a3f7ec967af9955d0988592f0693d2b19)
- ( -elim ) .∀{\ displaystyle \ forall}
Γ⊢M:∀α BΓ⊢MNO:B{α: =NO}{\ displaystyle {\ frac {\ Gamma \ vdash M: \ forall \ alpha ~ B} {\ Gamma \ vdash MA: B \ {\ alpha: = A \}}}}![{\ displaystyle {\ frac {\ Gamma \ vdash M: \ forall \ alpha ~ B} {\ Gamma \ vdash MA: B \ {\ alpha: = A \}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d3616a8fa3601706bc4f493594a9bd4c4980e26d)
As duas propriedades principais deste sistema de tipo são a propriedade de preservação do tipo de reduçãoβ{\ displaystyle \ beta}
e a propriedade de normalização forte :
- ( Preservação do tipo por redução ) Se e se , então ;Γ⊢M:NO{\ displaystyle \ Gamma \ vdash M: A}
M⟶∗M′{\ displaystyle M \ longrightarrow ^ {*} M '}
Γ⊢M′:NO{\ displaystyle \ Gamma \ vdash M ': A}![{\ displaystyle \ Gamma \ vdash M ': A}](https://wikimedia.org/api/rest_v1/media/math/render/svg/67b9b2b438e37085aa2a7bd58c43c4c2cd15032d)
- ( Normalização forte ) Se , então é fortemente normalizável.Γ⊢M:NO{\ displaystyle \ Gamma \ vdash M: A}
M{\ displaystyle M}![M](https://wikimedia.org/api/rest_v1/media/math/render/svg/f82cade9898ced02fdd08712e5f0c0151758a0dd)
A primeira dessas duas propriedades é uma propriedade puramente combinatória que é demonstrada por uma indução direta na derivação de tipagem. Por outro lado, a propriedade de normalização forte do sistema F é uma propriedade cuja prova se baseia fundamentalmente em métodos não combinatórios, baseados na noção de redutibilidade candidata.
Representação de tipos de dados
Para poder usar o lambda-cálculo simplesmente digitado como linguagem de programação, é necessário adicionar tipos básicos (booleanos, inteiros, etc.) e regras de redução adicionais que ampliam o poder expressivo do formalismo. Um exemplo de tal extensão é o sistema T de Gödel, que é obtido adicionando aos inteiros naturais primitivos lambda-calculus simplesmente digitados e um mecanismo de recursão semelhante à recursão primitiva (mas mais expressivo).
No sistema F, tal extensão não é necessária porque a expressividade do formalismo permite definir os tipos básicos e os construtores de tipo usuais sem que seja necessário modificar o sistema de tipos ou as regras de redução.
Booleanos e tipos finitos
O tipo de booleanos é definido no sistema F por
- Bool ≡ ∀γ(γ→γ→γ){\ displaystyle {\ textbf {Bool}} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to \ gamma \ to \ gamma)}
![{\ displaystyle {\ textbf {Bool}} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to \ gamma \ to \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/11ee015080606a1bd644751777b866cccdd81ed7)
e as constantes e por:
verdadeiro{\ displaystyle {\ textbf {true}}}
falso{\ displaystyle {\ textbf {false}}}![{\ displaystyle {\ textbf {false}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fa9a44680206f3cfe44567d4e934b782fad2feb)
-
verdadeiro ≡ Λγ.λx,y:γ.x : Bool{\ displaystyle {\ textbf {true}} ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda x, y \, {:} \, \ gamma \ ,. \, x ~: ~ {\ textbf { Bool}}}
;
-
falso ≡ Λγ.λx,y:γ.y : Bool{\ displaystyle {\ textbf {false}} ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda x, y \, {:} \, \ gamma \ ,. \, y ~: ~ {\ textbf { Bool}}}
.
Pode-se mostrar que os dois termos acima são os únicos dois termos fechados na forma normal do tipo . Assim, o tipo de dados captura efetivamente a noção de booleano.
Bool{\ displaystyle {\ textbf {Bool}}}
Bool{\ displaystyle {\ textbf {Bool}}}![{\ displaystyle {\ textbf {Bool}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/653b1b6a206bccb8e5bf69525436e779f8ea92b2)
A construção 'if ... then ... else ...' é definida por
- teixoVS M então NÃO1 senão NÃO2 ≡ MVSNÃO1NÃO2{\ displaystyle {\ texttt {if}} _ {C} ~ M ~ {\ texttt {then}} ~ N_ {1} ~ {\ texttt {else}} ~ N_ {2} ~ \ equiv ~ MCN_ {1} N_ {2}}
![{\ displaystyle {\ texttt {if}} _ {C} ~ M ~ {\ texttt {then}} ~ N_ {1} ~ {\ texttt {else}} ~ N_ {2} ~ \ equiv ~ MCN_ {1} N_ {2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6215f8cec72bdda8efdd96b416d120f528786785)
onde designa o tipo de eliminação da construção 'se ...', ou seja, o tipo comum aos dois ramos da condicional. Esta definição é correta do ponto de vista de digitação e do ponto de vista computacional na medida em que:
VS{\ displaystyle C}![VS](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fc55753007cd3c18576f7933f6f089196732029)
- Em qualquer contexto onde o termo tenha o tipo e onde os termos e tenham o tipo , a construção é bem tipificada e tem o tipo como seu tipo ;M{\ displaystyle M}
Bool{\ displaystyle {\ textbf {Bool}}}
NÃO1{\ displaystyle N_ {1}}
NÃO2{\ displaystyle N_ {2}}
VS{\ displaystyle C}
teixoVS M então NÃO1 senão NÃO2{\ displaystyle {\ texttt {if}} _ {C} ~ M ~ {\ texttt {then}} ~ N_ {1} ~ {\ texttt {else}} ~ N_ {2}}
VS{\ displaystyle C}![VS](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fc55753007cd3c18576f7933f6f089196732029)
- Se o prazo se reduz a , então a construção se reduz a ;M{\ displaystyle M \, \!}
verdadeiro{\ displaystyle {\ textbf {true}}}
teixoVS M então NÃO1 senão NÃO2{\ displaystyle {\ texttt {if}} _ {C} ~ M ~ {\ texttt {then}} ~ N_ {1} ~ {\ texttt {else}} ~ N_ {2}}
NÃO1{\ displaystyle N_ {1} \, \!}![N_1 \, \!](https://wikimedia.org/api/rest_v1/media/math/render/svg/931eb7e58bc7c1e65ed813c23059c8988abc81ad)
- Se o prazo se reduz a , então a construção se reduz a .M{\ displaystyle M \, \!}
falso{\ displaystyle {\ textbf {false}}}
teixoVS M então NÃO1 senão NÃO2{\ displaystyle {\ texttt {if}} _ {C} ~ M ~ {\ texttt {then}} ~ N_ {1} ~ {\ texttt {else}} ~ N_ {2}}
NÃO2{\ displaystyle N_ {2} \, \!}![N_2 \, \!](https://wikimedia.org/api/rest_v1/media/math/render/svg/6149f4c0de5332c766bd7f86e6a8c3b52d47667a)
De forma mais geral, pode-se definir um tipo finito com valores colocando:
Enão{\ displaystyle E_ {n}}
não{\ displaystyle n}
e1,...,enão{\ displaystyle e_ {1}, \ ldots, e_ {n}}![{\ displaystyle e_ {1}, \ ldots, e_ {n}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c60c38b7e2450d62e9dc496b89f8e5c96c77cecf)
-
Enão ≡ ∀γ(γ→⋯→γ⏟não→γ){\ displaystyle E_ {n} ~ \ equiv ~ \ forall \ gamma \, (\ underbrace {\ gamma \ to \ cdots \ to \ gamma} _ {n} \ to \ gamma)}
;
-
eeu ≡ Λγ.λx1,...,xnão:γ.xeu{\ displaystyle e_ {i} ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda x_ {1}, \ ldots, x_ {n} \, {:} \, \ gamma \ ,. \, x_ { eu}}
(para tudo ).1≤eu≤não{\ displaystyle 1 \ leq i \ leq n}![{\ displaystyle 1 \ leq i \ leq n}](https://wikimedia.org/api/rest_v1/media/math/render/svg/abbe58b9b83f8b6ec0da570e2249323a8930ef1e)
Novamente, pode ser mostrado que os termos são os únicos termos fechados na forma de tipo normal . A operação de filtragem correspondente é definida por:
e1,...,enão{\ displaystyle e_ {1}, \ ldots, e_ {n}}
Enão{\ displaystyle E_ {n}}![Dentro](https://wikimedia.org/api/rest_v1/media/math/render/svg/ad6b82f2a00af6c9efd4c16d4e99329605645c0c)
- partidaVS M com e1↦NÃO1|⋯|enão↦NÃOnão ≡ MVSNÃO1⋯NÃOnão{\ displaystyle {\ texttt {match}} _ {C} ~ M ~ {\ texttt {with}} ~ e_ {1} \ mapsto N_ {1} | \ cdots | e_ {n} \ mapsto N_ {n} ~ \ equiv ~ M \, C \, N_ {1} \ cdots N_ {n}}
![{\ displaystyle {\ texttt {match}} _ {C} ~ M ~ {\ texttt {with}} ~ e_ {1} \ mapsto N_ {1} | \ cdots | e_ {n} \ mapsto N_ {n} ~ \ equiv ~ M \, C \, N_ {1} \ cdots N_ {n}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/620cc5e0e4d205b20300373e3a77b7b5806be1c1)
(onde designa o tipo de ramificações do filtro).
VS{\ displaystyle C}![VS](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fc55753007cd3c18576f7933f6f089196732029)
Em particular :
-
E2 ≡ ∀γ(γ→γ→γ) ≡ Bool{\ displaystyle E_ {2} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to \ gamma \ to \ gamma) ~ \ equiv ~ {\ textbf {Bool}}}
(tipo de booleanos);
-
E1 ≡ ∀γ(γ→γ) ≡ Unidade{\ displaystyle E_ {1} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to \ gamma) ~ \ equiv ~ {\ textbf {Unit}}}
(tipo singleton);
-
E0 ≡ ∀γγ ≡ Vazio{\ displaystyle E_ {0} ~ \ equiv ~ \ forall \ gamma \, \ gamma ~ \ equiv ~ {\ textbf {Vazio}}}
(tipo vazio).
O tipo não é habitado por nenhum termo fechado na forma normal e, de acordo com o teorema de normalização forte, não é habitado por nenhum termo fechado.
E0{\ displaystyle E_ {0}}![E_0](https://wikimedia.org/api/rest_v1/media/math/render/svg/411d268de7b1cf300d7481e3fe59f3b20887e0d0)
Produto cartesiano e soma direta
Um e dois tipos. O produto cartesiano é definido no sistema F por
NO{\ displaystyle A}
B{\ displaystyle B}
NO×B{\ displaystyle A \ times B}![A \ vezes B](https://wikimedia.org/api/rest_v1/media/math/render/svg/65f31ae45b0098f06b5d22c38d317eb097a88fa9)
- NO×B ≡ ∀γ((NO→B→γ)→γ){\ displaystyle A \ times B ~ \ equiv ~ \ forall \ gamma \, ((A \ to B \ to \ gamma) \ to \ gamma)}
![{\ displaystyle A \ times B ~ \ equiv ~ \ forall \ gamma \, ((A \ to B \ to \ gamma) \ to \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3a0b8bf3b7f16a9d9788dc24af663cda238301b6)
e a construção do casal por
-
⟨M;NÃO⟩ ≡ Λγ.λf:(NO→B→γ).fMNÃO : NO×B{\ displaystyle \ langle M; N \ rangle ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda f \, {:} \, (A \ to B \ to \ gamma) \ ,. \, f \ , M \, N ~: ~ A \ vezes B}
(se e )M:NO{\ displaystyle M: A \, \!}
NÃO:B{\ displaystyle N: B \, \!}![{\ displaystyle N: B \, \!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4645722c384366ade347eb9b2788a9ce4ad37bcf)
Quanto aos tipos enumerados, pode-se mostrar que os únicos termos fechados na forma normal do tipo são da forma , onde e são termos fechados na forma normal do tipo e , respectivamente. As funções de projeção correspondentes são fornecidas por
NO×B{\ displaystyle A \ times B}
⟨M;NÃO⟩{\ displaystyle \ langle M; N \ rangle}
M{\ displaystyle M}
NÃO{\ displaystyle N}
NO{\ displaystyle A}
B{\ displaystyle B}![B](https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a)
- primeiro ≡ Λα,β.λp:(α×β).pα(λx:α.λy:β.x) : ∀α,β(α×β→α){\ displaystyle {\ textbf {fst}} ~ \ equiv ~ \ Lambda \ alpha, \ beta \ ,. \, \ lambda p \, {:} \, (\ alpha \ times \ beta) \ ,. \, p \, \ alpha \, (\ lambda x \, {:} \, \ alpha \ ,. \, \ lambda y \, {:} \, \ beta \ ,. \, x) ~: ~ \ forall \ alpha , \ beta \, (\ alpha \ times \ beta \ to \ alpha)}
![{\ displaystyle {\ textbf {fst}} ~ \ equiv ~ \ Lambda \ alpha, \ beta \ ,. \, \ lambda p \, {:} \, (\ alpha \ times \ beta) \ ,. \, p \, \ alpha \, (\ lambda x \, {:} \, \ alpha \ ,. \, \ lambda y \, {:} \, \ beta \ ,. \, x) ~: ~ \ forall \ alpha , \ beta \, (\ alpha \ times \ beta \ to \ alpha)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5a94df198b0fa0e6dbc01855c25a201ce6f4c72a)
- snd ≡ Λα,β.λp:(α×β).pβ(λx:α.λy:β.y) : ∀α,β(α×β→β){\ displaystyle {\ textbf {snd}} ~ \ equiv ~ \ Lambda \ alpha, \ beta \ ,. \, \ lambda p \, {:} \, (\ alpha \ times \ beta) \ ,. \, p \, \ beta \, (\ lambda x \, {:} \, \ alpha \ ,. \, \ lambda y \, {:} \, \ beta \ ,. \, y) ~: ~ \ forall \ alpha , \ beta \, (\ alpha \ times \ beta \ to \ beta)}
![{\ displaystyle {\ textbf {snd}} ~ \ equiv ~ \ Lambda \ alpha, \ beta \ ,. \, \ lambda p \, {:} \, (\ alpha \ times \ beta) \ ,. \, p \, \ beta \, (\ lambda x \, {:} \, \ alpha \ ,. \, \ lambda y \, {:} \, \ beta \ ,. \, y) ~: ~ \ forall \ alpha , \ beta \, (\ alpha \ times \ beta \ to \ beta)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/81d99667caa2481463b8e60d55c28006206509e9)
Essas funções verificam naturalmente as igualdades
e .
primeiroNOB⟨M;NÃO⟩=M{\ displaystyle {\ textbf {fst}} \, A \, B \, \ langle M; N \ rangle = M}
sndNOB⟨M;NÃO⟩=NÃO{\ displaystyle {\ textbf {snd}} \, A \, B \, \ langle M; N \ rangle = N}![{\ displaystyle {\ textbf {snd}} \, A \, B \, \ langle M; N \ rangle = N}](https://wikimedia.org/api/rest_v1/media/math/render/svg/da07e72566eae791bd34ed7d40ef227c2c1aeb80)
A soma direta é definida por
NO+B{\ displaystyle A + B}![A + B](https://wikimedia.org/api/rest_v1/media/math/render/svg/4279cdbd3cb8ec4c3423065d9a7d83a82cfc89e3)
- NO+B ≡ ∀γ((NO→γ)→(B→γ)→γ){\ displaystyle A + B ~ \ equiv ~ \ forall \ gamma \, ((A \ to \ gamma) \ to (B \ to \ gamma) \ to \ gamma)}
![{\ displaystyle A + B ~ \ equiv ~ \ forall \ gamma \, ((A \ to \ gamma) \ to (B \ to \ gamma) \ to \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0b804a61fa7ef3b7eb0987ef9c8e2c9dbd260a54)
Os habitantes dos tipos e são imersos no tipo com a ajuda das construções
NO{\ displaystyle A}
B{\ displaystyle B}
NO+B{\ displaystyle A + B}![A + B](https://wikimedia.org/api/rest_v1/media/math/render/svg/4279cdbd3cb8ec4c3423065d9a7d83a82cfc89e3)
-
inl(M) ≡ Λγ.λf:(NO→γ).λg:(B→γ).fM : NO+B{\ displaystyle {\ textbf {inl}} (M) ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda f \, {:} \, (A \ to \ gamma) \ ,. \, \ lambda g \, {:} \, (B \ to \ gamma) \ ,. \, f \, M ~: ~ A + B}
(se )M:NO{\ displaystyle M: A \, \!}![{\ displaystyle M: A \, \!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0c21e1ca9d4f46d24a0feb1999745d9111484a62)
-
em R(M) ≡ Λγ.λf:(NO→γ).λg:(B→γ).gM : NO+B{\ displaystyle {\ textbf {inr}} (M) ~ \ equiv ~ \ Lambda \ gamma \ ,. \, \ lambda f \, {:} \, (A \ to \ gamma) \ ,. \, \ lambda g \, {:} \, (B \ to \ gamma) \ ,. \, g \, M ~: ~ A + B}
(se )M:B{\ displaystyle M: B \, \!}![{\ displaystyle M: B \, \!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2f8b3ae68a506a8ef8bf2c29314fbc071ad913fe)
enquanto a filtragem de elementos de tipo é fornecida pela construção
NO+B{\ displaystyle A + B}![A + B](https://wikimedia.org/api/rest_v1/media/math/render/svg/4279cdbd3cb8ec4c3423065d9a7d83a82cfc89e3)
- partida NÃO com inl(x)↦M1 | em R(y)↦M2 ≡ NÃOVS(λx:NO.M1)(λy:B.M2){\ displaystyle {\ texttt {match}} ~ N ~ {\ texttt {with}} ~ {\ textbf {inl}} (x) \ mapsto M_ {1} ~ | ~ {\ textbf {inr}} (y) \ mapsto M_ {2} ~ \ equiv ~ N \, C \, (\ lambda x \, {:} \, A \ ,. \, M_ {1}) \, (\ lambda y \, {:} \ , B \ ,. \, M_ {2})}
![{\ displaystyle {\ texttt {match}} ~ N ~ {\ texttt {with}} ~ {\ textbf {inl}} (x) \ mapsto M_ {1} ~ | ~ {\ textbf {inr}} (y) \ mapsto M_ {2} ~ \ equiv ~ N \, C \, (\ lambda x \, {:} \, A \ ,. \, M_ {1}) \, (\ lambda y \, {:} \ , B \ ,. \, M_ {2})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c4bc94ceb5e738ecf479bd318b9a6d56fe68acaf)
que satisfaz a igualdade de definição esperada.
Ao contrário do produto cartesiano, a codificação da soma direta no sistema F nem sempre captura a noção de união disjunta, na medida em que é possível, em certos casos, construir termos fechados em forma normal de tipo que não são nem da forma (com ) nem da forma (com ) .
NO+B{\ displaystyle A + B}
inl(M){\ displaystyle {\ textbf {inl}} (M)}
M:NO{\ displaystyle M: A}
em R(M){\ displaystyle {\ textbf {inr}} (M)}
M:B{\ displaystyle M: B}![{\ displaystyle M: B}](https://wikimedia.org/api/rest_v1/media/math/render/svg/943c98785e1332a55a1484d8c4ca7ca86de9b166)
Inteiros da igreja
O tipo de inteiros da Igreja é definido no sistema F por
- NÃOnot ≡ ∀γ(γ→(γ→γ)→γ){\ displaystyle \ mathbf {Nat} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to (\ gamma \ to \ gamma) \ to \ gamma)}
![{\ displaystyle \ mathbf {Nat} ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ to (\ gamma \ to \ gamma) \ to \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4e0fd65efd0111cb1521fefe26fd137e2327f927)
Cada número natural é representado pelo termo
não{\ displaystyle n}![não](https://wikimedia.org/api/rest_v1/media/math/render/svg/a601995d55609f2d9f5e233e36fbe9ea26011b3b)
- não¯ ≡ Λγλx:γ.λf:(γ→γ).f(⋯(f⏟nãox)⋯) : NÃOnot{\ displaystyle {\ bar {n}} ~ \ equiv ~ \ Lambda \ gamma \, \ lambda x \, {:} \, \ gamma \ ,. \, \ lambda f \, {:} \, (\ gamma \ to \ gamma) \ ,. \, \ underbrace {f (\ cdots (f} _ {n} \, x) \ cdots) ~: ~ \ mathbf {Nat}}
![{\ displaystyle {\ bar {n}} ~ \ equiv ~ \ Lambda \ gamma \, \ lambda x \, {:} \, \ gamma \ ,. \, \ lambda f \, {:} \, (\ gamma \ to \ gamma) \ ,. \, \ underbrace {f (\ cdots (f} _ {n} \, x) \ cdots) ~: ~ \ mathbf {Nat}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c53c9661fcec3743bc055d8d5c20f2932755a087)
Quanto aos booleanos, o tipo captura a noção de inteiro natural, pois qualquer termo fechado de tipo na forma normal tem a forma de um certo inteiro natural .
NÃOnot{\ displaystyle \ mathbf {Nat}}
NÃOnot{\ displaystyle \ mathbf {Nat}}
não¯{\ displaystyle {\ bar {n}}}
não{\ displaystyle n}![não](https://wikimedia.org/api/rest_v1/media/math/render/svg/a601995d55609f2d9f5e233e36fbe9ea26011b3b)
Apresentação no Curry
A função de apagar
- |x|=x{\ displaystyle | x | = x}
![{\ displaystyle | x | = x}](https://wikimedia.org/api/rest_v1/media/math/render/svg/55d2c1e557cc3eedc06f8cc736efca5add7066dc)
- |λx:NO.M|=λx.|M|{\ displaystyle | \ lambda x: AM | = \ lambda x. | M |}
![{\ displaystyle | \ lambda x: AM | = \ lambda x. | M |}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7f478c2f6432628ed11b0f70b5fa3d810ffe4af1)
- |MNÃO|=|M||NÃO|{\ displaystyle | MN | = | M || N |}
![{\ displaystyle | MN | = | M || N |}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f2f1f66fcf481d0ecc6067fbe861f77dadf8cb1a)
- |Λα.M|=|M|{\ displaystyle | \ Lambda \ alpha .M | = | M |}
![{\ displaystyle | \ Lambda \ alpha .M | = | M |}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a12d8c090ef916a052af24873a6028f03400d943)
- |MNO|=|M|{\ displaystyle | MA | = | M |}
![{\ displaystyle | MA | = | M |}](https://wikimedia.org/api/rest_v1/media/math/render/svg/739490a0a2d482cef77d0505f7a87ee1c73b1b6c)
O sistema de tipo
- ( Axioma ) seΓ⊢x:NO{\ displaystyle {\ frac {} {\ Gamma \ vdash x: A}}}
(x:NO)∈Γ{\ displaystyle (x: A) \ in \ Gamma}
- ( -intro )→{\ displaystyle \ to}
Γ,x:NO⊢M:BΓ⊢λx.M:NO→B{\ displaystyle {\ frac {\ Gamma, x: A \ vdash M: B} {\ Gamma \ vdash \ lambda xM: A \ to B}}}
- ( -elim )→{\ displaystyle \ to}
Γ⊢M:NO→BΓ⊢NÃO:NOΓ⊢MNÃO:B{\ displaystyle {\ frac {\ Gamma \ vdash M: A \ to B \ quad \ Gamma \ vdash N: A} {\ Gamma \ vdash MN: B}}}
- ( -intro ) se não tiver ocorrência livre em∀{\ displaystyle \ forall}
Γ⊢M:BΓ⊢M:∀α B{\ displaystyle {\ frac {\ Gamma \ vdash M: B} {\ Gamma \ vdash M: \ forall \ alpha ~ B}}}
α{\ displaystyle \ alpha}
Γ{\ displaystyle \ Gamma}
- ( -elim ) .∀{\ displaystyle \ forall}
Γ⊢M:∀α BΓ⊢M:B{α: =NO}{\ displaystyle {\ frac {\ Gamma \ vdash M: \ forall \ alpha ~ B} {\ Gamma \ vdash M: B \ {\ alpha: = A \}}}}![{\ displaystyle {\ frac {\ Gamma \ vdash M: \ forall \ alpha ~ B} {\ Gamma \ vdash M: B \ {\ alpha: = A \}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6c985c1d6f81d93a371d63abc8cc3f69b8f14a98)
Equivalência entre os dois sistemas
O teorema de normalização forte
Os termos tipáveis do sistema F são fortemente normalizáveis , ou seja, a redução dos termos é uma operação que sempre termina produzindo uma forma normal.
Correspondência com lógica de segunda ordem
Por meio da correspondência Curry-Howard , o sistema F corresponde exatamente à lógica mínima de segunda ordem , cujas fórmulas são construídas a partir de variáveis proposicionais usando implicação e quantificação proposicional:
NO,B : = α | NO⇒B | ∀αB{\ displaystyle A, B ~~: = ~~ \ alpha ~~ | ~~ A \ Rightarrow B ~~ | ~~ \ forall \ alpha \, B}
Lembre-se de que, neste quadro, as unidades (verdade) e (absurdo), os conectores (negação), (conjunção) e (disjunção) e a quantificação existencial são definíveis por
⊤{\ displaystyle \ top}
⊥{\ displaystyle \ bot}
¬{\ displaystyle \ lnot}
∧{\ displaystyle \ land}
∨{\ displaystyle \ lor}
∃αB(α){\ displaystyle \ exists \ alpha \, B (\ alpha)}![{\ displaystyle \ exists \ alpha \, B (\ alpha)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3cbf9e56a77e69ff6571cee078b9acccdcd91222)
- ⊤ ≡ ∀γ(γ⇒γ){\ displaystyle \ top ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ Rightarrow \ gamma)}
![{\ displaystyle \ top ~ \ equiv ~ \ forall \ gamma \, (\ gamma \ Rightarrow \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a176b45b537b5d7285b527219f58511975bd0c55)
- ⊥ ≡ ∀γγ{\ displaystyle \ bot ~ \ equiv ~ \ forall \ gamma \, \ gamma}
![{\ displaystyle \ bot ~ \ equiv ~ \ forall \ gamma \, \ gamma}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dfc4f489392a77becd46f5b66d9b42e9b8ed1461)
- ¬NO ≡ NO⇒⊥{\ displaystyle \ lnot A ~ \ equiv ~ A \ Rightarrow \ bot}
![{\ displaystyle \ lnot A ~ \ equiv ~ A \ Rightarrow \ bot}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5725b9f639130f49606ea44d27bd4c2c5926b938)
- NO∧B ≡ ∀γ((NO⇒B⇒γ)⇒γ){\ displaystyle A \ land B ~ \ equiv ~ \ forall \ gamma \, ((A \ Rightarrow B \ Rightarrow \ gamma) \ Rightarrow \ gamma)}
![{\ displaystyle A \ land B ~ \ equiv ~ \ forall \ gamma \, ((A \ Rightarrow B \ Rightarrow \ gamma) \ Rightarrow \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/26637341a2165e1fc326fbe3fb3734712dc53b70)
- NO∨B ≡ ∀γ((NO⇒γ)⇒(B⇒γ)⇒γ){\ displaystyle A \ lor B ~ \ equiv ~ \ forall \ gamma \, ((A \ Rightarrow \ gamma) \ Rightarrow (B \ Rightarrow \ gamma) \ Rightarrow \ gamma)}
![{\ displaystyle A \ lor B ~ \ equiv ~ \ forall \ gamma \, ((A \ Rightarrow \ gamma) \ Rightarrow (B \ Rightarrow \ gamma) \ Rightarrow \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ca4c853d062ad34d1d75004718f8c8c13b424695)
- ∃αB(α) ≡ ∀γ(∀α(B(α)⇒γ)⇒γ){\ displaystyle \ exists \ alpha \, B (\ alpha) ~ \ equiv ~ \ forall \ gamma \, (\ forall \ alpha \, (B (\ alpha) \ Rightarrow \ gamma) \ Rightarrow \ gamma)}
![{\ displaystyle \ exists \ alpha \, B (\ alpha) ~ \ equiv ~ \ forall \ gamma \, (\ forall \ alpha \, (B (\ alpha) \ Rightarrow \ gamma) \ Rightarrow \ gamma)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ea9910787f38b7e240d6233682e64cba0de35555)
(Observe que, por meio da correspondência Curry-Howard, o absurdo corresponde ao tipo vazio, a verdade ao tipo singleton, a conjunção ao produto cartesiano e a disjunção à soma direta.)
Provamos que, neste formalismo, uma fórmula é demonstrável sem hipóteses se e somente se o tipo correspondente no sistema F é habitado por um termo fechado.
Correspondência com aritmética de segunda ordem
Bibliografia
-
Lambda-calculus, types and models , Jean-Louis Krivine , capítulo VIII, Masson , 1990, ( ISBN 2-225-82091-0 )
-
Provas e tipos ,Jean-Yves Girard, Paul Taylor, Yves Lafont, capítulo 11,Cambridge University Press, 1989, ( ISBN 0-521-37181-3 )
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">