Escolar Documentos
Profissional Documentos
Cultura Documentos
Fundmat PDF
Fundmat PDF
Resumo
O presente texto visa descrever alguns aspectos da fundamentação da
matemática, mostrando, a partir de uma visão histórica, como alguns
conceitos de matemática foram formalizados. A ênfase será sobre a teoria
de conjuntos e “resolução” de paradoxos. Também será dada uma apre-
sentação formal da teoria de provas, onde sistemas lógicos servirão como
ferramenta para a fundamentação de conceitos tais como a “demonstração
por absurdo”. Por fim, será apresentada o teorema da incompletude de
Gödel que diz, basicamente, que dentro de um determinado ramo da ma-
temática que possui um número finito de axiomas (como, por exemplo,
a aritmética de Peano), existem sempre teoremas (ou seja, proposições
verdadeiras) que não podem ser provados.
1
Sumário
1 Fundamentos da matemática 4
3 Lógica intuicionista 10
3.1 Semântica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 Lógica e Matemática 13
6 Sistema de Frege 16
6.1 Idéias básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.2 O sistema formal . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.3 Paradoxos e a teoria de tipos de Russell . . . . . . . . . . . . . . 20
9 λ-calculus e computabilidade 34
11 Isomorfismo de Curry-Howard 45
2
12 Tipos e Significados: Semântica 47
12.1 Semântica Denotacional . . . . . . . . . . . . . . . . . . . . . . . 48
12.2 Semântica Operacional . . . . . . . . . . . . . . . . . . . . . . . . 50
14 Lógica Linear 57
14.1 Semântica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
16 Logical frameworks 60
16.1 Lógica Linear como framework para especificar sistemas de seqüen-
tes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3
1 Fundamentos da matemática
O termo “fundamentos da matemática” (em inglês, foundations of mathematics)
é em geral usado para certas áreas da matemática, como por exemplo a lógica
matemática, teoria de conjuntos axiomática, teoria de provas, teoria de modelos,
teoria da recursão. A procura de fundamentos para a matemática é também
uma questão central de filosofia da matemática: quando podemos dizer que uma
afirmação matemática pode ser chamada verdadeira?
No paradigma matemático dominante atualmente, a verdade de uma afir-
mativa pode ser derivada dos axiomas da teoria de conjuntos usando regras de
lógica formal.
A preocupação em estabelecer uma base lógica e filosófica para a matemática
começou com os Elementos de Euclides. Essencialmente, Euclides foi o primeiro
a questionar quando os axiomas de um certo cálculo (no seu caso, a geometria),
podem assegurar completeza e consistência. Na era moderna, esse debate deu
origem a três escolas de pensamento: logicismo, formalismo e intuicionismo.
Logicistas propõe que objetos matemáticos abstratos devem ser inteiramente
desenvolvidos a partir de idéias básicas de conjuntos e pensamento racional ou
lógico.
Formalistas acreditavam que a matemática era a manipulação de confi-
gurações de sı́mbolos de acordo com regras prescritas, um jogo, independente
de qualquer interpretação fı́sica dos sı́mbolos.
Intuicionistas rejeitam certos conceitos de lógica e a noção que um método
axiomático seria suficiente para explicar toda a matemática, e vêem a ma-
temática como uma atividade intelectual que lida com construções mentais
(construtivismo), independente da linguagem e de qualquer realidade externa.
O presente texto diz respeito apenas ao logicismo e, portanto, visa estudar as
idéias básicas da teoria de conjuntos (de Zermelo-Fraenkel), bem como a teoria
de provas, tendo como pano de fundo sempre a lógica clássica.
4
provas, que serão apresentados a seguir.
Começaremos pela sintaxe (ou notação). A idéia é que expressões válidas
da linguagem lógica são seqüências especiais de sı́mbolos de um dado alfabeto,
geradas por uma definição indutiva (gramática). Desta forma, partindo do
alfabeto básico:
ALFABETO
Letras : A, B, C, ...
Conectivos : ¬, ∧, ∨, ⇒, ⊥
Agrupamento : (·)
as fórmulas da lógica clássica proposicional de primeira ordem são dadas pela
gramática:
GRAMÁTICA
F ::= A|(¬F )|(F ∧ F )|(F ∨ F )|(F ⇒ F )|⊥|∀x.F |∃x.F
que significa que uma fórmula F pode ser uma proposição atômica (ou seja,
uma fórmula A sem conectivos lógicos), a negação de uma fórmula, a conjunção
de duas fórmulas, a disjunção de duas fórmulas, implicação, falso ou fórmulas
quantificadas (para todo e existe).
Vale ressaltar que a gramática acima não é minimal. De fato, podemos, por
exemplo, identificar ¬A com A ⇒ ⊥. Mas escrever a negação de forma concisa
facilitará a visualização de provas em dedução natural, que veremos a seguir.
Outra observação importante é que ⊥ não é uma fórmula atômica, mas sim o
zero-ário do conectivo ∨.
A segunda parte de um sistema lógico consiste em estabelecer os axiomas e
as regras de inferência do sistema.
Existem diversas formas de se definir regras e axiomas de um sistema lógico
formal. Começaremos por descrever rapidamente os sistemas de Hilbert.
Os sistemas de Hilbert (também chamados de sistemas axiomáticos) são
muito utilizados por filósofos para formalizar a argumentação lógica. Tais sis-
temas são, em geral, fáceis de serem compreendidos, mas extremamente difı́ceis
de serem usados para provar teoremas. Sistemas de Hilbert possuem um grande
número de axiomas básicos, como por exemplo:
⊢ A ⊃ A ∨ B ou ⊢ A ⊃ (B ⊃ A)
(A)
..
.
B
A⇒B
5
parêntesis em torno de A) para produzir A ⇒ B. Desta forma, uma prova de
B depende de uma prova de A, enquanto que a prova de A ⇒ B não.
Utilizaremos aqui uma presentação mais moderna de dedução natural, que
utiliza um sistema à la cálculo de seqüentes (veja Seção A.2), onde as afirmativas
a serem “descartadas” na linha de inferência são anotadas no contexto. Isto
é, os nodos da árvore de uma derivação deixam de ser fórmulas para se tornar
seqüentes da forma Γ ⊢ C, onde Γ é um conjunto de fórmulas chamado contexto
ou antecedente enquanto que C uma fórmula chamada sucedente. Desta forma,
a regra acima pode ser re-escrita como:
A⊢B
⊢A⇒B
Nesta presentação, a lógica clássica tem um e apenas um axioma:
Inicial
Γ, A ⊢ A
que diz que uma fórmula é provável a partir de si mesma.
Como exemplo de regra de inferência, apresentamos aqui o famoso modus
ponens1 :
Γ ⊢ A Γ ⊢ A ⇒ B (⇒ E)
Γ⊢B
Informalmente, essa regra diz que se temos uma função do tipo A ⇒ B e um
argumento do tipo A, então podemos aplicar a função ao argumento e obter um
resultado do tipo B.
Veja a Figura 1 para lista completa das regras de dedução natural para a
lógica cássica.
Vale a pena observar que, em lógica cássica, vale o tão comentado princı́pio
do meio excluı́do. Ou seja, a proposição
p ∨ ¬p
é sempre válida. Isso significa que uma fórmula é sempre ou verdadeira, ou
falsa.
Essa afirmação é extremamente não construtiva, uma vez que nada se pode
dizer de qual das das opções é valida. Existe uma série de conseqüências que
derivam dessa fórmula, e esse será objeto de um estudo cuidadoso durante o
decorrer destas notas.
A prova formal do princı́pio do meio excluı́do utilizando as regras de dedução
natural (Figura 1) é:
(Inicial)
¬(p ∨ ¬p), p ⊢ p
(∨I1 ) (Inicial)
¬(p ∨ ¬p), p ⊢ p ∨ ¬p ¬(p ∨ ¬p) ⊢ ¬(p ∨ ¬p)
(¬E)
¬(p ∨ ¬p), p ⊢ ⊥
(¬I)
¬(p ∨ ¬p) ⊢ ¬p
(∨I2 ) (Inicial)
¬(p ∨ ¬p) ⊢ p ∨ ¬p ¬(p ∨ ¬p) ⊢ ¬(p ∨ ¬p)
(¬E)
¬(p ∨ ¬p) ⊢ ⊥
(¬I)
⊢ ¬¬(p ∨ ¬p)
(DN )
⊢ p ∨ ¬p
1 Esta é uma regra de eliminação, própria de sistemas descritos em dedução natural. Veja
6
Inicial
Γ, A ⊢ A
2.1 Semântica
Com relação à semântica (significado dos sı́mbolos lógicos), no caso proposici-
onal (isto é, sem os quantificadores) o significado de fórmulas em lógica pode
ser dado de maneira trivial, baseado na tabela da verdade, ou um pouco mais
elaborada utilizando, por exemplo, álgebras de Boole.
7
fórmulas A ⇒ B, ¬B ⇒ ¬A e ¬(A ∧ ¬B) possuem o mesmo comportamento:
B segue de A
utilizando qualquer dos seguintes métodos:
direto, contra-recı́proco, por absurdo
são equivalentes.
1. a + b = b + a
2. (a + b) + c = a + (b + c)
3. ∃0 ∈ R tal que a + 0 = a ∀a ∈ R
4. ∀a.∃(−a) tal que a + (−a) = 0
5. (a.b).c = a.(b.c)
6. a.(b + c) = a.b + a.c e (b + c).a = b.a + c.a
8
Definição 2 (Álgebra Booleana) Uma álgebra Booleana é um anel (R, +, ·, 0, 1)
no qual cada elemento é idempotente com relação à multiplicação (ou seja, igual
ao seu quadrado).
X∆Y = (X ∪ Y ) − (X ∩ Y ) = (X ∩ (A − Y )) ∪ ((A − X) ∩ Y ).
ϕ ∼ ψ se e somente se ⊢ ϕ ⇒ ψ e ⊢ ψ ⇒ ϕ
−a ∩ a = [⊥]∼ e − a ∪ a = [⊤]∼ .
9
[[p]]vc = v(p) para p ∈ P V
[[⊥]]vc = 0
[[ϕ ∨ ψ]]vc = [[ϕ]]vc ∪ [[ψ]]vc
[[ϕ ∧ ψ]]vc = [[ϕ]]vc ∩ [[ψ]]vc
[[ϕ ⇒ ψ]]vc = [[ϕ]]vc → [[ψ]]vc
Escreveremos Γ |= ϕ sempre que [[Γ]]vc = 1 implica [[ϕ]]vc = 1 para todos B e
v relacionados com a álgebra de Boole F∼ .
O seguinte teorema diz que o modelo semântico baseado em álgebra de Boole
é completo e “sound”:
Teorema 1 As seguintes condições são equivalentes:
1. Γ ⊢ ϕ;
2. Γ |= ϕ.
3 Lógica intuicionista
Como descrito na Seção 2, o entendimento clássico de lógica é baseado na noção
de verdade. Ou seja, a veracidade de uma afirmativa é “absoluta” e indepen-
dente de qualquer argumentação, crença ou ação.
Desta forma, afirmativas são ou falsas ou verdadeiras (princı́pio do meio
excuı́do), onde falso é a mesma coisa que não verdadeiro (veja Tabela 1).
Claro que essa abordagem de pensamento é muito intuitiva e baseada em
experiência e observação. Para um matemático preocupado em provar um teo-
rema, é importante a idéia de que toda afirmativa pode ser provada verdadeira
se uma prova é apresentada ou falsa se existe um contra-exemplo. Além disso,
várias técnicas de demostração utilizam implicitamente o princı́pio do meio ex-
cluı́do.
Considere o seguinte exemplo:
10
existe uma prova de que existem sete 7’s consecutivos na representação
decimal do número π.
e chamemos de t o predicado dado pelo enunciado do Teorema 3. Parece claro
que p ⇔ t. Mas isso vale somente se p é verdadeiro. Se p é falso não se pode
dizer que t é falso.
Esse é um exemplo de uma afirmativa para a qual não existe sentido a sua
negação. Ou seja, o princı́pio do meio excluı́do não se encaixa em um sistema que
possui esse tipo de “teorema”. Observe que aqui “infinitude” está envolvida.
Ou seja, muito provavelmente, provar o Teorema 3 significa testar todas as
(infinitas) possibilidades.
A lógica intuicionista abandona a idéia de verdade absoluta, e afirmativas
são consideradas válidas se e somente se existe uma prova construtiva da mesma.
Ou seja, o princı́pio do meio excluı́do não é mais válido.
Com relação ao sistema de provas da lógica intuicionista, em dedução natural
as regras são as mesmas das apresentadas na Figura 1, com excessão da regra de
dupla negação, (DN ). Já em cálculo de seqëntes, a presentação mais conhecida
é o sistema de Gentzen LJ, onde os seqüentes válidos possuem exatamente
uma fórmula como sucedente e as regras de weakening and contraction não são
válidas à direita. Isto é, são consideradas todas as regras da Figura A.2 menos
as regras weakR e contR. Daremos maiores detalhes na Seção 8.
5. ((p ⇒ q) ⇒ p) ⊢ p
6. ⊢ (p ⇒ q) ∨ (q ⇒ p)
Mas apenas (1), (2) e (3) apresentam provas construtivas, isto é, são prováveis
intuicionisticamente.
3.1 Semântica
Um dos modelos semânticos mais populares para a lógica intuicionista é baseado
em álgebras de Heyting. Descreveremos aqui (de maneira resumida) a semântica
para o caso proposicional [31].
Seja Φ o conjunto de todas as fórmulas proposicionais da lógica intuicionista,
considere Γ ⊆ Φ e seja ∼ a seguinte relação de equivalência:
ϕ ∼ ψ se e somente se Γ ⊢ ϕ ⇒ ψ e Γ ⊢ ψ ⇒ ϕ
11
Podemos também definir as seguintes (bem definidas) operações sobre LΓ :
(a ∪ b) ∩ c = (a ∩ c) ∪ (b ∩ c) e (a ∩ b) ∪ c = (a ∪ c) ∩ (b ∪ c)
O máximo que podemos afirmar é que −a é o maior elemento tal que −a∩a =
0. Chamamos −a de pseudo-complemento de a. Uma vez que a negação é um
caso especial de implicação (pois ¬a ≡ a ⇒ ⊥), o que foi dito acima merece
uma generalização. Um elemento c é chamado um pseudo-complemento relativo
de a com relação a b se e somente se c é o maior elemento tal que a ∩ c ≤ b. O
pseudo-complemento relativo, caso existir, é denotado por a ⇀ b.
Não é difı́cil de ver que na álgebra LΓ (comumente chamada de álgebra de
Lindenbaum), temos
[ϕ]∼ ⇀ [ψ]∼ = [ϕ ⇒ ψ]∼ .
Formalmente, uma álgebra de Heyting (ou álgebra pseudo-Booleana), é um
sistema algébrico H que é um reticulado distributivo contendo o zero e que
possui um pseudo-complemento relativo definido para cada par de elementos.
Em particular, cada álgebra de Boolean é uma álgebra de Heyting com a ⇀ b
definido como −a ∪ b 3 .
A semântica da lógica intuicionista proposicional é dada pela aplicação [[•]]i ,
definida a seguir.
12
Escreveremos Γ |= ϕ sempre que [[Γ]]vi = 1 implica [[ϕ]]vi = 1 para todos H e
v relacionados com a álgebra de Heyting H.
O seguinte teorema diz que o modelo semântico baseado em álgebra de Hey-
ting é completo e “sound”:
Teorema 4 As seguintes condições são equivalentes:
1. Γ ⊢ ϕ;
2. Γ |= ϕ.
4 Lógica e Matemática
Para muitos, lógica não faz parte da matemática. De fato, parece paradoxal di-
zer que a lógica é um ramo da matemática, uma vez que a lógica é o instrumento
utilizado para a formalização da matemática.
Na realidade, o estudo da lógica como um modelo para a matemática, sendo
ao mesmo tempo uma parte da matemática não forma um cı́rculo vicioso, mas
pode ser entendido como uma escada em espiral. Se a matemática está no n-
ésimo degrau (chamado degrau intuitivo), o degrau n + 1 contém um modelo
reduzido, um protótipo (degrau formal). A passagem do degrau n para o degrau
n + 1 é chamado formalização.
Com relação à lógica, a passagem do degrau n para o degrau n + 1 implica
em aumentar a ordem. Então, a lógica clássica de primeira ordem (que é um
ramo da matemática) dá origem à lógica de segunda ordem (que contém toda a
matemática), onde predicados podem ser quantificados, e não apenas variáveis.
É interessante também ressaltar que, nas áreas clássicas da matemática, o
propósito inicial é propor um modelo matemático para alguma situação mais
ou menos concreta. Com a lógica, acontece algo similar. A sua particularidade
reside no fato de que a “realidade” que a lógica visa descrever não é fora do
mundo matemático, mas sim a própria matemática. Desta forma, do mesmo
modo que um matemático não confunde o ambiente fı́sico em que vive com um
espaço vetorial euclideano tri-dimensional, um pesquisador na área de lógica
não a confunde com a matemática sendo descrita.
Por fim, observe que tanto na matemática quanto na lógica, o estudo de mo-
delos dá origem ao aparecimento de novos ramos de estudo, que aparentemente
nada ou pouco têm a ver com o objetivo inicial de descrever um “objeto”, seja ele
concreto ou não. Desta forma, a lógica como disciplina passa a ter vida própria,
e o seu estudo não se limita ao caso clássico. Isto justifica o aparecimento e
estudo de lógicas como a intuicionista, linear, fuzzy, modal, etc.
13
passos em lógica formal, mas não possuiam nem mesmo um sistema numérico:
trabalhavam com comprimentos de segmentos de reta e suas razões. Eles clara-
mente reconheciam pontos e retas como entidades abstratas e não-fı́sicas, apesar
de saber que a geometria por eles desenvolvida podia ser aplicada a problemas
práticos de medição de espaço, por exemplo.
O cálculo diferencial foi inventado ao mesmo tempo por Newton e Leibniz, o
primeiro claramente motivado por um forte sentido de realidade fı́sica, enquanto
que o segundo estava muito mais interessado em lógica e matemática formal.
De qualquer forma, existem vários pontos fundamentais nos quais a maioria
dos matemáticos concorda, independentemente de convicções filosóficas, relaci-
onados à natureza da matemática. A primeira é que a matemática é abs-
trata, e isso consiste essencialmente em argumentar com abstrações. A segunda
é que a verdade ou falsidade de uma proposição em matemática é determinada
por um processo de dedução, ou seja, mostrando que uma proposição pode
ser provada tendo como base alguns princı́pios ou verdades assumidas. Esse
processo difere de outras ciências ao menos em um aspecto: todas as outras
ciências (mesmo uma tão abstrata quanto a fı́sica teórica) dependem de uma
certa quantidade de manipulação do mundo fı́sico. Ou seja, as hipóteses e leis
são consideradas válidas apenas depois de serem testadas através de algum ex-
perimento. Em matemática, teoremas são provados (portanto estabelecendo a
sua veracidade) sem a necessidade de convalidar o resultado no mundo fı́sico.
Desta forma, o primeiro ingrediente dos estudos modernos dos fundamentos
da matemática é a visão da matemática como uma ciência independente da
realidade fı́sica, uma ciência cujos objetos de estudo são sistemas abstratos e
auto-consistentes, e que usa a prova como técnica principal para determinar a
verdade.
Então, o que é uma prova? Praticamente falando, uma prova é qualquer
argumento razoável aceito como tal pelos matemáticos. Esta definição é muito
imprecisa, e não dá pistas de que tipo de proposições podem ser provadas ou
não. Essa é uma das razões para o estudo de lógica matemática.
14
Após a aritmetização da Análise, veio a generalização da Geometria, criando
a Topologia, que hoje é uma disciplina independente. As duas possuem uma
interseção quando se fala de espaços métricos.
Neste ponto, ficou claro que a fundamentação matemática necessária para
suportar esse boom de novas teorias e áreas da matemática deveria ir muito
além de reduzir tudo aos números naturais. De fato, eram necessários: os
naturais e mais uma série de argumentações baseadas em teoria de conjuntos.
O problema é que a teoria de conjuntos usada na época era extremamente
ingênua, e o aparecimento de contradições lógicas (ou paradoxos) estremeceu a
base da argumentação matemática.
Alguma coisa tinha que ser feita, e foi daı́ que surgiram os primeiros esforços
de axiomatizar a teoria de conjuntos. Esse assunto foi definitivamente encerrado
na primeira década do século XX, quando Zermelo publicou o seu trabalho, logo
complementado por Fraenkel. Surge então a teoria de conjuntos de Zermelo-
Fraenkel, que será o objeto de estudo da Seção 7.
15
6. A construção da matemática do dia-a-dia no sistema adotado deve ser
natural e ordenada.
6 Sistema de Frege
No começo de sua carreira, Georg Cantor investigou conjuntos de pontos de des-
continuidade em funções que admitiam representações de Fourier. Ele também
apresentou uma construção dos números reais a partir dos racionais, e mostrou
que existe muito mais reais que racionais. Cantor seguia uma noção de conjun-
tos abstratos, trabalhando com hierarquias tais como o “conjunto de todos os
subconjuntos”.
Mas o que vem a ser um conjunto abstrato? Em alguns textos matemáticos
muito, mas muito antigos, um conjunto é definido como sendo uma aglomeração
de elementos, que se juntam de maneira arbitrária e vêm de fontes independen-
tes. Mas essa definição, além de ser muito doida, entra em conflito direto com
a prática matemática, que busca sempre a descrição formal e precisa dos entes
a serem definidos, e possui pouca aplicação prática também em filosofia.
16
Esta condição não pode ser deduzida a partir da noção de co-extenção. Ou seja,
se desejamos que co-extensão caracterize a identidade entre conjuntos, então essa
condição (ou princı́pio) deve ser posta como axioma. Esse princı́pio é conhecido
como o princı́pio ou axioma da extensionalidade.
Observamos que o princı́pio da extensionalidade pode parecer óbvio, mas é
possı́vel formular uma teoria de conjuntos coerente em que tal princı́pio não
vale.
Uma vez que acreditamos no princı́pio da extensionalidade, surge uma outra
questão: toda propriedade define um conjunto? Ou seja, dada uma propriedade
P , existe um conjunto definido exatamente por aqueles objetos que satisfazem a
condição P ? A tese de que toda propriedade ou condição define um conjunto é
conhecida como princı́pio da abstração (o conjunto é abstraı́do da propriedade
que o define). Formalmente:
∀P.∃A.∀x.(x ∈ A ≡ P (x))
∀z.z ∈ x ≡ z ∈ y
17
F2. ∀x.x ∈ {y | A(y)} ≡ A(x) onde A(y) contém y livre, x é livre em y em
A(y) e A(x) é obtido de A(y) substituindo y por x em todas as ocorrências
livres de y em A(y).
Teorema 5 ⊢ ∀x.x = x
como querı́amos.
Definição 5 V denota {x | x = x}
Teorema 6 ⊢ ∀x.x ∈ V
Definição 6 ∅ denota {x | x 6= x}
Teorema 7 ⊢ ∀x.x ∈
/∅
Teorema 8 ⊢ 0 ∈ N
18
Ou seja, 0 é um número natural. Também, 0 não é o sucessor de nenhum
número natural:
Teorema 13 ⊢ {x | x ∈
/ x} ∈
/ {x | x ∈
/ x}
Teorema 14 ⊢ {x | x ∈
/ x} ∈ {x | x ∈
/ x}
19
Mas, apesar de ser inconsistente, nem tudo o que foi desenvolvido por Frege
era errado. Por exemplo, a construção dos conjuntos numéricos é consistente.
O erro consistiu em considerar o princı́pio da abstração de uma maneira geral.
Então a pergunta que surge é: é possı́vel propor um sistema baseado nas
idéias de Frege que não seja contraditório? Veja a resposta na Seção 7.
20
mesmo que cada número natural possui um sucessor diverso. Desta forma, a
tentativa de Russell de reduzir a matemática à lógica foi um fracasso.
21
O princı́pio da separação pode ser definido de maneira intuitiva:
Para cada condição P (que possa ser expressa por uma fórmula lógica
na nossa teoria formal) e para cada conjunto y dado, o conjunto de
todos os elementos de y que satisfazem a propriedade P existe.
⊢ ∀y.∃x.∀z.(z ∈ x) ≡ (z ∈ y) ∧ P (z)
o que implica
⊢ ∃x1 .∀x2 .(x2 ∈
/ x1 )
Observe que nenhuma fórmula lógica P dá origem ao conjunto universal.
Com o princı́pio da separação podemos apenas construir o conjunto vazio.
Todos os outros conjuntos devem ser subconjuntos de conjuntos dados. Então
devemos determinar quais são esses conjuntos. Basicamente, conjuntos válidos
são construı́dos através do conjunto vazio e operações básicas como power set e
união. Temos necessidade de outros postulados (ou axiomas) para garantir essas
operações. Esses axiomas adicionais, juntamente com o princı́pio da separação,
constituem o sistema de Zermelo-Fraenkel (ZF).
7.2 Formalização de ZF
A gramática de termos e fórmulas de ZF é basicamente a mesma descrita
anteriormente para o sistema de Frege, exceto pela introdução de termos que
são operadores primitivos, que serão apresentados ao longo do texto.
A primeira definição de ZF é a de igualdade, igual à definição de Frege:
∀z.z ∈ x ≡ z ∈ y
onde x e y são quaisquer termos nos quais a variável z não ocorre livre.
22
Prova Considere a dedução abaixo:
x1 = x2 ⊢ (x1 ∈ x3 ) ≡ (x2 ∈ x3 )
(∀I)
x1 = x2 ⊢ ∀x3 .(x1 ∈ x3 ) ≡ (x2 ∈ x3 )
(⇒ I)
⊢ (x1 = x2 ) ⇒ ∀x3 .(x1 ∈ x3 ) ≡ (x2 ∈ x3 )
(∀I)
⊢ ∀x1 .∀x2 .((x1 = x2 ) ⇒ ∀x3 .(x1 ∈ x3 ) ≡ (x2 ∈ x3 ))
Pelo axioma ZF1 com x = x1 , y = x2 e A(x, x) = ∀x3 .x ∈ x3 ≡ x ∈ x3 :
⊢ (x1 = x2 ) ⇒ ∀x3 .(((x1 ∈ x3 ) ≡ (x1 ∈ x3 )) ≡ ((x1 ∈ x3 ) ≡ (x2 ∈ x3 )))
Logo,
23
ZF4. ∀x.∀y.x ∈ P(y) ≡ (x ⊂ y).
Seja {y, z} a representação da função primitiva que indica o par não ordenado
de y e z, ou o conjunto cujos únicos elementos são y e z.
24
que em qualquer famı́lia de conjuntos não vazios (mesmo que sejam infinitos)
existe ao menos uma função de escolha é chamado o axioma da escolha. Esse
princı́pio foi proposto por Zermelo em 1904.
Formalmente, o axioma da escolha diz o seguinte:
ZF10. ∀x.x 6= 0 ⇒ σ(x) ∈ x onde σ é a representação da função primitiva que
indica a função escolha.
σ(x) escolhe exatamente um elemento do conjunto não vazio x. Claramente,
σ escolhe o mesmo elemento para dois conjuntos iguais:
Teorema 18 ⊢ ∀x1 .∀x2 .(x1 = x2 ) ⇒ σ(x1 ) = σ(x2 )
O caráter altamente não construtivo do axioma da escolha provocou uma
grande crı́tica inicialmente: ao mesmo tempo que garante a possibilidade de se
fazer um número arbitrariamente grande de escolhas arbitrárias, o axioma não
dá nenhuma indicação de como essas escolhas devem ser feitas.
Em 1938, Gödel estabeleceu a relativa consistência do axioma da escolha
com relação a sistemas usuais de teoria de conjuntos e isso, juntamente com a
importância do axioma da escolha em provas de muitos teoremas matemáticos
importantes, fez com que o axioma fosse aceito pela maioria da comunidade
acadêmica.
A prova de independência do axioma da escolha (com relação aos demais
axiomas da teoria de conjuntos de Zermelo Fraenkel) foi apresentada em 1964
por P. J. Cohen.
A julgar pelo número de conseqüências matemáticas, o axioma da escolha é
sem dúvida o mais fértil princı́pio da teoria de conjuntos.
Muitas dessas conseqüências são, na verdade, equivalentes ao teorema da
escolha. As mais famosas são:
1. Teorema da boa ordenação de Zermelo: todo conjunto pode ser bem or-
denado.
2. Princı́pio de tricotomia: em todo par de números cardinais, um é menor
que o outro, ou eles são iguais.
3. Lema de Kuratowski-Zorn: qualquer conjunto não vazio no qual todo
subconjunto ordenado possui um limite superior, possui um elemento ma-
ximal.
4. Teorema de Tychonov: o produto de qualquer famı́lia de espaços to-
pológicos compactos é compacto.
5. Teorema de Hamel-Banach: todo espaço vetorial possui uma base.
Como observado anteriormente, o caráter não construtivo do axioma da
escolha foi notado desde quando foi proposto. Entretanto, a questão de qual é
o seu “status” lógico continuou sem solução por um bom tempo. Finalmente,
em 1975, Diaconescu mostrou que o axioma da escolha implica o princı́pio do
meio excluı́do (veja Teorema 19 abaixo). Esse resultado é extraordinário per
se, apesar de não ser de todo surpreendente. De fato, isso basta para entender
porque os métodos de prova em matemática são baseados em lógica clássica,
como a demonstração por absurdo por exemplo.
A seguir, uma prova fácil de que o axioma da escolha implica o princı́pio do
meio excluı́do.
25
Teorema 19 Considere a seguinte formulação do axioma da escolha:
ZF10′ : Se S é um subconjunto do produto cartesiano A × B e, para cada
x ∈ A existe y ∈ B tal que (x, y) ∈ S, então existe uma função f : A → B tal
que (x, f (x)) ∈ S para cada x ∈ A.
Então vale o princı́pio do meio excluı́do: ⊢ p ∨ ¬p.
26
Em qualquer um dos dois métodos, para provar consistência devemos utilizar
a matemática. Como a matemática não foi provada consistente, existe aı́ uma
circularidade.
Uma maneira de evitar este dilema é restringir as ferramentas matemáticas
utilizadas para prova de consistência. Por exemplo, utilizar apenas o que pode
ser desenvolvido através de métodos matemáticos construtivos. Um exemplo é
a prova de consistência da lógica de primeira ordem.
Para a discussão que se segue, precisaremos da linguagem S da aritmética
de primeira ordem.
S é uma teoria de primeira ordem com um predicado binário primitivo “=”,
duas funções binárias primitivas “+” e “•”, uma função unária “′ ” e uma cons-
tante primitiva “0”. Intuitivamente, tais entes primitivos representam a relação
de igualdade, as operações de adição, multiplicação e sucessor nos naturais, e
zero, respectivamente. Os axiomas de S consistem daqueles para igualdade (ver
Hatcher página 70), os axiomas de Peano para o 0 e ′ , e as definições recursivas
para a adição e multiplicação:
x + 0 = x ∧ x + y ′ = (x + y)′
x • 0 = 0 ∧ x • y′ = x • y + x
Observe que esta linguagem é bem mais fraca que uma baseada em teoria de
conjuntos, uma vez que todos os axiomas de S são teoremas dentro da teoria de
conjuntos ZF.
Os teoremas de aritmética que podem ser provados dentro de S são ditos
elementares.
Observe que para provar a consistência de S devemos utilizar a aritmética.
Ou seja, devemos assumir que S é consistente e pronto! Também porque a
teoria de números é uma parte básica da matemática, então S ser inconsistente
desmorona toda a matemática que conhecemos.
27
que se referiam apenas a objetos concretos foram chamados reais, ou concre-
tos, enquanto que outras proposições matemáticas eram consideradas ideais ou
abstratas.
Então, por exemplo, 2+2=4 seria considerado como uma proposição real,
enquanto que “existe um número ı́mpar perfeito” seria visto como ideal. Na
verdade, proposições ideais eram pensadas como pontos no infinito da geometria
projetiva.
As ambições propostas no programa de Hilbert foram derrubadas mais tarde
por Gödel, que provou, através do seus famosos teoremas de incompletude, que
existem sempre proposições reais prováveis através de métodos ideais que não
podem ser provadas por métodos concretos. Ou seja, o programa de Hilbert
para estabelecer a consistência da matemática se mostrou irrealizável.
28
“esta sentença é falsa”.
Basicamente, Gödel provou que se nessa frase se substitui a palavra falsa pela
frase não concretamente provável, então a proposição resultante é verdadeira,
mas não concretamente provável. Estendendo esse argumento, Gödel foi capaz
de provar que a consistência da aritmética não pode ser provada por meios
concretos.
g(0) = 3, g(′ ) = 5, g(() = 7, g()) = 9, g(+) = 11, g(•) = 13, g(=) = 15, g(xn ) = 15+2n
Observe que a correspondência g é 1-1 entre conjunto formado pela união dis-
junta de sı́mbolos primitivos, expressões bem formadas ou seqüências de ex-
pressões e a sua imagem nos naturais. De fato, o método apresentado para
calcular o número de Gödel é construtivo. Reciprocamente, podemos decidir se
um dado natural é um número de Gödel e, mais ainda, encontrar a expressão
nesse caso.
Outra observação é que o número de Gödel para sı́mbolos primitivos é ı́mpar,
enquanto que o de expressões é par com todos os expoentes ı́mpares na fatoração
prima. O número de Gödel para seqüências de expressões é par com todos os
expoentes pares.
29
Uma vez que estabelecemos uma correspondência entre a aritmética e uma
linguagem formal, podemos observar que toda propriedade da linguagem for-
mal dá origem a uma propriedade da aritmética e vice versa. Por exemplo, a
propriedade
ser uma expressão bem formada de S
determina um único conjunto de expressões e, por conseqüência, um único con-
junto de números que representam a contrapartida aritmética da propriedade
em questão, a saber:
ser um número de Gödel para uma expressão bem formada.
Além disso, note que podemos representar todos os números naturais em S.
De fato, o número zero é representado pela constante “0” e, de uma maneira
′′ ′
geral, o número n é representado pelo termo 0 ... com n ocorrências do sı́mbolo
primitivo ′ . Chamaremos de numerais esses termos de S e escreveremos n̄ para
o numeral associado ao número n.
Passaremos agora a definir o conceito de função recursiva. As seguintes
funções aritméticas são iniciais:
• a função zero: Z(x) = 0 para todo x ∈ N ;
• a função sucessor: v(x) = x + 1 para todo x ∈ N ;
• as funções projeção: Uin (z1 , . . . , zi , . . . , zn ) = zi onde (z1 , . . . , zi , . . . , zn ) ∈
Nn
As seguintes operações elementares definem uma função aritmética a partir
de outras funções aritméticas dadas:
onde min y significa “o menor y tal que”. Claro que pode ocorrer que tal
mı́nimo não esteja definido para um determinado h e para certos valores
z1 , . . . , zn . Desta forma, o uso de minimalização será restrito àqueles casos
onde existe um mı́nimo para cada conjunto de valores dos parâmetros zi .
30
2. Um conjunto recursivo de números naturais é definido como um conjunto
de números naturais cuja função caracterı́stica (ou seja, a função que vale
0 para todos os elementos do conjunto e 1 fora dele) é recursiva.
3. Uma relação é recursiva se sua função caracterı́stica é recursiva.
4. Uma função primitiva recursiva é uma função recursiva que pode ser obtida
a partir das funções iniciais sem o uso de minimalização.
Intuitivamente, uma função recursiva é aquela cujos valores podem ser cal-
culados por um computador. Ou seja, funções recursivas são computáveis. A
recı́proca não pode ser demonstrada porque não existe uma definição precisa do
que vem a ser computável (Tese de Church).
De maneira semelhante, um conjunto recursivo de números naturais é intui-
tivamente um conjunto “decidı́vel” no sentido que podemos decidir quando um
objeto está ou não no conjunto.
Definimos o conjunto recursivo de expressões bem formadas como sendo todo
conjunto para o qual o conjunto correspondente de números de Gödel é recur-
sivo. Similarmente, uma relação entre expressões bem formadas é dita recursiva
se a relação correspondente nos números naturais também é recursiva. Em
particular, dizer que o conjunto de axiomas de um sistema formal é decidı́vel
significa que o seu conjunto de números de Gödel é recursivo. Um sistema cujo
conjunto de axiomas é recursivo é dito axiomático.
Dada uma relação R de grau n entre números naturais, dizemos que R pode
ser expressa em S se existe uma expressão bem formada A(x1 , . . . , xn ) tal que:
i. Se a n-tupla hy1 , . . . , yn i de números naturais está em R, então
⊢ A(ȳ1 , . . . , ȳn )
onde y¯i representa o numeral associado a yi .
ii. Se a n-tupla hy1 , . . . , yn i de números naturais não está em R, então
⊢ ¬A(ȳ1 , . . . , ȳn )
31
Q Seja Qx uma expressão bem formada que possui uma única variável livre
x e seja n o seu número de Gödel. Representamos por Qn a expressão
bem formada (fechada) formada a partir de Qx instanciando todas as
ocorrências de x por n. Uma vez que Qn possui um número de Gödel,
definimos o predicado Qxy que diz que y é o número de Gödel de Qx.
Por um lado, Qn significa que algum número n possui a propriedade n. Mas
Qn também diz que a expressão bem formada com número de Gödel n (a saber,
Qx), possui a propriedade Q, uma vez que n é apenas a referência a Qx. Ou
seja, n cria um tipo de auto-referência indireta5 . Observe que predicados que
fazem referênca a si próprios correspondem a funções recursivas.
Com o predicado P xy, podemos também dizer que uma expressão bem for-
mada A não é um teorema, ou não pode ser provada em S.De fato, seja a o
número de Gödel de A. Então a expressão
¬(∃x.P xa)
diz que não existe seqüência que prova A, ou simplesmente:
¬(⊢ A)
O segundo passo para provar o teorema de Gödel consiste em construir a
sentença bem formulada F de S:
F : ¬(∃x.∃y.P xy ∧ Qzy)
Em palavras, F diz que não existe uma prova do par hx, yi onde y é o número
de Gödel de Qz. Ou seja, Qz não pode ser provado em S.
Para fazer F falar de si próprio, instanciamos a única variável livre de F , z,
ao número f de Gödel de F :
G : ¬(∃x.∃y.P xy ∧ Qf y)
Alguns comentários sobre G:
i. G = Qf , ou seja, G é a auto referência de F .
ii. G diz que não existe prova do par hx, yi, onde y é o número de Gödel de
Qf . Mas Qf é G.
iii. Ou seja, G diz que não existe prova em S de G:
G ≡ ¬(⊢ G)
iv. Mas a negação de G também não pode ser provada em S. De fato, suponha
que ¬G seja provável em S. Ou seja,
⊢ ¬G
Como G é o mesmo que a proposição ¬(⊢ G), obtemos
⊢ ¬G ≡ ⊢ ¬(¬(⊢ G))
≡ ⊢G
o que contraria a nossa hipótese.
5 Se você tem a impressão que o cérebro vai dar um nó, então é porque você está entendendo.
32
v. Desta forma, dizemos que G é indecidı́vel em S, ou seja, nem G nem a sua
negação podem ser provados em S.
O comentário v acima já é suficiente para provar a incompletude de S e, por-
tanto, provar o primeiro teorema de incompletude de Gödel para S.
Mas o fato mais extraordinário sobre G é que ele é verdadeiro! De fato, G
diz que não existe prova de G em S e isso nós acabamos de ver que é verdadeiro.
Observe que nós “provamos” que G é verdadeiro através de uma meta-análise,
não dentro de S.
Ou seja, não obstante existem expressões bem formadas que não podem ser
provadas em S, existem teoremas que não podem ser provados.
Vale notar que existem outras provas do resultado (1). Algumas bastante
simples, como a descrita abaixo:
Observe que a prova acima mostra que Gödel provou uma coisa que nenhum
computador pode provar.
Uma pergunta interessante que surge é: o que acontece se adicionarmos G ao
conjunto de axiomas de S? O sistema resultante seria completo? A resposta é
não. De fato, chamemos S’ a união de S e G. Gödel provou que podemos sempre
construir uma outra expressão bem formada G′ que não pode ser provada em S’.
Claro, podemos adicionar G′ a S’ e assim por diante. Através do uso abstrato
33
do método de diagnalização, Gödel provou que todos os sistemas dessa forma
são incompletos. Esse tipo de incompletude é chamado incompletude omega
Por fim, gostaria de salientar que o teorema de Gödel não se aplica a todos
os sistemas de aritmética. Só aos suficientemente fortes. Isso cria o dilema da
incompletude: ou o sistema é incompleto porque é muito fraco, ou ele é forte
mas ainda incompleto pelo teorema de Gödel6 .
Moral da estória deste capı́tulo: se a matemática é consistente (e todos
acreditamos que sim!), ela é incompleta.
SC : {S é consistente}
9 λ-calculus e computabilidade
O λ-calculus [1, 26] é um sistema formal que lida com a teoria de funções. Foi
introduzido nos anos 1930 por Alonzo Church. Originalmente, Church tentou
construir um sistema (que continha o λ-calculus) para a fundamentação da ma-
temática. Mas esse sistema foi mostrado inconsistente por ser possı́vel simular
6 Hofstadter usa uma analogia interessante para este problema: imagine um ladrão que só
rouba pessoas suficientemente ricas e que pára todos os viajantes que passam por uma certa
estrada. Então, todos os viajantes que passam pela estrada serão pobres: Ou porque não
eram suficientemente ricos, ou porque o eram e foram roubados.
34
o paradoxo de Russell dentro da teoria. Desta foma, Church separou a parte do
λ-calculus e a usou para estudar a computabilidade.
λ-calculus é uma teoria que representa funções como regras, ao invés da
tradicional abordagem de funções como gráficos. Funções como regras é a noção
mais antiga de função e refere-se ao processo de partir de um argumento para um
valor, processo esse determinado apenas por uma definição e por certas regras.
Desta forma, é possı́vel estudar os apectos computacionais das funções.
Por exemplo, podemos pensar em funções determinadas por definições em
português aplicadas a argumentos também expressos em português. Ou, mais
especificamente, funções dadas como programas aplicadas a outros programas.
Em ambos os casos, temos uma estrutura livre de tipos, onde os objetos de
estudo são, ao mesmo tempo, função e argumento.
Esse é o ponto de partida para o λ-calculus atipado. Em particular, uma
função pode ser aplicada a ela mesma. Na noção usual de função em matemática
(como na teoria de conjuntos de Zermelo-Fraenkel), isso é impossı́vel (por causa
do “axioma de fundação”).
De maneira formal, termos em λ-calculus são definidos da seguinte forma.
M ::= x | λx.M | M M
Ou seja, um λ-termo pode ser uma variável, uma abstração ou uma aplicação
de termos. Observe que um λ-termo é uma função com apenas um argumento
que, por sua vez, vem a ser uma função com um único argumento, etc. Dessa
forma, se tem uma idéia intuitiva do porque -calculus trata de funções recursi-
vamente enumeráveis.
Funções são definidas através de uma λ-expressão que expressa a ação da
função em seu argumento. Por exemplo, a função
f (x) = x + 2
Definição 15
i) A regra β é definida como: (λx.M )N → M [N/x]
ii) A β-redução é o fechamento contextual da regra β, representada por →β .
35
Então, considerando o exemplo de função definido acima,
(λx.x + 2)5 →β (x + 2)[5/x] = 5 + 2 = 7
Essa redução corresponde, no caso usual, ao cálculo do valor da função f para
5:
f (5) = 5 + 2 = 7
O λ-calculus pode ser considerado a menor linguagem de programação uni-
versal. Menor no sentido que possui uma única regra de redução (a redução
β, que nada mais é que a substituição de variáveis). Universal porque todas
as funções computáveis podem ser expressas utilizando esse formalismo (tese de
Church).
Apesar de ser possı́vel programar em λ-calculus, a sua real importância
para ciência da computação é que muitos problemas de design de linguagens
e de implementação, especialmente aqueles que dizem respeito a estrutura de
tipos, são mais fáceis de serem investigados dentro do λ-calculus do que em
linguagens de programação mais complexas. Por isso dizemos que o λ-calculus
é um instrumento teórico utilizado para provar propriedades sobre aplicações
práticas.
O λ-calculus com a β-redução definida acima dá origem a uma estratégia
de passagem de parâmetros chamada call-by-name, onde os parâmetros não
precisam ser avaliados antes de serem fornecidos à função. Essa estratégia é
utilizada em linguagens de programação como ML, por exemplo.
Existem termos emλ-calculus para os quais se pode construir uma seqüência
infinita de reduções. O exemplo clássico é:
(λx.xx)(λx.xx) →β (λx.xx)(λx.xx) →β . . .
Tais termos são utilizados para modelar o comportamento de sub-rotinas
que entram em loop, por exemplo.
Mas os λ-termos mais importantes de estudo são aqueles que, para qual-
quer estratégia de redução escolhida, a redução sempre pára. Tais termos são
chamados fortemente normalizáveis.
36
Em computação, existem diversas linguagens não tipadas (ou seja, que pos-
suem apenas um tipo, que contém todos os valores) como, por exemplo: LISP,
λ-calculus, Self, Perl e Tcl. Essas linguagens não dispõem de nenhum me-
canismo para a detecção de falhas devidas a operações aplicadas a argumen-
tos impróprios. A ocorrência de um erro dessa natureza não interrompe a
execução do programa, sendo possı́vel que o erro seja detectado somente após
uma seqüência bastante grande de operações subseqüentes à ocorrência do mesmo.
O tipo de uma expressão determina em que contextos a ocorrência dessa
expressão é válida ou não. Em outras palavras, o agrupamento de valores em
tipos permite que se verifique se expressões que denotam tais valores não são
usadas em contextos em que não fazem sentido.
Essa verificação, comumente chamada de “checagem” de tipo, pode ser feita
em tempo de compilação ou em tempo de execução de um programa. Quando
a verificação é feita em tempo de compilação, além dos erros de tipo serem
detectados antecipadamente (um programa não é executado caso contenha erros
de tipos), eles são sempre detectados, podendo ser então corrigidos.
No caso de verificação em tempo de execução, um erro existente só será
detectado se alguma execução do programa envolver, de fato, o ponto onde tal
erro ocorre; em outras palavras, o erro só é detectado se a execução do programa
constitui um teste para o caso correspondente ao erro de tipo.
Como um exemplo simples, considere a expressão:
v=v+1
37
matemática para definições recursivas foi estabelecida a partir da teoria de
domı́nios.
O estudo de tipos em linguagens de programação tornou-se de grande im-
portância, especialmente por causa de sua influência sobre o projeto e a definição
de linguagens de programação e, portanto, sobre o desenvolvimento de software
em geral.
38
Existem diversas maneiras distintas de se definir a sintaxe de linguagens
de programação. O uso de um formalismo baseado em lógica, constituı́do
por axiomas e regras de inferência, possibilita definir, simultaneamente, tanto
condições livres de contexto quanto condições sensı́veis ao contexto. Tal forma-
lismo tem sido cada vez mais usado, principalmente na definição e estudo de
modelos/núcleos de linguagens de programação.
A idéia básica desses sistemas formais é estabelecer regras de formação das
frases da linguagem, a partir de suas subfrases, levando em conta propriedades
das construções envolvidas na formação dessas frases. Como as propriedades
consideradas são, tipicamente, tipos de expressões, tais sistemas são denomina-
dos sistemas de tipos.
Sistemas de tipos de linguagens de programação são usualmente apresenta-
dos sob a forma de cálculo de seqüentes, definição no Apêndice A.2, podendo
também ser apresentados sob a forma de um sistema de dedução natural 2.
Os tipos de expressões atômicas são definidos por meio de axiomas de tipo
da forma
Γ⊢e:σ
Esse axioma define que a expressão atômica e tem tipo σ no contexto de tipos
Γ.
Um contexto de tipos mantém informação sobre os tipos das variáveis que
podem ser usadas (i.e. que foram declaradas), possibilitando detectar se uma
expressão é bem tipada, com base nos tipos das variáveis livres que ocorrem
nessa expressão. Por exemplo, verifica-se se a expressão x + 1 é bem tipada,
em um determinado contexto, examinando se a variável x tem tipo inteiro nesse
contexto. É natural representar o contexto como um conjunto de pares x : σ,
de variáveis e seus respectivos tipos:
Γ = {x1 : σ1 , . . . , xk : σk }
39
10.3 Outras propriedades de sistemas de tipos
Além das propriedades mencionadas anteriormente, existem outras propriedades
desejáveis para sistemas de tipos.
• Decidibilidade — O sistema de tipos da maioria das linguagens de pro-
gramação é decidı́vel, isto é, existe um algoritmo tal que, dado um pro-
grama p, determina se esse programa é bem tipado ou não. Em termos
do sistema de tipos, o algoritmo determina se existe uma derivação para
a fórmula Γ ⊢ p : σ, para algum σ, de acordo com as regras do sistema
de tipos, onde Γ é um contexto contendo tipagens para os sı́mbolos pré-
definidos da linguagem.
Alguns sistemas de tipos de linguagens de programação são indecidı́veis,
como os das linguagens Quest e Cayenne
A argumentação em favor do uso de sistemas de tipos indecidı́veis, em geral
mais complexos, é baseada em dois aspectos. O primeiro é o de que, em
geral, a linguagem compreende um conjunto de frases bem tipadas maior
do que o de uma linguagem com um sistema de tipos decidı́vel. O segundo
é o de que o número de casos em que, de fato, o algoritmo pára, sem uma
verificação de tipo bem sucedida (por ter alcançado o limite estabelecido
para o número de reduções) seria muito pequeno. Entretanto, é ainda
necessária uma maior experiência com o uso de tipos dependentes para
que se possa avaliar como se comportam, na prática, sistemas de tipos
indecidı́veis.
• Unicidade — Um sistema possui a propriedade de unicidade de tipos se,
para cada frase e bem formada e cada contexto Γ, existe um único σ tal
que Γ ⊢ e : σ é provável. Para sistemas de tipos com subtipagem (poli-
morfismo), a propriedade de unicidade de tipos é, em geral, substituı́da
pelas propriedades de tipo e tipagem mı́nima (principal) - veja seção 10.6.
• Tipo e tipagem mı́nima, tipo e tipagem principal.
40
De fato, aplicada a uma expressão qualquer e, fix e retorna um ponto fixo de
e:
fix e = (λf. (λx.f (xx))(λx.f (xx))) e
⇒ (λx.e(xx))(λx.e(xx))
⇒ e((λx.e(xx))(λx.e(xx)))
= e (fix e)
Expressões como fix acima introduzem dificuldades na definição do sigini-
ficado de expressões do λ-calculus. Por exemplo: se uma expressão e tem mais
de um ponto fixo, qual deles é dado por fix e? O que significa fix e, se e
não tem ponto fixo (por exemplo, e ≡ λx. x + 1)? Certamente, um modelo de
interpretação para o λ-calculus deve ser capaz de responder a essas questões.
Na interpretação definida por Scott, fix e denota o ponto fixo minimal (“me-
nos definido”) da função (contı́nua) denotada por e, no domı́nio semântico. A
complexidade de interpretação do operador de ponto fixo é evidenciada pelo
fato de sua definição envolver a aplicação de uma variável (x) a ela própria.
Essa possibilidade pode levar a paradoxos. Considere, por exemplo, a seguinte
expressão:
if x x = a then b else a
A possibilidade de qualquer expressão poder ser aplicada a ela própria requer que
o espaço de valores representados por essas expressões seja isomorfo ao espaço
de funções sobre esses valores. Dessa forma, embora o modelo de execução do
λ-calculus não tipado seja muito simples e poderoso, a complexidade de seus
modelos de interpretação, assim como o fato de que linguagens de programação
são, em sua maior parte, linguagens tipadas, motivaram o estudo de cálculos
baseados no λ-calculus tipado.
O λ-calculus tipado simples, proposto por Church, considera apenas tipos
básicos (por exemplo, Int, o tipo dos inteiros, e Bool, o tipo dos valores boolea-
nos) e tipos funcionais. O sistema de redução do λ-calculus tipado simples herda
as propriedades fundamentais do sistema de redução do λ-calculus não tipado:
confluência e normalização. A propriedade de confluência, também chamada de
propriedade de Church-Rosser , garante que, se uma expressão e reduz para e1
ou para e2 , então existe uma expressão e′ , tal que e1 reduz para e′ e e2 reduz
para e′ . Como conseqüência, se um termo tem uma forma normal, então ela é
única. A propriedade de normalização garante a existência de uma determinada
estratégia de redução para a qual a seqüência de reduções de qualquer expressão
resulta em sua forma normal, caso a expressão possua uma forma normal.
A Figura 2 apresenta a sintaxe livre de contexto das expressões do λ-calculus
tipado simples. No λ-calculus tipado simples, ao contrário do λ-calculus não ti-
pado, uma expressão não pode ser aplicada a si própria. Assim, não se pode
definir o operador de ponto fixo na própria linguagem. Além disso, o λ-calculus
tipado simples possui a propriedade de terminação (também chamada de nor-
malização forte): toda seqüência de redução de qualquer expressão termina, ou
seja, toda expressão possui uma (única) forma normal.
41
Tipos τ ::= b tipo básico (ou primitivo)
τ1 → τ2 tipo funcional
(V AR)
Γ, x : τ ⊢ x : τ
Γ, x : τ ′ ⊢ e : τ
(ABS)
Γ ⊢ (λx : τ ′ . e) : τ ′ → τ
Γ ⊢ e : τ ′ → τ, Γ ⊢ e′ : τ ′
(AP L)
Γ ⊢ e e′ : τ
42
recursiva definida sobre os naturais pode ser expressa na linguagem).
O seguinte axioma de tipo é usado na formação de expressões bem tipadas
usando operadores de ponto fixo:
(F IX)
Γ ⊢ fixτ : (τ → τ ) → τ
A semântica (operacional) de operadores de ponto fixo é definida pelo se-
guinte axioma de redução (f ix):
fixτ ⇒f ix λf : τ → τ. f (fixτ f )
A introdução de operadores de ponto fixo possibilita definir, como no λ-
calculus não tipado, termos que não possuem forma normal. Também da mesma
forma, mesmo que um termo possua uma forma normal, a estratégia de redução
adotada é importante para que esse termo seja reduzido para a sua forma nor-
mal. Por exemplo, para qualquer expressão e : τ → τ , pode-se aplicar repetidas
vezes o axioma de redução (fix):
e, portanto, para qualquer termo fixτ e : τ (que possua ou não forma nor-
mal) existe uma seqüência infinita de reduções, determinada por uma estratégia
de redução que escolha o redex mais interno em cada passo de redução. Ao
contrário do que ocorre com o λ-calculus não tipado, termos da forma x x não
podem ser definidos.
Γ ⊢ e : τ1 Γ ⊢ e′ : τ2
(P ROD)
Γ ⊢ he, e′ i : τ1 × τ2
Γ ⊢ e : τ1 × τ2
(P ROJ1 )
Γ ⊢ proj1τ1,τ2 e : τ1
Γ ⊢ e : τ1 × τ2
(P ROJ2 )
Γ ⊢ proj2τ1,τ2 e : τ2
43
As regras (PROJ1) e (PROJ2) introduzem as funções de projeção proj1τ1 ,τ2 e
proj2τ1,τ2 , utilizadas para obter os componentes de um par. A semântica desses
operadores é definida pelos seguintes axiomas de redução:
proj1τ1,τ2 he, e′ i ⇒ e
proj2τ1,τ2 he, e′ i ⇒ e′
10.5.2 Somas
A notação τ1 + τ2 é usada para denotar união disjunta dos conjuntos denotados
pelos tipos τ1 e τ2 . Isto significa que um elemento v de tipo τ1 + τ2 pode ser um
elemento de tipo τ1 (τ2 ) juntamente com uma indicação de que v é um elemento
de tipo τ1 (τ2 ) (veja Figura 5).
Γ ⊢ e : τ1
(IN1 )
Γ ⊢ inEsqτ1,τ2 e : τ1 + τ2
Γ ⊢ e : τ2
(IN2 )
Γ ⊢ inDirτ1,τ2 e : τ1 + τ2
Γ ⊢ e : τ1 + τ2 Γ ⊢ f : τ1 → τ3 Γ ⊢ g : τ2 → τ3
(ELIM )
Γ ⊢ case e f g : τ3
case (inEsqτ1,τ2 e) f g ⇒ f
case (inDirτ1,τ2 e) f g ⇒ g
10.6 Polimorfismo
O λ-calculus tipado simples possibilita definir apenas funções monomórficas, ou
seja, funções que podem ser aplicadas a argumentos de um único tipo. Isso
requer, por exemplo, que se tenha que definir uma função identidade, de tipo
44
τ → τ , para cada tipo τ , embora a definição dessa função seja a mesma para
valores de qualquer tipo.
Em algumas linguagens, tais como Standard ML (ou simplesmente ML),
podem ser definidas funções polimórficas, isto é, funções que operam uniforme-
mente sobre argumentos de vários tipos. O mecanismo utilizado para a definição
de funções polimórficas em ML, constitui, em sua essência, uma extensão simples
e elegante do λ-calculus tipado simples.
fn x ⇒ x + 1
11 Isomorfismo de Curry-Howard
O isomorfismo de Curry-Howard [31] estabelece uma correspondência muito
interessante entre sistemas de lógica formal (tratados em teoria de provas) e
cálculos computacionais (como aqueles em teoria de tipos). Desta forma, os dois
mundos que são objeto de estudo no presente curso - lógica e teoria de funções
- que, a princı́pio, parecem ser muito diferentes, estão intrinsecamente ligados.
Tal isomorfismo entre o λ-calculus simplesmente tipado e a lógica intuicionista
foi estabelecida por volta de 1940 de maneira independente por Curry e Howard.
Outros exemplos de isomorfismo são: lógica de 1a ordem ↔ tipos dependen-
tes; lógica de 2a ordem ↔ tipos polimórficos.
Analisaremos aqui apenas o isomorfismo para o caso λ-calculus/lógica intui-
cionista 7 . Neste caso, a nı́vel sintático, temos que:
7 Não será feita uma demonstração formal do teorema, será apresentada apenas uma idéia
45
• Fórmulas ↔ tipos.
• Provas ↔ termos.
• Provabilidade ↔ inhabitation.
• Normalização de provas ↔ redução de termos.
Como exemplo, considere as provas para o sequente ⊢ φ ⇒ ψ ⇒ ψ:
(inicial)
φ, ψ ⊢ ψ
(⇒ I)
φ⊢ψ⇒ψ
(⇒ I)
⊢φ⇒ψ⇒ψ
e
(inicial)
ψ ⇒ ψ, φ ⊢ ψ ⇒ ψ
⇒I (inicial)
ψ⇒ψ⊢φ⇒ψ⇒ψ ψ⊢ψ
(⇒ I) (⇒ I)
⊢ (ψ ⇒ ψ) ⇒ φ ⇒ ψ ⇒ ψ ⊢ψ⇒ψ
(⇒ E)
⊢φ⇒ψ⇒ψ
A segunda prova claramente possui desvios que podem ser evitados, enquanto
que a primeira prova é direta. O processo de retirar de provas desvios inúteis é
chamado de normalização de provas e provas sem desvios são chamadas provas
normais.
Observe que o desvio da segunda árvore é criado através da aplicação de
uma regra de introdução seguida de uma regra de eliminação. Em geral, sempre
que isso ocorre podemos eliminar a ocorrência da aplicação dessas regras (as
lógicas clássica e intuicionista são fortemente normalizáveis).
Considere agora a prova para a fórmula λy : φ.λx : ψ.x : φ ⇒ ψ ⇒ ψ:
(V AR)
y : φ, x : ψ ⊢ x : ψ
(ABS)
y : φ ⊢ λx : ψ.x : ψ ⇒ ψ
(ABS)
⊢ λy : φ.λx : ψ.x : φ ⇒ ψ ⇒ ψ
(V AR)
z : ψ ⇒ ψ, y : φ ⊢ z : ψ ⇒ ψ
(ABS) (V AR)
z : ψ ⇒ ψ ⊢ (λy : φ.z) : φ ⇒ ψ ⇒ ψ x:ψ⊢x:ψ
(ABS) (ABS)
⊢ (λz : ψ ⇒ ψ.λy : φ.z) : (ψ ⇒ ψ) ⇒ φ ⇒ ψ ⇒ ψ ⊢ (λx : ψ.x) : ψ ⇒ ψ
(AP L)
⊢ (λz : ψ ⇒ ψ.λy : φ.z)(λx : ψ.x) : φ ⇒ ψ ⇒ ψ
A mesma discussão feita anteriormente vale para este caso: o tipo de (λz :
ψ ⇒ ψ.λy : φ.z)(λx : ψ.x) é a formula φ ⇒ ψ ⇒ ψ e a prova dessa fórmula é
determinada pelo termo (λz : ψ ⇒ ψ.λy : φ.z)(λx : ψ.x).
46
Por fim, observe que:
(λz.λy.z)(λx.x) ⇒β λy.λx.x
Ou seja, normalização corresponde à β-redução!
47
De fato, em geral, o design de uma linguagem de programação começa pela
definição de uma gramática e depois pela determinação da semântica para essa
gramática. Isso parece muito razoável, mas merece um pouco de reflexão. Por
exemplo, considere as seguintes duas sentenças (gramaticamente corretas) em
linguagem natural (inglês):
por tipos devem ser, eles próprios, elementos do domı́nio de interpretação da linguagem.
9 Veja, na seção 10.4, a definição de ocorrências livres e ligadas de variáveis em uma ex-
pressão.
48
variáveis de tipo livres. Na apresentação que segue, supomos que o ambiente
ρ também atribui significado a variáveis de tipo, ou seja, ρ é uma função que
associa variáveis de expressão a valores do domı́nio, e associa subconjuntos de
valores do domı́nio a variáveis de tipo. A denotação de um tipo σ, em um
ambiente ρ, é representada por [[σ]]ρ.
den
Dois termos e1 e e2 são denotacionalmente equivalentes, e1 = e2 , se, para
todo ambiente ρ, temos
[[e1 ]]ρ = [[e2 ]]ρ
O significado dos termos de uma linguagem é definido, de forma mais natural,
por indução sobre a estrutura de provas de derivação de tipos, no sistema de
tipos da linguagem. Isso garante que se atribua significado apenas a termos bem
tipados.10 A semântica de uma linguagem é então definida da seguinte forma:
49
(V AR)
Γ ⊢ x : σ se x : σ ∈ Γ
Γ ⊢ e : τ → τ′ Γ ⊢ e′ : τ (AP L)
Γ ⊢ e e : τ′
′
50
square (2+5) ⇒ (2+5) ∗ (2+5) ⇒ 7 ∗ 7 ⇒ 49
51
Para estender a definição de equivalência operacional para termos (e não
apenas para programas) é necessário introduzir a noção de contexto.12 Essa
noção é necessária, uma vez que termos podem conter variáveis livres, cujo
significado não é observável, isto é, não é definido pela relação de redução. Um
contexto C[ ] é um termo que contém um “buraco” (representado por um par de
colchetes), onde outro termo pode ser inserido. Por exemplo:
def
C0 [ ] = λ x : Integer. x + [ ]
é um contexto tal que, se inserimos nele um termo e qualquer, ele passa a ter a
forma13
def
C0 [e] = λ x : Integer. x + e
Na inserção de um termo e em um contexto C[ ], resultando em C[e], ocorrências
livres de variáveis em e podem ser capturadas em C[e], uma vez que a inserção
de um termo em um contexto C[ ] é efetuada sem que as variáveis ligadas nesse
contexto sejam renomeadas.
op
Dois termos e1 e e2 são operacionalmente equivalentes (e1 = e2 ) se, para
todo contexto C[ ] tal que C[e1 ] e C[e2 ] são programas, tem-se que evalF (C[e1 ]) =
evalF (C[e2 ]).
A concordância entre o sistema de tipos e a semântica operacional de uma
linguagem é expressa pelas seguintes propriedades:
diferentemente do definido aqui, que pode ser visto como um termo incompleto, com um
buraco em que outro termo pode ser inserido.
13 A notação de λ-expressões é descrita na seção 10.4. Intuitivamente, uma expressão λ x : σ. e
representa uma função que, ao receber um argumento denotado por x, de tipo σ, fornece como
resultado o valor definido pela expressão e.
52
Propriedade 6 (Adequação computacional) Seja p um programa e v uma
den
forma canônica. Temos que p = v se, e somente se, evalF (p) = v.
Y M = M (Y M )
53
Parece claro que a primeira solução é a melhor. Mas por que? A resposta é que
todas as outras soluções contém informações arbitrárias, que uma computação
(automática) não pode decidir.
Em outras palavras, f1 é a solução minimal, ou a que contém o mı́nimo de
informações.
O objetivo do texto a seguir é formalizar esse conceito de ordenação de
valores dependendo da quantidade de informação que eles carregam.
54
13.2 Ordem parcial completa (CPO)
Definição 21 Um CPO é um POSET no qual toda cadeia tem um lub em P
a ⊑A b ⇔ a = ⊥A ou a = b.
P xQ = {< x, y > |x ∈ P, y ∈ Q}
Prova
1. P xQ tem elemento mı́nimo: < ⊥P , ⊥Q >.
2. ⊑P xQ é reflexiva, transitiva e anti-simétrica.
3. Toda cadeia < t0 , v0 >⊑< t1 , v1 >⊑ . . . em P xQ tem um lub < t, v > tal
que
t = lub ti em P e v = lub vi em Q.
55
1. f (p0 ) ⊑Q f (p1 ) ⊑Q . . . é uma cadeia em Q.
2. f (lubi≥0 pi ) = lubi≥0 f (pi )
Prova
1. A relação ⊑[P −→Q] é uma ordem parcial.
2. O elemento mı́nimo ⊥[P −→Q] de [P −→ Q] é definido por:
56
Seja f ∈ [N⊥ −→ N⊥ ] definida pela equação:
f = λn.n = 0 −→ 1, n ∗ f (n − 1)
H(f ) = λn.n = 0 −→ 1, n ∗ f (n − 1)
A menor solução é f = lubi≥0 H i (⊥).
f = lubi≥0 H i (⊥)
1. H(f ) = λn.n = 0 −→ 1, n ∗ f (n − 1)
H 0 (⊥) = ⊥
f = λn.n = ⊥ −→ ⊥, n!
14 Lógica Linear
Como visto na Seção 2, matemáticos começam de um conjunto de axiomas,
provam alguns lemas e então os utilizam para provar teoremas. Algumas das
provas utilizadas não são construtivas, e o uso da estratégia conhecida como
redução ao absurdo é muito comum.
Uma vez que um lema é provado, ele pode ser usado de novo para provar
outras proposições ou teoremas, uma vez que um lema provado verdadeiro será
verdadeiro para sempre. Portanto, matemáticos trabalham com a lógica clássica,
a lógica da verdade estável e de recursos e conclusões infinitos.
Já a lógica intuicionista (Seção 3) joga fora essa noção de verdade abso-
luta e a veracidade de uma afirmativa depende da existência de uma prova (ou
construção) da afirmativa.
Mas ainda, a lógica intuicionista é uma lógica de infinitos recursos – mas
não infinitas conclusões, uma vez que permitir a prova de todos os resultados
possı́veis implica em permitir o princı́pio do meio excluı́do.
57
Agora, se imaginarmos a situação real de descrever uma máquina de vender
refrigerantes, não é adequado usar uma lógica de recursos infinitos. Ou seja, se
uma latinha de guaraná custa um real e tenho um real na minha carteira, posso
comprar apenas uma latinha e, no fim do processo, vou estar sem dinheiro.
A Lógica Linear (desenvolvida por Girard [10]) lida com situações como essa:
é uma lógica de recursos conscientes. Em Lógica Linear, afirmativas não podem
ser livremente copiadas (Contraction) ou descartadas (Weakening), apenas em
situações especiais, onde aparece um tipo muito particular de conectivos: os ex-
ponenciais “?” e “!”. Intuitivamente, !B significa que o recurso B pode ser usado
tantas vezes quanto necessárias. De maneira dual, ?B indica a possibilidade de
produção de uma quantidade infinita da conclusão B.
A implicação linear é representada pelo sı́mbolo “−◦” e o significado de A−◦B
é:
consome-se A dando origem a B
Isto significa que, a partir do ponto em que B é produzido, o predicado A deixa
de ser válido. A implicação intuicionista “⇒” então significa:
A ⇒ B ≡ !A −◦ B
14.1 Semântica
A semântica da Lógica Linear é dada através de espaços coerentes.
58
15 Lógica e Ciência da Computação
De Acordo com Miller [19], lógica é utilizada na especificação de sistemas com-
putacionais de dois modos. Primeiro, computações são estruturas matemáticas
contendo nodos, estados e transições de estados e a lógica faz afirmações sobre
tais estruturas. Portanto, computações são modelos para expressões lógicas.
Esta abordagem é conhecida como computação-como-modelo. Como um exem-
plo de como a lógica é utilizada nesta abordagem, considere as triplas de Hoare
que tipicamente são representados como:
{Γ}P {∆}
59
As lógicas clássica e intuicionista não suportam esse tipo de ação: um con-
texto pode apenas ser expandido ao longo de uma derivação e não existe o
conceito de limitação ou consumo de recursos.
A primeira abordagem tem sido amplamente estudada e faz uso de tópicos
da matemática como teoria de conjuntos, teoria das categorias, álgebras, etc,
para modelar computações. Em geral, as estruturas matemáticas utilizadas são
complexas porque devem lidar com o conceito de infinitude.
A segunda abordagem, apesar de lidar com estruturas mais simples (que
raramente fazem referência ao infinito) e de estar mais intimamente ligada à
computação, tem merecido pouca ou nenhuma atenção nos últimos tempos.
Apenas após recentes pesquisas na área de teoria de provas e programação lógica
observou-se um crescimento do estudo nessa área de pesquisa. Lógicas expressi-
vas como Lógica Linear [10] (e Forum [18] - linguagem de programação baseada
em Lógica Linear) passaram a ser utilizadas para modelar estados, transições
de estado e algumas primitivas de concorrência. Como será visto no decorrer
do texto, a utilização de Lógica Linear para especificar sistemas computacionais
provê ricas formas de análise e dedução de propriedades dos sistemas especifi-
cados.
Mais recentemente, uma nova abordagem para representar lógicas foi pro-
posta: o Cálculo de Estruturas [4, 13, 30]. Até agora, várias lógicas proposici-
onais foram especificadas em cálculo de estruturas e a alta simetria das regras
lógicas juntamente com o procedimento de deep inference para acessar subfor-
mulas permitem a observação de algumas propriedades muito interessantes nas
lógicas especificadas. Isto abre uma avenida enorme para a exploração do uso
da lógica em proof theory.
16 Logical frameworks
Um logical framework [24] é uma meta-linguagem formal especificamente de-
senvolvida para representar linguagens de programação, lógicas e outros for-
malismos que podem ser descritos através de sistemas de provas. Um logical
framework consiste de uma meta-linguagem de representação (usualmente uma
lógica ou uma teoria de tipos) com algumas propriedades computacionais, e uma
metodologia de meta-representação que sugere como codificar um dado sistema
de provas.
Acontece que a codificação tem que ser natural e eficiente, se não se torma
intratável e inútil.
Isto significa que a meta-linguagem escolhida deve ser poderosa o suficiente
para codificar diversos sistemas dedutivos e, ao mesmo tempo, deve ser simples
o suficiente de maneira a permitir representações concisas dos sistemas especi-
ficados.
Em artigos recentes [21, 20], Lógica Linear tem sido usada como um fra-
mework para a especificação de sistemas de provas. As codificações propostas
são naturais, elegantes e diretas, permitindo o uso da rica meta-teoria da Lógica
Linear para ajudar a provar propriedades sobre os sistemas especificados.
60
16.1 Lógica Linear como framework para especificar sis-
temas de seqüentes
No passado, vários frameworks lógicos baseados em lógica intuicionista têm sido
propostos e utilizados para especificar sistemas de provas baseados em dedução
natural (veja por exemplo Isabelle, λ-Prolog, LF e Twelf). Dada a conecção
entre dedução natural e λ-calculus (veja Seção 11), aplicações que requerem
object-level binding e substituições têm sido implementadas com sucesso nesses
frameworks lógicos.
Como exemplo, considere a prova em dedução natural:
(A)
..
.
B C
D
Proof search em lógica intuicionista têm sido bem estudada e possui diversas
implementações robustas (como Isabelle e λ-Prolog acima citadas, por exemplo).
A questão que surge é: qual framework é adequado para especificar cálculo de
seqüentes? Claramente, seqüentes podem ser codificados dentro dos frameworks
existentes através de pares de listas de fórmulas. Mas cálculo de seqüentes possui
várias dualidades:
Esquerda Direita
Positivo Negativo
Axioma inicial Regra Cut
Sı́ncrono Assı́ncrono
Γ⊢∆
¬(¬A) 6≡ A
ou seja, negando um predicado duas vezes não nos dá o predicado original. Isto
faz com que a lógica intuicionista seja muito fraca como meta-lógica para des-
crever sistemas de seqüentes uma vez que, por definição, dualidades são sempre
simétricas.
61
Também, as regras estruturais têm um papel importante na definição de
conectivos lógicos em cálculo de seqüentes, e um controle total da modalidade
não está presente em lógica intuicionista.
Ocorre que Lógica Linear é uma boa escolha de meta-linguagem: possui uma
negação involutiva permite que Contraction e Weakening sejam controlados e
refina a lógica intuicionista.
Para cada uma das regras de introdução acima, existe uma regra de eliminação.
O princı́pio geral que nos ajuda a determinar quais são essas regras é o princı́pio
de inversão(veja [22]):
62
Princı́pio de inversão. Tudo o que é derivado a partir da
derivação das premissas utilizadas na prova direta de uma proposição
deve derivar da proposição.
63
Axioma inicial e a regra cut
Γ1 ⊢ ∆1 , A A, Γ2 ⊢ ∆2
Inicial Cut
Γ, A ⊢ ∆, A Γ1 , Γ2 ⊢ ∆1 , ∆2
Regras à direita
Γ ⊢ A, ∆ Γ ⊢ B, ∆ Γ, A ⊢ B, ∆
⊤R ∧R ⇒R
Γ ⊢ ⊤, ∆ Γ ⊢ A ∧ B, ∆ Γ ⊢ A ⇒ B, ∆
Γ ⊢ A, ∆ Γ ⊢ B, ∆
∨ R1 ∨ R2
Γ ⊢ A ∨ B, ∆ Γ ⊢ A ∨ B, ∆
Γ ⊢ A[x/y], ∆ Γ ⊢ A[x/t], ∆
∀R ∃R
Γ ⊢ ∀xA, ∆ Γ ⊢ ∃xA, ∆
Regras à esquerda
Γ, A ⊢ ∆ Γ, B ⊢ ∆
⊥L ∧ L1 ∧ L2
Γ, ⊥ ⊢ ∆ Γ, A ∧ B ⊢ ∆ Γ, A ∧ B ⊢ ∆
Γ, A ⊢ ∆ Γ, B ⊢ ∆ Γ1 ⊢ A, ∆1 Γ2 , B ⊢ ∆2
∨L ⇒L
Γ, A ∨ B ⊢ ∆ Γ1 , Γ2 , A ⇒ B ⊢ ∆1 , ∆2
Γ, A[x/t] ⊢ ∆ Γ, A[x/y] ⊢ ∆
∀L ∃L
Γ, ∀xA ⊢ ∆ Γ, ∃xA ⊢ ∆
Regras estruturais
Γ⊢∆ Γ⊢∆
weak L weak R
Γ, A ⊢ ∆ Γ ⊢ ∆, A
Γ, A, A ⊢ ∆ Γ ⊢ ∆, A, A
cont L cont R
Γ, A ⊢ ∆ Γ ⊢ ∆, A
Observe que a regra como escrita acima é equivalente às regras ∧L1 e ∧L2 da
Figura 8 para o caso intuicionista (apenas um sucedente) uma vez que as regras
estruturais podem ser usadas livremente à esquerda de um sequente.
64
Exemplo 5 Provas em cálculo de sequentes são muito mais fáceis de serem
realizadas quando comparadas com dedução natural. Um exemplo disso é a
prova do princı́pio do meio excluı́do:
initial
p ⊢ ⊥, p
⇒R
⊢ p, ¬p
∨R2
⊢ p, p ∨ ¬p
∨R1
⊢ p ∨ ¬p, p ∨ ¬p
contR
⊢ p ∨ ¬p
65
Checar se um sistema lógico possui a propriedade de cut-elimination é, em
geral, um problema não trivial (veja, por exemplo, [28, 17, 24, 21, 3, 25]). Vale
observar que essa propriedade é válida para as lógicas clássica e intuicionista.
Como conseqüência imediata, temos que esses sistemas são consistentes.
Então, a lógica de primeira ordem é completa e consistente. Observe que
isso não entra em contradição com o resultado de Gödel, uma vez que a lógica
de primeira ordem não é suficientemente forte, ou seja, não inclui a aritmética.
Referências
[1] Barendregt, H.P., The Lambda Calculus: its syntax and semantics, N.103
in Studies in Logic and the Foundations of Mathematics (revised edition),
North-Holland, Amsterdam (1994).
[2] Boole, G., The mathematical analsys of logic, being an essay toward a cal-
culus of deductive reasoning, 1847.
[3] Bruscoli, P. and Guglielmi, A., A Tutorial on Proof Theoretic Foundations
of Logic Programming. Invited tutorial at ICLP ’03, LNCS 2916 (2003).
[4] Brünnler, K., Deep Inference and Symmetry in Classical Proofs, PhD thesis
(2003).
[5] Church, A., A formulation of the simple theory of types, Journal of Symbolic
Logic 5, pp. 56–68 (1940).
[6] Church, A., An unsolvable problem of elementary number theory, American
Journal of Mathematics, 58, pp 345-363 (1963).
[7] Enciclopédia Einaudi, Lógica Combinatória, Imprensa Nacional - Casa da
Moeda, 1988.
[8] Frege, G., Begriffsschrift, eine der arithmetischen nachgebildete Formels-
prache des reinen Denkens, 1879.
[9] Forster, T., Logic, Induction and Sets, London Mathematical Soc., C. M.
Series (2003).
[10] Girard, J-Y., Linear Logic, Theoretical Computer Science, vol 50, pp. 1–102
(1987).
[11] Girard, J-Y., Proofs and types.
[12] Gödel, K. On Undecidable Propositions of Formal Mathematical Systems,
New York (1934).
[13] Guglielmi, A. A System of Interaction and Structure, to appear on ACM
Transactions on Computational Logic.
[14] Hatcher, W. S. Foundations of Mathematics (1968).
[15] van Heijenoort, J., From Frege to Gödel, Harvard College, (1999).
[16] Hilbert, D., Ackermann, W., Grundzüge der Theoretischen Logik, Berlin,
Springer (1928).
66
[17] McDowell, R. and Miller, D., Cut elimination for a logic with definitions
and induction, Theoretical Computer Science, vol. 232, pp.91–119 (2000).
[18] Miller, D., Forum: A multiple-conclusion specification language, Theoreti-
cal Computer Science, vol.165, pp. 201–232 (1996).
[19] Miller, D. Sequent Calculus and the Specification of Computation, School
Marktoberdorf on Logic of Computation in 1997: An Advanced Study
Institute of the NATO Science Committee and the Technical University
of Munich, Germany (1997).
[20] Miller, D., Pimentel, E., Linear logic as a framework for specifying sequent
calculus, Lectures in Logic 17 (2004).
[21] Miller, D., Pimentel, E., Using linear logic to reason about sequent systems,
Proceedings of Tableaux, Lecture Notes in Computer Science (2002).
[22] Negri, S., von Plato, J., Structural Proof Theory, Cambridge University
Press, 2001.
[23] Paolini, L., Pimentel, E., Ronchi della Rocca, S., Lazy Strong Normaliza-
tion, Eletronic Notes in Theoretical Computer Science, 2004.
[24] Pfenning, F. Logical frameworks. In Alan Robinson and Andrei Voronkov,
editors, Handbook of Automated Reasoning, chapter 17, pp. 1063–1147
(2001).
[25] Pimentel, E., Miller, D., On the specification of sequent systems, LPAR
(2005).
[26] Ronchi Della Rocca S., Paolini L., The Parametric λ-calculus: a meta-
model for computation, Computer Science-Monograph, Springer Verlag,
(2004).
[27] Russell, B. and Whitehead, A. N., Principia Mathematica, New York, Cam-
bridge University Press (1927).
[28] Schroeder-Heister, P. Cut-elimination in logics with definitional reflection,
Lecture Notes in Computer Science 619 (1992).
[29] Smullyan, R. M., Gödel’s incompletness theorems, New York, Oxford Uni-
versity Press (1992).
[30] Straßburger, L., Linear Logic and Noncommutativity in the Calculus of
Structures, Ph.D. thesis (2003).
[31] Sørensen, M. H. and Urzyczyn, P. Lectures on the Curry-Howard iso-
morphism (1998).
[32] Turing, A.M. On Computable Numbers, with an Application to the Ents-
cheidungsproblem, Proceedings of the London Mathematical Society, series
2, 42 pp , 230-265 (1936-37).
[33] Willard V. Quine. Set Theory and Its Logic, Harper Torchbooks. NY (1965).
67