Você está na página 1de 67

Fundamentos de Matemática

Elaine Gouvêa Pimentel


12 de março de 2008

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

2 Lógica matemática (clássica) 4


2.1 Semântica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Tabela da verdade . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2 Álgebra de Boole . . . . . . . . . . . . . . . . . . . . . . . 8

3 Lógica intuicionista 10
3.1 Semântica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Lógica e Matemática 13

5 Matemática como uma ciência independente 13


5.1 A aritmetização da Análise . . . . . . . . . . . . . . . . . . . . . 14
5.2 Critérios para a fundamentação . . . . . . . . . . . . . . . . . . . 15

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

7 Teoria de conjuntos de Zermelo-Fraenkel 21


7.1 Idéias básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7.2 Formalização de ZF . . . . . . . . . . . . . . . . . . . . . . . . . 22
7.3 Axioma da escolha . . . . . . . . . . . . . . . . . . . . . . . . . . 24

8 O programa de Hilbert e a incompletude de Gödel 26


8.1 O programa de Hilbert . . . . . . . . . . . . . . . . . . . . . . . . 27
8.2 Teoremas de incompletude de Gödel . . . . . . . . . . . . . . . . 28
8.3 O método de prova dos teoremas de Gödel: funções recursivas . . 29
8.3.1 Prova do primeiro teorema de incompletude de Gödel . . 31
8.3.2 Prova do segundo teorema de incompletude de Gödel . . . 34

9 λ-calculus e computabilidade 34

10 λ-calculus tipado simples 36


10.1 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
10.2 Sistemas de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . 38
10.3 Outras propriedades de sistemas de tipos . . . . . . . . . . . . . 40
10.4 Tipos Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.5 Tipo produto, tipo soma e tipos recursivos . . . . . . . . . . . . . 43
10.5.1 Produtos cartesianos . . . . . . . . . . . . . . . . . . . . . 43
10.5.2 Somas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.6 Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.7 Inferência de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . 45

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

13 Semântica denotacional do λ-calculus 53


13.1 Conjunto parcialmente ordenado (POSET) . . . . . . . . . . . . 54
13.2 Ordem parcial completa (CPO) . . . . . . . . . . . . . . . . . . . 55

14 Lógica Linear 57
14.1 Semântica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

15 Lógica e Ciência da Computação 59

16 Logical frameworks 60
16.1 Lógica Linear como framework para especificar sistemas de seqüen-
tes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

A De dedução natural para cálculo de seqüentes 62


A.1 Dedução natural . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
A.2 Cálculo de seqüentes . . . . . . . . . . . . . . . . . . . . . . . . . 63
A.2.1 Cut elimination . . . . . . . . . . . . . . . . . . . . . . . . 65

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.

2 Lógica matemática (clássica)


A lógica matemática lida com a formalização e a análise de tipos de argu-
mentação utilizados em matemática.
Desta forma, os sistemas lógicos formais utilizados para esse fim devem ser
ferramentas adequadas para provar proposições. Parte do problema com a for-
malização da argumentação matemática é a necessidade de se especificar de
maneira precisa uma linguagem matemática formal. Linguagens naturais, as-
sim como o português ou inglês, não servem a este propósito: elas são muito
complexas e em constante modificação. Por outro lado, linguagens formais como
(algumas) linguagens de programação, que também são rigidamente definidas,
são muito mais simples e menos flexı́veis que as linguagens naturais. Utilizamos
então um sistema lógico formal.
Um sistema lógico formal é composto, além da sintaxe (ou notação), de uma
especificação cuidadosa de regras de argumentação (regras de inferência), bem
como de alguma noção de como interpretar e dar um significado a sentenças (ou
proposições) da linguagem adotada (semântica).
A linguagem usada atualmente para formalizar a argumentação matemática
é a lógica (clássica) de primeira ordem, juntamente com um sistema formal de

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)

e no caso da lógica proposicional existe apenas uma regra de inferência: modus


ponens (veja definição abaixo). Desta forma, derivações são seqüências lineares
que começam com instâncias dos axiomas que são decompostos pela regra de
inferência, até que a conclusão é atingida.
De maneira oposta, em sistemas de dedução natural existem apenas regras de
inferência, além de afirmativas que começam as derivações, como por exemplo:

(A)
..
.
B
A⇒B

Neste caso, os pontos verticais indicam a derivação de B a partir de A, que por


sua vez é descartada na linha de inferência (procedimento indicado pelo uso de

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

o Apêndice A.2 para a diferença entre cálculo de seqüentes e dedução natural.

6
Inicial
Γ, A ⊢ A

Γ ⊢ A Γ ⊢ B (∧I) Γ ⊢ A ∧ B (∧E1) Γ ⊢ A ∧ B (∧E2)


Γ⊢A∧B Γ⊢A Γ⊢B
Γ ⊢ A (∨I1) Γ ⊢ B (∨I2) Γ ⊢ A∨B Γ, A ⊢ C Γ, B ⊢ C
(∨E)
Γ ⊢ A∨B Γ⊢A∨B Γ⊢C
Γ, A ⊢ B Γ⊢A Γ ⊢ A ⇒ B (⇒ E)
(⇒ I)
Γ⊢A⇒B Γ⊢B
Γ ⊢ ⊥ (⊥E)
Γ⊢A
Γ, A ⊢ ⊥ Γ ⊢ A Γ ⊢ ¬A (¬E)
(¬I)
Γ ⊢ ¬A Γ⊢⊥
Γ ⊢ ¬(¬A)
(DN )
Γ⊢A

Figura 1: Dedução natural para a lógica cássica

A B ¬A A∧B A∨B A⇒B ⊥


V V F V V V F
V F F F V F F
F V V F V V F
F F V F F V F

Tabela 1: Tabela da verdade

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.

2.1.1 Tabela da verdade


À cada sı́mbolo básico da lógica é dado um valor (semântico): verdadeiro V ou
falso F . Dependendo desse valor, chegamos ao valor das fórmulas formadas a
partir da gramática analisando a Tabela 1.
A semântica dos quantificadores é mais complicada e não será objeto de
estudo neste curso.
Através dessa análise semântica, podemos ver, por exemplo, por que as

7
fórmulas A ⇒ B, ¬B ⇒ ¬A e ¬(A ∧ ¬B) possuem o mesmo comportamento:

A B A⇒B ¬B ⇒ ¬A ¬(A ∧ ¬B)


V V V V V
V F F F F
F V V V V
F F V V V

Ou seja, provas matemáticas do fato:

B segue de A
utilizando qualquer dos seguintes métodos:
direto, contra-recı́proco, por absurdo
são equivalentes.

2.1.2 Álgebra de Boole


Nesta seção mostraremos como utilizar álgebras de Boole para estabelecer a
semântica da lógica clássica proposicional. Além de ser interessante por si só, po-
deremos utilizar alguns conceitos aqui estabelecidos para a semântica da lógica
intuicionista (ver Seção 3.1).
Começaremos por relembrar o conceito de anéis

Definição 1 Um conjunto não vazio R fechado com relação às operações + e


· é dito um anel associativo se ∀ a, b e c em R:

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

Os ı́tens (1)−(4) dizem que R é um grupo abeliano com relação a +, enquanto


que (5) diz que R é um semigrupo com operador ·.
Dizemos ainda que R é um anel com unidade se ∃1 ∈ R tal que ∀a ∈ R
a.1 = 1.a = a. Além disso, R é um anel comutativo se ∀a, b ∈ R, a.b = b.a.

Exemplo 1 a) (Z, +, ·) é um anel comutativo com unidade.


• R = conjunto dos inteiros pares é anel comutativo sem unidade.
b) (Q, +, ·) é anel comutativo com unidade. Além disso, os elementos de Q
diferentes de zero formam um grupo abeliano com relação à multiplicação.
Um anel com esta propriedade é chamado corpo.
c) (Z6 , +, ·) é um anel comutativo com unidade, mas não um corpo.

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).

Exemplo 2 a) (P(A), ∆, ∩, ∅, A) é uma álgebra booleana, onde ∆ é a operação


de diferença simétrica:

X∆Y = (X ∪ Y ) − (X ∩ Y ) = (X ∩ (A − Y )) ∪ ((A − X) ∩ Y ).

b) Z2 é a única álgebra de Boole que também é um corpo. De fato, seja B uma


álgebra de Boole que é um corpo. Para todo x ∈ B, x2 = x ≡ x(x−1) = 0.
Então, se B é um domı́nio de integridade, temos x = 0 ou x = 1. Ou
seja, B é isomorfo a Z2 .

Propriedade 1 1. Em qualquer álgebra de Boole, todo elemento é seu próprio


inverso aditivo.
2. Toda álgebra de Boole é comutativa.

Prova Como (a + b)2 = (a + b) e (a + b)2 = a2 + a.b + b.a + b2 então:

a.b + b.a = 0 (1)

Fazendo b = 1, obtemos a = −a. Para a segunda parte, sabemos que a.b é o


inverso de a.b. Mas por (1), a.b também é o inverso de b.a e portanto a.b = b.a.

A semântica da lógica clássica proposicional será dada a seguir.


Seja F o conjunto de todas as fórmulas proposicionais da lógica clássica e ∼
a seguinte relação de equivalência:

ϕ ∼ ψ se e somente se ⊢ ϕ ⇒ ψ e ⊢ ψ ⇒ ϕ

Seja F∼ = F/ ∼= {[ϕ]∼ : ϕ ∈ F }. As seguintes operações sobre F∼ são bem


definidas:
[α]∼ ∪ [β]∼ = [α ∨ β]∼ [α]∼ ∩ [β]∼ = [α ∧ β]∼
−[α]∼ = [¬α]∼ [α]∼ → [β]∼ = [α ⇒ β]∼
[α]∼ ↔ [β]∼ = [α ⇔ β]∼ [α]∼ = [β]∼ = [α < β]∼

Chame 0 = [⊥]∼ e 1 = [⊤]∼ , onde ⊤ = ⊥ ⇒ ⊥. Então (F∼ , =, ∩, 0, 1) é


uma álgebra de Boole.
Observe que
[⊤]∼ = {ϕ : ∅ ⊢ ϕ}
ou seja, 1 é a classe das tautologias. Observe também que

−a ∩ a = [⊥]∼ e − a ∪ a = [⊤]∼ .

a última igualdade sendo equivalente ao princı́pio do meio excluı́do.


Seja P Vc o conjunto de variáveis proposicionais da lógica clássica. Dizemos
que uma valuação v em F∼ é uma aplicação v : P Vc −→ {0, 1}.
Dada uma valuação v em F∼ , definimos a aplicação [[•]]vc : F −→ {0, 1} de
maneira trivial:

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:

Teorema 2 Existem dois números irracionais x e y tais que xy é racional.



2
Prova A prova √ desse fato é bastante simples: se 2 é racional, então toma-
mos x = y = 2. √ √
Caso contrário, tomamos x = 2 2 e y = 2.
Observe que não

temos como saber qual dos casos realmente acontece, porque
2
não se sabe se 2 é racional ou irracional. Mas o princı́pio do meio excluı́do
nos garante que uma das opções ocorre e isso é bastante natural de se aceitar.
Então, para o exemplo acima descrito, o problema se limita ao fato de que a
prova apresentada não é construtiva.
Um caso mais sério surge com o seguinte teorema:

Teorema 3 Existem sete 7’s consecutivos na representação decimal do número


π.

Ora, ou alguém algum dia chega à representação de com um número de


casas decimais grande o suficiente de modo a encontrar sete 7’s consecutivos ou
então... não se sabe!
Considere p a afirmativa:

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.

Exemplo 3 Todos os seqüentes abaixo são prováveis em lógica clássica:


1. ¬(p ∨ q) ⊢ (¬p ∧ ¬q)
2. (p ∨ q) ⊢ ¬(¬p ∧ ¬q)
3. (p ∨ q) ⊢ (¬p ⇒ q)
4. ¬(p ∧ q) ⊢ (¬p ∨ ¬q)

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 Γ ⊢ ψ ⇒ ϕ

Seja LΓ = Φ/ ∼= {[ϕ]∼ : ϕ ∈ Φ} e defina uma ordem parcial ≤ sobre LΓ da


seguinte forma:

[ϕ]∼ ≤ [ψ]∼ se e somente se Γ ⊢ ϕ ⇒ ψ.

11
Podemos também definir as seguintes (bem definidas) operações sobre LΓ :

[α]∼ ∪ [β]∼ = [α ∨ β]∼ ;

[α]∼ ∩ [β]∼ = [α ∧ β]∼ ;


−[α]∼ = [¬α]∼ ;
ou ainda ir mais adiante e mostrar que as operações ∩ e ∪ são operações “ı́nfimo”
e “supremo” com relação a ≤, e que as leis de distributividade

(a ∪ b) ∩ c = (a ∩ c) ∪ (b ∩ c) e (a ∩ b) ∪ c = (a ∪ c) ∩ (b ∪ c)

são satisfeitas 2 . A classe [⊥]∼ é o menor elemento (0) de LΓ e [⊤]∼ , onde


⊤ = ⊥ ⇒ ⊥, é o maior elemento (1). Temos também que [⊤]∼ = {ϕ : Γ ⊢
ϕ}. Entretanto, existem algumas dificuldades (já esperadas) com a operação
complementar:

−a ∩ a = [⊥]∼ mas não necessariamente − a ∪ a = [⊤]∼ .

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.

Definição 3 Seja H = hH, ∪, ∩, ⇀, −, 0, 1i uma álgebra de Heyting. Denota-


mos por P V ao conjunto de variáveis proposicionais da lógica intuicionista.
i. Uma valuação v em H é uma aplicação v : P V −→ H.
ii. Dada uma valuação v em H, definimos a aplicação [[•]]vi : Φ −→ H por:

[[p]]vi = v(p) para p ∈ P V


[[⊥]]vi = 0
[[ϕ ∨ ψ]]vi = [[ϕ]]vi ∪ [[ψ]]vi
[[ϕ ∧ ψ]]vi = [[ϕ]]vi ∩ [[ψ]]vi
[[ϕ ⇒ ψ]]vi = [[ϕ]]vi ⇀ [[ψ]]vi
2 Ou seja, LΓ é um reticulado distributivo.
3O exemplo mais conhecido de álgebra de Heyting que não é uma álgebra de Boole é a
álgebra de conjuntos abertos de um espaço topológico.

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.

5 Matemática como uma ciência independente


Existem diversas opiniões a respeito de como surgiu a matemática. Alguns ma-
temáticos tendem a considerar a fı́sica como a principal fonte de problemas e
idéias matemáticas. Outros consideram a intuição matemática ligada principal-
mente com a estrutura abstrata de objetos matemáticos (o que quer que venha
a ser isso) e portanto independente de outras ciências. Essa dicotomia de pen-
samento vem desde os primórdios do estudo da matemática. Por exemplo, os
matemáticos gregos desenvolveram a geometria axiomática e deram os primeiros

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.

5.1 A aritmetização da Análise


Um segundo ingrediente dos estudos modernos dos fundamentos da matemática
é o desenvolvimento da Análise e da Teoria da Conjuntos nos séculos XIX e XX.
Este desenvolvimento teve o efeito de separar aspectos puramente aritméticos
ou algébricos do número, dos aspectos geométricos.
Álgebra foi desenvolvida pelas civilizações Indu-Árabe e Descartes “inven-
tou” a Análise através da fusão de Álgebra e Geometria em uma única disci-
plina, a geometria analı́tica. Isto permitiu que os matemáticos “vissem” funções
através de seus gráficos. Um número real passou a ser considerado como um
continuum que era ao mesmo tempo geométrico e algébrico, e provas de fatos
relacionados a funções eram feitas através da análise de seus gráficos. Desta
forma, uma função nunca era separada da curva que era a sua contrapartida
geométrica.
A aritmetização da Análise (Dedekind, Weierstrass, Cauchy, Cantor, etc) foi
responsável pelo desenvolvimento de uma noção algébrica de número real que
não apelava para a intuição geométrica. A definição de números reais partia dos
números racionais. Os racionais eram, por sua vez, definidos a partir de razões
de inteiros e os inteiros eram facilmente construı́dos a partir dos naturais.

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.

5.2 Critérios para a fundamentação


Nesta seção estabeleceremos alguns critérios que devem ser seguidos na hora de
decidir o que é uma fundação (ou fundamentação) para a matemática.
1. Uma fundação para a matemática deve ser adequada para argumentar
sobre uma porção grande da matemática.
De acordo com o Teorema de incompletude de Gödel (veja Seção 8.2), não
existe uma fundação que seja consistente e completa, ou seja, que seja
adequada para toda a matemática. Sempre vão existir alguns teoremas
válidos que não poderão ser obtidos puramente através de um processo
formal de argumentação. Basta então decidir quais verdades são mais
importantes, de maneira a se minimizar as perdas.
2. Uma fundação deve derivar de alguns princı́pios intuitivos e naturais.
Um sistema axiomático é o meio mais comum de catalogar um conjunto
de “verdades” e, em geral, esse sistema é baseado em intuição.
3. Os princı́pios básicos e noções primitivas (não definidas) devem ser tão
econômicas quanto possı́vel.
4. A fundação deve ser consistente.
A não consistência tem uma conseqüência desastrosa: as regras da lógica
de primeira ordem podem ser usadas para provar que qualquer afirmativa
é um teorema (ou seja, é sempre verdadeira). Desta forma, o sistema
resultante é trivial e portanto inútil.
5. A fundação deve poder ser expressa como um sistema formal.
É claro que uma fundação para a matemática poderia ser proposta de
modo a não poder ser expressa através de um sistema formal. De fato,
os resultados de Gödel a respeito da incompletude de sistemas formais
colaboraria para que essa fosse a solução mais adequada. Entretanto,
não haver um sistema formal implica sempre em se desenvolver discursos
quase-filosóficos e obscuros, onde a impera a ausência de uniformidade e
clareza.

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.

6.1 Idéias básicas


Começando em 1879, Gottlob Frege [8] definiu conjuntos através da compre-
ensão de predicados, onde qualquer predicado (ou propriedade) pudesse ser
usado para definir um conjunto.
Se pensarmos em um conjunto como uma coleção de objetos, então existem
basicamente duas maneiras diferentes de descrever conjuntos:
(1) exibindo cada um de seus objetos;
(2) apresentando uma propriedade que seja uma condição necessária e sufici-
ente para pertinência ao conjunto.
Para conjuntos finitos, podemos utilizar tanto (1) quanto (2). De fato, o
conjunto A = {a1 , . . . , an } é determinado pela propriedade
x1 = a1 ∨ . . . ∨ xn = an
Para conjuntos infinitos, (1) é claramente impossı́vel. A pergunta que surge
então é: quando dois conjuntos são iguais?
A condição mais aceita e intuitivamente correta é que dois conjuntos são
iguais se e somente se eles possuem os mesmos elementos. Mas, apesar de
intuitiva, essa afirmativa é altamente não trivial pois as propriedades usadas
na descrição de dois conjuntos com elementos iguais podem ser diferentes. Por
exemplo, o conjunto de todos os inteiros irracionais e o conjunto das pessoas
imortais é igual. Dois conjuntos com os mesmos elementos são ditos serem
co-estensivos.
Se aceitarmos a condição descrita anteriormente para igualdade de conjuntos,
então essa relação entre conjuntos deve satisfazer todas as propriedades de uma
relação de igualdade. A reflexividade vale obviamente, pois todo conjunto possui
os mesmos elementos que si mesmo. A outra condição básica da igualdade é
que dois conjuntos iguais devem possuir as mesmas propriedades:
A = B ⇒ P (A) ≡ P (B)

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))

Frege e Dedekind provaram, utilizando uma série de construções engenhosas,


que toda a matemática básica podia ser descrita usando apenas lógica de pri-
meira ordem mais os dois princı́pios: extensionalidade e abstração. Ou seja, se
considerarmos a l.p.o. (com “∈” como o único predicado primitivo) mais os axi-
omas citados acima então é possı́vel, por meio de construções e definições dentro
do sistema, definir os números naturais, os reais, e reproduzir formalmente as
provas usuais dos teoremas conhecidos sobre tais conjuntos e seus elementos.

6.2 O sistema formal


A linguagem F definida por Frege contém apenas um predicado, que escrevere-
mos como ∈. As fómulas de F são definidas abaixo.

1. Toda variável é um termo.


2. Se x, y são termos, então x ∈ y é uma fórmula.
3. Se A é uma fórmula e x é uma variável, então ∀x.A e ∃x.A são fórmulas.
4. Se A é uma fórmula contendo x como variável livre, então {x | A} é um
termo.
5. Se A, B são fórmulas, então ¬A, A ∨ B são fórmulas.
6. As fórmulas e termos de F são exatamente as definidas pelas regras acima.

A primeira definição de F é a de igualdade:

Definição 4 Escrevemos (x = y) para

∀z.z ∈ x ≡ z ∈ y

onde a variável z não ocorre livre em x ou y.

Os axiomas de extensionalidade e abstração são os únicos axiomas de F:

F1. ∀x.∀y.(x = y) ⇒ A(x, x) ≡ A(x, y) onde A(x, y) é obtido de A(x, x)


substituindo x por y zero, uma ou mais ocorrências de x em A(x, x) e y é
livre em x em todas as ocorrências de x por ele substituı́das.

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).

Segue imediatamente que se ⊢ A(x) ≡ B(x) então ⊢ {x | A(x)} = {x |


B(x)}.
A seguir, apresentaremos algumas definições e teoremas em F.

Teorema 5 ⊢ ∀x.x = x

Prova Considere a seguinte derivação:


(inicial)
⊢ x2 ∈ x1 ≡ x2 ∈ x1
(∀I)
⊢ ∀x2 .x2 ∈ x1 ≡ x2 ∈ x1

Pela Definição 4, obtemos ⊢ x1 = x1 . Logo,


(inicial)
⊢ x1 = x1
(∀I)
⊢ ∀x1 .x1 = x1

como querı́amos.

Definição 5 V denota {x | x = x}

Teorema 6 ⊢ ∀x.x ∈ V

Ou seja, V é, na verdade, o conjunto universal contendo tudo. Em particular,


V contém ele mesmo.

Definição 6 ∅ denota {x | x 6= x}

Teorema 7 ⊢ ∀x.x ∈
/∅

∅ é o conjunto vazio, um conjunto que não contém elementos. Poderı́amos


seguir adiante e definir união, interseção e complementar de conjuntos. Veja a
referência 5 para a lista completa de definições.
O mais impressionante dessa teoria, é que podemos definir o conjunto dos
naturais com apenas o que foi descrito até agora. A seguir, as definições de zero,
sucessor e do conjunto dos naturais.

Definição 7 0 denota {∅}

Definição 8 S(x) denota {y | ∃z.z ∈ y ∧ (y ∩ z) ∈ x}

Definição 9 N denota {x1 | ∀x2 .(0 ∈ x2 ) ∧ ((∀x3 .x3 ∈ x2 ⇒ S(x3 ) ∈ x2 ) ⇒


x1 ∈ x2 )}

Um conjunto é dito indutivo se contém o sucessor de todos os seus elementos.


N é o menor conjunto indutivo contendo o 0.
Com as definições acima, podemos provar alguns teoremas sobre o conjunto
N.

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 9 ⊢ ∀x.0 6= S(x)

O sucessor de um natural também é natural:

Teorema 10 ⊢ ∀x.x ∈ N ⇒ S(x) ∈ N

Teorema 11 ⊢ ∀x1 .(0 ∈ x1 ∧ ∀x2 .x2 ∈ x1 ⇒ S(x2 ) ∈ x1 ) ⇒ (N ⊂ x1 )

O teorema acima diz que N está contido em qualquer conjunto contendo o


zero e o sucessor de cada um de seus elementos, e permite enunciar a indução
matemática:

Teorema 12 ⊢ (P (0) ∧ ∀x.P (x) ⇒ P (S(x))) ⇒ ∀x.(x ∈ N ⇒ P (x))

Algumas observações importantes sobre o que foi discutido acima:


• Os cinco postulados de Peano (formalização da aritmética) podem ser
provados a partir do sistema de Frege.
• As operações de adição, multiplicação, etc, podem ser definidas utilizando
a recursão:
x+0 = x
x + S(y) = S(x + y)

Claro que o segundo ı́tem depende do Teorema da recursão primitiva: dadas


as funções g(x1 , . . . , xn ) e h(x1 , . . . , xn , y, z), existe uma função f (x1 , . . . , xn , xn+1 )
tal que f (x1 , . . . , xn , 0) = g(x1 , . . . , xn ) e f (x1 , . . . , xn , S(y)) = h(x1 , . . . , xn , y, f (x1 , . . . , xn , y)).
Tal teorema pode ser provado por indução, também dentro do sistema de Frege.
Mas não pode ser provado apenas a partir dos axiomas de Peano.
O sistema de Frege é certamente viável e satisfaz claramente 5 dos critérios
estabelecidos anteriormente para uma boa fundamentação da matemática. As
construções são naturais e intuitivas e os axiomas não fazem nada a mais que
expressar formalmente algumas caracterı́sticas que parecem básicas e essenciais
em teoria de conjuntos.
Mas falta o mais importante: a consistência!

Teorema 13 ⊢ {x | x ∈
/ x} ∈
/ {x | x ∈
/ x}

Teorema 14 ⊢ {x | x ∈
/ x} ∈ {x | x ∈
/ x}

Se toda condição determina um conjunto, então considere o conjunto y de-


terminado pela condição x ∈/ x. Ou seja, y é o conjunto de todos os conjuntos
que não são elementos de si mesmos.
A princı́pio, y é um conjunto grande, uma vez que a maioria dos conjuntos
não é membro de si mesmo. Por exemplo, o conjunto dos reais não é um número
real. O paradoxo consiste no fato de que y é um elemento de si mesmo se e
somente se não o é. Mais sobre o Paradoxo de Russell na Seção 6.3.
Sendo o Sistema de Frege inconsistente, qualquer coisa pode ser provada
dentro dele e, portanto, ele não poder ser usado como uma fundação para a
matemática.

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.

6.3 Paradoxos e a teoria de tipos de Russell


Em 1903, Bertrand Russell publicou Principles of Mathematics, onde ele afirma
que matemática e lógica são idênticas. Em suas palavras:
“Pure mathematics is the class of all propositions of the form p implies q
where p and q are propositions ... and neither p nor q contains any constants
except logical constants.”
No seu trabalho posterior Principia Mathematica, escrito entre 1910 e 1913
em colaboração com Alfred North Whitehead (1861-1947), Russell propõe um
sistema que pensa ser completo para matemática pura, baseado exclusivamente
em princı́pios lógicos puros, e formulado utilizando uma linguagem simbólica
precisa.
A preocupação principal do Principia Mathematica era evitar os tão famosos
paradoxos circulares viciosos, tais como o paradoxo de Russell. O paradoxo de
Russell começa com o questionamento se um conjunto qualquer é um membro
de si mesmo ou não.
Por exemplo, o conjunto de todos os gatos não é membro de si mesmo, por
não ser um gato. Mais interessante, considere R a coleção contendo apenas os
conjuntos que não são membros de si mesmos. A pergunta que surge é: R é
um conjunto ou não? Suponha que sim. Então existem duas possibilidades: ou
R ∈ R, ou R ∈ / R. No primeiro caso, R deve satisfazer a condição de pertinência
a R, ou seja, R não deve ser um membro de si mesmo, o que é um absurdo.
Conversamente, suponha que R não seja um elemento de si mesmo. Então R
não satisfaz a condição de pertinência a R. Ou seja, R deve ser um elemento de
si mesmo. De qualquer modo, chegamos a uma posição contraditória, onde R é
um membro de si mesmo precisamente quando não o é. Observe que o fato de
R ser finito ou infinito é irrelevante.
O mesmo paradoxo aparece em diversas outras situações, como por exemplo
o clássico: a bibliografia de todas as bibliografias. A esse tipo de “conjunto de
todos os conjuntos” chamamos usualmente de coleção.
Examinando de perto o paradoxo de Russell, vemos que R é definido através
de uma referência implı́cita a si mesmo, e portando gerando um cı́rculo vicioso.
A solução apresentada por Russell para esse tipo de problema com auto-
referência foi a de excluir todas as coleções cuja definição fazia referência à
própria coleção. Ou seja, ele sugeriu uma teoria de tipos ou nı́veis, onde à toda
classe (conjunto, coleção) corresponde um tipo e uma classe pode conter apenas
elementos de menor tipo. Com essa restrição, classes devem possuir tipo maior
que o tipo de cada um de seus membros, evitando paradoxos como o de Russell.
A teoria desenvolvida por Russell foi chamada de teoria ramificada de tipos,
e consiste na espinha dorsal do Principia Mathematica. Enquanto a teoria
ramificada de tipos exclui a possibilidade de paradoxos, é um sistema muito
fraco para sevir como ferramenta lógica para a matemática. De fato, não se
pode nem ao menos provar que existe uma infinidade de números naturais, ou

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.

7 Teoria de conjuntos de Zermelo-Fraenkel


A partir dos trabalhos de Frege e Russell, se tornava evidente que um maior
esforço deveria ser feito no sentido de formalizar (ou axiomatizar) a teoria de
conjuntos.
Isso foi feito com sucesso por Ernst Zermelo. Suas razões para fazê-lo foram
duas. Primeiro, a descoberta do paradoxo de Russell. Como já observado anteri-
ormente, a solução proposta pro Russell em sua teoria de tipos não é satisfatória.
Mas Zermelo observou que o paradoxo de Russell pode ser evitado através de
uma escolha cuidadosa dos princı́pios de construção de conjuntos, obtendo ainda
o poder de expressão necessário para a argumentação matemática.
O preço que se deve pagar para evitar inconsistência é apenas que alguns
“conjuntos” não existem, como por exemplo o conjunto “universal” (conjunto
de todos os conjuntos), ou o conjunto de todos os números cardinais.
A segunda razão é um pouco mais delicada. No desenvolvimento da teoria
de números cardinais e ordinais de Cantor, surgiu a questão de qual tipo de
conjunto pode ser ordenado. De fato, Zermelo provou que todo conjunto satisfaz
o princı́pio da boa ordenação, mas pode fazer isso apenas depois de introduzir
um novo axioma que parecia ser independente dos outros (como realmente o é).
O seu axioma da escolha se tornou a ferramenta padrão da matemática
moderna, e a discussão que surgiu em torno desse axioma se compara à de
outro axioma famoso, o quinto postulado de Euclides. Mais sobre o axioma da
escolha na Seção 7.3. A teoria axiomática de conjuntos que utilizamos hoje em
dia (ZF) é baseada na proposição original de Zermelo, depois melhorada por
Fraenkel em 1922.

7.1 Idéias básicas


Respondendo à pergunta feita no final da Seção 6, Zermelo evitou os paradoxos e
inconsistências no sistema de Frege baseando-se na idéia de que conjuntos podem
ser construı́dos a partir de alguns conjuntos simples e algumas operações.
Com relação ao princı́pio da abstração: quando conjuntos são definidos
por propriedades, eles são usualmente subconjuntos de um dado conjunto ma-
temático. Por exemplo, um matemático trabalha com o conjunto de todas as
funções reais contı́nuas quando define a noção “f é contı́nua” em termos lógicos
puros. Mas este é um subconjunto do conjunto de todas as funções reais, que
os matemáticos consideram um objeto matemático válido. Mas certamente não
ocorreria a um matemático considerar o conjunto de todas as funções (ou equi-
valentemente o conjunto de todos os conjuntos). A razão é simples: não tem
sentido em se falar do conjunto de todas as funções, uma vez que cada função
é determinada por um domı́nio, uma regra matemática, um co-domı́nio e assim
por diante.
Portanto, no sistema de Zermelo, o princı́pio da abstração se torna o princı́pio
da separação. Basicamente, esse princı́pio determina um processo de obter sub-
conjuntos a partir de um conjunto dado através de propriedades, ao invés de
defini-los a priori pelas propriedades.

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.

Utilizando a notação lógica:

⊢ ∀y.∃x.∀z.(z ∈ x) ≡ (z ∈ y) ∧ P (z)

Ou seja, ao invés de propor a existência de conjuntos, o princı́pio da se-


paração fala sobre a existência de subconjuntos de um dado conjunto.
O único conjunto cuja existência pode ser provada a partir do princı́pio da
separação é o conjunto vazio. Basta tomar qualquer propriedade auto contra-
ditória para P . Por exemplo:

⊢ ∃x1 .∀x2 .(x2 ∈ x1 ) ≡ (x2 ∈ x3 ) ∧ ((x2 ∈ x2 ) ∧ (x2 ∈


/ x2 ))

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:

Definição 10 Escrevemos (x = y) para

∀z.z ∈ x ≡ z ∈ y

onde x e y são quaisquer termos nos quais a variável z não ocorre livre.

O axioma de extensionalidade de ZF:

ZF1. ∀x.∀y.(x = y) ⇒ A(x, x) ≡ A(x, y) onde A(x, y) é obtido de A(x, x)


substituindo x por y zero, uma ou mais ocorrências de x em A(x, x) e y é
livre em x em todas as ocorrências de x por ele substituı́das.

Teorema 15 ⊢ ∀x1 .∀x2 .((x1 = x2 ) ⇒ ∀x3 .(x1 ∈ x3 ) ≡ (x2 ∈ x3 ))

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,

(x1 = x2 ) ⊢ (((x1 ∈ x3 ) ≡ (x1 ∈ x3 )) ≡ ((x1 ∈ x3 ) ≡ (x2 ∈ x3 ))) (x1 = x2 ) ⊢ (x1 ∈ x3 ) ≡ (x1 ∈ x3 )


x1 = x2 ⊢ (x1 ∈ x3 ) ≡ (x2 ∈ x3 )

O axioma da separação é formalmente enunciado como:


ZF2. ∀x.∀y.(x ∈ {y | (y ∈ z) ∧ A(y)}) ≡ (x ∈ z) ∧ A(x).
A diferença entre o princı́pio da separação e o princı́pio da abstração de
Frege é a condição extra y ∈ z.
O axioma a seguir que diz que 0 é o conjunto vazio:
ZF3. 0 = {x1 | x1 ∈ 0 ∧ x1 6= x1 }, onde 0 é uma constante primitiva.
Como já observamos antes, a existência do conjunto vazio pode ser deduzida
a partir de ZF2. ZF3 apenas nos diz que 0 é o conjunto de nenhum elemento,
como o 0 = ∅ do sistema de Frege.
Teorema 16 ⊢ ∀x.(x = x)
A demonstração do teorema acima é trivial e este resultado pode ser usado para
provar:
Teorema 17 ⊢ ∀x.(x ∈
/ 0)
Prova Por ZF2, x ∈ 0 = x ∈ 0 ∧ x 6= x. Logo x ∈ 0 ⇒ x 6= x pode ser
provado:
(inicial)
x ∈ 0 ⊢ x ∈ 0 ∧ x 6= x
(∧E)
x ∈ 0 ⊢ x 6= x
(⇒ I)
⊢ x ∈ 0 ⇒ x 6= x
Utilizando as equivalências De Morgan, a conclusão da derivação acima é equi-
valente a ⊢ x = x ⇒ x ∈ / 0. Logo,
⊢ ∀x.x = x (∀E)
⊢x=x⇒x∈ /0 ⊢x=x
(⇒ E)
⊢x∈ /0
(∀I)
⊢ ∀x.x ∈
/0

Dado que P é a representação da função primitiva que indica o “power set”


(P(y) é o conjunto de todos os subconjuntos de y), o quarto axioma do sistema
ZF pode ser enunciado assim:

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.

ZF5. ∀y.∀z.∀x.x ∈ {y, z} ≡ (x = y ∨ x = z).


S S
Seja a representação da função primitiva tal que (y) indica a união de
todos os conjuntos na coleção y. O próximo axioma é conhecido como axioma
da soma de conjuntos.
S
ZF6. ∀y.∀x.x ∈ (y) ≡ ∃z.(z ∈ y) ∧ (x ∈ z).
S
Definição 11 Denotaremos x ∪ y = ({x, y}).

Definição 12 Denotaremos x′ = x ∪ {x}. Em particular, escreveremos 1 =


0′ , 2 = 1′ . etc.

O operador x′ é a função sucessor no sistema de Zermelo. A versão de


números naturais que obtemos é a mesma desevolvida por von Neumann. In-
tuitivamente, os números naturais formam o menor conjunto contendo o 0 e
fechado com relação à operação sucessor.
Ao total, são 10 os axiomas de ZF. Não discutiremos todos os outros aqui,
mas de especial interesse são aqueles que tratam da existência do conjunto
infinito e o axioma da escolha, que é o assunto da próxima seção.

7.3 Axioma da escolha


No livro Introdução à Filosofia da Matemática, Russell relata a parábola de um
milionário cujo guarda roupa possui um número enumerável (infinito) de pares
de sapatos, assim como de meias. Parece óbvio que existe uma bijeção entre
os sapatos e os números naturais, e uma bijeção entre as meias e os números
naturais.
Com relação aos sapatos, essa bijeção é fácil de estabelecer: o sapato es-
querdo do n-ésimo par corresponde ao número 2n, enquanto que o sapato direito
corresponde ao número 2n+1. E com relação às meias? O problema é que, em
geral, não se pode distinguir meias de um certo par, como feito com sapatos.
Ou seja, para que o mesmo procedimento funcione nesse caso é necessário que
as meias de todos os pares (a menos de um número finito) sejam diversas. Mas
não somente isso, as meias devem ser diversas mas seguindo um certo critério,
como por exemplo uma é azul e a outra preta.
O fato de que não existe um modo sistemático de escolher uma meia de um
par significa que precisamos da uma função de escolha, mesmo que não possamos
apresentá-la explicitamente.
Uma função de escolha em uma famı́lia S de conjuntos é uma função f com
domı́nio S tal que, para todo conjunto não vazio X em S, f (X) é um elemento
de X. Em outras palavras, f “escolhe” um elemento para cada membro de S.
Se S é finito, a existência da função de escolha em S é uma consequência
trivial dos princı́pios básicos de formação de conjuntos e das regras de lógica
clássica.
Quando S é infinito, entretanto, esses princı́pios não são suficientes e por-
tanto a existência de uma função de escolha deve ser postulada. A afirmativa

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.

Prova Seja A = {s, t}, onde s = t se e somente ⊢ p, onde p é um predicado


qualquer. Seja B = {0, 1} e seja S = {(s, 0), (t, 1)} ⊂ A × B. Se f : A → B é a
função de escolha para S, então
(I) f (s) = 1 ou f (t) = 0, então devemos ter s = t e, portanto p vale; ou
(II) f (s) = 0 e f (t) = 1, e portanto s não pode ser igual a t e p não vale.

Finalmente, um comentário rapidinho sobre as conseqüências “paradoxais”


do axioma da escolha. Em 1914, Hausdorff provou, utilizando o axioma da
escolha, que 2/3 da superfı́cie da esfera é congruente a 1/3 dela. Esse resul-
tado foi mais tarde estendido para o caso tri-dimensional por Banach e Tarski
em 1924, onde eles utilizaram o axioma da escolha para provar que qualquer
esfera sólida pode ser decomposta em um número finito de subconjuntos, que
podem ser re-arranjados de tal modo a formar duas esferas sólidas, cada uma
do mesmo tamanho da original. Esse resultado é conhecido como o paradoxo
de Banach-Tarski. Por mais estranhos que esses resultados possam parecer,
eles não constituem, verdadeiramente, contradições. Decomposições “parado-
xas” como essas só se tornam possı́veis em teoria de conjuntos porque objetos
geométricos contı́nuos foram considerados como um conjunto discreto de pon-
tos, que o axioma da escolha então permite ser rearranjado em uma maneira
arbitrária.

8 O programa de Hilbert e a incompletude de


Gödel
Nesta seção começaremos a discutir algumas questões básicas que dizem respeito
à relação entre provas dentro de uma certa linguagem formal e a argumentação
meta-matemática sobre as provas dentro da linguagem.
O problema básico a ser abordado é o seguinte: dado um sistema lógico
formal, como podemos provar que tal sistema é consistente?
Para provar a inconsistência, basta exibir uma dedução de uma contradição,
como foi feito no caso do sistema de Frege.
Para provar a consistência, devemos provar que é impossı́vel que qualquer
contradição possa ser um teorema do sistema. Existem basicamente dois métodos
para fazer isso. O primeiro é mostrar que o sistema formal é, na verdade, uma
estrutura matemática. Através de uma exaustiva análise do processo de prova
dentro do sistema (visto como uma operação matemática) pode-se mostrar que
contradições não estão presentes no sistema. Este método é conhecido como
proof theory.
O segundo método utiliza o fato de que qualquer sistema que possui um
modelo (matemático) é consistente. Essa abordagem é conhecida como model
theory.

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.

8.1 O programa de Hilbert


Em 1899 David Hilbert publicou o seu trabalho Grundlagen der Geometrie
(Fundamentos da Geometria), que marcou época. Sem introduzir nenhum sim-
bolismo especial, nesse trabalho Hilbert formula um tratamento axiomático ri-
goroso da geometria euclideana.
Ele também estabelece a consistência do seu sistema axiomático mostrando
que ele pode ser interpretado em um sistema de números reais. Com esse sis-
tema, Hilbert procurava mostrar que a geometria era inteiramente auto sufici-
ente como um sistema dedutivo.
O grande sucesso que Hilbert obteve com esse trabalho o levou a tentar apli-
car o mesmo método à matemática pura como um todo, deste modo assegurando
o que ele esperava ser o rigor perfeito de toda matemática.
Hilbert foi o primeiro a formular o conceito de meta-matemática, por meio
da qual ele pretendia estudar sistemas formais através de métodos concretos
(construtivos) de teoria de números. O objetivo era apresentar uma prova de
consistência de um sistema no qual toda a matemática poderia ser deduzida.
O programa de Hilbert (1920) tinha como objetivo prover uma nova fundação
para a matemática, não reduzindo-a à lógica, mas representando a sua forma
essencial dentro de sı́mbolos concretos. Desta forma, proposições matemáticas

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.

8.2 Teoremas de incompletude de Gödel


No princı́pio do século XX, Gödel acabou com qualquer esperança de encontrar
uma base axiomática para a matemática que fosse ao mesmo tempo completa e
livre de contradições.
De uma maneira concisa, o teorema da incompletude de Gödel diz que:

em qualquer formalização consistente da matemática que seja su-


ficientemente forte para definir o conceito de números naturais, se
pode sempre construir uma afirmativa que não pode ser provada
verdadeira ou falsa dentro do sistema.

Mais especificamente, seja F um sistema de primeira ordem no qual igual-


dade pode ser definida. Dizemos que F é suficientemente rico se ao menos a
aritmética de primeira ordem pode ser desenvolvida dentro de F . Ou seja, os
axiomas de S devem ser teoremas de F . Gödel provou que:
1. Se o conjunto de axiomas de um sistema for decidı́vel (no sentido de que
podemos decidir por métodos construtivos quando uma fórmula é ou não
um axioma), então não é possı́vel construir um sistema formal de primeira
ordem suficientemente rico no qual todos os teoremas dentro do sistema
são prováveis verdadeiros.
2. A consistência de um sistema formal de primeira ordem suficientemente
rico F não pode ser provado por métodos que podem ser expressos em F .
Em particular, se S é consistente, então não podemos provar a consistência
de S dentro de S4 . Ou seja, não existe uma prova absoluta de consistência
para nenhum sistema consistente e suficientemente rico.
Observe que o ı́tem (2) é equivalente a dizer que é impossı́vel provar a con-
sistência da matemática dentro de um sistema de primeira ordem. Então, como
resultado imediato do fato de que a lógica de primeira ordem ser consistente,
temos que a matemática não pode ser formalizada utilizando apenas lógica de
primeira ordem.
A prova apresentada por Gödel é feita através de uma modificação engenhosa
do paradoxo do mentiroso:
4 É importante observar que S foi provado consistente por Gentzen, mas seu método usa

indução transfinita e portanto envolve os métodos de teoria geral de conjuntos.

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.

8.3 O método de prova dos teoremas de Gödel: funções


recursivas
Ilustraremos aqui, de maneira intuitiva, o método utilizado por Gödel para o
sistema S.
O primeiro passo para demonstrar o resultado (1) é estabelecer uma corres-
pondência 1 − 1 (g) entre os sı́mbolos primitivos, expressões bem formadas e
seqüências de expressões bem formadas de S e os números naturais. A imagem
de um certo sı́mbolo ou expressão é chamada de número de Gödel.
Deste modo, os números de Gödel para S (por convenção) são:

g(0) = 3, g(′ ) = 5, g(() = 7, g()) = 9, g(+) = 11, g(•) = 13, g(=) = 15, g(xn ) = 15+2n

onde xn é qualquer variável.


Depois, lembramos que uma expressão é qualquer seqüência finita de sı́mbolos
primitivos, e que toda expressão bem formada é uma expressão. Atribuı́mos
números de Gödel a expressões da seguinte forma:
• Se a0 a1 . . . an é uma seqüência finita de sı́mbolos primitivos, então

g(a0 a1 . . . an ) = 2g(a0 ) · 3g(a1 ) · . . . · pg(a


n
n)

onde pn é o n-ésimo primo.


• Se x = e0 e1 . . . en é uma seqüência finita de expressões, então
n
g(ei )
Y
g(x) = pi
i=0

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.

Exemplo 4 Calculemos o número de Gödel para a expressão (x1 = x1 ).

g((x1 = x1 )) = 2g(() · 3g(x1 ) · 5g(=) · 7g(x1 ) · 11g())


27 · 317 · 515 · 717 · 119

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:

• Substituição: dadas n funções h1 , . . . , hn de m variáveis cada e uma função


g de n variáveis, a função f é definida por:

f (z1 , . . . , zm ) = g(h1 (z1 , . . . , zm ), h2 (z1 , . . . , zm ), . . . , hn (z1 , . . . , zm ))

• Recursão primitiva: dadas uma função h de n + 2 variáveis e uma função


g de n variáveis, a função f de n + 1 variáveis é definida por:
f (z1 , . . . , zn , 0) = g(z1 , . . . , zn )
f (z1 , . . . , zn , y + 1) = h(z1 , . . . , zn , y, f (z1 , . . . , zn , y))

• Minimalização: associa à função f de n variáveis a função h de n + 1


variáveis tal que

f (z1 , . . . , zn ) = min y(h(z1 , . . . , zn , y) = 0)

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 .

Definição 13 1. Uma função recursiva é qualquer função que é ou inicial


ou pode ser obtida a partir de uma função inicial por um número finito de
aplicações de operações elementares.

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 )

Se R pode ser expressa em S, dizemos que A(x1 , . . . , xn ) expressa R.


A importância crucial do conceito de recursividade se baseia no fato de que
toda relação recursiva pode ser expressa em S. E é essa possibilidade de expressar
afirmativas sobre S dentro de S que é importante para provar os resultados (1)
e (2) formulados por Gödel.
A idéia da prova de (1) é baseada na construção de uma expressão bem
formada G de S tal que nem G nem ¬G podem ser provadas como teorema de
S se S é consitente. O método para obter tal G utiliza os números de Gödel.
Passemos então à prova detalhada do primeiro teorema de Gödel.

8.3.1 Prova do primeiro teorema de incompletude de Gödel


Em primeiro lugar, definimos os predicados P e Q.
P Sejam n o número de Gödel de alguma seqüência de expressões e1 , . . . , en
e m o número de Gödel de uma expressão bem formada e. Definimos o
predicado P nm como sendo verdadeiro se e1 , . . . , en ⊢ e. Dizemos que P
prova o par hn, mi.

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:

1. Alguém mostra a Gödel a M V U , uma máquina que supõe-se ser uma


Máquina da Verdade Universal, capaz de responder corretamente qualquer
pergunta.
2. Gödel pede para ver o programa e o circuito da M V U . O programa pode
ser complicado, mas possui comprimento finito. Chamemos este programa
de P (M V U ).
3. Sorrindo de maneira sarcástica, Gödel escreve a seguinte sentença:

“A máquina construı́da com base no programa P (M V U ) nunca vai dizer


que esta sentença é verdadeira.”

Chame a sentença acima de G, de Gödel. Note que G é equivalente a:

“M V U nunca vai dizer que G é verdadeiro.”

4. Agora Gödel ri e pergunta a M V U se G é verdadeiro ou não.


5. Acontece que se M V U diz que G é verdadeiro, então “M V U nunca vai
dizer que G é verdadeiro” é falso. Da mesma forma, se M V U diz que G
é falso, então “M V U nunca vai dizer que G é verdadeiro” é verdadeiro.
Portanto M V U não pode dar nenhuma resposta, uma vez que faz apenas
afirmativas verdadeiras.
6. Em particular, M V U nunca vai dizer que G é verdadeiro. Ou seja, G é
verdadeiro!
7. “Eu sei uma verdade que M V U nunca poderá provar,” diz Gödel. “Eu
sei que G é verdadeiro. M V U não é universal!”

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.

8.3.2 Prova do segundo teorema de incompletude de Gödel


O segundo teorema de incompletude de Gödel é tão revolucionário quanto o
primeiro.
Em poucas palavras, o segundo teorema diz que nenhum sistema (suficien-
temente forte) pode provar a sua própria consistência, a não ser que o sistema
em si seja inconsistente.
A expressão bem formada utilizada para provar esse teorema é:

SC : {S é consistente}

Abaixo segue uma prova rápida do segundo teorema a partir do primeiro:


1. SC ⇒ G provado no primeiro teorema
2. (⊢ SC) ⇒ (⊢ G) (1) e meta-argumentação
3. ¬(⊢ G) provado no primeiro teorema
4. ¬(⊢ SC) (2), (3) e modus tollens
O resultado do segundo teorema implica que, para provar a consistência de
um sistema A, devemos fazê-lo ou informalmente, ou através de argumentação
em um sistema B. Desta forma, obtemos apenas uma consistência relativa para
A, uma vez que a consistência de A agora depende da consistência de B. Mas,
por sua vez, a consistência de B deve ser provada através da argumentação em
um sistema C, e assim por diante.
Para terminar este capı́tulo, gostaria de salientar que o primeiro teorema de
Gödel provou que sistemas que contém a aritmética não podem ser completos,
e que alguns teoremas de teoria de números nunca poderão se provadas verda-
deiras ou falsas, não importa o esforço que façamos. O segundo teorema mostra
que a confiança que temos na aritmética não pode nunca ser perfeita.
Ou seja, Gödel conseguiu, com uma tacada só, destruir dois ideais da ma-
temática, e o fez em 1931, aos 25 anos de idade.

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.

Definição 14 Seja Var um conjunto enumerável finito de variáveis. O con-


junto deλ-termos é definido pela seguinte gramática:

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

é expressa em λ-calculus como


λx.x + 2
que significa que o comportamento da função é de adicionar 2 ao argumento,
caso exista. Observe que o nome da função (antes f ) não importa, ou seja, foi
abstraı́da. Também não importa se a função é ou não aplicada a um argumento
(no caso de f , o argumento era x), uma vez que isso não é necessário para
descrever o comportamento da função. Mais do que isso, a λ-função pode ser
aplicada a um número natural, real, ou a uma outra função, o que não é possı́vel
com a representação usual de funções.
O λ-calculus possui apenas uma regra de redução, que basicamente diz que
aplicar uma função a um argumento significa substituir todas as ocorrências da
variável da função pelo argumento em questão.

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.

10 λ-calculus tipado simples


10.1 Tipos
Tipos estão presentes tanto em matemática quanto em computação. Na te-
oria de conjuntos tradicional, o agrupamento de elementos em um conjunto
independe da natureza desses elementos. Quando passamos a trabalhar em
aplicações especı́ficas, precisamos classificar os objetos em categorias, de acordo
com o seu uso ou aplicação.
A noção de tipos origina-se dessa classificação: um tipo é uma coleção de
objetos ou valores que possuem alguma propriedade em comum. Em geral, para
cada tal conjunto de valores, existe uma classe sintática correspondente, qual
seja, de termos que representam esses valores, que também é chamada de tipo,
em abreviação a expressão de tipo.
Em matemática, tipos impõem restrições que evitam paradoxos. Universos
não tipados, como o da teoria de conjuntos de Frege, apresentam inconsistências
lógicas (tais como o paradoxo de Russell).

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:

if E then 1 else 1 + “1”

No caso de checagem em tempo de execução, o erro de tipo contido nesta ex-


pressão só é detectado se a avaliação da sub-expressão E resulta no valor falso.
Podem então ocorrer casos em que um erro de tipo não é detectado, mesmo
depois de um número grande de testes do programa. Esse erro poderá ocorrer,
inesperadamente, em um passo de execução não testado anteriormente, com
conseqüências potencialmente desastrosas. No caso de checagem em tempo de
compilação, ao contrário, todos os erros de tipo serão sempre detectados.
É claro que existem formas de erro que não são erros de tipo. No entanto,
os argumentos apresentados acima, são importantes devido à grande freqüência
de erros de tipo usualmente cometidos durante uma tarefa de programação.
Em face dos argumentos apresentados, o estudo de tipos em linguagens de pro-
gramação tornou-se de grande importância, no sentido de sua influência sobre
o projeto e a definição de linguagens de programação e, portanto, sobre o de-
senvolvimento de software em geral.
Apesar da similaridade entre as noções de tipo em matemática e em com-
putação, existem algumas diferenças entre estes dois conceitos. Em primeiro
lugar, a finalidade é diferente. Em computação, a noção de tipos é motivada pe-
los fatores apresentados acima: estruturação, clareza e eficiência de programas,
e detecção de erros; em matemática, o propósito é o de evitar inconsistências
lógicas. Outra diferença relevante é o fato de que tipos em linguagens de pro-
gramação são definidos para objetos cuja avaliação pode não terminar, o que
não ocorre em matemática; por exemplo, pode-se definir recursivamente uma
variável inteira v, da seguinte forma:

v=v+1

A variável v não pertenceria ao tipo (matemático) dos inteiros. A interpretação

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.

10.2 Sistemas de Tipos


A definição de uma linguagem de programação serve a diferentes grupos de
pessoas: projetistas, implementadores (de compiladores, interpretadores ou edi-
tores com recursos especı́ficos para edição de programas) e programadores. Tal
definição deve especificar tanto a sintaxe quanto a semântica da linguagem.
A definição da sintaxe de uma linguagem determina quais seqüências de
sı́mbolos são frases (válidas), e como frases podem ser combinadas de modo a
formar outras frases. Aspectos dinâmicos, relativos à execução de programas,
não são considerados. Exemplos de frases de programas são literais, variáveis,
declarações, expressões, comandos, programas etc.
As condições que determinam se uma seqüência de sı́mbolos é uma frase
podem ser expressas através de regras livres de contexto e de regras sensı́veis
ao contexto. Como o nome indica, regras livres de contexto são aquelas em
que as condições para a construção de novas frases podem ser especificadas sem
considerar o contexto no qual essas frases ocorrem. Regras sensı́veis ao contexto,
ao contrário, levam em conta o contexto em que as frases ocorrem, na definição
das condições para a construção de novas frases.
A maioria das condições que definem a sintaxe de uma linguagem (em ge-
ral, em número muito grande) pode ser especificada através de regras livres
de contexto. Alguns exemplos simples são: uma variável é uma seqüência de
sı́mbolos que começa com uma letra e é seguida por uma seqüência de letras ou
dı́gitos ou o sı́mbolo “ ”; uma expressão é uma variável, uma lambda-abstração
ou uma aplicação; uma aplicação é uma expressão seguida de outra expressão
(separadas por pelo menos um caractere delimitador); uma lambda-abstração é
uma seqüência de sı́mbolos iniciada pelo sı́mbolo “λ”, seguido de uma variável,
depois do sı́mbolo “.” e, em seguida, de uma expressão.
São exemplos ilustrativos de condições sensı́veis ao contexto: 1) toda variável
deve ser declarada antes de ser usada; 2) uma variável que ocorre em uma
expressão e tem que ocorrer, anteriormente, após o sı́mbolo λ de alguma lambda-
abstração que tem e como sub-expressão; 3) em um comando de atribuição, o
tipo da expressão (que ocorre no lado direito desse comando) tem que ser igual
ao tipo da variável (que ocorre no lado esquerdo desse comando).
Regras sensı́veis ao contexto podem ser regras de escopo e regras de tipo.
Uma regra de escopo permite associar um nome a uma definição, especificando
o escopo dessa definição. Os exemplos 1) e 2) acima são exemplos de regras
de escopo. Regras de tipo determinam o tipo de cada expressão da linguagem,
possibilitando garantir que cada operação tenha operandos de tipo apropriado.
Por exemplo, supondo que Integer e Bool são tipos pré-definidos em uma
dada linguagem, e que a operação de adição, denotada por +, é definida apenas
sobre operandos de tipo Integer, uma expressão como True + x, que envolve
a constante True, de tipo Bool, não é sintaticamente válida.

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 }

A coleção das variáveis x1 , . . . , xk em Γ é indicada por dom(Γ).


Em geral, exige-se que nenhuma variável ocorra mais de uma vez em um
dado contexto. Isso significa que cada variável só pode ser ligada a uma única
definição, em um dado escopo. Essa condição pode ser eliminada em sistemas
de tipos que suportam sobrecarga (overloading) de um nome com diferentes
definições, dadas por expressões com tipos distintos. A forma geral de uma
regra de inferência de um sistema de tipos é:
Γ1 ⊢ e1 : σ1 . . . Γn ⊢ en : σn
Γ⊢e:σ
onde as fórmulas Γi ⊢ ei : σi , para i = 1, . . . , n, são as hipóteses (ou premissas)
da regra e Γ ⊢ e : σ é a sua conclusão. Intuitivamente, esta regra diz que, se
cada expressão ei tem tipo σi no contexto Γi , para i = 1, . . . , n, então e tem
tipo σ no contexto Γ.
Uma expressão e é dita bem tipada em um dado contexto Γ, com relação a
um sistema de tipos, se existe uma derivação de Γ ⊢ e : σ, para algum σ, obtida
mediante os axiomas e regras desse sistema de tipos.
Vale observar que sistemas formais podem definir não apenas tipos, mas
também outras propriedades de construções de linguagens de programação.

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.

10.4 Tipos Simples


Estudos sobre tipos em linguagens de programação são usualmente desenvolvi-
dos sob o arcabouço do λ-calculus tipado. O λ-calculus tipado surgiu a partir
do λ-calculus não tipado, ambos definidos por Church, na década de 1930. O
λ-calculus (não tipado) provê um modelo muito simples de avaliação de ex-
pressões.
Apesar dessa simplicidade, o λ-calculus é um modelo “universal” de compu-
tabilidade, no sentido de que qualquer função recursiva, assim como qualquer
função computável por uma máquina de Turing, pode ser expressa como um
termo do λ-calculus. Para se ter uma idéia de como o λ-calculus consegue tal
poder de expressão, é interessante considerar como se pode expressar definições
recursivas em λ-calculus, ou seja, utilizando um operador de ponto fixo. Um
operador de ponto fixo é qualquer expressão fix tal que, para toda expressão
e, tem-se que fix e = e (fix e), ou seja, fix e é um ponto fixo da expressão
e. O operador de ponto fixo pode ser definido em λ-calculus, por exemplo, pela
seguinte expressão:
fix ≡ λf. (λx.f (xx))(λx.f (xx))

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:

λy. if y y = a then b else a


Se x representa essa expressão, então xx resulta, contraditoriamente, em:

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

Termos e ::= x variável


λ x : τ. e λ-abstração
e e′ aplicação

Figura 2: Sintaxe livre de contexto do λ-calculus tipado simples

(V AR)
Γ, x : τ ⊢ x : τ

Γ⊢e:τ (ADV AR)


Γ, x : τ ′ ⊢ e : τ

Γ, x : τ ′ ⊢ e : τ
(ABS)
Γ ⊢ (λx : τ ′ . e) : τ ′ → τ

Γ ⊢ e : τ ′ → τ, Γ ⊢ e′ : τ ′
(AP L)
Γ ⊢ e e′ : τ

Figura 3: Sistema de tipos do λ-calculus tipado simples

A Figura 3 apresenta o sistema de tipos do λ-calculus tipado simples.


O axioma (VAR) indica que uma variável tem o tipo especificado na sua
“declaração” (isto é, o tipo τ que ocorre em λx : τ. e).
A regra (AD VAR) permite que uma hipótese seja adicionada ao contexto.
A notação Γ, x : τ significa Γ ∪ {x : τ }, com a condição de que x não ocorra em
Γ. Isto indica que, se um termo e é bem tipado em um dado contexto, então
todas as variáveis livres de e devem ocorrer nesse contexto. Segundo a regra
(AD VAR), se um termo e possui tipo τ em um contexto Γ, então, para qualquer
variável x, de tipo τ ′ , que não ocorra livre em e e não pertença ao domı́nio de
Γ, podemos formar um novo contexto Γ′ = Γ, x : τ ′ tal que e possui tipo τ em
Γ′ .
A regra (ABS) estabelece que se e : τ é derivável em um contexto Γ′ onde
x tem tipo τ ′ , então a expressão λx : τ ′ . e define uma função de tipo τ ′ → τ no
contexto Γ = Γ′ − {x : τ ′ }.
A regra (APL) permite a aplicação de qualquer função e, de tipo τ ′ → τ , a
um argumento e′ de tipo τ ′ , produzindo um resultado, e e′ , de tipo τ .
O λ-calculus tipado simples pode ser estendido de diversas maneiras, introduzindo-
se novos tipos básicos ou novos construtores de tipos. Construtores de tipos
comumente adicionados são construtores para os tipos produto e soma (união
disjunta) e tipos recursivos (veja seção 10.5).
Para servir como modelo para linguagens de programação, o λ-calculus ti-
pado simples tem que ser estendido com a introdução de operadores de ponto
fixo (um para cada tipo funcional τ → τ ′ ), de modo a prover definições de
funções recursivas. Desta forma, a linguagem torna-se “universal” (toda função

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

fixτ e ⇒f ix e(fixτ e) ⇒f ix e(e(fixτ e)) ⇒f ix . . .

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.

10.5 Tipo produto, tipo soma e tipos recursivos


Extensões do λ-calculus tipado simples com tipos produto e soma, e com ti-
pos recursivos, são usadas para modelar diversas construções em linguagens de
programação.

10.5.1 Produtos cartesianos


Um tipo produto τ1 × τ2 é um tipo de pares de valores, onde o primeiro com-
ponente tem tipo τ1 e o segundo tem tipo τ2 . As regras de formação e acesso a
componentes de valores de tipo produto são apresentadas na Figura 4.

Γ ⊢ 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

Figura 4: Regras de inferência para tipo produto

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′

Um registro é uma tupla cujos componentes (chamados campos) possuem


rótulos. A diferença entre tuplas e registros é que, enquanto cada componente
de uma n-tupla é identificado pela sua posição (de 1 a n), os campos de um re-
gistro podem ocorrer em qualquer ordem, sendo identificados apenas pelo rótulo
associado a cada um deles. O tipo de um registro (r1 = e1 , . . . , rn = en ) pode ser
escrito como (r1 : τ1 , . . . , rn : τn ), onde r1 , . . . , rn são rótulos sintaticamente dis-
tintos. Escolhendo uma ordenação para os componentes, podemos transformar
registros em produtos cartesianos.

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

Figura 5: Regras de inferência para tipo soma

A função de injeção inEsqτ1 ,τ2 recebe um elemento de tipo τ1 e constrói um


elemento de tipo τ1 + τ2 . Similarmente, a função de injeção inDirτ1 ,τ2 recebe
um elemento de tipo τ2 e constrói um elemento de tipo τ1 + τ2 .
A regra de eliminação (ELIM) caracteriza o uso correto de expressões cujo
tipo é uma soma. Intuitivamente, case e f g inspeciona o tipo de e e aplica f
se e possui tipo τ1 , ou g se e possui tipo τ2 .
A semântica desses operadores é definida pelos seguintes axiomas de redução:

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.

10.7 Inferência de tipos


Anotações de tipo podem ser muito úteis, pelas razões expostas na seção 10.1,
mas não constituem parte necessária de programas. Para permitir a omissão
de anotações de tipo, caso se julgue conveniente, linguagens de programação
utilizam mecanismos de inferência de tipos, isto é, mecanismos para determinar
automaticamente o tipo de expressões que ocorrem em um programa, em tempo
de compilação.
Toda linguagem tipada faz uso de inferência de tipos, uma vez que, em ge-
ral, utiliza anotações de tipos apenas em determinados pontos do programa (nas
declarações de variáveis ou funções). Os tipos das demais expressões são infe-
ridos, de acordo com as informações pré-definidas ou providas por declarações.
A linguagem ML provê um mecanismo de inferência de tipos que possibilita a
total omissão de anotações de tipo em programas.
Para dar uma noção do mecanismo de inferência de tipos de ML, considere,
por exemplo, a seguinte expressão:

fn x ⇒ x + 1

Ao analisar a expressão x + 1, o compilador atribui tipo α à variável x (onde α


é uma variável de tipo). A ocorrência do operador “+” não determina, ainda,
o tipo de x, já que “+” é definido tanto para argumentos inteiros quanto para
argumentos reais. Com a ocorrência da constante inteira 1, o compilador reco-
nhece que trata-se de uma soma de argumentos inteiros e infere, portanto, que
x tem tipo int. Conseqüentemente, o tipo inferido para a expressão acima é
int → int.

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

intuitiva de como funciona o isomorfismo.

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 : φ ⇒ ψ ⇒ ψ

Claramente, esta prova é parecida com a primeira prova apresentada para φ ⇒


ψ ⇒ ψ. De fato, o tipo de λy : φ.λx : ψ.x é a formula φ ⇒ ψ ⇒ ψ. Deste
modo, tipos em λ-calculus simplismente tipado correspondem a fórmulas na
lógica intuicionista. E a prova dessa fórmula é determinada pelo termo λy :
φ.λx : ψ.x.
Da mesma forma, considere a prova para a fórmula (λz : ψ ⇒ ψ.λy :
φ.z)(λ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!

12 Tipos e Significados: Semântica


A palavra semântica foi primeiro empregada em um livro de Michel Bréal publi-
cado em 1900; naquele trabalho, semântica se referia ao estudo de como palavras
mudam o seu signficado. Atualmente, utilizamos a palavra semântica para de-
signar o estudo da relação existente entre palavras e sentenças de uma liguagem
(falada ou escrita) e seus significados.
A área onde esse tipo de estudo teve maior desenvolvimento foi na lingüı́stica
(e filosofia) que estudam o significado se sentenças da linguagem natural. Uma
segunda área de estudo da semântica é a lógica matemática, onde é estudada a
semântica de linguagens formais utilizadas na matemática.
O texto que se segue discute um terceiro uso de semântica, aquele que diz
respeito ao estudo do signeficado de expressões utilizadas em linguagens de
programação.
Os objetivos do estudo de semântica de linguagens de programação são
bastante diferentes daqueles de semântica para linguagens naturais ou lógica
matemática, mas ainda assim existe uma interseção nos métodos utilizados.
Tradicionalmente, linguagens de computadores são baseadas em sentenças im-
perativas utilizadas para designar comandos. Em linguagem natural, sentenças
análogas são aquelas que podem ser encontradas em um livro de receita de bolos:
“bata a clara até ficarem duras”. Em contraste, sentenças em lógica matemática
dizem respeito a verdades que independendem do tempo: “se batidas, as claras
ficam duras”.
Na verdade, essas duas sentenças descrevem o mesmo processo. Isso pode
ser usado para analisar a diferença entre linguagens imperativas e declarativas.
Por exemplo, considere o seguinte programa (usando a sintaxe de Prolog):
gcd(X,0,X).
gcd(X,Y,Gcd) :- mod(X,Y,Z), gcd(Y,Z,Gcd).
Dado que mod(X,Y,Z) significa que Z é o resto da divisão de X por Y, a
semântica usual de primeira ordem provê um significado de gcd como a relação
única que satisfaz essas duas fórmulas para inteiros não negativos. Desta forma,
as cláusulas acima pertencem à lógica, mas possuem uma conotação algorı́tmica.
Poderı́amos facilmente escrever uma expressão imperativa para calcular o maior
divisor comum. E vice versa, sempre podemos descrever através de sentenças
lógicas expressões imperativas. Disso surgem os paradı́gmas de linguagens de
programação e a escolha de uma ou outra linguagem depende da aplicação.
Entretanto, no caso da linguagem de programação e linguagem natural,
esse processo não é, em geral, válido. Ou seja, dada uma sentença em lin-
guagem natural, não é sempre que podemos transformá-la em um predicado
lógico. Isso porque, apesar de uma sentença ser sempre construı́da utilizando
uma gramática, o seu significado depende de uma série de entendimentos ex-
ternos. Linguagens artificiais, ao contrário, podem ser inteiramente estudadas
e entendidas, pois não dependem da interpretaçã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):

Time flies like an arrow.


Fruit flies like a banana.

Na primeira sentença, “flies” é um verbo, enquanto que na segunda é um


substantivo. Ou seja, é impossı́vel construir uma semântica para a lı́ngua inglesa
baseada apenas na sua gramática.
Programas bem tipados, assim como os tipos usados nesses programas, pos-
suem significado. Nesta seção, abordamos métodos formais usados na definição
da semântica de linguagens de programação. Duas diferentes abordagens são
usualmente empregadas:

• Denotacional — associa a cada frase da linguagem um significado, como


um elemento de um domı́nio semântico escolhido para a interpretação da
linguagem. Formalmente, uma semântica denotacional pode ser definida
como um homomorfismo, entre uma álgebra de termos (álgebra inicial so-
bre a assinatura de tipos e sı́mbolos da linguagem) e uma álgebra semântica
(sobre a mesma assinatura, cujos “carriers” são os domı́nios semânticos
correspondentes aos valores dos termos da linguagem).
• Operacional — o significado de cada frase é definido a partir de uma
relação de transição, apresentada sob a forma de um sistema de inferência.
Para ser caracterizado como operacional, o sistema de inferência deve ser
finitário, isto é, cada regra ou axioma deve ter um conjunto finito de
hipóteses.

12.1 Semântica Denotacional


Em uma semântica denotacional, o significado de termos e frases de uma lingua-
gem é definido por meio de uma função que associa, a cada termo, um elemento
de um domı́nio matemático adequado para a interpretação da linguagem. Esse
elemento é chamado denotação do termo. A cada tipo da linguagem é também
associado um significado: a denotação de um tipo é um conjunto (possivel-
mente munido de alguma estrutura) de elementos do domı́nio de interpretação
dos termos da linguagem.8
A denotação de um termo que possui variáveis livres depende do significado
atribuı́do a essas variáveis. 9 Por isso, a função semântica é parametrizada por
outra função, denominada ambiente, que associa a cada variável um elemento
do domı́nio. A denotação de um termo e, em um ambiente ρ, é representada
por [[e]]ρ.
Da mesma forma, em sistemas de tipo que incluem variáveis de tipo, o
significado de uma expressão de tipo depende do significado atribuı́do a suas
8 Em sistemas de tipos em que tipos podem ser usados como valores, os conjuntos denotados

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:

1. Para cada termo atômico e, tal que Γ ⊢ e : σ é provável, o significado de e


é definido em função de um ambiente ρ e do próprio termo e. Usualmente
definimos:
[[Γ, x : σ ⊢ x : σ]]ρ = ρ(x)
isto é, o significado da variável livre x é o valor que lhe é atribuı́do pelo
ambiente ρ.
2. O significado de um termo composto e, tal que Γ ⊢ e : σ é provável, a
partir das provas de Γ1 ⊢ e1 : σ1 , . . . , Γn ⊢ en : σn , onde e1 , . . . , en são os
subtermos de e, é obtido em função dos significados de e1 , . . . , en .

Dizemos que um ambiente ρ satisfaz um contexto Γ se ρ(x) ∈ [[σ]]ρ, para


todo x : σ ∈ Γ, isto é, se para todo x de tipo σ em Γ, o valor atribuı́do a x pelo
ambiente ρ é um elemento do conjunto denotado por σ.
Como a semântica denotacional de uma linguagem é definida por indução
sobre a estrutura de provas em seu sistema de tipos, ocorre o problema de
coerência: diferentes derivações de tipo para um mesmo termo devem possuir
o mesmo significado (ou um significado relacionado). Em outras palavras, o
significado de um termo e deve ser independente de uma escolha particular de
derivação de tipo para e, dependendo apenas do próprio termo e e dos valores
atribuı́dos às suas variáveis livres pelo ambiente. Essa propriedade, denominada
coerência, é formalmente enunciada a seguir:

Propriedade 2 (Coerência) Sejam ∆ e ∆′ derivações de tipo com conclusões


Γ ⊢ e : σ e Γ′ ⊢ e : σ ′ , respectivamente, e suponha que toda variável x, livre em
e, possui o mesmo tipo em Γ e em Γ′ . Se ρ é um ambiente que satisfaz Γ e Γ′ ,
então
[[Γ ⊢ e : σ]]ρ = [[Γ′ ⊢ e : σ ′ ]]ρ
onde os significados são definidos utilizando ∆ e ∆′ respectivamente.

Alguns sistemas de tipos não satisfazem esta propriedade, dificultando a


definição da semântica de termos e tipos da linguagem. Por exemplo, considere
um sistema de tipos que contenha as regras da Figura 6 e no qual contextos de
tipos podem conter várias ocorrências de uma mesma variável, com diferentes
10 No caso de linguagens dinamicamente tipadas, o domı́nio de interpretação dos termos

deve incluir um elemento especial, como denotação de erro dinâmico de tipo.

49
(V AR)
Γ ⊢ x : σ se x : σ ∈ Γ

Γ ⊢ e : τ → τ′ Γ ⊢ e′ : τ (AP L)
Γ ⊢ e e : τ′

Figura 6: Regras de Inferência

tipos. Suponha um contexto Γ que contenha as seguintes atribuições de tipo:


g : Int → Int, g : Float → Int, one : Int e one : Float. A partir das regras
da Figura 6, podemos obter as seguintes derivações para a expressão g one,
nesse contexto Γ:
Γ ⊢ g: Float→Int Γ ⊢ one: Float
Γ ⊢ g one: Int
Γ ⊢ g: Int→Int Γ ⊢ one: Int
Γ ⊢ g one: Int
O significado de Γ ⊢ g one: Int, em um ambiente ρ que satisfaz Γ, é dado,
indutivamente, em função de [[Γ ⊢ g : Float → Int]]ρ e de [[Γ ⊢ one : Float]]ρ,
na derivação (1), e em função de [[Γ ⊢ g : Int → Int]]ρ e de [[Γ ⊢ one : Int]]ρ,
na derivação (2). Como estes significados podem ser diferentes, é possı́vel que
g one : Int tenha significados diferentes, dependendo da derivação escolhida.
A concordância entre o sistema de tipos e a semântica denotacional dos
termos e tipos desse sistema é dada pela propriedade de correção, a seguir.
Essa propriedade expressa que o significado de uma expressão bem tipada deve
ser um elemento do conjunto denotado pelo seu tipo.

Propriedade 3 (Correção) Se Γ ⊢ e : σ é provável, e ρ é um ambiente que


satisfaz Γ, então [[Γ ⊢ e : σ]]ρ ∈ [[σ]]ρ.

Na Seção 13, descreveremos a semântica denotacional do λ-calculus.

12.2 Semântica Operacional


Em uma semântica operacional, o significado de um termo é usualmente outro
termo, em forma normal , isto é, que não pode ser simplificado pela relação de
transição. A relação de transição (ou redução) captura a noção de um passo de
avaliação de termos da linguagem. Uma regra de transição, escrita na forma
e ⇒ e′ , define que o termo e avalia, ou reduz, para o termo e′ , em um passo.
Nesse caso, dizemos que e é um redex e e′ é o seu reduto. Escrevemos e ⇒∗ e′ , se
e avalia para e′ em zero ou mais passos. Formalmente, uma expressão e é uma
forma normal se não existe nenhum termo e′ , tal que e pode ser reduzido para
e′ . Se e ⇒∗ e′ , e e′ é uma forma normal, dizemos que e′ é uma forma normal
de e.
Note que podem existir diferentes seqüências de redução para uma dada ex-
pressão. Por exemplo, duas diferentes seqüências de redução para a expressão
square (2+5), onde square é definido por square x = x ∗ x, seriam:

50
square (2+5) ⇒ (2+5) ∗ (2+5) ⇒ 7 ∗ 7 ⇒ 49

square (2+5) ⇒ square 7 ⇒ 7 ∗ 7 ⇒ 49


Uma estratégia de redução é uma função parcial F , de termos em termos, tal
que F (e) = e′ implica que e ⇒ e′ . F é uma “estratégia” porque é definida com
base em uma estratégia particular para a escolha do redex a ser reduzido em
cada passo da avaliação da expressão. Por exemplo, na primeira das reduções
acima, a estratégia é escolher, em cada passo, o redex mais externo e que ocorre
mais à esquerda na expressão.
Dada uma estratégia de redução F , o significado de um termo e é dado pela
função parcial de avaliação evalF , definida indutivamente do seguinte modo:

e se e é uma forma normal
evalF (e) =
e′ se F (e) = e1 e evalF (e1 ) = e′

De modo geral, diferentes escolhas da estratégia de redução podem resultar


em funções de avaliação que atribuem significados distintos a uma mesma ex-
pressão (mesmo no caso de relações de redução que satisfazem a propriedade de
Church-Rosser).11
Existem diferentes estratégias de avaliação : avaliação estrita (chamada-por-
valor ), avaliação normal (chamada-por-nome) e avaliação preguiçosa (chamada-
por-necessidade).
A função de avaliação, como definida acima, atribui significado, indistinta-
mente, tanto a termos válidos quanto a termos que não são bem tipados. Por
exemplo, o significado da expressão (2+5) é 7, uma vez que (2+5) ⇒ 7, e 7 é
uma forma normal. Do mesmo modo, o significado da expressão (2+True) é essa
própria expressão, uma vez que ela não avalia para nenhuma outra expressão,
sendo, portanto, uma forma normal.
É possı́vel distinguir esses dois casos, definindo-se explicitamente a sintaxe
livre de contexto do conjunto dos termos em forma canônica da linguagem. A
motivação de tal distinção é possibilitar que se verifique se o sistema de tipos e
a semântica operacional da linguagem estão definidos de forma concordante, a
saber, satisfazem as propriedades 4 e 5 definidas a seguir. A função de avaliação
parcial evalF é redefinida como:


 e se e é uma forma canônica
 ′
e se F (e) = e1 e evalF (e1 ) = e′
evalF (e) =

 erro se e não é uma forma canônica e
não existe e1 tal que F (e) = e1

Utilizando uma sintaxe adequada para os termos em forma canônica da


linguagem, terı́amos evalF (2 + 5) = 7 (como anteriormente), mas evalF (2 +
True) = erro, uma vez que (2 + True) não seria uma forma canônica.
Dizemos que dois programas p1 e p2 são operacionalmente equivalentes se
evalF (p1 ) = evalF (p2 ). Isto significa que, ou p1 e p2 avaliam para uma mesma
forma canônica, ou ambos resultam em erro, ou evalF é indefinida para ambos
op
os casos (tanto p1 quanto p2 “entram em loop”). Escrevemos, nesse caso, p1 =
p2 .
11 Veja seção 10.4, página 41.

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:

Propriedade 4 (Redução preserva tipo) Se Γ ⊢ e : σ é provável, e e ⇒ e′


então Γ ⊢ e′ : σ é provável.

Propriedade 5 (Programas bem tipados não contêm erros) Se Γ ⊢ p :


σ é provável, então evalF (p) 6= erro

A primeira propriedade expressa que a relação de transição deve preservar


o tipo das expressões. A segunda propriedade expressa que termos válidos
(bem tipados) avaliam para formas canônicas da linguagem. A verificação dessa
propriedade possibilita a detectar eventuais erros na definição do sistema de
tipos (a atribuição de um tipo a uma expressão que não deveria ser tipada),
assim como na definição da semântica operacional (a avaliação de um programa
bem tipado resultando em erro). Uma linguagem que satisfaz essa segunda
propriedade é dita fortemente tipada.
A semântica denotacional de uma linguagem provê uma definição do signi-
ficado de seus termos que é, em geral, mais adequada para o raciocı́nio sobre
propriedades de programas e de construções da linguagem, do que a definição
obtida através da semântica operacional. A semântica operacional, por outro
lado, provê uma definição mais adequada de como a linguagem deve ser imple-
mentada, sendo muito útil, portanto, para implementadores da linguagem.
Deve-se notar também que as semânticas operacional e denotacional de uma
linguagem devem ser definidas de forma concordante, isto é, devem satisfazer a
seguinte propriedade:
12 Observe que o termo contexto definido na seção anterior refere-se a um contexto de tipos,

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.

Para termos arbitrários e e e′ , o que se espera, em geral, é que, se e e e′ são


denotacionalmente equivalentes, então e e e′ são operacionalmente equivalentes
den op op
( = implica =). Se a recı́proca é também verdadeira (ou seja, se = implica
den
= ), então a semântica denotacional é dita totalmente abstrata. Entretanto, a
definição de uma semântica denotacional totalmente abstrata pode ser muito
difı́cil.
Se as semânticas operacional e denotacional de uma linguagem estão rela-
cionadas pela propriedade de adequação computacional, então a propriedade
5 torna-se um corolário da propriedade 3. De fato, suponha que Γ ⊢ p : σ é
provável e que evalF (p) = erro. Pela propriedade de adequação computacional,
den
temos p = erro. Mas como erro não possui significado denotacional, o mesmo
deve acontecer com p. Absurdo, pois [[Γ ⊢ p : σ]]ρ ∈ [[σ]]ρ, para qualquer ρ que
satisfaz Γ, pela propriedade 3.

13 Semântica denotacional do λ-calculus


Relembrando:
Y = λh.(λx.h(xx))(λx.h(xx))
Y é tal que, para qualquer termo M

Y M = M (Y M )

As perguntas que surgem são:


• Se M tem mais de um ponto fixo, qual Y M produz?
• O que acontece quando Y é applicado a expressões como λx.x + 1, que
não possui ponto fixo?
• Paradoxos: u ≡ λy.if yy = a then b else a
Para entender melhor a segunda pergunta, considere a seguinte definição
recursiva:
f = λx. if x = 0 then 1
else if x = 1 then f (3)
else f (x − 2).
Resolver a equação acima significa procurar o ponto fixo de:
λf.λx. if x = 0 then 1
else if x = 1 then f (3)
else f (x − 2).
Mas tal equação possui várias soluções. De fato, algumas delas são:

1, x par
f1 (x) =
⊥, x ı́mpar.
f2 (x) =  1
1, x par
f3 (x) =
a, x ı́mpar.

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.

13.1 Conjunto parcialmente ordenado (POSET)


Considere os seguintes intervalos na reta:
x = [x1 , x2 ] e y = [y1 , y2 ]
Se y1 ≤ x1 e x2 ≤ y2 , então podemos comparar x com y: x é mais preciso do
que y.
Escreveremos:
y⊑x
significando que y aproxima-se de x. Em geral, temos a seguinte definição:
Definição 16 Um POSET é um conjunto P munido de uma ordem parcial
⊑P em P tal que ⊑P é:
1. Reflexiva: x ⊑P x
2. Transitiva: x ⊑P y ∧ y ⊑P z ⇒ x ⊑P z
3. Anti-simétrica: x ⊑P y ∧ y ⊑P x ⇒ x ⊑P y

A partir da definição de POSET, podemos introduzir as noções de supremo


e elemento mı́nimo.

Definição 17 Uma cota superior ub em P de X ⊆ P é u ∈ P tal que


∀x ∈ X, x ⊑ u.
Definição 18 O supremo lub de X ⊆ P é um ub U de X ⊆ P , tal que
∀v ∈ P, v um ub de X ⇒ u ⊑ v. Escreveremos: u = lubP X.
Definição 19 O elemento mı́nimo de um POSET P é um elemento ⊥P ∈ P
tal que ∀x ∈ P, ⊥P ⊑ x.
Observe que nem todo POSET precisa ter um elemento mı́nimo ⊥ mas,
quando o tem, ele é único devido à anti-simetria de ⊑. Note também, que nem
todo conjunto precisa ser um POSET. Qualquer ordenação total dentro de um
conjunto é chamdo de cadeia.
Definição 20 X ⊆ P é uma cadeia em P se
∀x, y ∈ X, x ⊑ y ∨ y ⊑ x

ou seja, a ordem parcial ⊑ é uma ordem total em X.


Se X = {x0 , x1 , . . .} for uma cadeia, escrevemos: x0 ⊑ x1 ⊑ . . . e se P for
um POSET sem cadeias infinitas, a altura de P será o comprimento de sua
maior cadeia.

54
13.2 Ordem parcial completa (CPO)
Definição 21 Um CPO é um POSET no qual toda cadeia tem um lub em P

Observe que os racionais com a ordenação ≤ não é um CP O. De fato, por


exemplo,
√ o lub do subconjunto (infinito) contendo todos os racionais menores
que 2 não é um número racional. Observe também os naturais com ≤ não é
um CPO.
Mas todo POSET de altura finita que tenha um elemento mı́nimo é um
CPO.
A seguir descreveremos o processo de construção de um CPO trivial a partir
de qualquer conjunto A, chamado flat:
• Cria-se a CPO A⊥ = A ∪ ⊥A , tal que ⊥A ∈
/ A.
• Define-se a relação ⊑A tal que, para todo a, b ∈ A⊥ :

a ⊑A b ⇔ a = ⊥A ou a = b.

Desta forma, a altura de A⊥ é 2.


Outra forma de construir CPOs a partir de certos CPOs dados é utilizando
a noção de produto cartesiano.

Definição 22 Sejam P e Q CPOs. O produto cartesiano P xQ é definido como:

P xQ = {< x, y > |x ∈ P, y ∈ Q}

munido da relação ⊑P xQ , tal que < x, y >⊑P xQ < w, z > quando x ⊑P w e


y ⊑Q z.

Teorema 20 Sejam P e Q CPOs. Então P xQ é um CPO.

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.

Definição 23 Sejam P e Q CPO’s. A função f : P −→ Q é monotônica se

∀p, p′ ∈ P, p ⊑P p′ ⇒ f (p) ⊑Q f (p′ ).

Proposição 21 Seja p0 ⊑P p1 ⊑P p2 ⊑P . . . uma cadeia em P . Seja f uma


função monotônica. Então f (p0 ) ⊑Q f (p1 ) ⊑Q f (p2 ) ⊑Q . . . é uma cadeia em
Q.

Prova f monotônica: pi ⊑P pi+1 ⇒ f (pi ) ⊑Q f (pi+1 ). O resultado segue


por transitividade.

Definição 24 Sejam P e Q CPO’s. A função P −→ Q é contı́nua se, para


toda cadeia não vazia p0 ⊑P p1 ⊑P . . . em P :

55
1. f (p0 ) ⊑Q f (p1 ) ⊑Q . . . é uma cadeia em Q.
2. f (lubi≥0 pi ) = lubi≥0 f (pi )

Observação: Toda função contı́nua é monotônica.

Proposição 22 Seja P um CPO de altura finita. Seja Q um CPO qualquer.


Se f : P −→ Q for uma função monotônica, então f é contı́nua.

Prova Seja p0 ⊑P p1 ⊑P . . . ⊑P pn uma cadeia em P . Como f é monotônica,

f (p0 ) ⊑Q f (p1 ) ⊑Q . . . ⊑Q f (pn )

é uma cadeia em Q (Proposição 21). E

f (lub0≤i≤n pi ) = f (pn ) = lub0≤i≤n f (pi )

Definição 25 Definimos [P −→ Q] como o conjunto das funções contı́nuas do


CPO P para o CPO Q munido da relação de ordem parcial:
def
f ⊑P −→Q g = ∀p ∈ P, f (p) ⊑Q g(p)

Lema 23 Seja f0 ⊑ f1 ⊑ . . . uma cadeia em [P −→ Q]. Então, para todo


p ∈ P:
a) (lubi≥0 fi )(p) = lubi≥0 fi (p).
b) lubi≥0 (lubj≥0 fi (pj )) = lubj≥0 (lubi≥0 fi (pj )).

Teorema 24 Sejam P e Q CPO’s. Então [P −→ Q] é um CPO.

Prova
1. A relação ⊑[P −→Q] é uma ordem parcial.
2. O elemento mı́nimo ⊥[P −→Q] de [P −→ Q] é definido por:

∀p ∈ P. ⊥[P −→Q] (p) = ⊥Q

3. Por fim, toda cadeia em [P −→ Q] tem um lub em [P −→ Q].

Definição 26 Seja P um CPO. Então a função µP : [P −→ P ] −→ P definida


por
def
µP (f ) = lubi≥0 f i (⊥P )
def
onde f 0 (⊥P ) = ⊥P , tem as seguintes propriedades:
1. µP é contı́nua.
2. f (µP (f )) = µP (f ).
3. ∀p ∈ P, | f (p) = p implica µP (f ) ⊑ p.

56
Seja f ∈ [N⊥ −→ N⊥ ] definida pela equação:

f = λn.n = 0 −→ 1, n ∗ f (n − 1)

Então pode-se escrever:

f = H(f ), para H ∈ [[N⊥ −→ N⊥ ] −→ N⊥ ]

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 (⊥) = ⊥

H 1 (⊥) = λn.n = 0 −→ 1, n ∗ ⊥(n − 1)


2.
= λn.n = 0 −→ 1, ⊥

H 2 (⊥) = λn.n = 0 −→ 1, n ∗ H(⊥)(n − 1)


= λn.n = 0 −→ 1, n ∗ (n − 1 = 0 −→ 1, ⊥)
3.
= λn.n = 0 −→ 1, n ∗ (n = 1 −→ 1, ⊥)
= λn.n = 0 −→ 1, n = 1 −→ n, ⊥

H 3 (⊥) = λn.n = 0 −→ 1, n ∗ H 2 (⊥)(n − 1)


= λn.n = 0 −→ 1, n ∗ (n − 1 = 0 −→ 1, n − 1 = 1 −→ n − 1, ⊥)
4. = λn.n = 0 −→ 1, n ∗ (n = 1 −→ 1, n = 2 −→ n − 1, ⊥)
= λn.n = 0 −→ 1, n = 1 −→ n, n = 2 −→ n ∗ (n − 1), ⊥
= λn.0 ≤ n < 3 −→ n!, ⊥

5. H k (⊥) = λn.0 ≤ n < k −→ n!, ⊥


6. Para k −→ ∞ tem-se:

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

ou seja, um predicado A implica B intuicionisticamente se e somente se existe


uma quantidade infinita de A que linearmente implica B.
A ausência de Contraction e Weakening muda a natureza dos conectivos
lógicos. De fato, a conjunção intuicionista (assim como a disjunção) é separada
em dois conectivos diferentes. Portanto, existem duas maneiras distintas de
formular a conjunção, correspondendo a dois conectivos distintos em Lógica
Linear: o conectivo multiplicativo “⊗” (A⊗B significa ambos A e B) e o aditivo
“&” (A&B = escolha entre A e B). O mesmo para a disjunção: multiplicativo
“O” (AOB é igual a A paralelo a B) e aditivo “⊕” (A ⊕ B significa ou A ou B).
Lógica Linear utiliza ainda os seguintes conectivos: ⊥, e 1 para a versão
multiplicativa de falso e verdadeiro respectivamente; 0, ⊤ para a versão aditiva
desses conectivos; e ∀ e ∃ para quantificações universal e existencial.

14.1 Semântica
A semântica da Lógica Linear é dada através de espaços coerentes.

Definição 27 Um espaço coerente é um conjunto (de conjuntos) A que satisfaz


as seguintes propriedades:
i. Se a ∈ A e a′ ⊂ a então a′ ∈ A.
S
ii. Se M ⊂ A e se ∀a1 , a2 ∈ M.a1 ∪ a2 ∈ A, então M ∈ A.

Podemos então considerar que espaços coerentes são domı́nios (parcialmente


ordenados pela inclusão) algébricos (qualquer conjunto é a união direta de seus
subconjuntos finitos).
Entender como espaços coerentes podem ser utilizados para descrever semântica
demanda um certo tempo e muito espaço. Portanto, não poderá ser descrito nes-
tas notas. Uma análise mais detalhada sobre este assunto pode ser encontrada
em [10, 11].

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 {∆}

significando que se um programa P começa a ser rodado em um estado que


satizfaz as proposições lógicas em Γ, então P termina (se termina) em um estado
que satisfaz as proposições em ∆. As fórmulas em Γ são chamadas de pré-
condições de P enquanto que as em ∆ são chamadas de pós-condições. Por
exemplo, seja P o programa que contém o comando x := x + 1 (Figura 7). O
fato de que P começa em um estado, por exemplo, em que o identificador x
tem valor 1 pode ser representado como o par hx, 1i, dentro de uma estrutura
matemática maior. A lógica é utilizada para expressar proposições sobre este
par. Por exemplo, ao final de um passo de execução, teremos hx, 2i satizfazendo
a proposição x > 1 ∧ x < 3.

Figura 7: Triplas de Hoare

Na segunda abordagem, estados são descritos através de um conjunto de pro-


posições e mudanças nos estados são modelados por mudanças nas proposições
dentro de uma derivação (ou seja, por passos na construção de uma prova). Essa
abordagem é conhecida como computação-como-dedução.
No exemplo anterior, o fato de que o identificador x tem valor 1 pode ser
codificado como a proposição “x tem valor 1”. Note que a mudança de estado
pode requerer que uma certa proposição deixe de ser válida, enquanto que outras
podem passar a ser verdadeiras. Tais mudanças são naturalmente suportadas
pela Lógica Linear. De fato, a transição do estado 1 para o estado 2 da Figura 7
pode ser descrita como a seguinte fórmula da Lógica Linear:

(x tem valor 1) −◦ (x tem valor 2)

Ou seja, a primeira proposição é “consumida” para “produzir” a segunda pro-


posição.

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

Tal prova pode ser especificada em lógica intuicionista como:

(prove A ⇒ prove B) ∧ prove C ⇒ prove 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

Em particular, a dualidade Esquerda - Direita é o centro do cálculo de


seqüentes uma vez que seqüentes têm a forma:

Γ⊢∆

onde as hipóteses Γ estão do lado esquerdo do sı́mbolo de validade ⊢ enquanto


as conclusões ∆ ocorrem do lado direito. Relacionado a isto, está a noção de
ocorrências positivas e negativas de uma fórmula dentro de um seqüente. A
noção de conectivos sı́ncronos e assı́ncronos depende das regras de inferência
definindo o comportamento de tais conectivos, e a dualidade do axioma inicial e
da regra Cut pode ser melhor entendida dentro do tópico Cálculo de Estruturas.
Um framework deve levar em conta tais dualidades diretamente, e isso é
problemático em lógica intuicionista. De fato, uma vez que o princı́pio do meio
excluı́do não é mais válido, temos que, em geral,

¬(¬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.

A De dedução natural para cálculo de seqüentes


Na Seção 2, vimos uma introdução a um formalismo de provas chamado dedução
natural. A principal vantagem desse tipo de presentação de sistemas de lógica
formal é que dedução natural segue o estilo natural de argumentação, com regras
de introdução e eliminação para cada conectivo.
Entretanto, construir provas utilizando dedução natural é muito difı́cil, uma
vez que não existe, começando da fórmula que se deseja provar e seguindo de
baixo para cima, uma estratégia de prova. Por exemplo, se queremos provar a
fórmula B utilizando a regra modus ponens:
Γ⊢A⇒B Γ⊢A
Γ⊢B

a fórmula A deve ser “adivinhada”. De fato, a fórmula A pode ser, a princı́pio,


qualquer fórmula.
Nesta seção, apresentaremos um tipo de formalismo, chamado cálculo de
seqüentes, para presentação de sistemas de lógica formal. Começaremos entre-
tanto por descrever em maiores detalhes dedução natural.

A.1 Dedução natural


Em dedução natural, as regras de inferência foram estabelecidas a partir das
tão faladas condições BHK (de Brower-Heyting-Kolmogorov), que explicam
operações lógicas da lógica proposicional em termos da provabilidade direta de
proposições, como descrito a seguir:
1. Uma proca direta de A ∧ B consiste de provas de A e B.
2. Uma prova direta de A ∨ B consiste em uma prova de A ou de uma prova
de B.
3. Uma prova direta de A ⇒ B consiste em uma prova da proposição B
partindo do pressuposto que existe uma prova da proposição A.
4. Uma prova direta de ⊥ é impossı́vel.
A partir das condições BHK, chegamos às regras de introdução da Figura 1, a
saber:

Γ ⊢ A Γ ⊢ B (∧I) Γ ⊢ A (∨I1) Γ ⊢ B (∨I2) Γ, A ⊢ B


(⇒ I)
Γ ⊢ A∧B Γ⊢A∨B Γ ⊢ A∨B Γ⊢A⇒B

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.

Desta forma, como A ∧ B segue da derivação de A e da derivação de B, se C


vale quando assumimos A e B então C é derivável a partir de A ∧ B:
Γ ⊢ A ∧ B A, B ⊢ C
(∧E)
Γ⊢C

A regra acima se transforma trivialmente nas regras (∧E1 ) e (∧E2 ) da Figura 1


quando C = A ou C = B.
No caso da disjunção, temos dois casos: ou A ∨ B deriva de A e C também
deriva de A ou A ∨ B deriva de B e C também deriva de B. Como os dois casos
são possı́veis, temos a regra de eliminação:
Γ⊢A∨B A⊢C B ⊢ C (∨E)
Γ⊢C

O caso da implicação é mais complicado. De fato, A ⇒ B depende da


existência de uma derivação hipotética de B a partir de A. Logo se temos uma
derivação de A e se C derva de B, então Cderiva de A ⇒ B. Traduzindo para
regras de inferência:
Γ⊢A⇒B Γ⊢A B ⊢ C (⇒ E)
Γ⊢C

Mais uma vez, se C = B obtemos o resultado da Figura 1.


Por fim, ⊥ não possui regra de introdução. Desta forma, as premissas para
a derivação de ⊥ não existem, ou formam um conjunto vazio. De acordo com o
princı́pio da inversão, qualquer coisa segue de ⊥, ou seja:
Γ ⊢ ⊥ (⊥E)
Γ⊢C

A.2 Cálculo de seqüentes


Cálculo de seqüentes foi introduzido nos anos 1930 por Gerhard Genzen, que
também introduziu dedução natural. Apesar da sintaxe ser parecida, cálculo
de seqüentes e dedução natural diferem em vários aspectos. Enquanto dedução
natural enfatiza as propriedades mais fundamentais dos conectivos através de
suas regras de eliminação e introdução, o cálculo de seqüentes é mais “prático”
no sentido que:
• Em vez de regras de eliminação e introdução, o cálculo de seqüentes possui
apenas regras de introdução;
• premissas e conclusões são tratadas da mesma forma e são construı́das
simultaneamente;
• é menos natural, mas tecnicamente mais simples: quando lidas de baixo
pra cima (bottom up), fica claro que as regras no cálculo de seqüentes
simplificam o processo de construção de provas.

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

Figura 8: Cálculo de seqüentes para a lógica clássica

As regras do cálculo de seqüentes para a lógica clássica estão listadas na


Figura 8.
As regras, à direita e à esquerda são chamadas regras lógicas, uma vez que
definem o significado dos conectivos lógicos.
Observe que as regras à direita são as mesmas usadas em dedução natural.
Por outro lado, as regras de eliminação em dedução natural correspondem às
regras à esquerda do cálculo de seqüentes. De fato, no caso de ∧E na forma
como apresentada na Seção anterior, temos a derivação de C a partir de A, B
e algumas hipóteses Γ e concluı́mos que C segue de A ∧ B e Γ. Em cálculo de
sequentes, isso é escrito como:
A, B, Γ ⊢ C
A ∧ B, Γ ⊢ C

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

A.2.1 Cut elimination


Talvez a regra lógica mais conhecida em dedução natural seja a modus ponens14 :
Γ ⊢ A ⇒ B Γ ⊢ A (ELIM ⇒)
Γ⊢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.
A regra acima citada juntamente com a regra de introdução de ⇒ é equi-
valente à regra Cut do cálculo de seqüentes que aparece em lógicas tradicionais
como clássica, intuicionista e linear [3]:
Γ1 ⊢ ∆1 , A A, Γ2 ⊢ ∆2
(Cut)
Γ1 , Γ2 ⊢ ∆1 , ∆2

Basicamente, essa regra formaliza o conceito de provas matemáticas utilizando


lemas auxiliares. Ou seja, se podemos provar um lema A (e outros resultados
∆1 ) a partir de um conjunto de hipóteses Γ1 e, a partir de A (e possivelmente
algumas outras hipóteses Γ2 ) é possı́vel provar outro conjunto de resultados
(∆2 ), então podemos provar ∆1 , ∆2 diretamente a partir de Γ1 , Γ2 .
Essa idéia é utilizada sempre em Matemática mas é também muito interes-
sante sob o ponto de vista computacional, uma vez que a implementação de
tal regra é feita “bottom-up”. Ou seja, para tentar provar ∆1 , ∆2 a partir de
Γ1 , Γ2 , primeiro tentamos provar uma fórmula A (para uma certa fórmula des-
conhecida A), e a partir de A tentamos provar ∆2 . Isto significa que a fórmula
lógica A deve ser “adivinhada” pelo programa de computador e isso representa
um problema muito sério, uma vez que computadores não tem a “criatividade”
necessária para adivinhar fórmulas.
Portanto, é muito importante dentro da área de programação lógica a pos-
sibilidade de se verificar se um sistema lógico possui a propriedade de cut-
elimination, ou seja, checar se a regra Cut é, de fato, redundante e portanto
pode ser eliminada.
Enquanto para Ciência da Computação a importância da propriedade de
cut-elimination está relacionada com a viabilidade de implementações, para os
matemáticos essa propriedade reforça o fato de que lemas são ferramentas úteis
para organizar uma prova, mas completamente dispensáveis. Ou seja, toda
prova que utiliza a regra Cut pode ser substituı́da por uma onde Cut não está
presente.
14 Veja Seção 2

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

Você também pode gostar