Você está na página 1de 168

Universidade Eduardo Mondlane

ELEMENTOS DE
MATEMÁTICA DISCRETA
Manual Teórico – Prático

Sergey LABÓVSKIY

Departamento de Matemática e Informática


Maputo 2005
2

Introdução
A investigação de diferentes problemas em ciência acha a sua reflexão em cons-
trução de diferentes modelos matemáticos. Em física e engenharia usam-se
diferentes modelos principalmente na base dos resultados de Análise Matemá-
tica. Mas problemas de informática precisam de modelos matemáticos de outra
natureza. A distinção principal consiste no seguinte: o objectivo de Análise
Matemática é investigação de processos contínuos, mas informática estuda pro-
cessos discretos. Um processo discreto é resultado de realização de um algoritmo.
Investigação de algoritmos é o assunto principal da Matemática Discreta.
Tanto Matemática Discreta como Análise Matemática têm na sua base Te-
oria de conjuntos, Lógica matemática e teoria de algoritmos, Álgebra abstracta.
Por causa de natureza de conjuntos discretos o capítulo Análise combinatória
faz uma parte importante de Matemática Discreta.
Neste manual são apresentados elementos dos tópicos principais de Matemá-
tica Discreta:
• teoria de conjuntos
• análise combinatória
• indução e recursividade
• teoria de grafos e algoritmos sobre grafos

• autómatos finitos, gramáticas e linguagens


O manual é reelaboração do manual do autor [5]. Na preparação do presente
manual particularmente foram utilizados diferentes exercícios e matéria teórica
dos livros [4] e [3].
Conteúdo

1 Conjuntos, relações e grafos 7


1 Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 Métodos de representação de conjuntos . . . . . . . . . . 7
1.2 Conjuntos frequentemente usados . . . . . . . . . . . . . . 8
1.3 Conjunto de conjuntos . . . . . . . . . . . . . . . . . . . . 8
1.4 Operações sobre conjuntos . . . . . . . . . . . . . . . . . . 9
1.5 Leis de álgebra de conjuntos . . . . . . . . . . . . . . . . . 9
1.6 Produto directo (cartesiano) . . . . . . . . . . . . . . . . . 10
1.7 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Relações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1 Conceito de relação . . . . . . . . . . . . . . . . . . . . . 12
2.2 Representação geométrica de relação. Conceito de grafo
orientado . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Representação de grafos. Matriz de adjacência . . . . . . 14
2.4 Relação de equivalência . . . . . . . . . . . . . . . . . . . 14
2.5 Partição de um conjunto em classes . . . . . . . . . . . . 15
3 Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1 Algoritmos cíclicos . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Ciclos duplos e múltiplos . . . . . . . . . . . . . . . . . . 17
3.3 Complexidade de algoritmos . . . . . . . . . . . . . . . . . 18
4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1 Lógica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Conjuntos e funções . . . . . . . . . . . . . . . . . . . . . 21
4.3 Relações . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2 Contagem. Análise combinatória 25


1 Princípios básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.1 Regra de união . . . . . . . . . . . . . . . . . . . . . . . . 25
1.2 Princípio do produto . . . . . . . . . . . . . . . . . . . . . 26
2 Permutações, subconjuntos e distribuições . . . . . . . . . . . . . 26
2.1 r -permutações (arranjos) . . . . . . . . . . . . . . . . . . 26
2.2 Número de funções . . . . . . . . . . . . . . . . . . . . . . 27
2.3 Número de subconjuntos. Coeficientes binomiais . . . . . 27
2.4 Teorema binomial, propriedades de coeficientes . . . . . . 28
2.5 Distribuição de n objectos em k caixas diferentes . . . . 29
3 Permutações com repetições. Partições . . . . . . . . . . . . . . . 31
3.1 Permutações com repetições . . . . . . . . . . . . . . . . . 31
3.2 Partições de um conjunto . . . . . . . . . . . . . . . . . . 31

3
4 CONTEÚDO

4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3 Indução 36
1 Indução matemática . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.1 Introdução. Exemplo . . . . . . . . . . . . . . . . . . . . . 36
1.2 Princípio da indução matemática . . . . . . . . . . . . . . 38
1.3 O princípio fraco de indução matemática . . . . . . . . . 39
1.4 Princípio de escolha de mínimo elemento . . . . . . . . . . 40
2 Definições recursivas . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.1 Descrição do problema . . . . . . . . . . . . . . . . . . . . 41
2.2 Definição recursiva . . . . . . . . . . . . . . . . . . . . . . 41
2.3 Extensão de domínio . . . . . . . . . . . . . . . . . . . . . 42
2.4 Cálculo iterativo. Algoritmos . . . . . . . . . . . . . . . . 42
2.5 Cálculo recursivo . . . . . . . . . . . . . . . . . . . . . . . 43
2.6 Relações recorrentes lineares . . . . . . . . . . . . . . . . 44
3 Definição recursiva e indução matemática . . . . . . . . . . . . . 45
3.1 Demonstração de proposições . . . . . . . . . . . . . . . . 45
3.2 Indução com base de vários elementos . . . . . . . . . . . 46
4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1 Indução matemática . . . . . . . . . . . . . . . . . . . . . 47
4.2 Definições recursivas . . . . . . . . . . . . . . . . . . . . . 49

4 Algoritmos cíclicos 54
1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
1.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
1.2 Ciclo infinito. Estado . . . . . . . . . . . . . . . . . . . . 55
1.3 Ciclo com pre-condição . . . . . . . . . . . . . . . . . . . 56
1.4 Invariante de ciclo . . . . . . . . . . . . . . . . . . . . . . 56
1.5 Invariante de ciclo com pre-condição . . . . . . . . . . . . 58
1.6 Demonstração que o ciclo termina . . . . . . . . . . . . . 59
2 Exemplos de algoritmos . . . . . . . . . . . . . . . . . . . . . . . 59
2.1 Algoritmo de divisão inteira . . . . . . . . . . . . . . . . . 59
2.2 Algoritmo de Euclid . . . . . . . . . . . . . . . . . . . . . 60
2.3 Equação em números inteiros . . . . . . . . . . . . . . . . 61
3 Formação de um algoritmo cíclico . . . . . . . . . . . . . . . . . . 63
3.1 Colocação problema . . . . . . . . . . . . . . . . . . . . . 63
4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.1 Algoritmos cíclicos . . . . . . . . . . . . . . . . . . . . . . 64
4.2 Formação de algoritmo . . . . . . . . . . . . . . . . . . . . 66

5 Introdução à teoria de grafos e árvores 68


1 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
1.1 Grafo orientado (com direcções, digrafo) . . . . . . . . . . 68
1.2 Vínculo entre grafo orientado e uma relação . . . . . . . . 69
1.3 Grafo não orientado (grafo sem direcções) . . . . . . . . . 69
1.4 Grau de vértice. Relação de adjacência . . . . . . . . . . . 69
1.5 Caminhos, ciclos . . . . . . . . . . . . . . . . . . . . . . . 71
1.6 Matriz de adjacência . . . . . . . . . . . . . . . . . . . . . 71
1.7 Isomorfismo de grafos . . . . . . . . . . . . . . . . . . . . 72
2 Proposições sobre caminhos e ciclos . . . . . . . . . . . . . . . . . 72
CONTEÚDO 5

3 Problema de percurso de arcos. Circuito de Euler . . . . . . . . . 73


3.1 Problema sobre as pontes de Königsberg . . . . . . . . . . 73
3.2 Proposições . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.3 Algoritmo de Fleury . . . . . . . . . . . . . . . . . . . . . 74
4 Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.1 Definições e teoremas gerais . . . . . . . . . . . . . . . . . 76
4.2 Árvores com raiz . . . . . . . . . . . . . . . . . . . . . . . 77
4.3 Árvore binária . . . . . . . . . . . . . . . . . . . . . . . . 78
5 Árvores geradoras . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1 Algoritmo de produção duma árvore geradora . . . . . . . 79
5.2 Grafos com pesos, árvore mínima com pesos . . . . . . . . 79
6 Percurso de vértices. Caminho de Hamilton . . . . . . . . . . . . 81
7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.1 Definições de grafos orientado e não orientado, diagrama
de grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.2 Grau de vértice, isomorfismo de grafos . . . . . . . . . . . 83
7.3 Caminhos e ciclos . . . . . . . . . . . . . . . . . . . . . . 84
7.4 Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.5 Exercícios diferentes . . . . . . . . . . . . . . . . . . . . . 88
7.6 Árvore geradora mínima. Algoritmos de Kruskal e de Prim 89

6 Ordenação de um vector 90
1 Procura binária em vector ordenado . . . . . . . . . . . . . . . . 90
2 Ordenação de um vector. Complexidade espacial . . . . . . . . . 91
2.1 Ordenação por união (merge sort) . . . . . . . . . . . . . 91
2.2 Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
2.3 Avaliação de complexidade de ordenação . . . . . . . . . . 94
3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

7 Recursividade geral 95
1 Conceito geral da definição recursiva . . . . . . . . . . . . . . . . 95
1.1 Exemplos preliminares . . . . . . . . . . . . . . . . . . . . 95
1.2 Definição recursiva de um conjunto . . . . . . . . . . . . . 97
1.3 Forma inversa. Definições determinadas unicamente . . . 98
1.4 Princípio generalizado da indução matemática . . . . . . 100
1.5 Funções sobre conjuntos dados recursivamente . . . . . . 102
1.6 Árvores binárias e árvores com raízes . . . . . . . . . . . . 104
2 Algoritmos recursivos . . . . . . . . . . . . . . . . . . . . . . . . 108
2.1 Calculo de funções dadas recursivamente . . . . . . . . . . 109
2.2 Prova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
2.3 Percurso dos elementos de um conjunto . . . . . . . . . . 114
3 Questões principais . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

8 Recursividade e árvores 124


1 Percurso de árvore com raiz . . . . . . . . . . . . . . . . . . . . . 124
2 Percurso de árvore binária . . . . . . . . . . . . . . . . . . . . . . 125
2.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . 125
2.2 Notação funcional . . . . . . . . . . . . . . . . . . . . . . 126
3 Fórmulas binárias . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6 CONTEÚDO

3.1 Fórmulas bem formadas . . . . . . . . . . . . . . . . . . . 126


3.2 Notação polaca . . . . . . . . . . . . . . . . . . . . . . . . 127
3.3 Fórmulas do cálculo proposicional . . . . . . . . . . . . . 130
4 Árvore com pesos. Mínima árvore binária . . . . . . . . . . . . . 130
4.1 Mínima árvore binária. Algoritmo de Huffman . . . . . . 130
4.2 Código prefixo . . . . . . . . . . . . . . . . . . . . . . . . 132
4.3 Código mínimo . . . . . . . . . . . . . . . . . . . . . . . . 133
5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

9 Digrafos, redes 137


1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
2 Digrafos com pesos . . . . . . . . . . . . . . . . . . . . . . . . . . 138
2.1 Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . 138
2.2 Modificação do algoritmo de Dijkstra . . . . . . . . . . . . 141
3 Redes. Fluxo máximo em rede . . . . . . . . . . . . . . . . . . . 143
3.1 Rede. Fluxo. Corte . . . . . . . . . . . . . . . . . . . . . 143
3.2 Algoritmo para encontrar fluxo máximo em rede . . . . . 145

10 Linguagens e gramáticas 148


1 Linguagens e gramáticas . . . . . . . . . . . . . . . . . . . . . . . 148
1.1 Definição de uma gramática . . . . . . . . . . . . . . . . . 148
1.2 Derivação . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
2 Classificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
3 Máquinas finitas . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
4 Autómatos finitos . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5 Relação entre autómatos finitos e gramáticas . . . . . . . . . . . 156
5.1 Gramática regular determina um diagrama . . . . . . . . 156
5.2 Autómato determina uma gramática . . . . . . . . . . . . 157
5.3 Uma gramática regular determina um autómato indeter-
minado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
5.4 Autómato indeterminado — autómato . . . . . . . . . . . 160
5.5 Construção directa de autómatos . . . . . . . . . . . . . . 161
6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
6.1 Gramáticas . . . . . . . . . . . . . . . . . . . . . . . . . . 161
6.2 Autómatos . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Capítulo 1

Conjuntos, relações e grafos

Este capitulo serve como uma introdução. Os objectivos desta introdução são
conceitos principais da disciplina. Tanto em álgebra, geometria e análise como
em matemática discreta o conceito de conjunto forma uma base para todos os
passos em criação da teoria. Mas existe uma distinção principal entre conjuntos
que considera Análise Matemática e conjuntos que são objectos de Matemática
Discreta. Quase sempre serão considerados conjuntos finitos. Os conjuntos
infinitos tais como o conjunto de todos os números naturais N = {1, 2, . . .}
também têm estrutura discreta. Deixemos sem atenção a questão sobre definição
rigorosa de um conjunto discreto.
Neste capítulo serão considerados os tópicos principais da teoria de conjuntos
e funções, relações e grafos, conceito informal de algoritmo e sua complexidade.

1 Conjuntos
1.1 Métodos de representação de conjuntos
Lista
O primeiro método para determinar um conjunto é formar uma lista de todos
os elementos
A = {2, 4, 6, 8, 10}, B = {a, b, c}, C = {(1, 2), (5, −1), (30, 0), (0, 0), (−13, 8)}.
O conjunto B contem os 3 objectos, o conjunto C consiste dos 5 objectos
que são pares ordenados de números inteiros.

Lista (algoritmo)

Pode-se usar o símbolo . . .′ (etc.) para conjuntos de grande volume ou para
conjuntos infinitos
N100 = {1, 2, 3, . . . , 100}, D3 = {3, 6, 9, . . .}
Mas este método pressupõe um algoritmo de formação de elementos do conjunto.
Por exemplo, para verificar se o número 36 pertence ao conjunto D3 ou não, é
preciso cumprir várias adições 3 + 3 = 6, 6 + 3 = 9, 9 + 3 = 12, . . . ate obter ou
não o elemento necessário. Este exemplo sugere mais um método para definir
um conjunto.

7
8 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

Propriedade característica
Um conjunto pode ser dado por meio de uma propriedade característica. Con-
sideremos vários exemplos:
1. D = {n : n ∈ N e n é par} = {2, 4, 6, 8, . . .}
2. E = {x : x ∈ R, 1 ≤ x < 3} = [1, 3)
3. F = {n2 : n ∈ N } = {m : m ∈ N, (∃n : m = n2 )}
4. G = {(−1)n : n ∈ N } = {−1, 1}
Em chavetas o primeiro objecto é uma variável ou uma expressão todos os valores
da qual formam o conjunto. A variável (expressão) é seguida pelo símbolo ′ :′ .
A segunda parte contém uma ou várias condições necessárias e suficientes para
verificar se um elemento pertence ao conjunto. Por exemplo, para verificar se o
número 25 pertence ao conjunto F , é preciso encontrar um número natural n
tal que n2 = 25 . A segunda forma da definição do conjunto F é mais completa
e mais clara para usar.

1.2 Conjuntos frequentemente usados


Para os seguintes conjuntos usa-se a notação:
• N = {1, 2, 3, . . .} é o conjunto de todos os números naturais,
• Z é o conjunto de todos os números inteiros,
• Z+ é o conjunto de todos os números inteiros não negativos,
• ∅ é o conjunto vazio.
Seja Σ um conjunto finito não vazio que vamos chamar por alfabeto. Sejam
letras os elementos do Σ . Vamos utilizar a notação Σ∗ para o conjunto de
todas as linhas finitas (sequências) contendo os elementos do Σ . Elementos de
Σ∗ vamos chamar palavras. Por exemplo, seja Σ = {a, b, c} . Podemos formar
as palavras
(a, a, c, a, b), (b, b, b), (a, b, c, a, b, c), (c),
etc. Usa-se também a forma reduzida

aacab, bbb, abcabc, c

Usa-se a palavra vazia λ = () como elemento do conjunto Σ∗ .

1.3 Conjunto de conjuntos


Seja M um conjunto. Usa-se designação P(M ) para o conjunto de todos os
subconjuntos de M . Por exemplo, seja M = {a, b, c} . O conjunto P(M )
contem 8 elementos

∅, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}.

A operação P pode ser aplicada duas vezes:

P(P({1})) = P({∅, {1}}) = {∅, {∅}, {{1}}, {∅, {1}}}.


1. CONJUNTOS 9

1.4 Operações sobre conjuntos


Usa-se a notação x ∈ A no caso x é um dos elementos do conjunto A e x ∈
/A
no caso contrário. Sejam M e N dois conjuntos. Se cada um dos elementos
x ∈ M é também elemento do conjunto N diz-se que M é um subconjunto
do N e escreve-se M ⊂ N , isto é,1

M ⊂N se e somente se x ∈ M ⇒ x ∈ N.

Definição 1.1. Definam-se as 3 operações básicas sobre conjuntos


• A ∪ B = {x : x ∈ A ∨ x ∈ B} é união,
• A ∩ B = {x : x ∈ A ∧ x ∈ B} é intersecção,
/ B} é diferença dos conjuntos A e B
• A \ B = {x : x ∈ A ∧ x ∈
Podem ser consideradas outras operações, por exemplo A ⊕ B = (A \ B) ∪
(B \ A) é diferença simétrica.
Se num problema consideram-se só subconjuntos de um conjunto U dado
(conjunto universal) designa-se por A = U \ A ou Ac o complemento do con-
junto A .
Exemplo 1.1. Demonstrar que (A ∪ B) ∩ Ac ⊂ B .
Seja x ∈ (A ∪ B) ∩ Ac . Então x ∈ A ∪ B e x ∈
/ A . Isto é

((x ∈ A) ∨ (x ∈ B)) ∧ (x ∈
/ A).

Portanto x ∈ B .

1.5 Leis de álgebra de conjuntos


Suponhamos que todos os conjuntos são subconjuntos de conjunto U dado
(conjunto universal). É possível demonstrar as fórmulas:
1. Leis comutativas

(a) A ∪ B = B ∪ A ,
(b) A ∩ B = B ∩ A
2. Leis associativas
(a) (A ∪ B) ∪ C = A ∪ (B ∪ C) ,
(b) (A ∩ B) ∩ C = A ∩ (B ∩ C)
3. Leis distributivas
(a) A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C) ,
(b) A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C)
4. A ∪ A = A, A∩A=A
5. (a) A ∪ ∅ = A
1o símbolo ⇒ é sinal de implicação, isto é A ⇒ B temos que ler: de A decorre B
10 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

(b) A ∪ U = U
(c) A ∩ ∅ = ∅
(d) A ∩ U = A
6. (Ac )c = A
7. A ∪ Ac = U, A ∩ Ac = ∅
8. U c = ∅, ∅c = U
9. Leis de Morgan
(a) (A ∪ B)c = Ac ∩ B c ,
(b) (A ∩ B)c = Ac ∪ B c

1.6 Produto directo (cartesiano)


Sejam S e T dois conjuntos arbitrários. Consideremos um par ordenado (s, t)
onde s ∈ S , t ∈ T são elementos arbitrários destes conjuntos. O conjunto de
todos os pares ordenados chama-se produto directo (ou cartesiano) e designa-se

S × T = {(s, t) : s ∈ S ∧ t ∈ T }.

Se S = T escreve-se também S × S = S 2 .
Exemplo 1.2. Sejam S = {1, 2, 3, 4}, T = {a, b, c} . Produto S × T consiste
de 12 pares ordenados:

(1, a) (2, a) (3, a) (4, a)


(1, b) (2, b) (3, b) (4, b)
(1, c) (2, c) (3, c) (4, c).

Notemos que em caso geral S × T 6= T × S .


Designemos |S| é o número de elementos do conjunto S (se S é um con-
junto finito). É claro que
|S × T | = |S| · |T |.
Generalização:

S1 × . . . × Sn = {(s1 , s2 , . . . , sn ) : sk ∈ Sk , k = 1, 2, . . . , n}.

Aqui (s1 , s2 , . . . , sn ) é cortejo (ou "conjunto ordenado"). No caso

S1 = S2 = . . . = Sn = S

usa-se designação
S × S × . . . × S = S n.
1. CONJUNTOS 11

1.7 Funções
O que é uma função?
Função ou aplicação f de um conjunto A para um outro (ou o mesmo) conjunto
B é uma regra (uma lei, um algoritmo) que permite a partir de qualquer valor
x ∈ A encontrar um único valor y ∈ B . O conjunto A chama-se domínio da
função f , e B é contradomínio da f . Usa-se notação
f: A → B
e diz-se que f age do A para B . Escreve-se também y = f (x) onde f (x)
designa o valor da função f quando argumento da função toma o valor x ∈ A .
A expressão f (x) chama-se também imagem do x .
Exemplo 1.3. Sejam A = {a, b, c} e B = {1, 2, 3, 4} . Para definir uma função
f : A → B é preciso definir os três valores de função: f (a), f (b), f (c) . Por
exemplo, uma das funções possíveis pode ser dada pela tabela
x a b c
f (x) 2 4 2
Então f (a) = 2 , f (b) = 4 , f (c) = 2 .

Imagem e preimagem
Introduz-se também a imagem de um conjunto. Seja X ⊂ A . Por definição
f (X) = {f (x) : x ∈ X} ≡ {y : y = f (x), x ∈ X}.
A expressão f (X) chama-se a imagem do conjunto X . No exemplo 1.3 f (A) = {2, 4} .
Se f (x) = y o elemento x chama-se preimagem do y . O conjunto de
todos os preimagens do y forma preimagem completo do y . Para preimagem
completo vamos usar notação f −1 (y) . Então
f −1 (y) = {x ∈ A : f (x) = y}.
No exemplo 1.3 f −1 (2) = {a, c}, f −1 (4) = {b}, f −1 (1) = f −1 (3) = ∅ . A
preimagem de um conjunto Y ⊂ B defina-se como união de todos os preimagem
dos elementos y ∈ Y , ou
f −1 (Y ) = {x ∈ A : f (x) ∈ Y }.
No exemplo 1.3 f −1 ({1, 2}) = {a, c} .
Exemplo 1.4. Consideremos uma função f : A → A onde A = {0, 1, 2, 3, 4} ,
definida pela relação2
f (x) = (2x) mod 5.
Encontrar f (A) e f −1 (A) .
Solução. Consideremos a tabela dos valores da função
x 0 1 2 3 4
f (x) 0 2 4 1 3

Da tabela logo f (A) = A e f −1 (A) = A .


2 a operação binária mod determina o resto de divisão do operando esquerdo por direito.

Por exemplo 13 mod 5 = 3, 4 mod 7 = 4 .


12 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

2 Relações
2.1 Conceito de relação
Exemplo. Sejam S um conjunto de todos os estudantes duma universidade
e T conjunto das disciplinas. Consideremos produto directo S × T que con-
siste de pares (s, t) onde s é um estudante, t é uma disciplina. Formemos o
subconjunto R ⊂ S × T dos pares (s, t) :

R = {(s, t) : estudante s inscreve-se e assiste a disciplina t}.

Diz-se que dada uma relação entre elementos dos conjuntos S e T .


Sejam S e T conjuntos e R ⊂ S × T . Vamos chamar R por uma relação
entre S e T ou sobre S × T . Escreve-se xRy (ou usa-se outro símbolo):
xRy ⇔ (x, y) ∈ R . Mais frequentemente T = S , e R ⊂ S × S .
Exemplo 1.5. Consideremos várias relações:
(a) Relação de igualdade E ⊂ S × S, E = {(x, x) : x ∈ S} . De facto, dados
dois elementos x, y ∈ S pode-se colocada a questão x = y ou não? No
caso sim o par (x, y) ∈ E , no caso contrário (x, y) ∈
/ S.
(b) Relação de ordem R ⊂ N × N, R = {(x, y) : x ≤ y}
(c) Relação de divisibilidade.
Vamos usar o símbolo | para a relação de divisibilidade sobre o conjunto
Z . A formula m | n diz: m divide n ou m é divisor de n . Por
outras palavras a formula m | n ≡ significa existência de um k ∈ N tal
que km = n , por exemplo 2 | 6, 7 | 35 etc. Seja R = {(m, n) ∈ N ×
N : m | n} . Então n é divisível por m se (m, n) ∈ R .

Composição de relações
Sejam R1 ⊂ S × S e R2 ⊂ S × S relações sobre S . O conjunto
def
R1 ◦ R2 = {(x, z) : ∃y : (x, y) ∈ R1 , (y, z) ∈ R2 }

é uma relação que se chama composição das relações R1 e R2 .


Exemplo 1.6. Consideremos o conjunto S = {1, 2, 3, 4, 5} e a relação

R = {(1, 2), (1, 4), (5, 2), (4, 3)}. (1.1)

Encontremos a composição R ◦ R . Temos por exemplo (1, 4) ∈ R e (4, 3) ∈ R .


Daqui (1, 3) ∈ R ◦ R . Desta maneira não é possível encontrar mais pares
(x, y), (y, z) ∈ R . Então, R ◦ R = {(1, 3)} .
Exemplo 1.7. Seja R ⊂ N × N, R = {(x, y) : x < y} . Verifique se a composição
R ◦ R é o subconjunto

R ◦ R = {(x, y) : x ≤ y − 2}.
2. RELAÇÕES 13

4 5

1 3
2

Figura 1.1: Grafo da relação (1.1)

2.2 Representação geométrica de relação. Conceito de


grafo orientado
Dada uma relação R sobre um conjunto S , isto é, R ⊂ S × S . Representemos
os elementos do S por pontos de plano. Isto não é difícil realizar se o conjunto
S é finito. A relação R pode ser indicada por meio de um conjunto de arcos,
cada um dos quais sai de um ponto e entra a um outro ou o mesmo ponto. Por
exemplo, para a relação 1.1 resultado da representação geométrica podemos ver
na figura 1.1.
Na figura 1.1 o diagrama apresenta uma estrutura. Esta estrutura consiste
de dois conjuntos, um conjunto é o conjunto de pontos (que correspondem aos
elementos do conjunto S ) e o segundo é o conjunto de vários arcos. A cada
um dos arcos correspondem os dois pontos: origem e extremidade do arco. Esta
estrutura chama-se grafo orientado. Então temos a definição
Definição 1.2. Grafo orientado G é o terno ordenado G = {V, E, γ} onde
• V é um conjunto de vértices, V = V (G)
• E é um conjunto de arcos, E = E(G)
• γ : E → V × V ( γ é uma função com domínio E , os valores da função
γ pertencem ao produto directo V × V )
Se γ(e) = (p, q) diz-se " e vai de p a q ", p é o vértice inicial, q é a
extremidade do arco e ou o vértice terminal. Diz-se também que cada um dos
vértices p e q é incidente ao arco e .
Se γ(e) = γ(f ) = (p, q) arcos e e f chamam-se arcos múltiplos ou paralelos.
Caso γ(e) = (p, q) e p = q o vértice se chama laço.
Exemplo 1.8. Consideremos o grafo sobre a figura 1.2. O grafo tem 3 laços, os
dois arcos a e b são arcos paralelos. A tabela representa os valores da função
γ
14 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

e γ(e)
a (v1 , v2 )
b (v1 , v2 )
c (v1 , v3 )
d (v1 , v4 )
f (v3 , v1 )
g (v3 , v4 )
h (v4 , v2 )
l (v1 , v1 )
m (v2 , v2 )
n (v2 , v2 )

l a n
m
v1
v2
b

f c h
d

v3 g v4

Figura 1.2: Grafo orientado

2.3 Representação de grafos. Matriz de adjacência


Consideremos um digrafo G e o conjunto V (G) = {v1 , v2 , . . . , vn } dos vérti-
ces. A cada par (vi , vj ) corresponde o número aij de arcos que saem do vértice
vi e entram para vj . Obteremos a matriz (aij )i,j=1,n que vamos chamar ma-
triz de adjacência. No caso aij = 0 o vértice vi não é adjacente ao vértice vj ).
Por exemplo para o grafo na figura 1.2 a matriz de adjacência tem a forma
 
1 2 1 1
0 2 0 0
A= 1 0 0 1

0 1 0 0

Matriz de adjacência descreve completamente a estrutura do grafo e permite


reconstruir o grafo (se a informação sobre natureza dos vértices e arcos não é
importante).

2.4 Relação de equivalência


Definição 1.3. Relação R ⊂ S × S chama-se relação de equivalência se satis-
fizer às 3 condições (designemos esta relação por símbolo ∼ ):
(R) m ∼ m ∀m ∈ S
2. RELAÇÕES 15

(S) m ∼ n ⇒ n ∼ m
(T) m ∼ n, n ∼ r ⇒ m ∼ r
Estas três propriedades chamam-se reflexividade, simetria e transitividade
respectivamente
Exemplo 1.9. Consideremos relação Rp ⊂ Z × Z, (m, n) ∈ Rp se p | (m − n) .
Esta relação chama-se relação de congruência com modulo p . Usa-se a notação

m≡n (mod p).

Verifique as propriedades (R), (S) e (T).


Exemplo 1.10. Seja R uma relação transitiva. Consideremos a composição
R ◦ R . Se (x, z) ∈ R ◦ R então existe y ∈ S tal que (x, y), (y, z) ∈ R . Daqui
(x, z) ∈ R . Então,
R ◦ R ⊂ R.
Demonstre que
R é transitiva ⇔ R ◦ R ⊂ R.

2.5 Partição de um conjunto em classes


Sn
Definição 1.4. Se um conjunto S é representado como união S = Sk dos
T k=1
conjuntos disjuntos, isto é, Si Sk = ∅ quando i 6= k , então diz-se que os
subconjuntos S1 , . . . , Sn formam partição do conjunto S (partição em classes
S1 , . . . , Sn ).
Qualquer relação R de equivalência determina a partição correspondente,
cada classe consiste de elementos equivalentes entre si. A cada um elemento
x ∈ S corresponde a classe

S(x) = {y ∈ S : (x, y) ∈ R}.


T
Verifique que S(x) = S(y) se (x, y) ∈ R e S(x) S(y) = ∅ caso contrário.
Exemplo 1.11. Consideremos uma relação de equivalência Rp , relação de con-
gruência pelo modulo p . Encontremos a partição correspondente. Seja m ∈ Z
um número. É claro que Sm = {m, m ± p, m ± 2p, m ± 3p, . . .} . Existem exacta-
mente p classes diferentes que correspondem aos números {0, 1, 2, . . . , p − 1} .
Caso p = 2 teremos as duas classes: números pares e números ímpares.
As vezes uma partição pode ser feita usando a operação preimagem. Sejam
S e T dois conjuntos e f : S → T qualquer função. Se y1 ∈ T e y2 ∈ T são
dois elementos diferentes, os conjuntos f −1 (y1 ) e f −1 (y2 ) não têm elementos
comuns (exercício 10). Por isso, uma partição em classes pode ser constituída
de todos os conjuntos da forma Sy = f −1 (y) , onde y percorre o conjunto T .
Exemplo 1.12. Consideremos a função f : Z → {0, 1, 2}

f (n) = n mod 3.
16 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

Os conjuntos S0 = f −1 (0) , S1 = f −1 (1) e S2 = f −1 (2) formam uma partição


do Z em 3 classes

S0 = {. . . , −6, −3, 0, 3, 6, . . .}
S1 = {. . . , −5, −2, 1, 4, 7, . . .}
S2 = {. . . , −4, −1, 2, 5, 8, . . .}

3 Algoritmos
Conceito de algoritmo é também uma noção básica de Matemática Discreta.
Este conceito não pode ser definido agora com rigor matemático e precisa de
preparação séria. Apesar disso o conceito pode ser descrito em termos habituais.
Existe um conjunto finito de instruções que devem ser realizadas passo a passo.
Claro que devem ser dados objectos de aplicação das instruções, condições de
aplicação, ordem de aplicação.
Um exemplo simples de algoritmo é algoritmo cíclico.

3.1 Algoritmos cíclicos


Consideremos um algoritmo para encontrar a soma de n números

s = x1 + x2 + · · · + xn .

Usando uma notação algorítmica semelhante com a notação da língua Pascal o


algoritmo pode ser representado de maneira seguinte:
s := 0
for j := 1 to n do
s := s + xj
end for
Comentário: introduz-se uma variável s com valor inicial zero. Depois disso
passo a passo o valor de s aumenta-se em valores de x1 , x2 , . . . , xn . Para
atingir isto usa-se a variável de controlo j que toma os valores 1, 2, . . . , n sub-
sequentemente.
O mesmo algoritmo pode ser representado de outra maneira usando a estru-
tura while (enquanto):
s := 0 ; j := 0
while j < n do
j := j + 1
s := s + xj
end while
Comentário: o algoritmo cíclico que usa while funciona de maneira seguinte:
1. verifica-se a condição (neste caso: j < n )
2. Se a condição for falsa o ciclo termina (saída do algoritmo).
3. Se for verdadeira:
(a) executam-se os operadores interiores do ciclo ( j := j + 1 e s := s +
xj )
3. ALGORITMOS 17

(b) o controlo volta para verificar a condição (alinha 1)


Exemplo 1.13. Dados n números x1 , x2 , . . . , xn . Sabe-se que pelo menos um
deles é negativo. Achar o índice k de um número negativo.
Uma solução está apresentada no Algoritmo 1.1.

Input: pelo menos um dos números x1 , x2 , . . . , xn é negativo


Output: k é o índice de um número xk negativo
j := 1
while xj ≥ 0 do
j := j + 1
end while
k := j

Algoritmo 1.1: Índice de um número negativo

Notemos que neste exemplo o número dos passos do algoritmo cíclico de-
pende dos números dados x1 , . . . , xn . Por isso, não é natural resolver este
problema usando a estrutura for.

3.2 Ciclos duplos e múltiplos


Seja (aij )i,j=1,...,n uma matriz quadrada. Um algoritmo para encontrar a soma
de todos os elementos tem a forma de um ciclo duplo

s := 0
for i := 1 to n do
for j := 1 to n do
s := s + aij
end for
end for
Algoritmo 1.2: Ciclo duplo

Comentário. O ciclo exterior começa funcionar com o valor de i = 1 . Para


este valor o ciclo interior calcula a soma

s = a11 + a12 + · · · + a1n .

De mesma maneira para os valores i = 2, i = 3, . . . , i = n o ciclo interior


adiciona à variável s as somas

a21 + a22 + · · · + a2n , . . . , an1 + an2 + · · · + ann .

O resultado é
n X
X n
s= aij . (1.2)
i=1 j=1

Note que a fórmula (1.2) é só realmente outra notação para representar o algo-
ritmo (1.2).
Exemplo 1.14. Vamos supor que pelo menos um elemento da matriz (aij ) é
número negativo. Achar os índices i1 , j1 de um elemento negativo.
18 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

Input: pelo menos um dos números aij é negativo


Output: i1 , j1 são os índices de um elemento ai1 j1 < 0
found := 0 ; i := 0
while found = 0 do
i := i + 1
for j := 1 to n do
if aij < 0 then
found := 1 ; j1 := j
end if
end for
end while
i1 := i

Algoritmo 1.3: Índices de um elemento negativo

n 10 20 30 40 50
t 1 seg 18 min 12 dias 35 anos 35700 anos

Figura 1.3: Tempo do algoritmo de formação dos subconjuntos

Uma solução está apresentada na figura 1.3.


Neste exemplo o número dos passos do algoritmo cíclico depende da matriz
(aij ) . O mínimo número dos passos é igual a n quando a primeira linha contém
números negativos. O máximo é n2 se os números negativos contém só última
linha.

3.3 Complexidade de algoritmos


Exemplo 1.15. Dado um conjunto X de n elementos coloquemos o problema
de construção de todos os subconjuntos do conjunto X . Sabe-se que existe
2n tais subconjuntos. Seja t0 o tempo médio para construir um subconjunto.
Todo o tempo do trabalho de um algoritmo depende do número n de elementos
e constituirá t = f (n) = 2n · t0 . A função f (n) tem crescimento exponencial, e
portanto é possível realizar o algoritmo para valores n bastante pequenos. De
facto suponhamos que o tempo para formar um subconjunto t0 é igual a um
milisegundo. O tempo do trabalho representemos pela tabela sobre a figura 1.3.
Infelizmente não existe nenhum algoritmo que permita resolver o problema
mais rápido. Temos que formar todos os subconjuntos e cada um dos subcon-
juntos exige o tempo t0 . Mas em diferentes problemas com frequência podem
existir diferentes algoritmos tempo do trabalho dos quais distingue considera-
velmente.
Assim surge o conceito de complexidade temporal de algoritmo. Suponhamos
que num algoritmo existe uma operação principal, e o tempo de trabalho se pode
apreciar pelo produto Qt0 onde Q é o número de vezes de comprimento da
operação e t0 é o tempo de comprimento. Pode-se também considerar conceito
de volume ou dimensão de dados. No exemplo precedente o número n de
elementos serve como volume de dados.
Definição 1.5. O número de operações como função Q = f (n) do volume de
3. ALGORITMOS 19

dados n chama-se complexidade de algoritmo.


Notemos que o valor Q pode depender não só de n mas de dados próprios.
Portanto consideram-se os conceitos de complexidade média, de complexidade
máxima (o pior caso) e complexidade mínima (o melhor caso).

No exemplo 1.15 a complexidade é igual a 2n .


Exemplo 1.16. Para o algoritmo 1.1 a complexidade média é igual a n/2 , a
complexidade máxima é n , a complexidade mínima é 1 .
Exemplo 1.17. Calcular o produto de uma matriz quadrada (aij )n1 e de uma
matriz coluna composta de elementos (bj )n1 . O resultado é a matriz coluna
Pn
composta dos elementos ci = aij bj , i = 1, 2, . . . n .
j=1
for i := 1 to n do
s := 0
for j := 1 to n do
s := s + aij bj
end for
ci := s
end for
A operação de multiplicação é operação principal. O parâmetro n escolhe-
mos como o parâmetro que determina o volume de dados. É fácil ver que a
complexidade é igual à n2 .

Exemplo 1.18. Dados n pontos em espaço M1 , M2 , . . . , Mn . Encontrar a dis-


tância máxima entre todos os pares Mi , Mj , i, j ∈ {1, . . . , n} .
Tem-se Cn2 = n(n − 1)/2 pares. Portanto complexidade de um algoritmo
que realize a resolução pode ser igual a n(n − 1)/2 . Para isso serve o algoritmo
seguinte
D := 0
for i := 1 to n − 1 do
for j := i + 1 to n do
if D < |Mi Mj | then
D := |Mi Mj |
end if
end for
end for
Aqui as complexidades média, máxima e mínima coincidem e são iguais a
n(n − 1)/2 .
Nos últimos dois exemplos o crescimento do tempo mais considerável que no
exemplo 1.16 porque

n/2 n/2
lim = 0, lim = 0.
n→∞ n2 n→∞ n(n − 1)/2

Usa-se notação f (n) = O(g(n)) se existe C > 0 e

|f (n)| ≤ C|g(n)|
20 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

para todos bastante grandes n . No exemplo 1.16 f (n) = n/2 = O(n) , no


último exemplo
f (n) = n(n − 1)/2 = O(n2 ).
Se f (n) = O(nk ) diz-se que f (n) tem crescimento polinomial. No caso
f (n) = O(2n ) a função f (n) tem crescimento exponencial.

Exemplo 1.19. Dado um algoritmo triplo. Determinar a complexidade do algo-


ritmo e tipo de crescimento da complexidade.
x := 0
for i := 1 to n do
for j := i + 1 to n do
for k := j + 1 to n do
x := x + 1
end for
end for
end for
Operação principal é atribuição x := x + 1 . Calculemos o número x ao
terminar do algoritmo. O ciclo interior se cumpre n − j vezes. Para j -ciclo
vamos ter
(1 + (n − i − 1))(n − i − 1) (n − i)(n − i − 1)
(n−i−1)+(n−i−2)+. . .+1 = = .
2 2
Então
n
X (n − i)(n − i − 1)
f (n) = .
i=1
2

Não é necessário calcular esta soma para determinar tipo do algoritmo. É pos-
sível fazer cálculo aproximado. O número de vezes médio de cumprimento do
j -ciclo é igual a n/2 , o número de vezes médio para k -ciclo é uma função da
forma c · n, 0 < c < 1 . Portanto f (n) ≈ n · n/2 · cn = c/2 · n3 = O(n3 ) .
4. EXERCÍCIOS 21

4 Exercícios
4.1 Lógica
1. Demonstrar: se um número n natural é múltiplo de 4 então o n é par.
2. Como é que pode ser demonstrada a implicação P → (Q → R) ?

4.2 Conjuntos e funções


1. Dentro do conjunto universo U = {1, 2, 3, . . . , 12} dados os conjuntos
A = {1, 3, 5, 7, 9, 11} , B = {2, 3, 5, 7, 11} , C = {2, 3, 6, 12} ,
D = {2, 4, 8} .
(a) Encontrar os conjuntos
i. A∪B, A∩C
ii. (A ∪ B) ∩ C c
iii. A\B, C \D
iv. B⊕D
(b) Achar as representações dos conjuntos A, B, C, D usando proprieda-
des características
2. Demonstrar as leis de Morgan
3. Representar o conjunto P(P({a})) na forma de lista
4. Demonstrar que
(a) A ∩ (B ⊕ C) = (A ∩ B) ⊕ (A ∩ C)
(b) A ⊕ B ⊂ (A ⊕ C) ∪ (B ⊕ C)
(c) (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)
5. Provar a generalização da lei de Morgan

(A ∩ B ∩ C)c = Ac ∪ B c ∪ C c

6. Sejam A = {a, b, c}, B = {a, b, d}


(a) Formar lista de todos elementos dos conjuntos A × A, A × B
(b) Formar lista de elementos do conjunto {(x, y) ∈ A × B : x = y}
7. Sobre o conjunto U = {0, 1, 2, 3, 4, 5} é definida a função f : U → U
segundo a formula f (x) = x2 mod 6 . Encontrar as imagens e preimagens
f (U ), f −1 (U ) , f (B), f −1 B) onde B = {2, 3, 5} . Resolver a equação
f (x) = x .
8. Sejam A = {0, 1, 2, 3, 4, 5, 6, 7} e f : A → A a função definida pela fór-
mula f (x) = x2 mod 8 . Achar um elemento x ∈ f (A) tal que x ∈ / f −1 ({x}) .
9. Demonstrar a inclusão f (X1 ) ⊂ f (X2 ) se X1 ⊂ X2 . A proposição
inversa é verdadeira?
10. Demonstrar as seguintes propriedades da operação preimagem
22 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

S S
(a) f −1 (A B) = f −1 (A) f −1 (B)
T T
(b) f −1 (A B) = f −1 (A) f −1 (B)
c
(c) f −1 (Ac ) = f −1 (A)
11. Seja f : X → Y . Demonstrar que A ⊂ f −1 (f (A)), A ⊂ X . Dar um
6 f −1 (f (A))
exemplo quando A =
12. Sejam f : X → Y, A ⊂ X, B ⊂ Y . Demonstrar que

A ⊂ f −1 (B) ⇔ f (A) ⊂ B.

13. Sejam f : X → Y, A ⊂ X, B ⊂ Y . Demonstrar que as implicações


(a) A ⊃ f −1 (B) → f (A) ⊃ B
(b) f (A) ⊃ B → A ⊃ f −1 (B)
são falsas.

4.3 Relações
1. As relações seguintes são definidas sobre o conjunto N dos números na-
turais. Formar a lista de todos os pares da relação:
(a) R1 = {(m, n) : m + n = 5}
(b) R2 = {(m, n) : max{m, n} = 2}
(c) R3 = {(m, n) : min{m, n} = 2} (neste caso obter só 5 pares)
As relações consideradas são simétricas?
2. Achar a composição R ◦ R para a relação R = {(1, 2), (1, 4), (5, 2), (4, 3)}
e para cada uma das relações no exercício 1.
3. Uma relação R ⊂ S × S é transitiva. Demonstrar que R ◦ R ⊂ R .
4. Construir um grafo da relação dada sobre o conjunto S
(a) S = {1, 2, 3, 4}, R = {(1, 2), (1, 1), (4, 1), (2, 3), (2, 2)}
(b) S = {1, . . . , 10}, R = {(m, n) : m|n}
5. Verificar se as relações seguintes são relações de equivalência ou não. No
caso ’não’ indicar quais das condições (R),(S),(T) não se cumprem:
(a) sobre o conjunto das rectas no espaço, relações da paralelidade, per-
pendicularidade
(b) sobre o conjunto dos vectores no espaço (excepto o vector nulo) rela-
ções de colinearidade, perpendicularidade, relação: vectores a e b
têm a mesma direcção
(c) R = {(m, n) ∈ N × N : |m − n| ≤ 1}
(d) S = N × N, R ⊂ S × S , ponhamos por definição (m, n) ∼ (k, l) se
m+l =n+k
4. EXERCÍCIOS 23

6. Demonstrar que as relações seguintes são relações de equivalência e en-


contrar partição do conjunto S :
(a) S = {1, 2, 3, . . . , 10}, R = {(m, n) : m ≡ n (mod 4)}
(b) S = N, R = {(m, n) : ∃k ∈ Z tal que m = 2k n}
(c) S = Z, R = {(m, n) : m2 = n2 }
(d) S = {2, 3, 4, . . .} ,

R = {(m, n) : m e n têm o mesmo mínimo divisor primo}

(e) S = N2 , R = {((m, n), (p, q)) : mq = np}


7. Para as seguintes relações achar a mínima relação de equivalência que
contém dada:
(a) S = {1, 2, 3, 4}, R = {(1, 2), (4, 3)}
(b) S = {1, 2, 3, 4}, R = {(1, 2), (1, 3)}
8. Para as seguintes relações achar a mínima relação transitiva que contém
dada:
(a) S = {1, 2, 3, 4}, R = {(1, 2), (4, 3), (2, 3), (3, 2)}
(b) S = {1, 2, 3, 4}, R = {(1, 2), (3, 1), (1, 4), (4, 2)}

Nos exercícios 9 – 12 achar a complexidade dos algoritmos e ordem de


crescimento.
9. x := 0
for i := 1 to n do
for j := 1 to i do
x := x + 1
end for
end for
10. x := 0
for i := 1 to n do
for j := 1 to (i + 1) div 2 do
x := x + 1
end for
end for
11. x := 0; j := n
while j > 0 do
j := j div 2
x := x + 1
end while
12. x := 0; j := n
while j > 0 do
for i := 1 to j do
x := x + 1
24 CAPÍTULO 1. CONJUNTOS, RELAÇÕES E GRAFOS

end for
j := j div 2
end while
13. Demonstre que no exemplo 1.19 f (n) ≈ n3 /6
14. Demonstre que f (n) = n(n − 1)(n − 2)/6
Capítulo 2

Contagem. Análise
combinatória

1 Princípios básicos
Colocação do problema. Determinar o número de elementos de um conjunto
dado.

1.1 Regra de união


União de dois conjuntos
Sejam S e T conjuntos finitos.
• Se S e T são disjuntos i.e. S ∩ T = ∅ então

|S ∪ T | = |S| + |T |

• Caso geral
|S ∪ T | = |S| + |T | − |S ∩ T |.

Exemplo 2.1. Seja S = {1, 2, 3, . . . , 1000} . Quantos números de S são divisí-


veis por 3 ou 5?
Resolução. Designemos Di = {x ∈ S : x é divisivel por i} . Temos

|D3 ∪ D5 | = |D3 | + |D5 | − |D3 ∩ D5 |.

Como |D3 | = 333 (parte inteira de 1000/3), D5 = 200 e

|D3 ∩ D5 | = |D15 | = 66

( 66 é parte inteira de 1000/15 ) o número procurado é igual a 333 + 200 −


66 = 467 .

25
26 CAPÍTULO 2. CONTAGEM. ANÁLISE COMBINATÓRIA

União de três conjuntos


Para três conjuntos temos uma situação mais complicada

|A1 ∪ A2 ∪ A3 | = |A1 | + |A2 | + |A3 |


− |A1 ∩ A2 | − |A1 ∩ A3 | − |A2 ∩ A3 | + |A1 ∩ A2 ∩ A3 |. (2.1)

Esta relação pode ser interpretada geometricamente na base de diagrama de


Venn, mas pode-se demonstrada analiticamente.

Caso geral. União de n conjuntos


[n X n X X

Ai = |Ai | − |Ai ∩ Aj | + |Ai ∩ Aj ∩ Ak | − · · ·

i=1 i=1 i,j i,j,k

+ (−1)n+1 |A1 ∩ A2 ∩ . . . ∩ An |. (2.2)

1.2 Princípio do produto


• Se S1 , S2 , . . . , Sk são conjuntos finitos

|S1 × S2 × . . . × Sk | = |S1 | · . . . · |Sk |

• Generalização. Seja T ⊂ S1 × . . . × Sk . Supõe-se que para construir


qualquer elemento do conjunto T , (s1 , . . . , sk ) ∈ T existe um algoritmo
que consiste em seguintes passos. Existem n1 variantes para escolha de
s1 ∈ S1 . Com s1 têm-se n2 casos para escolha de s2 ∈ S2 . Dados s1 e
s2 é possível escolher s3 ∈ S3 de n3 variantes, etc. Dados s1 , . . . , sj−1
têm-se nj variantes para escolher sj . . .
Então
|T | = n1 n2 . . . nk .

Exemplo 2.2. Achar a quantidade de todos os números decimais com 3 alga-


rismos diferentes.
Existem n1 = 9 variantes para escolher o primeiro algarismo. Tendo o
primeiro algarismo teremos n2 = 9 variantes para escolher segundo algarismo.
Dados primeiros dois algarismos temos n3 = 8 variantes para escolha do ter-
ceiro. Então teremos n1 n2 n3 = 9 · 9 · 8 = 648 números.

2 Permutações, subconjuntos e distribuições


2.1 r -permutações (arranjos)
Dado um conjunto finito A = {a1 , . . . , an } de n elementos, encontremos uma
permutação de r ≤ n elementos do conjunto A :

ai(1) , ai(2) , . . . , ai(r) ∈ A


2. PERMUTAÇÕES, SUBCONJUNTOS E DISTRIBUIÇÕES 27

(índices i(1), i(2), . . . , i(r) são índices diferentes do conjunto {1, 2, . . . , n} ).


Esta sucessão chama-se r -permutação de elementos do conjunto A . Calcu-
lemos o total de todas tais permutações.
Para escolher o primeiro termo ai(1) da sucessão temos n variantes. Dado
o termo ai(1) é possível indicar somente n − 1 variantes do segundo termo.
Para os termos ai(1) , ai(2) existem n − 2 variantes para a escolha do terceiro
termo, etc.
Segundo do princípio do produto temos
n!
P (n, r) = n(n − 1) · · · (n − r + 1) = (2.3)
(n − r)!

de r -permutações, isto é, das permutações de r elementos compostas dos n


elementos dados.
No caso particular, para permutações dos todos n elementos temos

P (n, n) = n! (2.4)

Exemplo 2.3. Calcular a quantidade de números decimais de 3 algarismos di-


ferentes que não contêm o zero.
Pela fórmula (2.3) temos x = 9 · 8 · 7 = 504 .

2.2 Número de funções


Sejam S e T conjuntos finitos, |S| = m, |T | = n . Por exemplo

S = {s1 , s2 , . . . , sm }, T = {t1 , t2 , . . . , tn }.

O total de funções f : S → T determina-se por:


S
T = |T ||S| = nm

onde T S designa o conjunto de todas funções f : S → T .


Exemplo 2.4. Sejam S = {a, b, c}, T = {0, 1} . O total de funções f : S → T é
igual 23 = 8 . Para melhor imaginar este conjunto observemos que cada função
é definida sobre o conjunto S finito. Portanto é possível construir a tabela
de todos os valores da função. Por exemplo se f (a) = 1, f (b) = 0, f (c) = 1
teremos a linha 101 . Conclusão: o número de funções coincide com o número
de linhas de comprimento 3 algarismos de 0 e 1 :

000, 001, 010, 011, 100, 101, 110, 111.

2.3 Número de subconjuntos. Coeficientes binomiais


Dado um conjunto de n elementos. Vamos usar notação Cnr para o número de
todos os subconjuntos contendo r elementos. Vamos chamar também Cnr por
o número de combinações de n elementos por r elementos.
O nosso objectivo é demonstrar que este número é igual a
n!
Cnr = . (2.5)
r!(n − r)!
28 CAPÍTULO 2. CONTAGEM. ANÁLISE COMBINATÓRIA

Para isso consideremos de novo o problema de r -permutações. Mas vamos


usar a regra de produto de outra maneira. No primeiro passo escolhemos um
subconjunto de r elementos que pode ser realizado em n1 = Cnr variantes.
Consideremos por exemplo o conjunto {1, 2, 3, 4, 5} e r = 3 . Suponhamos que
no primeiro passo foi escolhido o subconjunto {2, 3, 5} que é uma das C53 = 10
variantes. Tendo este subconjunto passemos para o segundo passo em que temos
3! variantes para obter uma 3 -permutação.
Em caso geral tem-se n2 = r! variantes para obter uma permutação.
Segundo o princípio do produto:

P (n, r) = n1 n2 = Cnr · r!

(no nosso exemplo n1 n2 = 10 · 6 = 60 permutações). Daqui

P (n, r) n!
Cnr = = .
r! (n − r)! · r!
 
n
Nota. Usa-se também a designação = Cnr , por exemplo
r
 
5 5! 5·4
= C53 = = = 10.
3 2!3! 1·2

Cnr chama-se coeficiente binomial.


Exemplo 2.5. Consideremos um grafo não orientado completo de n vértices,
isto é, grafo sem laços e arcos paralelos em que cada par de vértices é par dos
vértices adjacentes. Calculemos o número dos arcos.
O número de arcos é igual ao número dos pares não ordenados,
  isto é, sub-
n
conjuntos de dois elementos. A quantidade destes pares é = n(n − 1)/2 .
2
Exemplo 2.6. Em quantas maneiras se pode escolher 3 equipas de 4, 2 e 2
jogadores respectivamente de um grupo de 8 pessoas.
Vamos usar o princípio do produto. Uma primeira equipa se pode escolher
por meio de n1 = C84 variantes. Dada primeira equipa teremos n2 = C42
variantes para escolha de segunda. Resto de 2 jogadores forma a terceira equipa.
Então de acordo com o princípio do produto vamos ter

n1 n2 = C84 C42 = 420

variantes.

2.4 Teorema binomial, propriedades de coeficientes


Para os números reais a e b e para n ∈ N temos
n
X
(a + b)n = Cnr an−r br .
r=0

Por exemplo (a+b)4 = a4 +4a3 b+6a2 b2 +4ab3 +b4 . Pondo a = b = 1 obtemos


do teorema binomial a soma dos coeficientes binomiais
2. PERMUTAÇÕES, SUBCONJUNTOS E DISTRIBUIÇÕES 29

2n = Cn0 + Cn1 + · · · + Cnn . (2.6)


Uma propriedade importante (propriedade característica) dos coeficientes é
r−1
Cnr = Cn−1
r
+ Cn−1 (n > 1, n > r) (2.7)

que junto com as condições


Cn0 = Cnn = 1
determina os coeficientes de maneira única.
Exemplo: C53 = 10, C43 = 4, C42 = 6, 10 = 4 + 6 .

2.5 Distribuição de n objectos em k caixas diferentes


Existe uma regra simples mas importante de cálculo de elementos de conjunto.
Se existe uma correspondência biunívoca entre os dois conjuntos fini-
tos A e B então estes conjuntos têm o mesmo número de elementos:
|A| = |B| .
Os problemas a seguir são equivalentes neste sentido. A reposta para todos estes
problemas é
k−1
D(n, k) = Cn+k−1 (2.8)
Para demonstrar esta relação, consideremos os quatro problemas equivalentes.

Problema 1 : O número de distribuições


Temos n objectos idênticos e k caixas diferentes: C1 , C2 , . . . , Ck . É preciso
calcular o número de distribuições de n objectos. Por exemplo, n = 5 objectos
podemos distribuir em k = 3 caixas assim:

2 2 1 ou 0 4 1 etc.

Como vamos ver em baixo, resposta à esta questão (pôr n objectos idênticos
em k caixas diferentes) pode ser encontrada da formula (2.8).
Exemplo 2.7. O número de variantes de distribuição de 5 objectos idênticos em
3 caixas (de cores diferentes) V = C72 = 7 · 6/2 = 21 .
Existem outros problemas isomorfos ao problema colocado, i.e., é possível
construir uma correspondência biunívoca entre dois conjuntos: o conjunto de
todas as distribuições e o conjunto num outro problema.

Problema 2 : O numero de soluções da equação x1 + x2 + . . . + xk = n


Consideremos a equação

x1 + x2 + . . . + xk = n (2.9)

em números inteiros não negativos. A cada uma solução desta equação corres-
ponde uma distribuição em n caixas: a primeira caixa contém x1 objectos, a
k−1
segunda x2 , etc. A reposta à questão é a mesma, D(n, k) = Cn+k−1 .
30 CAPÍTULO 2. CONTAGEM. ANÁLISE COMBINATÓRIA

Problema 3 : Sucessões binárias


Consideremos o conjunto das linhas de comprimento n + k − 1 contendo n
algarismos 0 e k − 1 algarismos 1 . Por exemplo, para n = 5 e k = 3
vamos ter as linhas da forma 0010010, 1000010 etc. A cada uma sucessão
binária pode ser considerada como código de uma distribuição em caixas. Os
zeros consideramos como objectos, mas unidades servem como separadores entre
caixas. Por exemplo na linha 0010010 as unidades dividem os zeros em 3 partes
de x1 = 2 , x2 = 2 e x3 = 1 zeros.
Às linhas 0010001, 0100010 correspondem as soluções
x1 = 2, x2 = 3, x3 = 0 e x1 = 1, x2 = 3, x3 = 1
da equação x1 + x2 + x3 = 5 .
Então, a conclusão é que o número destas sucessões é igual a D(n, k) .

Problema 4 : O número de subconjuntos


A mesma sucessão binária pode ser usada para representar um subconjunto do
conjunto {1, 2, . . . , n, n+1, . . . , n+k−1} contendo k−1 elementos exactamente.
Por exemplo, a sucessão 0010001 indica o subconjunto {3, 7} do conjunto
{1, 2, 3, 4, 5, 6, 7} .
Conclusão. Todos os 4 conjuntos considerados têm o mesmo número de
k−1
elementos D(n, k) , mas o último tem Cn+k−1 elementos. Daqui segue (2.8).

Então, o vínculo entre os problemas considerados permite facilmente encon-


trar uma solução na base da solução do outro. Consideremos mais um problema
que pode ser resolvido desta maneira.
Exemplo 2.8. Achar o numero de funções f : {1, 2, . . . , n} → {1, 2, . . . , m} que
são não decrescentes, isto é, x1 < x2 implica f (x1 ) ≤ f (x2 ) .
Solução do problema podemos encontrar usando a redução à equação (2.9).
Designemos
d1 = f (1), d2 = f (2) − f (1), d3 = f (3) − f (2), . . . , dn = f (n) − f (n − 1).
Os números d1 , . . . , dn são não negativos, d1 ≥ 1 , e
d1 + d2 + · · · + dn = f (n) ≤ m.
Claro que qualquer combinação de números que satisfaçam as últimas condições
determina uma das funções f : {1, 2, . . . , m} → {1, 2, . . . , n} . Então podemos
considerar o problema de número de soluções da inequação
d1 + d2 + · · · + dn ≤ m, d1 ≥ 1, di ≥ 0, i = 2, . . . , n.
Se introduzirmos mais uma variável não negativa dn+1 vamos ter equação
d1 + d2 + · · · + dn + dn+1 = m, d1 ≥ 1, di ≥ 0, i = 2, . . . , n + 1.
Substituindo d1 = 1 + t obteremos a equação t + d2 + · · · + dn + dn+1 = m − 1
que tem
n
Cm−1+n
3
soluções. Este número é a resposta. Por exemplo, existem C2−1+3 = 4 funções
não decrescentes f : {1, 2, 3} → {1, 2} .
3. PERMUTAÇÕES COM REPETIÇÕES. PARTIÇÕES 31

3 Permutações com repetições. Partições


3.1 Permutações com repetições
O número de permutações de n objectos diferentes é igual à n! . Se entre
n objectos nem todos são diferentes vamos ter outro resultado. Consideremos
por exemplo permutações das letras de uma palavra. Se sob palavra subenten-
der combinação qualquer de letras, vamos ter uma permutação com repetições.
Quantas palavras diferentes é possível formar das letras da palavra passarada?
O total de permutações dos 9 elementos é 9! , mas as letras s e a ocorrem duas
e quatro vezes respectivamente. Por isso, não é possível distinguir pas1 s2 arada
e pas2 s1 arada se substituir s1 e s2 por s .
Encontremos o número total de diferentes palavras (permutações) a partir
da palavra passarada. O princípio do produto pode ser aplicado de maneira
seguinte. Seja x o total dessas palavras. Introdução de índices para letras com
repetição, por exemplo pa1 s1 s2 a2 ra3 da4 faz uma permutação de objectos dife-
rentes. Construção de qualquer tal permutação pode ser feito em duas etapas.
A primeira etapa é formar uma palavra destas letras que pode ser feito em x
maneiras. Suponhamos que obtida, por exemplo, a palavra ssaaaaprd . Na
segunda etapa temos que escolher uma permutação das letras s1 e s2 em lugar
das ss e uma permutação a1 a2 a3 a4 em lugar de aaaa . Isto pode ser feito em
2!4! = 48 maneiras. Segundo o princípio de produto o resultado é o produto
x · 48 . Mas por outro lado o mesmo número é n! = 9!

x · 48 = 9!

Daqui x = 9!/48 = 5 · 6 · 7 · 4 · 9 = 7560 .


Consideremos caso geral. Temos n = n1 + n2 + . . . + nk objectos, entre os
quais k objectos diferentes a1 , . . . , ak de modo que ai tem ni repetições. O
total de permutações com repetições é igual a

n!
n1 !n2 ! · · · nk !

Por exemplo das letras aaabbccccd é possível formar


10!
= 5 · 7 · 4 · 9 · 10 = 12600
3!2!4!1!
diferentes palavras. Uma das permutações é bcaaacdccb .

3.2 Partições de um conjunto


Existe um vínculo entre o problema considerado e o problema seguinte. Dado
um conjunto A de n elementos. Achar o total de partições do A em união
ordenada de k conjuntos

A = A1 ∪ A2 ∪ · · · ∪ Ak

tal que |A1 | = n1 , |A2 | = n2 , . . . |Ak | = nk onde n1 , . . . nk são números


dados, n1 + n2 + . . . + nk = n .
Por exemplo A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} , n1 = 3 , n2 = 2 , n3 = 4 ,
n4 = 1 . Uma das partições é {3, 4, 5} ∪ {1, 10} ∪ {2, 6, 8, 9} ∪ {7} .
32 CAPÍTULO 2. CONTAGEM. ANÁLISE COMBINATÓRIA

Para resolver este problema consideremos um vínculo com a questão sobre


o número de permutações com repetições. Ao problema de permutações com
repetições da palavra aaabbccccd corresponde o problema de partições com
n = 10 , n1 = 3 , n1 = 2 , n1 = 4 , n1 = 1 . De facto para qualquer palavra
(permutação) correspondem quatro conjuntos dos lugares das letras a , b , c
e d respectivamente. Por exemplo para a palavra bcaaacdccb vamos ter os
conjuntos Ca = {3, 4, 5}, Cb = {1, 10} , Cc = {2, 6, 8, 9} e Cd = {7} . Estes
conjuntos formam uma das partições do conjunto

A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Então a correspondência biunívoca entre permutações e partições permite


afirmar que o número de partições é igual a
n!
. (2.10)
n1 !n2 ! · · · nk !
Nota 1. Neste problema é importante a ordem dos conjuntos. Se todos os nú-
meros n1 , . . . , nk são diferentes a ordem determina-se a partir destes números.
Mas este momento é preciso ter em vista no caso de coincidência de dois nú-
meros. Por exemplo seja A = {1, 2, 3, 4, 5, 6} e n1 = n2 = 3 . Neste caso
as partições A = {1, 2, 3} ∪ {4, 5, 6} e A = {4, 5, 6} ∪ {1, 2, 3} são partições
diferentes.
Se não é preciso distinguir tais partições tem de ser usada outra formula, a
formula (2.10) neste caso não serve.

4 Exercícios
1. Entre 150 homens 45 sabem nadar, 40 jogam futebol, 50 jogam xadrez.
Também, 32 homens jogam xadrez mas não jogam futebol, 27 jogam
xadrez e nadam, e 10 homens sabem fazer tudo.
(a) Quantos homens jogam xadrez, mas não nadam e não jogam futebol?
(b) Se 21 homens jogam futebol e nadam, quantos homens não sabem
fazer nada de três actividades?
2. Achar o número de permutações de um conjunto de 10 elementos.
3. Encontrar C83 , C80 , C85 .
4. Sejam S = {a, b, c, d} e T = {1, 2, 3, 4, 5, 6, 7} .
(a) Quantas funções f : T → S têm valores diferentes ( f (x1 ) 6= f (x2 )
se x1 6= x2 )?
(b) Quantas existem funções f : S → T com diferentes valores?
(c) Quantas existem funções f : T → S ?
5. (a) Achar o total de números com 3 dígitos
(b) Quantos números têm 3 dígitos diferentes?
(c) Quantos números de 3 dígitos diferentes não são múltiplos de 5 ?
4. EXERCÍCIOS 33

6. Sejam A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} e B = {2, 3, 5, 7, 11, 13, 19} .


S T L
(a) Encontre |A B|, |A B| e |A B| .
(b) Quantos subconjuntos tem A .
(c) Quantos subconjuntos de 4 elementos tem A .
(d) Quantos subconjuntos de 4 elementos com 3 números pares e 1
número ímpar tem A .
7. Em quantas maneiras é possível escolher do conjunto A = {42, 43, . . . , 52}
sete elementos que contêm 3 números pares e 4 números ímpares.
8. Quantos subconjuntos do conjunto A = {20, . . . , 30} têm exactamente 3
números pares e 2 números ímpares?
9. Uma classe consiste de 12 homens e 18 mulheres. Quantos comités pode-
se formar da classe contendo
(a) sete pessoas?
(b) 3 homens e 4 mulheres?
(c) 7 homens ou 7 mulheres?
10. Dada uma matriz A que contem m linhas e n colunas. Quantos menores
de ordem k onde k ≤ m, k ≤ n é possível formar dos elementos da A ?
11. De 9 pessoas é preciso formar um comité de 4 pessoas. Em quantas
maneiras é possível fazer isso, se duas pessoas, digamos João e Ana, não
podem servir no mesmo comité.
12. Seja S o conjunto de todas as sucessões de 0 , 1 e 2 de comprimento
10 (por exemplo 0220110120 ∈ S ).
(a) Achar |S| .
(b) Quantas sucessões do S contêm cinco 0 e cinco 1 ?
(c) Quantas sucessões do S contêm três 0 e sete 1 ?
(d) Quantas sucessões do S contêm três 0 exactamente (nem mais nem
menos)?
(e) Quantas sucessões do S contêm três 0 , quatro 1 e três 2 ?
(f) Quantas sucessões do S contêm pelo menos um 0 , pelo menos um
1 e pelo menos um 2 ?
13. De quantas maneiras um conjunto de 2n elementos pode ser partido em
dois subconjuntos com n elementos cada?
14. É preciso formar um password de 7 símbolos com 3 letras e 4 dígitos.
De quantas maneiras é possível fazer isso (o total das letras é 26 )?
15. Achar o número de todas as permutações das letras a, b, c, d, e, f, g, h sa-
tisfazendo à condição: os pares a e b , c e d , e e f , g e h formam
pares adjacentes. Por exemplo, f ecdbahg .
16. Seja P o número de todas as permutações das letras a, b, c, d, e, f
34 CAPÍTULO 2. CONTAGEM. ANÁLISE COMBINATÓRIA

(a) Achar |P |
(b) Quantas permutações satisfazem á condição: a e b são adjacentes,
e b e c são adjacentes.
(c) Encontrar o número de permutações obedecendo à condição: a e b
não são adjacentes?
(d) Encontrar o número de permutações das letras a, b, c, d, e, f se a e
b não são adjacentes e letras b e c também?
(e) Encontrar o número de permutações das letras a, b, c, d, e, f obede-
cendo à condição: as letras a e b são adjacentes ou as letras a
e c são adjacentes. Por exemplo, abcef d e bacdef satisfazem à
condição, mas cdbeaf não satisfaz.
17. Quantas palavras é possível formar das 3 letras a , 4 letras b e 3 letras
c?
18. (a) Achar o número de todas as soluções inteiras não negativas da equa-
ção x1 + x2 + x3 = 11 .
(b) Quantas números decimais de 3 algarismos têm a soma dos algaris-
mos 11 ?
19. Encontrar o número de todas as soluções inteiras não negativas da equação
x1 + x2 + x3 + x4 = 10 satisfazendo à condição x1 ≤ 3 .
20. Em quantas maneiras se pode distribuir 10 objectos iguais em 4 caixas
diferentes sabendo que cada caixa cabe 7 objectos?
21. Achar o número de todas as soluções inteiras da equação

x1 + x2 + x3 + x4 + x5 = 8,

se xi ≥ 0, i = 1, . . . , 5 e x1 ≤ 7 .
22. Em quantas maneiras se pode distribuir 10 objectos iguais em 4 caixas
diferentes sabendo que cada caixa cabe 4 objectos?

23. Têm-se 20 hastes idênticas que ocupam uma linha de vinte lugares dife-
rentes:

| | | | | | | | | | | | | | | | | | | |,

e seis há de ser escolhidas.


(a) Quantas variantes têm-se para isso?
(b) Quantas variantes têm-se se nenhum par de hastes escolhidas não
pode ser consecutivo?
(c) Quantas variantes têm-se se entre cada um par de hastes escolhidas
deve ser pelo menos dois hastes?
4. EXERCÍCIOS 35

24. Encontre o número de variantes para distribuir 10 bebidas de laranja, 1


bebida de limão e 1 bebida de lime entre 4 estudantes de modo que cada
um dos estudantes recebe pelo menos 1 bebida. As bebidas de limão e
lime são para diferentes estudantes.
25. É preciso distribuir 100 estudantes entre três salas com capacidades de
30, 30, 40 . Em quantas maneiras é possível fazer isso? Assumir que es-
tudantes preferem alguns salas, isto é, devemos distinguir as salas com
mesma capacidade.
26. Joan lives in Manhattan, and works at a location that is 10 blocks east
and 15 north from where she lives.
(a) In how many ways can she find a route to work (assuming her route
is as short as possible, and thus is 25 blocks long)?
(b) If she wants to pass a coffee shop on her route, and the coffee shop
is located 3 blocks east and 4 block north, how many routes to work
are possible?
Capítulo 3

Indução e recursividade

1 Indução matemática
1.1 Introdução. Exemplo
Indução matemática é um dos métodos de demonstração de teoremas e outras
proposições matemáticas. Notemos que demonstração é última etapa na re-
solução de um problema. Também, a indução pode servir para descobrir um
resultado, mas isto não é indução matemática, é raciocínio indutivo informal.
A ideia do método pode ser interpretada de maneira seguinte. Seja A um
subconjunto do conjunto N de todos os números naturais. Imaginemos que os
números do conjunto A são marcados, digamos têm cor vermelho. Mas todos
os outros têm cor branco. Temos informação certa sobre o conjunto A . Sabe-se
que o número 1 tem cor vermelho, isto é, 1 ∈ A . Mais, se um número n tem
cor vermelho, o número n + 1 é também de cor vermelho. O que é que podemos
dizer relativamente ao conjunto A ? Claro que 2 tem cor vermelho, porque 1
é do A e 1 + 1 = 2 . Mas o que é que podemos dizer sobre o 3 ?
Intuitivamente claro que A = N . O exemplo abaixo é baseado sobre a
mesma ideia. Mas em vês de dizer que um número n tem cor vermelho, no
exemplo abaixo tem-se uma proposição que que depende do parâmetro n .
Exemplo 3.1. Dada a sucessão 2, 5, 8, . . . Achar a expressão (uma fórmula) para
o termo geral xn desta sucessão. Aqui x1 = 2, x2 = 5, . . .
xn = xn−1 + 3, n ≥ 2. (3.1)
Surge uma hipótese que xn = 3n − 1 . Esta fórmula serve para vários
primeiros valores de n :
n xn 3n − 1
1 2 2
2 5 5
3 8 8
··· ··· ···
Vamos raciocinar de mesma maneira como foi feita em cima a conclusão que
todos os números naturais têm cor vermelho.
Consideremos a implicação
xk = 3k − 1 → xk+1 = 3(k + 1) − 1, k ≥ 1.

36
1. INDUÇÃO MATEMÁTICA 37

Esta implicação pode ser demonstrada:

xk+1 = xk + 3 = (3k − 1) + 3 = 3(k + 1) − 1.

O k pode tomar qualquer número natural, daqui

x1 = 3 · 1 − 1 → x2 = 3 · 2 − 1 → x3 · 3 − 1 → · · ·

Claro que a proposição xn = 3n − 1 deve ser válida para qualquer número


natural n .

Exemplo 3.2. Notemos que as seguintes igualdades


2·3 3·4 4·5
1+2= , 1+2+3= , 1+2+3+4= .
2 2 2
são válidas. Este fato pode sugerir uma hipótese indutiva

n(n + 1)
1 + 2 + 3 + ...+ n = , n = 1, 2, 3, . . . (3.2)
2
Ainda não sabemos se para todos os valores de n a relação (3.2) é verdadeira
ou não. Não é possível verificar a relação (3.2) para todos os valores de n ∈ N .
Verifiquemos que para n = 1 esta proposição é válida. De facto n = 1
1·2
torna (3.2) em igualdade 1 = . No segundo passo (passo da indução)
2
suponhamos que para n = k a proposição é válida, isto é,

k(k + 1)
1 + 2 + ...+ k = .
2
Baseando nesta hipótese demonstremos que para n = k + 1 a proposição será
válida também, isto é,

(k + 1)(k + 2)
1 + . . . + k + (k + 1) = .
2
Temos

k(k + 1)
1 + 2 + . . . + k +(k + 1) = +k+1
| {z } 2
suposição
k(k + 1) + 2(k + 1) (k + 1)(k + 2)
= = .
2 2
Este resultado podemos interpretar de maneira seguinte
   
k(k + 1) (k + 1)(k + 2)
1 + ...+ k = → 1 + . . . + k + (k + 1) = .
2 2
(3.3)
Vamos agora raciocinar. Da validade da relação (3.2) para n = 1 teremos
validade para n = 2 , mas isto implica validade para n = 3 , o último implica
para n = 4 , etc. Intuitivamente nós podemos ver que a relação (3.2) deve ser
válida para todos n = 1, 2, . . . .
38 CAPÍTULO 3. INDUÇÃO

Em geral vamos ter o método que se chama Método (ou princípio) da indução
matemática. Para compreensão melhor da estrutura do raciocínio, introduzimos
a designação  
n(n + 1)
P (n) = 1 + 2 + 3 + . . . + n = (3.4)
2
que depende do n (ou predicado). Estrutura do raciocínio consiste dos dois
elementos:
1. P (1) é verdadeiro
2. a implicação P (k) → P (k + 1) é verdadeira
Neste caso temos a sucessão das implicações

P (1) → P (2) → P (3) → · · ·

1.2 Princípio da indução matemática


Dada uma proposição que depende de parâmetro n natural (ou um predicado
P (n) ). Sob certas condições é preciso demonstrar que P (n) é verdadeiro qual-
quer que seja n natural, i.e.

∀(n ∈ N ) P (n).

A demonstração que utiliza o princípio da indução matemática consiste em


dois passos, base (B) e passo indutivo (I):
(B) Demonstrar que a proposição dada é válida para n = 1 ;
(I) A partir da suposição que a proposição é válida para n = k mostrar que
a suposição é válida e para n = k + 1 (qualquer que seja k ∈ {1, 2, . . .} ).
Usando a designação P (n) para a proposição mencionada o considerado pode-
mos resumir por meio do teorema:
Teorema 3.1 (Princípio de indução matemática). Vamos supor que
(B) P (1) é verdadeira
(I) P (k) → P (k + 1) qualquer que seja k ∈ {1, 2, . . .} .
Então a proposição P (n) é verdadeira qualquer que seja n ∈ N .
O teorema 3.1 pode ser demonstrado na base do princípio de escolha (veja
o axioma 1 na pagina 40).
No exemplo 1.1 a proposição é
 
n(n + 1)
P (n) = 1 + 2 + 3 + . . . + n = .
2

A demonstração está feita conforme o teorema 3.1.


Nos exemplos precedentes as proposições para demonstrar foram dadas.
Consideremos um exemplo, onde usa-se indução informal para predizer uma
proposição.
1. INDUÇÃO MATEMÁTICA 39

Exemplo 3.3. Encontrar a soma

sn = 1 + 3 + 5 + . . . + (2n − 1).

Notemos que n -esimo lugar ocupa o número 2n− 1 (que é possível demons-
trar por meio da mesma indução). Consideremos os cálculos:

n=1 1
n=2 1+3=4
n=3 1+3+5=9
n=4 1 + 3 + 5 + 7 = 16
... ...
Aparece a suposição (indução informal) que a soma sn é igual a n2 . Agora
def
vem etapa da demonstração. Designemos P (n) = {1 + 3 + 5 + . . . + (2n −
1) = n2 } .
(B) P (1) = {1 = 12 } é verdade.

(I) Suponhamos que P (k) = {1 + 3 + 5 + . . . + (2k − 1) = k 2 } = verdade .


Temos

P (k + 1) = {1 + 3 + 5 + . . . + (2k − 1) + (2k + 1) = (k + 1)2 } =


{k 2 + (2k + 1) = (k + 1)2 } = verdade.

Nota 1. Em vez do conjunto N de todos os números naturais pode-se considerar


um subconjunto da forma Nm = {m, m + 1, m + 2, . . .} . Neste caso aplicação
da indução terá a forma

(B) Demonstrar P (m) ;

(I) Demonstrar a implicação P (k) → P (k + 1) para todos os valores de


k ∈ {m, m + 1, . . .} .
Teorema 3.2 (Princípio de indução, generalização). Suponhamos que
(B) P (m) é verdadeira
(I) P (k) → P (k + 1) qualquer que seja k ∈ {m, m + 1, . . .} .
Então a proposição P (n) é verdadeira qualquer que seja n ∈ {m, m + 1, . . .} .

1.3 O princípio fraco de indução matemática


As vezes não é possível usar o princípio indicado. Mas pode ajudar o seguinte
teorema.
Teorema 3.3. Suponhamos que

(B) P (1) é verdade;


(I) Da validade das proposições P (1), . . . , P (k) segue P (k + 1) qualquer que
seja k ∈ {1, 2, . . .} .
40 CAPÍTULO 3. INDUÇÃO

Então P (n) é verdadeira para todos os números n naturais.


Exemplo 3.4. Demonstrar que qualquer número natural n ≥ 2 é possível de-
senvolver em produto de números primos.
Solução. Seja P (n) uma proposição: o número n é possível desenvolver em
produto de primos.
(B) P (2) é verdade evidentemente. O produto contém um único factor 2
(I) Consideremos P (k + 1) . Se o número k + 1 é primo claro que P (k + 1)
é valida. No caso contrario k + 1 = i · j onde i, j < k + 1 . Segundo a
suposição da indução, i e j são produtos de primos, i.e. i = a1 · · · · · am
e j = b1 · · · · · bk podemos. Daqui

k + 1 = a1 · · · · · am b 1 · · · · · b k

é produto de primos.
Existe uma generalização do princípio fraco:
Teorema 3.4. Se
(B) P (1), P (2), . . . , P (m) são verdadeiros;
(I) Da validade das proposições P (1), . . . , P (k) segue P (k + 1) qualquer que
seja k ∈ {m, m + 1, . . .} .
Então P (n) é verdade para qualquer número n natural.

1.4 Princípio de escolha de mínimo elemento


São consideradas diferentes formas de princípios de indução matemática. Como
podemos ver abaixo existem muitas formas de indução. Mas todas as formas po-
dem ser organizadas e justificadas na base de um axioma que reflecte a natureza
do conjunto dos números naturais.
Axioma 1 (Princípio de escolha). Qualquer subconjunto não vazio do conjunto
N dos números naturais tem o mínimo elemento.
Na base do princípio de escolha, axioma 1, pode ser demonstrado o princípio
de indução matemática 3.1 e outros princípios equivalentes.
Demonstração do teorema 3.1. Seja P (n) um predicado definido sobre N e
obedecendo às condições (B) e (I) do teorema 3.1. Designemos por E ⊂ N o
conjunto de todos os valores de n para os quais P (n) é falso. Precisamos de
demonstrar que E = ∅ . Suponhamos ao contrário que E não é vazio. Con-
forme ao axioma 1 o conjunto E tem o mínimo elemento n0 . O n0 é diferente
de 1 , porque P (1) é verdadeira. Como n0 é o mínimo, temos P (n0 − 1) é ver-
dadeira, mas P (n0 ) é falso. Mas isto contradiz à implicação P (k) → P (k + 1)
para k = n0 − 1 . A contradição obtida permite afirmar que E = ∅ .
2. DEFINIÇÕES RECURSIVAS 41

2 Definições recursivas
2.1 Descrição do problema
A secção precedente mostra que o conjunto de todos os números naturais tem
natureza recursiva. É suficiente demonstrar a implicação P (k) → P (k + 1)
e a partir do número 1 é possível obter um resultado para toda a sucessão
das proposições P (1), P (2), P (3), . . . . Esta propriedade dos números naturais
permite definir uma função f : N → Y sobre o N = {1, 2, 3, . . .} utilizando
uma relação entre valores da função para diferentes argumentos. Notemos que
cada função definida sobre N é a sucessão

f1 , f2 , . . . , fn , . . .

Aqui fn = f (n) . Notemos também que o Y é qualquer conjunto. O objectivo


desta secção é considerar um método de definição de sucessões.

2.2 Definição recursiva


A sucessão 1, 4, 9, 16, . . . pode ser determinada por meio da fórmula sn = n2 .
Aqui temos uma definição que permite encontrar sn directamente usando uma
fórmula e o argumento n . Definição recursiva de uma sucessão permite encon-
trar um termo através de outros elementos da mesma sucessão.
Exemplo 3.5. Consideremos a sucessão 2, 5, 8, 11, . . . Seja xn o termo geral da
sucessão, i.e., x1 = 2 , x2 = 5, . . . Implicitamente pressupõe-se um algoritmo
para calcular xn , isto é, para calcular xn temos que calcular previamente xn−1
e encontrar o xn usando a relação

xn = xn−1 + 3, n ≥ 2, x1 = 2. (3.5)

Exemplo 3.6. Consideremos o factorial n! = 1 · 2 · 3 · . . . · n . Realmente esta


definição diz que para calcular n! é preciso primeiro calcular (n − 1)! e depois
multiplicar por n . Em outros termos temos a definição da forma

1! = 1, n! = (n − 1)! · n, se n > 1.

A definição apresenta a informação completa para calcular n! de maneira única.


Pode-se utilizar outra notação

f1 = 1, fn = fn−1 · n, se n > 1.

Temos outra notação mas a mesma definição, por isso fn = n! . Algumas


detalhes de construção correta de definições vamos considerar abaixo.
Exemplo 3.7. A sucessão de Fibonacci defina-se de maneira seguinte
(B) F1 = F2 = 1,
(R) Fk = Fk−2 + Fk−1 se k ≥ 3 .
Daqui F3 = F1 + F2 = 1 + 1 = 2, F4 = F2 + F3 = 1 + 2 = 3, . . . Os 10
primeiros termos são: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 .
42 CAPÍTULO 3. INDUÇÃO

Destes exemplos podemos fazer a conclusão geral. Para definir uma sucessão

sn , n = 1, 2, . . .

um ou vários primeiros termos pode-se definir directamente, mas para outros


consequentes usa-se uma relação recursiva.
Definição 3.1. Definição recursiva consiste das duas partes:
(B) um número finito de primeiros termos de sucessão determinam-se directa-
mente, i.e. os termos s1 , s2 , . . . , sp onde p ≥ 1
(R) todos os outros termos determinam-se por meio de uma relação recursiva
que permite encontrar o termo a partir de certos termos antecedentes

sn = ϕn (s1 , s2 , . . .)

2.3 Extensão de domínio


As vezes é cómodo considerar uma extensão do domínio da sucessão definida.
Isto permite pode ser feito na base da definição recursiva. Por exemplo, para
o factorial com frequência usa-se a convenção 0! = 1 . De facto, este valor
corresponde a relação fn = fn−1 · n para n = 1 :

f1 = f0 · 1, ou 1 = f0 · 1.

Daqui 0! = f0 = 1 .
Para a sucessão de Fibonacci consideremos a relação dada quando n = 2 :

F2 = F1 + F0 .

Daqui F0 = F2 − F1 = 0 . Desta maneira pode-se definir F−1 , F−2 , . . . na base


da relação
Fn = Fn+2 − Fn+1 ,
por exemplo,

F−1 = F1 − F0 = 1 − 0 = 1, F−2 = F0 − F−1 = 0 − 1 = −1.

2.4 Cálculo iterativo. Algoritmos


A definição recursiva permite calcular os elementos da sucessão xn termo a
termo. Este método de cálculo vamos chamar cálculo iterativo. Para calcular
xn calculam-se consequentemente os elementos x1 , x2 , . . . , xn−1 .
Um algoritmo para calcular o factorial pode ter a forma
f := 1
for k := 1 to n do
f := f ∗ k
end for
Exemplo 3.8. Algoritmo de cálculo de soma. Dada uma sucessão a1 , a2 , . . . de
números reais. Consideremos a definição recursiva da soma sn = a1 + . . . + an

s0 = 0, sk = sk−1 + ak , se k ≥ 1.
2. DEFINIÇÕES RECURSIVAS 43

A extensão da sucessão para o conjunto {0} ∪ N dá s0 = 0 . Claro que em


vez disso pode ser dada a base s1 = a1 , mas a extensão para o conjunto {0} ∪N
permite simplificar um pouco o algoritmo.
Conforme com esta definição temos o algoritmo para calcular sn :
s := 0
for k := 1 to n do
s := s + ak
end for
Para calcular o n -esimo número de Fibonacci introduzimos duas variáveis
auxiliares x e y :
x := 1; F := 1
for k := 3 to n do
y := x + F
x := F
F := y
end for
Ao terminar o algoritmo vamos ter F = Fn (a definição do Fn veja no exemplo
3.7).
O algoritmo precisa de análise e justificação.

2.5 Cálculo recursivo


Se usar a definição da sucessão directamente vamos ter cálculo recursivo.
Exemplo 3.9. Consideremos cálculo recursivo do factorial, por exemplo, 5! .
Temos

5! = 4! · 5 = (3! · 4) · 5 = ((2! · 3) · 4) · 5 = ((1! · 2) · 3) · 4) · 5 = 120.

Este exemplo mostra que o método recursivo utiliza a definição directamente


e consiste em chamada da mesma definição mas com outro argumento (neste
exemplo k chama o predecessor k − 1 ). Este processo continua-se até o mo-
mento quando será possível calcular o valor directamente (ao atingir a base;
neste exemplo k = 1 ). A partir deste momento os cálculos se cumprem na
ordem inversa.
No exemplo é considerado que cada elemento da sucessão depende de um
só predecessor mas por exemplo na definição dos números de Fibonacci cada
elemento tem 2 predecessores que complica muito os cálculos:

F6 = (F4 + F5 ) = (F2 + F3 ) + (F3 + F4 )


= (1 + (F1 + F2 )) + ((F1 + F2 ) + (F2 + F3 ))
= (1 + (1 + 1)) + (1 + 1) + (1 + (F1 + F2 ))
3 + 2 + (1 + (1 + 1)) = 8.

Estes cálculos realiza o algoritmo recursivo 3.1. Notemos que a forma do


algoritmo é praticamente uma cópia da definição recursiva, mas utiliza notação
da linguagem Pascal.

O seguinte exemplo mostra mais uma variante para utilizar elementos ante-
cedentes da sucessão:
44 CAPÍTULO 3. INDUÇÃO

function Fib(n:integer):integer;
begin
if (n=1) or (n=2) then
Fib:=1
else
Fib:=Fib(n-2)+Fib(n-1)
end;
begin
write(Fib(6))
end.

Figura 3.1: Cálculo recursivo do número F6 de Fibonacci

Exemplo 3.10. Consideremos a definição


(B) s(0) = 0, s(1) = 1
(R) s(n) = s(⌊n/2⌋) + s(⌊n/5⌋) para n ≥ 2
Aqui ⌊x⌋ designa a parte inteira de x . Observemos que não há diferença
principal entre notação com índice sn e com argumento s(n) .
Calculemos recursivamente por exemplo o número s(73) .

s(73) = s(36) + s(14)


= (s(18) + s(7)) + (s(7) + s(2))
= s(18) + 2s(7) + s(2)
= s(9) + s(3) + 2(s(3) + s(1)) + s(1) + s(0)
= ...
= 8s(1) + 6s(0) = 8.

2.6 Relações recorrentes lineares


Dado um número natural p e a relação

sn = a1 sn−1 + a2 sn−2 + · · · + ap sn−p . (3.6)

Esta relação chama-se relação recorrente linear. Se definir directamente os pri-


meiros p termos s1 , s2 , . . . , sp vamos ter uma definição recursiva de uma su-
cessão (sn ) .
Existe um método para encontrar uma fórmula para termo geral sn da
sucessão. Consideremos uma solução na forma de progressão geométrica

sn = rn , n ≥ 0. (3.7)

Substituindo (3.7) na equação (3.6) vamos ter

rn = a1 rn−1 + a2 rn−2 + · · · + ap rn−p .

Daqui temos a equação característica

rp = a1 rp−1 + a2 rp−2 + . . . + ap . (3.8)


3. DEFINIÇÃO RECURSIVA E INDUÇÃO MATEMÁTICA 45

Se r é uma das raízes da equação a progressão geométrica vai ser uma das
soluções da equação (3.6).
Sejam xn e yn duas soluções da equação (3.6), isto é,

xn = a1 xn−1 + a2 xn−2 + · · · + ap xn−p ,

yn = a1 yn−1 + a2 yn−2 + · · · + ap yn−p .


A soma zn = xn + yn é uma solução também que pode ser verificado directa-
mente. Claro que
zn = C1 xn + C2 yn
é solução.
Se a equação (3.8) tem p raízes diferentes r1 , . . . , rp a combinação

sn = c1 r1n + . . . + cp rpn , n = 1, 2, . . .

é uma solução da equação (3.6). As constantes c1 , c2 , . . . , cp podem ser de-


terminadas a partir da condição que os primeiros termos são dadas (condições
iniciais).
No caso p = 2 vamos ter

sn = asn−1 + bsn−2 .

Equação característica:
r2 = ar + b.
Solução da relação. Se r1 6= r2 teremos

sn = c1 r1n + c2 r2n .

Se r1 = r2 = r então
sn = c1 rn + c2 nrn .
Exemplo 3.11. Consideremos a relação recorrente sn = sn−1 + 2sn−2 onde
s1 = s2 = 3 . Temos sucessão sn :

3, 3, 9, 15, 33, 63, . . .

A equação característica r2 = r + 2 tem raízes r1 = 2 e r2 = −1 . Portanto


sn = c1 · 2n + c2 (−1)n . Ponhamos aqui n = 1 e n = 2 e vamos ter

3 = c1 21 + c2 (−1)1 3 = c1 22 + c2 (−1)2

donde c1 = 1, c2 = −1 e
sn = 2n − (−1)n .

3 Definição recursiva e indução matemática


3.1 Demonstração de proposições
É natural que o vínculo acima mencionado entre indução matemática e relações
recursivas permite usar indução para demonstrar asserções diferentes sobre a
sucessão definida. Tanto indução matemática como uma definição recursiva
têm uma base e uma parte indutiva (recursiva).
46 CAPÍTULO 3. INDUÇÃO

Exemplo 3.12. A sucessão sn é definida recursivamente s0 = 1 , sk = 2sk−1


se k > 0 . Demonstrar que sn = 2n , ∀n ∈ N ∪ {0} .
Demonstração é fácil dar por meio da indução matemática. Base s1 = 20 é
válida. Passo indutivo: demonstrar a implicação
(sk = 2k ) → (sk+1 = 2k+1 )
Seja que sk = 2k . Então sk+1 = 2sk = 2 · 2k = 2k+1 .
Este exemplo mostra que demonstração de proposições em relação às funções
definidas recursivamente é natural realizar utilizando indução matemática.
Seja uma definição recursiva tem a estrutura seguinte. Dado o elemento x0
e a relação xn = ϕ(xn−1 ), n ≥ 1 . Qualquer proposição P (n) relativamente a
esta sucessão xn pode ser demonstrada usando a indução matemática de modo
seguinte
1. Verificar P (0)
2. Provar a implicação P (k) → P (k + 1)

3.2 Indução com base de vários elementos


Para definições recursivas que tem no lado direito da relação vários argumentos,
i.e.
xn = ϕn (xn−1 , xn−2 , . . . , xn−l )
é preciso usar outro principio de indução matemática. Por exemplo, no caso
l = 2 deve ser usado o teorema seguinte
Teorema 3.5. Seja m ∈ N . Suponhamos que
(B) P (m), P (m + 1) são verdadeiras
(I) As proposições P (k), P (k + 1) implicam P (k + 2) qualquer que seja
k ≥ m.
Então P (n) é verdade para todos os n ∈ {m, m + 1, m + 2, . . .} .
Exemplo 3.13. Consideremos a sucessão dada recursivamente
b0 = b1 = 1, bn = 2bn−1 + bn−2 , se n ≥ 2
e a proposição
P (n) = {bn < 6bn−2 }, n ≥ 2.
É preciso demonstrar que P (n) é verdadeira para n ≥ 4 . Para isso vamos usar
o teorema 3.5.
Base. Temos b2 = 3, b3 = 7, b4 = 17, b5 = 41 . Como m = 4 é preciso
verificar directamente n = 4 e n = 5 :
b4 < 6b2 , i.e. 17 < 6 · 3, e b5 < 6b3 , i.e. 41 < 6 · 7.
Indução. Sejam que bk < 6bk−2 e bk+1 < 6bk−1 . Temos que demonstrar:
bk+2 < 6bk . Então:
bk+2 = 2bk+1 + bk definição
< 12bk−1 + 6bk−2 suposição
= 6(2bk−1 + bk−2 )
= 6bk definição
Em virtude do teorema 3.5 bn < 6bn−2 para todos n ≥ 4 .
4. EXERCÍCIOS 47

Exemplo 3.14. Seja Σ = {a, b} . Calculemos o número sn de todas as palavras


de Σ∗ de comprimento n não contendo duas letras a consecutivas.
Resolução. Seja An o conjunto descrito das palavras. Claro que

A1 = {a, b}, A2 = {ab, ba, bb}, A3 = {aba, abb, bab, bba, bbb}.

Então, s1 = 2, s2 = 3, s3 = 5 . É cómodo admitir que A0 = {λ} onde λ é


palavra vazia. Logo s0 = 1 .
Seja n ≥ 2 . O conjunto An dividamos em duas partes. O primeiro sub-
conjunto A′n consiste das palavras com primeira letra a e no segundo A′′n a
primeira letra de cada palavra é b . Claro que cada palavra do A′n começa das
letras ab e resto tem n − 2 letras. Mas o resto é palavra arbitraria do conjunto
An−2 . Por isso, |A′n | = sn−2 . Agora o resto de cada palavra do A′′n contem
n − 1 letras e logo |A′′n | = sn−1 .
Então temos a relação
sn = sn−2 + sn−1
que é a segunda parte da definição da sucessão de Fibonacci Fn mas aqui os
primeiros dois termos são 2 e 3 .
Usando o teorema 3.5 pode-se provar que sn = Fn+2 .
Uma generalização do teorema 3.5 tem a forma:
Teorema 3.6. Suponhamos que
(B) P (m), P (m + 1), . . . , P (m + l − 1) são verdadeiros;
(I) As proposições P (k), . . . , P (k + l − 1) implicam P (k + l) qualquer que
seja k ≥ m .
Então P (n) é verdade para todos os números n ∈ {m, m + 1, . . .} .

4 Exercícios
4.1 Indução matemática
1. Demonstrar as identidades
n(n + 1)(2n + 1)
(a) 12 + 22 + . . . + n2 = , n∈N
6
n+1
a −1
(b) 1 + a + a2 + . . . + an = (a 6= 1)
a−1
2. Demonstrar que para todos os números n naturais
(a) n5 − n é divisível por 10
(b) 11n − 4n é divisível por 7
   
1 1 n 1 n
3. Dada a matriz A = . Demonstrar que A = .
0 1 0 1
4. Seja M um conjunto finito contendo n elementos. P(M ) designa o
conjunto de todos os subconjuntos de M . Determinar o número dos
membros de P(M )
48 CAPÍTULO 3. INDUÇÃO

5. Demonstrar para ∀n ∈ N
(a) 5n − 4n − 1 é divisível por 16
(b) 5n+1 + 2 · 3n + 1 é divisível por 8
(c) n! ≥ 2n−1
(d) 8n+2 + 92n+1 é divisível por 73
(e) 13 + 23 + . . . + n3 = (1 + 2 + . . . + n)2
Xn
1 √
(f) √ ≥ n
i=1
i
Xn
1 √
(g) √ ≤2 n−1
i=1
i
(h) an − 1 ≥ n(a − 1) (a > 0)
6. Demonstrar
(a)
m−1 m−1 m−1 m−1
Cnm = Cn−1 + Cn−2 + Cn−3 + · · · + Cm−1 , n ≥ m ≥ 0.
(b)
Cn1 + 2Cn2 + 3Cn3 + · · · + nCnn = n2n−1 .
7. Demonstre os teoremas 3.2, 3.3, 3.4, 3.5, 3.6.
8. Seja P (n) um predicado definido sobre o N . Suponhamos que P (n)
satisfaz às condições:
(a) P (1) é verdadeiro,
(b) P (k) → P (k + 2), k ≥ 1
Demonstre que P (n) é verdadeiro qualquer que seja n ímpar.
9. Prove by induction that a 2n by 2n chessboard minus any single square
can always be covered by L -shaped pieces (with 3 squares in each piece).
(Suggestion: divide the 2n+1 by 2n+1 chessboard into four smaller chess-
boards).
10. Demonstrar que ∀n ∈ N
√ a1 + . . . + an
n
a1 · . . . · an ≤
n
ai ≥ 0, i = 1, . . . , n .
Solução. Consideremos o caso particular quando o médio aritmético
a1 + . . . + an
= 1. (3.9)
n

É preciso demonstrar que

a1 · . . . · an ≤ 1. (3.10)
4. EXERCÍCIOS 49

Se a1 = a2 = · · · = an = 1 , a desigualdade (3.10) é verdadeira. No caso


contrário existem números maiores e menores do que 1 . Seja a1 > 1 e
an < 1 . Se substituirmos este par por números a′1 e a′n de modo que
a′1 + a′n = a1 + an e a′n = 1 então vamos ter a mesma soma e o mesmo
médio aritmético 1 dos números a′1 , a2 , . . . , an−1 , a′n . Ao mesmo tempo

a1 · . . . · an < a′1 · . . . · a′n = a′1 · . . . · an−1 (3.11)

por causa da desigualdade a1 an < a′1 a′n . De fato, se

a′1 = a1 − x, 1 = a′n = an + x, 0 < x < a1 − an ,

então

a′1 a′n = (a1 −x)(an +x) = a1 an +x((a1 −an )−x) = a1 an +x(a1 −1) > a1 an .

Agora notemos que


a′1 + · · · + an−1
= 1.
n−1
Usando o passo indutivo podemos supor que

a′1 · . . . · an−1 ≤ 1.

Daqui e da relação (3.11) deduzimos verdadeira da desigualdade (3.10).


A base da indução é fácil verificar.
a1 + · · · + an
O caso geral, quando o médio aritmético m = é um número
n
qualquer, reduz-se ao caso considerado por meio da substituição

ai = mxi , i = 1, 2, . . . , n.

4.2 Definições recursivas


1. Sucessão (xn ) é determinada recursivamente
p
x1 = 1, xn = 2 + xn−1 para n > 1.

Demonstrar que ∀(n ∈ N ) xn < 2 .



2. Demonstrar que xn > 5 e que xn é decrescente onde a sucessão xn
dada recursivamente
 
1 5
x0 = 3, xn = xn−1 + para n > 0.
2 xn−1

3. Dados a, b, S0 = a, Sn = 2Sn−1 + b . Encontrar uma fórmula para Sn


e demonstrá-lá.
4. Achar uma fórmula explícita para sn onde s0 = 3 e sn = −2sn−1 para
n≥1
5. Demonstrar que se sn = asn−1 para n ≥ 1 e a 6= 0 então sn = an · s0
para n ∈ N .
50 CAPÍTULO 3. INDUÇÃO

6. Demonstre que a sucessão xn = 1 + 1/xn−1 para n ≥ 2 e x1 = 1 satisfaz


a relação xn = Fn+1 /Fn onde Fn é n -ésimo número de Fibonacci.
7. Demonstrar que F1 + F2 + . . . + Fn = Fn+2 − 1 , n ∈ N onde Fn é a
sucessão de Fibonacci.
8. A sucessão das matrizes M1 , M2 , . . . é definida por
   
1 1 1 1
M1 = , Mn = Mn−1 para n ≥ 2.
0 1 0 1

Demonstrar que  
1 n
Mn = , n∈N
0 1

9. Demonstre que para qualquer n natural


 n  
1 1 Fn+1 Fn
=
1 0 Fn Fn−1

onde Fn é n -esimo número de Fibonacci


10. (a) Dar uma definição recursiva para a sucessão (2, 4, 16, 256, . . .) . A
sucessão pode ser representada (2, 22 , (22 )2 , ((22 )2 )2 , . . .) .
(b) Dar uma definição recursiva da sucessão (2, 4, 16, 65536, . . .) . Esta
2 22
sucessão pode ser representada na forma (2, 22 , 22 , 22 , . . .) .
2n
11. Dar uma definição recursiva para a sucessão pn = , n = 0, 1, . . .
n!
12. Dar uma definição recursiva para a sucessão dos polinómios

x(x − 1) · . . . · (x − n)
Pn = Pn (x) = , n≥0
n!
onde x é um número real.
x−n
Resposta: P0 = x , Pn = Pn−1 , n≥1
n
13. Dar uma definição recursiva para a sucessão

an (2n)!
xn = , n = 0, 1, 2, . . .
b2n−1 n!

14. Construir uma definição recursiva para o produto


n
Y
sn = a1 a2 · · · · · an = ai .
i=1

Solução: consideremos a propriedade


n+1
Y n
Y
ai = an+1 ai
i=1 i=1
4. EXERCÍCIOS 51

donde temos a definição


s1 = a1 , sn+1 = an+1 sn , se n ≥ 1.
Pode-se extender o domínio admitindo s0 = 1 . É cómodo considerar que
Q0
o produto que não contem factores ai = 1 :
i=1

s0 = 1, sn+1 = an+1 sn , se n ≥ 0.

15. Dar definição recursiva para a soma


n
X
sn = a1 + a2 + · · · + an = ai .
i=1

sobre o domínio {0, 1, 2, . . .}


16. Sejam S um conjunto e (A1 , A2 , . . .) uma sucessão de subconjuntos do
conjunto S .
n
[
(a) De uma definição recursiva para união Aj .
j=1
(b) De que modo poderíamos definir a "união vazia"?
n
\
(c) Responder a mesma questão para a intersecção Aj .
j=1

17. Dada a definição recursiva P0 = a0 e Pn = Pn−1 x + an se n ≥ 1 .


Demonstrar que Pn = a0 xn + a1 xn−1 + . . . + an . Construir um algoritmo
para calcular Pn
18. Verificar que a sucessão dada por sn = 2n+1 + (−1)n satisfaz às condições
s0 = s1 = 3 e sn = sn−1 + 2sn−2
19. Dada a definição recursiva u0 = 1 , a0 = 1 , un = un−1 /n , an = an−1 +
un se n ≥ 1 . Demonstrar que
1 1 1
an = 1 ++ + ···+ .
1! 2! n!
Construir um algoritmo para calcular iterativamente an .
Indicação. Demonstre primeiro que un = 1/n! .
O algoritmo:
u := 1 ; a := 1 {u = u0 , a = a0 }
for k := 1 to n do
u := u/k ; a := a + u
end for
20. Construir uma definição recursiva para a sucessão
22 23 2n
sn = 1 + 2 + + + ··· +
2! 3! n!
Indicação: utilize a sucessão auxiliar un = 2n /n! .
Construir um algoritmo para calcular iterativamente sn .
52 CAPÍTULO 3. INDUÇÃO

21. Determinemos recursivamente a0 = a1 = 1 e an = an−1 + 2an−2 para


n ≥ 2.
(a) calcular a6 recursivamente
(b) demonstrar que todos os termos an são ímpares
22. Mostrar que se a sucessão sn satisfaz s1 = 2, s2 = 3 e sn = sn−2 +
sn−1 para n ≥ 3 então sn = Fn+2 onde Fn é sucessão de Fibonacci:
F1 = 1, F2 = 1 , Fn = Fn−2 + Fn−1 se n ≥ 3 .
23. Demonstrar que se Fn é sucessão de Fibonacci então Fn−1 Fn+1 = Fn2 ± 1
onde sinal + corresponde ao número n par e sinal − escolhemos caso
contrário.
24. Demonstrar que 2Fn > 5Fn−2 para n ≥ 6 onde Fn é n -ésimo número
de Fibonacci ( F1 = F2 = 1, Fn = Fn−1 + Fn−2 , n ≥ 3 )
25. Uma sucessão sn é definida recursivamente:

s0 = s1 = s2 = 1, sn = sn−1 + sn−2 + sn−3 , se n ≥ 3 .

Demonstre que sn < 2sn−1 para n ≥ 4


26. Demonstrar que

Fm+n = Fm−1 Fn + Fm Fn+1 , m ≥ 2, n ≥ 1

onde Fn é n -ésimo número de Fibonacci.


27. Consideremos todas as palavras formadas de letras a e b (por exemplo
aabab, abb ). Seja sn o número de todas as palavras de comprimento n e
não contendo a parte aab .
(a) calcular s0 , s1 , s2 , s3
(b) encontrar uma relação recursiva para sn
(c) calcular s8
Indicação. O conjunto das palavras que começam com b tem sn−1 ele-
mentos. Demonstre que sn = sn−1 + sn−2 + 1 , n ≥ 2 .

28. Achar uma fórmula explícita para sn onde s0 = 3, s1 = 6 e sn = sn−1 +


2sn−2 .
Resposta: sn = 3 · 2n .
29. Em cada um dos seguintes casos achar uma fórmula explícita para sn .
(a) s0 = 2, s1 = −1 e sn = −sn−1 + 6sn−2 para n ≥ 2
(b) s0 = 2 e sn = 5sn−1 para n ≥ 1
(c) s0 = 1, s1 = 8 e sn = 4sn−1 − 4sn−2 para n ≥ 2
(d) s0 = c, s1 = d e sn = 5sn−1 − 6sn−2 para n ≥ 2
(e) s0 = 1, s1 = 4 e sn = sn−2 para n ≥ 2
4. EXERCÍCIOS 53

(f) s0 = s1 = s2 = 1 , sn = sn−1 − sn−2 + sn−3 para n ≥ 3


30. Seja s0 = 1, s1 = 8 e sn = 4sn−1 − 4sn−2 para n ≥ 2 . Usando indução
demonstrar que
sn = (1 + 3n)2n , n ≥ 0.

31. Dada a definição recursiva s0 = 1, s1 = 0 , sn = 2(sn−1 − sn−2 ) para


n ≥ 2 . Usando indução demonstrar que
n+1 π
sn = 2 2 cos(n + 1) , n ≥ 0.
4

32. Achar o valor do determinante de ordem n :



2 1 0 . . . 0 0

1 2 1 . . . 0 0

0 1 2 . . . 0 0
∆n =
... ...
0 0 0 . . . 2 1

0 0 0 . . . 1 2

Indicação. Demonstrar que ∆n = 2∆n−1 − ∆n−2 se n ≥ 3 .


Capítulo 4

Algoritmos cíclicos

1 Introdução
1.1 Exemplos
Algoritmo cíclico é um dos métodos principais em construção de algoritmos.
Resultados de trabalho de um algoritmo cíclico pode-se representar em forma
de uma tabela onde cada linha apresenta resultado depois de um passo do
algoritmo.
Exemplo 4.1. Consideremos por exemplo o algoritmo
x := 2
while true do
x := x + 3
end while
A seguinte tabela representa os valores da variável x depois de n passos do
ciclo
n x
0 2
1 5
2 8
3 11
4 14
... ...
O algoritmo calcula n -ésimo elemento da sucessão

x0 = 2, xn = xn−1 + 3, se n ≥ 1.

Sobre a sucessão xn dos valores da variável x podemos dizer que xn = 2 +


3n . Esta última proposição pode ser demonstrada usando indução na base da
definição recursiva.
Exemplo 4.2. Consideremos o ciclo
r := 30 ; k := 0
while r ≥ 7 do
r := r − 7 ; k := k + 1
end while

54
1. INTRODUÇÃO 55

Cada passo do algoritmo cíclico faz uma alteração das variáveis r e k . A


tabela a seguir apresenta os passos do algoritmo.

n r k
0 30 0
1 23 1
2 16 2
3 9 3
4 2 4

1.2 Ciclo infinito. Estado


Um ciclo infinito tem o fluxograma apresentado na figura 4.1. A direita da figura
é o código usando uma linguagem formal. Letra f representa o operador do
ciclo. Realmente, é um operador-algoritmo que executa-se consequentemente.
O resultado do operador-algoritmo representa-se por meio de atribuição

S := f (S). (4.1)

A letra S usa-se para indicar o bloco (cortejo, estado) de todas as variáveis que
se alteram no algoritmo. O cortejo destas variáveis vamos chamar por estado
(situação actual, meio ambiente) designada pela letra S .
Exemplo 4.3. No ciclo infinito
r := 30; k := 0
while true do
r := r − 7;
k := k + 1
end while

S = (r, k)
e a função f tem a representação

f (S) = f ((r, k)) = (r − 7, k + 1).

O ciclo produz uma sucessão

S0 , S1 , . . . , Sn , . . . ,

onde S0 é estado inicial, Sn é estado depois de n passos do algoritmo.


No exemplo 4.3 temos a seguinte sucessão dos estados

(30, 0), (23, 1), (16, 2), (9, 3), (2, 4), . . .

A representação do operador f na forma (4.1) significa que uma função


f : S → S produz o estado novo S ′ = f (S) e a seguir a atribuição S := S ′
serve para substituir a memória: S toma o valor novo S ′ . Aqui S é o conjunto
de todos os estados possíveis (o domínio do operador f ).
No exemplo 4.3 S = Z × Z é o conjunto de todos os pares ordenados dos
números inteiros.
56 CAPÍTULO 4. ALGORITMOS CÍCLICOS

1.3 Ciclo com pre-condição


Ciclo com pre-condição tem o fluxograma que vemos sobre a figura 4.2. O ciclo
pode funcionar infinitamente ou terminar depois de um dos passos.
Na figura 4.2 são apresentadas duas proposições (mais precisamente: predi-
cados) I(S) e P (S) . As funções P e I com argumento S pode tomar apenas
os dois valores verdade e falso . O predicado P (S) chama-se pre-condição do
ciclo e serve para terminar o ciclo. O ciclo termina quando a pre-condição P (S)
for falso. Portanto logo ao terminar o ciclo podemos afirmar que a negação

¬P (S)

é verdadeira!

1.4 Invariante de ciclo


Definição 4.1. Uma proposição I(S) chama-se invariante do operador f se
é verdadeira a implicação
I(S) → I(S ′ ),
onde S ′ = f (S) .
Por exemplo, consideremos o operador no exemplo 4.3:

S ′ = (r′ , k ′ ) = (r − 7, k + 1), S = (r, k).

A igualdade r + 7k = 1 é um invariante. De fato,

r′ + 7k ′ = r − 7 + 7(k + 1) = r + 7k = 1.

Definição 4.2. Uma proposição I(S) chama-se invariante de ciclo


while true do
S := f (S)
end while
se a implicação
I(S) → I(S ′ ), (4.2)

onde S = f (S) é verdadeira, o seja, se I(S) é invariante do operador f .

while true do
S := f (S) S := f (S)
end while

Figura 4.1: Ciclo infinito


1. INTRODUÇÃO 57

S := S0

S := S0 { I(S0 ) }
P (S)
Não while P (S) do
S := f (S)
Sim end while
{ ¬P (S) ∧ I(S) }
S := f (S)

Figura 4.2: Ciclo com pre-condição

Um invariante é proposição que sendo verdadeira na entrada do ciclo será


verdadeira depois de cada um dos passos do algoritmo cíclico. Por meio da
indução matemática é fácil demonstrar o seguinte teorema:
Teorema 4.1. Seja S0 , S1 , . . . , Sn , . . . a sucessão dos estados no algoritmo
cíclico 4.1, e I(S) é invariante do operador f . Se I(S0 ) é verdadeiro então
I(Sn ) é também verdadeiro para todos n = 0, 1, 2, . . . .
Nota 1. O teorema 4.1 é valido também para o ciclo com pre-condição mas até
terminar. Observemos que invariante será verdadeiro ao terminar o ciclo.
Exemplo 4.4. Para a atribuição i := i + 2 podemos indicar invariantes

P1 (i) = {i é par} e P2 (i) = {i é ímpar}.

Consideremos o ciclo infinito


while true do
i := i + 2
end while
com estado S = i . Se na entrada a variável i toma o valor par, então depois
de cada passo do ciclo o i tem um valor par. O mesmo podemos afirmar sobre
valores ímpares.
Exemplo 4.5. Seja S = (m, n) . Demonstrar que I(S) = {m = 2n } é um
invariante do ciclo
while true do
n := n + 1
m := m ∗ 2
end while
58 CAPÍTULO 4. ALGORITMOS CÍCLICOS

Por convenção vamos usar a notação I(m, n) em vez de I(S) . Designemos


m′ = 2m, n′ = n + 1 . Segundo à definição 4.2 temos que demonstrar a impli-
cação ′
I(m, n) → I(m′ , n′ ) ou {m = 2n } → {m′ = 2n }.
Temos ′
m′ = 2m = 2 · 2n = 2n+1 = 2n .
Compare esta demonstracao com a demonstracao deductiva puramente

{m = 2n } → {2m = 2 · 2n = 2n+1 } → {m′ = 2n }.

1.5 Invariante de ciclo com pre-condição


No caso de ciclo com pre-condição temos a possibilidade de utilizar a informa-
ção sobre estado obtida na pre-condição. Isto altera um pouco o conceito do
invariante (4.2). De facto, dentro do ciclo é possível usar a pre-condição P (S)
que é verdadeira.
Definição 4.3. A proposição I(S) chama-se invariante de ciclo com pre-
condição
S := S0
while P (S) do
S := f (S)
end while
se
I(S) ∧ P (S) → I(S ′ ) (4.3)
onde S ′ = f (S) .
O seguinte teorema justifica a definicao 4.3
Teorema 4.2. Seja I(S) um invariante do ciclo (fig. 4.2) i.e. I(S) satisfaz
à condição (4.3). Se para o estado inicial S0 a proposição I(S0 ) é verdadeira
então ao terminar o ciclo é verdadeira a asserção

I(S) ∧ ¬P (S). (4.4)

Exemplo 4.6. Consideremos o ciclo


while m 6= n do
if m > n then
m := m − n
else
n := n − m
end if
end while
É natural introduzir o estado S = (m, n) . A proposição

I(S) = I(m, n) = {m > 0 ∧ n > 0}

é invariante do algoritmo. No caso m > n temos alteração apenas da variável m


e o valor novo de m será positivo. Caso contrário m ≤ n mas (pre-condição!)
m 6= n e portanto m < n e valor novo da variável n será positivo.
2. EXEMPLOS DE ALGORITMOS 59

Se inicialmente as variáveis m e n têm valores positivos ao terminar o ciclo


vamos ter

I(S) ∧ ¬P (S) = {m > 0 ∧ n > 0} ∧ {m = n} = {m = n > 0}.

1.6 Demonstração que o ciclo termina


Infelizmente existe mais uma possibilidade: ciclo com pre-condição pode tra-
balhar infinitamente. Para demonstrar que o ciclo termina é cómodo usar a
seguinte asserção:

Não existe nenhuma sucessão decrescente infinita de números naturais.


Exemplos de aplicação podemos ver em baixo.

2 Exemplos de algoritmos
2.1 Algoritmo de divisão inteira
Exemplo 4.7. Demonstremos que no algoritmo
r := a ; k := 0
while r ≥ b do
r := r − b
k := k + 1
end while
a proposição
I(S) = I(r, k) = {a = kb + r}
é invariante. De facto designemos os valores novos de r e k por r′ e k ′
respectivamente, i.e.

(r′ , k ′ ) = f ((r, k)) = (r − b, k + 1),

onde f designa o operador contendo as atribuições r := r − b; k := k + 1 .


Então r′ = r − b , k ′ = k + 1 . Temos que demonstrar a implicação

{a = kb + r} → {a = k ′ b + r′ }.

Demonstração:

k ′ b + r′ = (k + 1)b + r − b = kb + r = a.

No exemplo 4.7 vemos um algoritmo. Como poderemos ver que este algo-
ritmo serve para encontrar quociente incompleto k e resto de divisão r do
número inteiro não negativo a por número natural b . Notemos que antes de
demonstrar é preciso dar definição correspondente.
Definição 4.4. Se o número a é representado em forma a = kb + r onde
0 ≤ r < b , números inteiros k e r chamam-se quociente e resto de divisão a
por b respectivamente.
60 CAPÍTULO 4. ALGORITMOS CÍCLICOS

O exemplo 4.7 diz que a igualdade a = kr + b é invariante do ciclo. O


teorema 4.2 (equação (4.3)) permite afirmar que por fim do ciclo as variáveis k
e r obedecem as condições:

a = kr + b e r < b.

Mas nós não temos desigualdade r ≥ 0 . Em tais casos é possível conseguir


o resultado por meio de uma extensão do invariante. Consideremos o segundo
invariante: r ≥ 0 . De facto seja r′ = r −b valor novo da variável r . Porquanto
r ≥ b para r′ temos r′ = r − b ≥ 0 . Notemos que aqui usamos a definição
(4.3) do invariante para ciclo com pre-condição. O nosso invariante extendido é

I(r, k) = {a = kr + b ∧ r ≥ 0}.

Agora por fim do ciclo temos

I ∧ ¬P = {a = kr + b ∧ r ≥ 0} ∧ {r < b}.

Inicialmente no algoritmo no exemplo 4.7 r = a e k = 0 e a proposição I(r, k)


é válida. Então nós podemos dizer que o algoritmo ao terminar dá o resultado
certo.
No algoritmo de divisão consideremos a variável r . O primeiro valor de r
é igual a a ≥ 0 . A variável r toma consequentemente as valores a, a − b, a −
2b, . . . onde b > 0 . A última sucessão não é infinita e portanto o ciclo termina.

2.2 Algoritmo de Euclid


Algoritmo de Euclid serve para encontrar o máximo divisor comum MDC(a, b)
dos dois números inteiros positivos a e b . Por exemplo MDC(21, 35) = 7 . A
ideia principal é reduzir os elementos do par (a, b) e obter um par (a1 , b1 ) com
o mesmo máximo divisor comum:

MDC(a1 , b1 ) = MDC(a, b).

Manutenção desta igualdade é manutenção de um invariante. O algoritmo uti-


liza o teorema
Teorema 4.3. Se b 6= 0 então

MDC(a, b) = MDC(b, r)

onde r = a mod b é o resto de divisão a por b .


No algoritmo 4.1 a e b são grandezas dadas e m e n são variáveis que
obedecem ao invariante

MDC(a, b) = MDC(m, n).

O resultado do algoritmo MDC(a, b) = d .


Demonstremos que o ciclo termina. Notemos que r < n e a desigualdade
m > n é um invariante do ciclo. A sucessão dos valores n é decrescente e
portanto não é sucessão infinita.
2. EXEMPLOS DE ALGORITMOS 61

m := a ; n := b
while n 6= 0 do
r := m mod n
(m, n) := (n, r)
end while
{ n = 0 ∧ m = MDC(a, b) }
d := m
Algoritmo 4.1: Euclid

2.3 Equação em números inteiros


O algoritmo de Euclid pode-se aplicar para resolver a equação em números
inteiros. Consideremos a equação

ax + by = c (4.5)

onde a, b, c são constantes inteiras, a, b > 0 . É preciso encontrar todas as


soluções inteiras da equação.
Por exemplo, dada equação 8x+3y = 1 . Substituindo 8 = k ·3+r = 2·3+2
vamos ter à equação (2 · 3 + 2)x + 3y = 1 ou 3x1 + 2x = 1 onde x1 = 2x + y .
Esta última equação tem uma das soluções x1 = 1, x = −1 . Então

x = −1, y = x1 − 2x = 1 − 2(−1) = 3.

Consideremos agora esta redução em forma geral. Seja

k = ⌊a/b⌋ e r = a mod b,

i.e. a = kb + r, 0 ≤ r < b . Substituindo na (4.5) vamos ter

(kb + r)x + by = b(kx + y) + rx = c.

Sejam a1 = b , b1 = r , x1 = kx + y ou y = x1 − kx , y1 = x . Então (4.5)


reduz-se à equação
a1 x1 + b1 y1 = c (4.6)
com a1 = b, b1 = r = a mod b .
Esta redução pode ser realizada várias vezes. O resultado é um algoritmo
cíclico. Representemos a substituição em forma matricial
    
x 0 1 x1
=
y 1 −k y1
 
x1
ou X = A1 X1 onde X1 = e x1 , y1 é uma das soluções da equação (4.6).
y1
Depois de segunda substituição vamos ter
 
x2
X = A1 X1 = A1 A2 X2 , X2 = ,
y2

a2 x2 + b2 y2 = c (4.7)
com a2 = b1 , b2 = r = a1 mod b1 .
62 CAPÍTULO 4. ALGORITMOS CÍCLICOS

Em caso geral, depois de n passos

X = A1 A2 · · · An Xn .

É importante: depois de qualquer passo temos a proposição:


 
xn
Se Xn = é uma das soluções da equação
yn

an xn + bn yn = c
 
x
então X = é uma das soluções da equação inicial (4.5).
y

A sucessão dos pares (ak , bk ) é a mesma sucessão que tínhamos no algoritmo


de Euclid. Por isso depois de um número finito k de passos o algoritmo termina
com ak = d = MDC(a, b) e bk = 0 . Suponhamos que c é divisível por d e
vamos ter
d · xk + 0 · yk = c
donde xk = c/d e yk é número qualquer. A solução X pode ser encontrada
da fórmula X = Pk Xk onde Pk = A1 A2 . . . Ak .
 
1 0
m := a ; n := b ; P :=
0 1
while n 6= 0 do
k := m div n ; r := m − k ∗ n
(m, n) := 
(n, r) 
0 1
P := P ∗
1 −k
end while
{ n = 0, m = MDC(a, b) ∧ X = P X̃ }

Algoritmo 4.2: Euclid (extensão)

No algoritmo 4.2 vamos ter o invariante: Se X̃ é uma das soluções da


equação me y = c então
x + ne
 

X = P X̃ = P

é uma das soluções da equação (4.5).


Por exemplo, consideremos 23x + 13y = 1 . A tabela mostra o resultado do
3. FORMAÇÃO DE UM ALGORITMO CÍCLICO 63

algoritmo

k m n P
 
1 0
início 23 13
0 1
 
0 1
1 13 10
1 −1
 
1 −1
1 10 3
−1 2
 
−1 4
3 3 1
2 −7
 
4 −13
3 1 0
−7 23
Ao terminar o algoritmo temos
     
x 4 −13 x̃
= ·
y −7 23 ỹ

onde x̃ = 1, ỹ = t (qualquer número inteiro). Daqui temos a solução geral

x = 4 − 13t, y = −7 + 23t.

3 Formação de um algoritmo cíclico


3.1 Colocação problema
É preciso construir um algoritmo para encontrar um cortejo S = (x, y, . . .) que
satisfaça a uma condição dada. Suponhamos que esta condição pode ser repre-
sentada em forma I(S) ∧ F (S) onde I(S) e F (S) são asserções (predicados).
A proposição I(S) vai servir como invariante, F (S) dá a condição final e será
verdadeira por fim do ciclo.

Etapas da resolução do problema


Para obter um algoritmo para encontrar S é preciso:
1. Formular as condições I(S) e F (S) a partir da colocação do problema,
isto é, representar a condição dada em forma I(S) ∧ F (S) .
2. Encontrar um estado inicial S0 tal que I(S0 ) é verdadeiro.
3. Encontrar operação f tal que não altera o invariante I(S) e verificar o
invariante usando o Teorema 4.2.
4. Demonstrar que o ciclo termina, i.e. que a sucessão S0 , S1 , . . . , Sn é finita.
64 CAPÍTULO 4. ALGORITMOS CÍCLICOS

4 Exercícios
4.1 Algoritmos cíclicos
1. Obter a lista de cinco primeiros valores de x em cada um dos algoritmos
(a) x := 0
while 0 ≤ x do
x := 2x + 3
end while
(b) x := 1
while 0 ≤ x do
x := 2x + 3
end while
(c) x := 0
while x ≥ 0 do
x := 2x − 1
end while
2. A lista dos estados durante cumprimento do algoritmo
m := 0; n := 0
while n 6= 4 do
m := m + 2n + 1
n := n + 1
end while
apresentar em forma da tabela
3. Mostrar que as proposições I1 (m, n) = {m + n é par} e I2 (m, n) = {m +
n é ímpar} são invariantes do ciclo
while 1 ≤ m do
m := m + 1
n := n + 1
end while
4. Mostrar que as proposições n2 ≥ m3 e 2m6 < n4 são invariantes do
ciclo
while 1 ≤ m do
m := 2m
n := 3n
end while
Resolução para a proposição P (m, n) = {2m6 < n4 } :
Designemos m′ = 2m e n′ = 3n . Temos
6 4
P (m′ , n′ ) = {2m′ < n′ } = {2 · 26 m6 < 34 n4 }.

Como 26 < 34 a última asserção decorre de P (m, n) i.e.

P (m, n) ≡ 2m6 < n4 ⇒ 2 · 26 m6 < 34 n4 ≡ P (m′ , n′ )

5. Consideremos o ciclo
4. EXERCÍCIOS 65

while j ≥ n do
i := i + 2; j := j + 1
end while
Quais das seguintes asserções
(a) i < j 2 se n = 1
(b) i < j 2 se n = 0
(c) i ≤ j 2 se n = 1
(d) i ≤ j 2 se n = 0
são invariantes ?
6. Demonstre que a proposição {2k 3l x = a} ( a é um número real dado) é
um invariante do algoritmo cíclico
k := 0; l := 0; x := a;
while (x mod 2 = 0) ∨ (x mod 3 = 0) do
if x mod 2 = 0 then
k := k + 1
x := x div 2
else
l := l + 1
x := x div 3
end if
end while
Demonstre que o ciclo termina e descreve o resultado.
7. Dado o algoritmo
p := 1; x := a; i := n
while i > 0 do
if odd(i) then
p := p ∗ x
end if
x := x ∗ x
i := i div 2
end while
Demonstre que
(a) A proposição {pxi = an } é um invariante do algoritmo cíclico ( n é
um número natural, a é um número real)
(b) Ao terminar o ciclo p = an
(c) O ciclo termina
8. Demonstrar que a proposição {kxm = an } é um invariante do algoritmo
cíclico ( n é um número natural)
k := 1; x := a; m := n
while m > 0 do
if odd(m) then
k := k ∗ x
66 CAPÍTULO 4. ALGORITMOS CÍCLICOS

m := m − 1
else
x := x ∗ x
m := m div 2
end if
end while
Demonstrar que o ciclo termina e logo ao terminar k = an .
9. Demonstrar que a proposição {kx + y = a} é invariante no algoritmo
cíclico ( a é um número natural)
k := 1; x := a; y := 0
while x > 1 do
if odd(x) then
y := y + k
end if
k := 2 ∗ k
x := x div 2
end while
Demonstrar que o ciclo termina e logo ao terminar x = 1 .

4.2 Formação de algoritmo


Em todos os problemas construir um algoritmo realizando as primeiras 5 etapas
indicadas em cima.

1. Calcular n!
2. Sucessão de Fibonacci: F1 = F2 = 1, Fk = Fk−1 + Fk−2 se k ≥ 3 .
(a) Calcular Fn .
(b) Dado M > 0 achar o primeiro número n tal que Fn > M .
3. Encontrar soma dos dígitos de um número natural.

4. Representar número arbitrário natural N em forma N = 2k x onde x é


um número ímpar.
5. Representar número arbitrário natural N em forma N = 2k 3l x onde
MDC(x, 6) = 1 .
6. Dado número A encontrar o primeiro número natural n para o qual soma
1 + 1/2 + 1/3 + . . . + 1/n > A .

7. Encontrar o mínimo divisor primo de um número natural.


8. Dados números a1 , . . . , an
(a) Achar a soma a1 + . . . + an
(b) Achar o número máximo max{a1 , . . . , an } e o seu índice
(c) Achar o índice do primeiro número negativo (supondo que tal número
existe)
4. EXERCÍCIOS 67

9. Dados números naturais d, p , d < p , p > 1 . A sucessão a0 , a1 , . . . é


definida por meio da relação recursiva a0 = 1, ak+1 = ak · d mod p .
Encontrar o primeiro índice k para o qual ak = 1 .
10. Sucessão de Fibonacci de restos da divisão por número natural p > 1
dado. Sucessão fk , k = 1, 2, . . . é definida por meio da relação recursiva
f1 = f2 = 1 , fk = (fk−2 + fk−1 ) mod p . Demonstrar que a sucessão tem
o ciclo (período), isto é, existe o número natural T tal que ∀k fk+T = fk .
Encontrar o T .
Capítulo 5

Introdução à teoria de grafos


e árvores

1 Grafos
1.1 Grafo orientado (com direcções, digrafo)
O conceito de grafo surge de maneira natural de diferentes problemas de infor-
mática. Organização de dados em estruturas tem sua reflexão em usar o conceito
de grafo. Claro que é cómodo representar as estruturas geometricamente. Gra-
fos também têm representação geométrica. Os elementos principais de grafo são
objectos-vértices e arcos que representam uma relação entre objectos.
Notemos que o conceito de grafo é um conceito mais geral do que o conceito
de relação. Como se sabe cada relação sobre um conjunto finito pode ser repre-
sentada em forma de um diagrama onde cada vértice representa um elemento do
conjunto e cada par (x, y) ordenado da relação pode ser representado por meio
de um arco orientado. Em geral é possível considerar vários arcos (ou múltiplos
arcos) que ligam dois vértices. Desta maneira temos o conceito geral de grafo
orientado.
Definição 5.1. Grafo orientado G é o terno ordenado G = (V, E, γ) onde
• V é um conjunto de vértices, V = V (G)
• E é um conjunto de arcos, E = E(G)
• γ : E → V × V ( γ é uma função com domínio E . Valores da função γ
pertencem ao produto directo V × V )
Exemplo 5.1. Sejam V = E = {0, 1, 2, . . . , n − 1} e a função γ definida pela
fórmula
γ(k) = (k, (k + p) mod n), k ∈ E
onde p ∈ {1, . . . , n − 1} . Se p = 1 , o grafo pode ser desenhado como um
polígono regular com n vértices. Os vértices do polígono são os vértices do
grafo e os lados do polígono representam os arcos do grafo.
Desenhe o grafo para n = 4 nos casos p = 2 , p = 3 .

68
1. GRAFOS 69

Definição 5.2 (Incidência, arcos paralelos, laço).


• Se γ(e) = (p, q) diz-se e vai de p a q , p é o vértice inicial, q é a
extremidade do arco e ou o vértice terminal. Diz-se também que cada
um dos vértices p e q é incidente ao arco e .
• Se γ(e) = γ(f ) = (p, q) arcos e e f chamam-se arcos múltiplos ou
paralelos. Caso γ(e) = (p, q) e p = q o vértice chama-se laço.

1.2 Vínculo entre grafo orientado e uma relação


Consideremos um grafo sem arcos paralelos. A função γ determina correspon-
dência biunívoca ( γ é bijectiva) entre E e o subconjunto R ⊂ V × V que
forma uma relação sobre o conjunto V

R = γ(E).

Inversamente, a cada relação R ⊂ V × V podemos considerar o grafo (V, R, γ)


onde a função γ dada por γ((v1 , v2 )) = (v1 , v2 ) se (v1 , v2 ) ∈ R .

1.3 Grafo não orientado (grafo sem direcções)


Definição 5.3. Grafo G é terno G = (V, E, γ) onde
• V é o conjunto de vértices, V = V (G)
• E é o conjunto de arcos (arestas), E = E(G)
• γ : E → {{u, v} : u, v ∈ V } (Valores da função γ são subconjuntos de V
e estes subconjuntos são pares não ordenados)
Nota 1. Se u = v , o conjunto {u, v} consiste de um só elemento, isto é,
{u, u} = {u} .
O termo grafo vamos usar no sentido de grafo não orientado, enquanto que
para grafos orientados usaremos termo digrafo.

1.4 Grau de vértice. Relação de adjacência


Definição 5.4. Seja G um digrafo (grafo orientado). Dois vértices u e v do
digrafo G são adjacentes se existe um arco e ∈ E(G) que liga u e v ( u é
vértice inicial), isto é, (u, v) = γ(e) . Então, a relação de adjacencia A defina-se
por meio da fórmula
A = γ(E(G)) ⊂ V × V.
Relação de adjacência para grafo não orientado determina-se analogamente.
Nota 2. Grafos diferentes G1 e G2 que têm o mesmo conjunto V de vértices
podem ter as mesmas relações de adjacência no caso de existência de arcos
paralelos.
Definição 5.5 (graus de vértices, digrafo). Para um vértice v ∈ V (G) consi-
deremos o número dos arcos com extremidade no vértice v , i.e., o número de
elementos do conjunto

{e ∈ E(G) : γ(e) = (u, v)}.


70 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

Este número designemos por indeg(v) . Analogamente o número de arcos que


partem de v designemos por outdeg(v) . Para o vértice v3 na figura 1.2
indeg(v3 ) = 1, outdeg(v3 ) = 2 .
Se omitir as direcções obteremos o conceito de grau de vértice de grafo não
orientado.
Definição 5.6 (Grau de vértice). deg(v) é o número de todos os arcos {v, w}
onde w 6= v mais duas vezes o número de laços {v, v} .
Definição 5.7 (Sucessão de graus). D0 (G) é o número de vértices isolados (de
grau 0 ), Dk (G) é o número de vértices de grau k . A sucessão de graus é a
sucessão
D0 , D1 , D2 , . . .
Teorema 5.1. As seguintes relações são validas:
1. Soma de todos graus de vértices de um grafo G é igual duas vezes o
número de arcos: X
deg(v) = 2|E(G)|
v∈V (G)

2. A mesma soma pode ser representada em forma


D1 (G) + 2D2 (G) + 3D3 (G) + . . . = 2|E(G)| (5.1)

Demonstração. Cada um dos arcos tem duas extremidades, e a cada extremi-


dade corresponde uma unidade de grau do vértice. Formalmente a demonstração
pode ser realizada por meio da indução em relação ao numero dos arcos de grafo.
Se aumentarmos um arco, logo aparecem duas unidades dos vértices incidentes
ao arco.
A segunda fórmula (5.1) vamos ter se agrupar o conjunto de todos os vértices
em blocos onde em cada um dos blocos os vértices têm o mesmo grau.
Nota 1. Para grafos orientados é válida a relação seguinte entre graus indeg e
outdeg X X
indeg(v) = outdeg(v). (5.2)
v∈V (G) v∈V (G)

Esta proposição pode ser facilmente demonstrada usando indução matemá-


tica em relação ao número dos arcos.
Definição 5.8 (grafos regular e completo). Um grafo é regular se todos os
vértices têm o mesmo grau.
Grafo completo de n vértices (designação Kn ) é um grafo sem laços e arcos
paralelos em que cada vértice é adjacente a todos vértices do grafo.
O grafo Kn pode ser desenhado como polígono regular de n vértices com
todas as diagonais.
Definição 5.9. Subgrafo: H é subgrafo de G se
• V (H) ⊂ V (G)
• E(H) ⊂ E(G)
• a função γ1 para G concorde com γ2 para H sobre E(H) , i.e., γ2 (e) = γ1 (e)
para e ∈ E(H)
1. GRAFOS 71

1.5 Caminhos, ciclos


Definição 5.10 (Caminho de comprimento n ). Dado um digrafo G . Um
caminho do vértice u para o vértice v de comprimento n define-se por meio
das duas sucessões: a sucessão dos arcos e1 , e2 , . . . , en e a sucessão dos vértices
x1 , x2 , . . . , xn+1 . O primeiro e o último vértices são x1 = u , xn+1 = v e
γ(ei ) = (xi , xi+1 ) , i = 1, 2, . . . n .
No caso x1 = xn+1 o caminho chama-se caminho fechado.
Para um grafo não orientado caminho de comprimento n defina-se de mesma
maneira mas neste caso γ(ei ) = {xi , xi+1 } , i = 1, 2, . . . , n .
A definição a seguir é para grafo não orientado.
Definição 5.11 (Caminho simples, ciclo). Um caminho é simples se todos os
arcos do caminho são diferentes. Ciclo é caminho fechado, simples e os vértices
x1 , x2 , . . . , xn são diferentes (mas x1 = xn+1 ).
Definição 5.12 (Grafo acíclico, caminho acíclico). Grafo acíclico é um grafo
que não contém ciclos. Um caminho é acíclico se o subgrafo que consiste de
todos arcos e vértices do caminho é acíclico.
Definição 5.13 (grafo conexo). Grafo G chama-se grafo conexo se existe pelo
menos um caminho entre cada um par de vértices do G .
Em geral vamos considerar componentes de grafo. Um subgrafo G′ chama-
se componente se não existe outro subgrafo conexo contendo G′ e diferente de
G′ .

1.6 Matriz de adjacência


Consideremos o seguinte problema: calcular o número cij de todos os caminhos
de comprimento 2 com vértice inicial vi e vértice terminal vj . Primeiro no-
n
P
temos que cij = tk onde tk é número de caminhos com vértices vi , vk , vj
k=1
(vértice intermédio é vk ). Segundo o princípio do produto tk = aik akj . Então
n
X
cij = aik akj .
k=1

A última relação mostra que cij é o elemento da matriz C = A2 .


Por exemplo a matriz
 2  
1 2 1 1 2 7 1 2
0 2 0 0 0 4 0 0
C=A =
2
1
 = 
0 0 1 1 3 1 1
0 1 0 0 0 2 0 0

fornece informação completa sobre os caminhos de comprimento 2 . Por exem-


plo, existem 3 caminhos de comprimento 2 com vértice inicial v3 e vértice
terminal v2 .
Da mesma maneira é possível demonstrar que a matriz An contém infor-
mação sobre os caminhos do comprimento n . O elemento ci,j é o número dos
caminhos de comprimento n com vértice inicial vi e vértice terminal vj .
72 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

1.7 Isomorfismo de grafos


Definição 5.14 (Isomorfismo de digrafos). Os dois grafos G = (V, E, γ) e
G′ = (V ′ , E ′ , γ ′ ) chamam-se isomorfos se existem duas bijeções f : V → V ′ e
g : E → E ′ que conservam correspondência (incidência) entre arcos e vértices.
Se γ(e) = (u, v)
u → u′ = f (u), v → v ′ = f (v), e → e′ = g(e)
então
γ ′ (e′ ) = (u′ , v ′ )
e vice versa.
Definição 5.15 (Isomorfismo de grafos não orientados). Neste caso temos a
mesma definição, é necessário só mudar os pares ordenados para conjuntos de
dois elementos: . . . {u, v} . . . {u′ , v ′ } .
Definição 5.16 (Invariante de isomorfismo). Todos os conceitos dados por meio
de elementos principais de grafos, não se alteram se passarmos de um grafo para
outro isomorfo. Esses conceitos chamam-se invariantes de isomorfismos. Por
exemplo, conceitos de grau de vértice, caminho simples, ciclo, proposições do
tipo tem n vértices, etc. Pode-se usar invariantes para determinar se os grafos
dados são isomorfos ou não.

2 Proposições sobre caminhos e ciclos


Lema 5.1. Cada caminho fechado de comprimento n pelo menos 3 com vér-
tices x1 , . . . , xn diferentes ( x1 = xn+1 ) é ciclo.
Note que no caso n = 2 o caminho x1 x2 x3 (x1 = x3 ) pode ser não ciclo.
Lema 5.2. Caminho tem todos vértices diferentes se e somente se o caminho
é simples e acíclico.
Teorema 5.2 (sobre caminho simples acíclico). Se u e v são vértices dife-
rentes de um grafo G e existe um caminho do vértice u para v então existe
também um caminho simples acíclico entre os vértices u e v .
Demonstração. Entre todos os caminhos de u para v escolhemos qualquer um
com o mínimo comprimento possível. Seja x1 , x2 , . . . , xn sucessão dos vértices
( x1 = u, xn = v ). Mostremos que todos os vértices são diferentes. Suponha-
mos que xi = xj , i < j . Neste caso é possível eliminar os vértices xi+1 , . . . , xj
e arcos correspondentes do caminho e obter um caminho mais curto que con-
tradiz à escolha. Segundo a lema 5.2 o caminho é simples e acíclico.
Corolário 1. Se o arco f é arco de um caminho simples fechado então o arco
f pertence a um ciclo.
Demonstração. O arco f tem extremidades u e v . Caso u = v o arco f é
único arco do ciclo que é laço. Seja u 6= v . Podemos eliminar o arco f do
caminho e obter outro caminho que vai de u para v . De acordo com teorema
5.2 existe um caminho simples acíclico de u para v e não contendo o arco
f (porquanto o primeiro caminho consiste de arcos diferentes). Incluindo f
obteremos um ciclo.
3. PROBLEMA DE PERCURSO DE ARCOS. CIRCUITO DE EULER 73

Teorema 5.3 (único caminho simples). Se u e v são vértices de um grafo


acíclico então pode existir o máximo um caminho simples de u para v .
Demonstração. Sejam x1 , x2 , . . . , xn e y1 , y2 , . . . , ym as sucessões de vértices
dos dois caminhos simples com x1 = y1 = u e xn = ym = v .
Se estes caminhos não têm vértices comuns excepto as extremidades podemos
formar o caminho fechado x1 , . . . , xn , ym−1 , . . . , y1 que é ciclo. Isto contradiz
à condição que o grafo é acíclico.
Então, os caminhos têm um vértice w = xk = yi comum. O vértice w
divide cada um dos caminhos em duas partes. Claro que entre os vértices u e
w ou entre os vértices w e v temos dois caminhos simples diferentes. Sobre
estes caminhos podemos repetir o raciocínio.
Neste processo vamos uma sucessão de pares de vértices. Claro que tal
processo não pode ser infinito e depois de numero finito de passos vai ser obtido
um ciclo. Isto contradiz à condição.
Teorema 5.4. Seja e um arco de um grafo conexo G . As seguintes proposições
são equivalentes:
(a) G \ {e} é conexo
(b) o arco e pertence a um ciclo
(c) o arco e pertence a um caminho simples e fechado
Demonstração. Vamos começar dos dois casos específicos. Se e é um laço, o
grafo G \ {e} é conexo. Se e liga dois vértices diferentes u e v e existe mais
um arco paralelo f entre u e v , então G \ {e} é conexo também e ef é ciclo
que contem e . Nestes dois casos o teorema é valido. Por isso podemos assumir
que e é único arco que liga dois vértices diferentes u e v .
Então e é único arco entre u e v . Consideremos equivalência (a) ⇔ (b) .
(a) ⇒ (b) . Suponhamos que G\{e} é conexo. Segundo o teorema 5.2 existe
um caminho simples e acíclico x1 x2 . . . xn onde x1 = u e x2 = v . Como não
existe arco entre u e v no grafo G \ {e} temos n ≥ 3 . Todos os vértices
x1 , . . . , xn são diferentes e por isso x1 x2 . . . xn u é um ciclo que contem o arco
e.
(b) ⇒ (a) . Seja existe um ciclo que contem o arco e . Seja c qualquer
caminho que contem o arco e . É possível substituir o e por resto do ciclo e
obter um caminho com as mesmas extremidades. Então G \ {e} é conexo.
Agora consideremos equivalência (b) ⇔ (c) . A implicação (b) ⇒ (c) é
evidente. A implicação (c) ⇒ (b) segue do corolário do teorema 5.2.

3 Problema de percurso de arcos. Circuito de


Euler
3.1 Problema sobre as pontes de Königsberg
Um dos primeiros problemas formulados em termos de grafos é o problema sobre
pontes de Königsberg (fig. 5.1): será possível percorrer numa cidade, todas as
74 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

pontes uma e uma só vez cada e retornar ao ponto inicial? O problema foi
resolvido pelo matemático Euler em ano 1736.
Para construir o grafo sobre a figura 5.1 é necessário substituir as áreas de
terra por vértices e as pontes por arcos. Surge a questão: existe um caminho
fechado que usa cada um dos arcos uma única vez? Vamos chamar tal caminho
por circuito de Euler do grafo. Um caminho simples contendo todos arcos de
um grafo G chama-se caminho de Euler.
M1

P2
P6
P3
P1
I1 I2

P4
P7
P5

M2
Figura 5.1: Grafo de Königsberg

3.2 Proposições
Teorema 5.5. Se um grafo G contém um circuito de Euler então o grafo tem
todos os vértices de grau par.
Corolário 1. Se um grafo G tem um caminho de Euler então G tem dois
vértices de grau ímpar ou não tem vértices de grau ímpar.
Teorema 5.6 (Euler). Se todos os vértices de um grafo conexo têm grau par
então ele tem um circuito de Euler.
Corolário 1. Grafo conexo G que tem dois vértices de grau ímpar e outros de
grau par tem um caminho de Euler.

3.3 Algoritmo de Fleury


O algoritmo de Fleury abaixo serve para encontrar um circuito de Euler para
um grafo conexo com todos os vértices de grau par e um caminho de Euler se
dois vértices têm grau ímpar mas todos os outros têm grau par. O caminho
encontrado representa-se por meio das duas sucessões de vértices V S e arcos
ES . A variável v serve para um vértice corrente. As variáveis V e E são
os conjuntos de vértices e arcos respectivamente para um subgrafo G obtido
depois de cada um dos passos do algoritmo cíclico.
Vamos usar a notação:
• (x1 , . . . , xn ) é uma sucessão
3. PROBLEMA DE PERCURSO DE ARCOS. CIRCUITO DE EULER 75

• () é sucessão vazia
• A concatenação de uma sucessão s e um elemento x vamos designar por
s + x , por exemplo (a, b, c) + d = (a, b, c, d)
Inicialmente: a variável v é um vértice de grau ímpar se tal vértice existe.
No caso contrário v é um vértice arbitrário.
Input: G é um grafo conexo com todos os vértices de grau par ou com dois
vértices de grau ímpar
Output: V S e ES são sucessões dos vértices e dos arcos de um circuito de
Euler (ou caminho de Euler)
V S := (v) ; ES := ();
V := V (G) ; E := E(G)
while deg(v) > 0 do
if deg(v) = 1 {γ(e) = {v, w}} then
E := E \ e ; V := V \ v
else { deg(v) > 1 }
escolher um arco e ( γ(e) = {v, w} ) tal que se eliminarmos o arco e
obteremos um grafo conexo
E := E \ {e}
end if
V S := V S + w ; ES := ES + e
adicionar w e e no fim das sucessões V S e ES
v := w {agora v = w é o vértice corrente}
end while
Algoritmo 5.1: Fleury

Nota 1. A pre-condição deg(v) > 0 do ciclo while significa que o algoritmo


termina quando não existirem vértices adjacentes ao vértice v . Em cada passo
elimina-se um arco do subgrafo (V, E) e acrescenta-se no fim da sucessão ES .
É possível demonstrar que, caso o grafo conexo e todos vértices têm grau par,
este algoritmo vai construir um circuito de Euler (teorema 5.7)
Exemplo 5.2. Para o grafo sobre a figura 5.2 são mostradas situações correntes
durante execução do algoritmo de Fleury.
A seguinte tabela representa os passos do algoritmo para o grafo na figura
5.2.

v VS ES V E
z (z) () {x, y, z, r, s, t} {a, b, c, d, f, g, h, i}
y (z, y) (i) {x, y, r, s, t} {a, b, c, d, f, g, h}
x (z, y, x) (i, f ) {x, y, r, s, t} {a, b, c, d, g, h}
r (z, y, x, r) (i, f, a) {x, y, r, s, t} {b, c, d, g, h}
s (z, y, x, r, s) (i, f, a, b) {x, y, s, t} {c, d, g, h}
t (z, y, x, r, s, t) (i, f, a, b, c) {x, y, t} {d, g, h}
x (z, y, x, r, s, t, x) (i, f, a, b, c, d) {x, y} {g, h}
y (z, y, x, r, s, t, x, y) (i, f, a, b, c, d, h) {y} {g}
y (z, y, x, r, s, t, x, y, y) (i, f, a, b, c, d, h, g) {y} ∅
76 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

r r r
b f y b f y b y
x x x
s a gs a gs a g
c d h i c d h c d h
t t t
z

x y y y
g g
h

Figura 5.2: Algoritmo de Fleury

Teorema 5.7. Para cada grafo conexo com vértices de grau par o algoritmo
de Fleury produz um circuito de Euler. No caso de existência de 2 vértices de
grau ímpar, o algoritmo produz um caminho de Euler.
Demonstração do teorema pode ser realizada na base dos teoremas de Euler
e 5.4.

4 Árvores
4.1 Definições e teoremas gerais
Definição 5.17 (árvore). Grafo conexo e acíclico chama-se árvore. Grafo ací-
clico não conexo chama-se floresta.
Notemos que árvore não tem arcos paralelos e laços porque é acíclico. Exis-
tem só uma árvore de 2 vértices (não distinguir árvores isomorfas), uma árvore
de 3 vértices, duas árvores com 4 vértices.
Consideremos grafo conexo G = (V, E) sem laços e arcos paralelos ( V é o
conjunto de vértices).
Definição 5.18 (arvore geradora). Uma árvore A = (V, E ′ ), E ′ ⊂ E (sub-
grafo de G ) chama-se árvore geradora (ou árvore abrangente) do grafo G . Por
outras palavras, árvore geradora contém todos os vértices do grafo G .
Definição 5.19 (folha). Vértice de grau 1 de uma árvore chama-se folha.
Teorema 5.8 (existência de árvore geradora). Cada grafo finito conexo tem
uma árvore geradora.
Demonstração. Seja (V, E) um grafo finito conexo. Consideremos todos os
subgrafos conexos (V, E ′ ) com E ′ ⊂ E e escolhemos um com o mínimo número
de arcos. Este subgrafo é acíclico. De facto, se este grafo contém um ciclo,
segundo o teorema 5.4 é possível eliminar um arco deste ciclo e obter grafo
conexo com número menor dos arcos. Isso contradiz à suposição. Então este
subgrafo é conexo e acíclico e portanto é uma árvore contendo V .
4. ÁRVORES 77

Teorema 5.9 (propriedade característica 1). Dado um grafo G com mais do


que 1 vértice sem laços e arcos paralelos. As seguintes proposições são equiva-
lentes
1. G é árvore
2. Cada par de vértices diferentes pode ser ligado por um único caminho
simples
3. G é conexo, mas se eliminar qualquer arco obteremos um grafo não conexo
4. G é acíclico, mas se adicionar qualquer arco obteremos um grafo não
acíclico
Lema 5.3. Cada árvore com pelo menos 1 arco tem no mínimo duas folhas.
Demonstração. Consideremos um caminho simples de comprimento máximo
v1 v2 . . . vn . Então v1 6= vn , v1 e vn são folhas.
Lema 5.4. Qualquer árvore com n vértices tem n − 1 arcos.
É fácil demonstrar o lema por meio de indução matemática.
Teorema 5.10 (propriedade característica 2). Seja G um grafo finito com n
vértices (sem laços e arcos paralelos). As seguintes proposições são equivalentes:
1. G é árvore
2. G é acíclico e tem n − 1 arcos
3. G é conexo e tem n − 1 arcos

4.2 Árvores com raiz


O conceito de árvore com raiz ou árvore de raiz é simples mas muito importante
em aplicações.
Definição 5.20 (árvore com raiz). Sejam A árvore, v um dos seus vértices.
O par (A, v) chama-se árvore com raiz v . Vértices com grau 1 (excepto a raiz
v ) chamam-se folhas da árvore com raiz.
Nota 1. As árvores (A, v1 ) e (A, v2 ) cujas raízes são v1 e v2 ( v1 6= v2 ) com
mesma arvore A são árvores de raízes diferentes. Como podemos ver na figura
5.3, as árvores (a) e (b) não são isomorfas (as raízes são marcados). Vamos
representar as árvores com raiz de maneira apresentada nos casos (c) e (d) (a
raiz está em cima).
A raiz serve para organizar os dados em uma estrutura hierárquica. Também,
árvore de raiz é uma base para diferentes algoritmos.
Para qualquer árvore com raiz é fácil definir orientação e considerar a árvore
de raiz como digrafo. De facto sejam u e v vértices adjacentes. Existe só um
único caminho simples de r para u e um único caminho simples de r para v .
Podem ser duas só situações: u esta situada sobre caminho de r para v ou
situação reciproca (demonstre isto!). No primeiro caso determina-se a direcção
de u para v . Em outras palavras se u0 , u1 , u2 , . . . , un é caminho simples, onde
u0 = r é raiz, cada par (uk , uk+1 ) mostra a direcção.
78 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

(a) (b)

(c) (d)

Figura 5.3: Arvores com raiz não isomorfas

Definição 5.21 (nivel, altura). Vamos chamar nível de um vértice de uma


árvore com raiz o comprimento de caminho simples de raiz para o vértice.
Altura de uma árvore é o máximo nível dos seus vértices.
O nível zero tem a raiz só.
Definição 5.22 (descendentes). Se os vértices u e v são adjacentes com o
arco (u, v) diz-se que u é pai do v, v é filho do u . Mais geralmente, w é
descendente de v se w 6= v e v é vértice de caminho único de raiz r para w .
Segundo a definição para digrafo o número de todos os filhos de v é igual a
outdeg(v) .
Definição 5.23 (subárvore). Subárvore com raiz v é uma árvore que consiste
de v e de todos descendentes e de todos arcos (direccionados) que ligam estes
vértices.

4.3 Árvore binária


Definição 5.24 (binária). Suponhamos que numa árvore de raiz cada vértice
tem o máximo dois filhos. Se os filhos são diferentes e chamados o filho esquerdo
e o filho direito vamos chamar a árvore árvore binária.
Neste caso temos não só restrição em número dos filhos. È aceitável a si-
tuação quando não existe um dos filhos (ou ambos). Por exemplo, existe um
filho esquerdo mas não existe direito. Existe uma generalização do conceito de
árvore binária:
Definição 5.25 ( m -ária). Para m ≥ 2 uma árvore m -ária é árvore em que
todos os filhos de cada pai são marcados (assinalados) por números diferentes
de {1, 2, . . . , m} .
Se, qualquer que seja vértice v , outdeg(v) = m ou outdeg(v) = 0 diz-se
que árvore é regular.
Uma árvore regular chama-se árvore completa se todas as folhas têm o mesmo
nível. Este nível chama-se altura da árvore.
5. ÁRVORES GERADORAS 79

5 Árvores geradoras
5.1 Algoritmo de produção duma árvore geradora
Consideremos um algoritmo que permite encontrar uma árvore geradora para
grafo conexo dado G = (E(G), V (G)) . Se n = |V | árvore geradora contém
n − 1 arcos. Vamos começar a partir de qualquer vértice do grafo e adicionar
arco a arco ate obter uma arvore geradora. O código de um algoritmo Tree(v)
está apresentado sobre a figura algoritmo 5.2.

Input: G é um grafo conexo, v é um vértice de grafo G


Output: E é o conjunto dos arcos de uma árvore geradora
V := {v} ; E := ∅
while existem arcos de G que ligam vértices em V com vértices de V (G)\V
do
Escolher um arco {u, w} que liga um u ∈ V com um w ∈ /V
V := V ∪ {w}
E := E ∪ {{u, w}}
end while
Algoritmo 5.2: Tree(v)

Teorema 5.11 (Algoritmo Tree). Se G é um grafo conexo o algoritmo Tree(v)


produz uma árvore geradora do grafo.
Demonstração. Notemos primeiro que o algoritmo tem o invariante

(V, E) é subgrafo conexo e acíclico.

De fato, depois de adicionar o arco {u, w} existe um caminho de qualquer


vértice para o vértice w através do vértice u . Por isso, o grafo obtido é conexo.
O arco {u, w} não pode pertencer a nenhum ciclo no subgrafo obtido porque
o vértice w tem grau 1 (no subgrafo). Então, ao terminar o algoritmo o grafo
G′ = (V, E) é árvore.
Se V (G) \ V 6= ∅ existe um caminho entre qualquer vértice de V para
qualquer vértice do V (G) \ V . Este caminho deve conter um arco {u, w} que
liga um u ∈ V com um w ∈ / V . Por isso, ao terminar o algoritmo V (G)\V = ∅ .

5.2 Grafos com pesos, árvore mínima com pesos


Se a cada arco e dum grafo G corresponde um número negativo W (e) (que
vamos chamar o peso do arco e ) o grafo G chama-se grafo com pesos. O
peso W (H) de um subgrafo H ⊂ G é a soma de pesos de todos os arcos de
H . Consideremos o seguinte problema: encontrar uma árvore geradora mínima,
i.e. a árvore geradora cujo peso é menor ou igual ao peso de qualquer árvore
geradora. Por exemplo, pode ser colocado o problema de minimizar as despesas
de construção de uma rede de caminhos que deve ligar todas as cidades num
país.
80 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

Algoritmo de Kruskal
No algoritmo de Kruskal os arcos dispõem-se em ordem crescente dos pesos:
para a sucessão de arcos e1 , e2 , . . . , en temos

W (e1 ) ≤ W (e2 ) ≤ . . . W (en ).

Input: G é um grafo com arcos em ordem crescente de pesos


Output: E é um conjunto de todos os arcos de uma árvore geradora mínima
E := ∅
for j := 1 to |E(G)| do
if E ∪ {ej } é acíclico then
E := E ∪ {ej }
end if
end for
Algoritmo 5.3: Kruskal

Teorema 5.12. Algoritmo de Kruskal produz uma mínima árvore geradora.


Demonstração. Notemos que
1. A proposição

P (E) ≡ { E é uma parte de uma mínima árvore geradora}

é um invariante do ciclo
2. Inicialmente E = ∅ e evidentemente P (E) é verdadeiro
Daqui pode ser concluído que ao terminar o ciclo a proposição será verdadeira.
Para demonstrar isto consideremos um passo do ciclo. Na entrada temos um
conjunto E . Vale a pena considerar só o caso E ′ = E ∪ {ej } é acíclico. Seja T
uma mínima árvore geradora contendo E . É preciso demonstrar que existe uma
miníma árvore geradora T ′ ⊃ E ′ . Se ej ∈ T então E ′ ⊂ T . Consideremos o
caso ej ∈/T.
Neste caso ej pertence a um ciclo C do grafo T ∪ {ej } 1 . E ′ é acíclico,
por isso o ciclo C contém um arco

f ∈ T, f ∈
/ E, f 6= ej .

Se remover o f e adicionar o ej vamos ter

T ′ = (T ∪ {ej }) \ {f }.

Notemos que T ′ = (T ∩ C) \ {f } . Por isso, T ′ é conexo. O grafo T ′ é uma


árvore geradora2. Para mostrar que T ′ é uma mínima árvore comparemos os
pesos de ej e f . Como E ∪ {f } ⊂ T o grafo E ∪ {f } ⊂ T é acíclico. Mas ej
foi escolhido antes do f , por isso W (ej ) ≤ W (f ) . Isto resulta

W (T ′ ) ≤ W (T ).
1 por causa do teorema 5.4 ou do teorema 5.10
2 por causa do teorema 5.10
6. PERCURSO DE VÉRTICES. CAMINHO DE HAMILTON 81

Então, T ′ é árvore geradora mínima. A demonstração sobre o invariante do


ciclo é realizada.
Agora para completar a demonstração do teorema é preciso demonstrar que
ao terminar o ciclo o grafo acíclico com o conjunto dos arcos E é conexo.
Sejam u e v dois vértices do grafo G . Dentro do grafo G existe um
caminho entre u e v . Se um arco f não pertence ao caminho, E ∩ {f }
contém um ciclo (no caso contrário o f devia ser escolhido no algoritmo). É
possível substituir o f por resto do ciclo e obter um outro caminho entre u e
v . Podemos fazer todas tais substituições necessárias.

Algoritmo de Prim
Existe mais um algoritmo para resolver o mesmo problema. No algoritmo de
Prim 5.4 não é necessário ordenar os arcos antes de construir uma árvore. Tam-
bém, no algoritmo de Prim não é preciso controlar que o grafo corrente obtido
não é acíclico. Realmente, este algoritmo é um caso especial do algoritmo Tree
(algoritmo 5.2).
Teorema 5.13. Algoritmo de PRIM produz uma mínima árvore geradora.

Input: G é um grafo com arcos ordenados arbitrariamente


Output: E é o conjunto de todos os arcos de uma árvore geradora mínima
E := ∅
V := {w} {onde w ∈ V (G) é qualquer vértice}
while V 6= V (G) do
Escolher um arco {u, v} ∈ E(G) onde u ∈ V e v ∈ V (G) \ V com o
mínimo peso possível
E := E ∪ {{u, v}}
V := V ∪ {v}
end while
Algoritmo 5.4: Prim

6 Percurso de vértices. Caminho de Hamilton


Existem aplicações importantes que precisam resolver o percurso dos vértices
de um grafo. O problema consiste em seguinte. Dado um grafo conexo G . É
preciso encontrar um caminho que usa todos os vértices, uma vez cada. Este
caminho chama-se caminho de Hamilton. Se o caminho for fechado, chama-se
circuito de Hamilton, e o grafo é Hamiltoniano. O problema é mais complicado
que o problema de percurso de arcos. Não existe algoritmo simples para encon-
trar um caminho. Existem condições suficientes para existência do caminho de
Hamilton.
Consideremos o problema de percorrer o quadro de xadrez por meio de cavalo
de xadrez. Uma solução é apresentada na figura 5.4. O algoritmo que foi
aplicado é o seguinte. Depois de cada passo de algoritmo para cada um dos
vértices do grafo existem várias possibilidades. Entre os vértices que podem ser
seguidos escolhe-se um com o mínimo numero de possibilidades. O algoritmo
82 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

Figura 5.4: Caminho de um cavalo de Xadrez

nem sempre pode dar resultado positivo, mas no caso do problema de percurso
do quadro de xadrez o algoritmo serve.

7 Exercícios
7.1 Definições de grafos orientado e não orientado, dia-
grama de grafo
1. Dada a tabela da função γ : E(G) → V (G) × V (G) construir o diagrama
do grafo G :

e a b c d e f g h
γ(e) (w, z) (w, x) (x, z) (z, z) (z, x) (z, y) (y, w) (y, x)

2. O conjunto dos vértices de um grafo é V = {1, 2, 3, 4, 5, 6} , o conjunto dos


arcos E = {a12 , a23 , a34 , a35 , a11 , a53 , a51 , a22 } . Para cada um dos arcos
defina-se o valor da função γ de maneira seguinte

γ(aij ) = {i, j}.

Construir o diagrama do grafo.


3. No grafo G = (V, E, γ) temos V = N = {1, 2, . . .} , E = {ai : i ∈ N} ,
γ(ai ) = (i, i + 1) . Desenhar o diagrama do grafo.
7. EXERCÍCIOS 83

7.2 Grau de vértice, isomorfismo de grafos


1. Confirmar o Teorema 5.1 para cada grafo sobre a figura 5.7.
2. Um grafo tem 21 arcos, 7 vértices de grau 1 , 3 de grau 2 , 7 de grau
3 . Os vértices restantes têm grau 4 . Quantos vértices tem o grafo?
3. Quais das sucessões

(a) (1, 1, 0, 3, 1, 0, 0, . . .) (b) (4, 1, 0, 3, 1, 0, 0, . . .)


(c) (0, 1, 0, 2, 1, 0, 0, . . .) (d) (0, 0, 2, 2, 1, 0, 0, . . .)
(e) (0, 0, 1, 2, 1, 0, 0, . . .) (f ) (0, 1, 0, 1, 1, 1, 0, . . .)
(g) (0, 1, 0, 1, 1, 1, 0, . . .) (h) (0, 1, 0, 1, 1, 1, 0, . . .)

são as sucessões de graus de um grafo? Construir os grafos ou explicar


porque não existe grafo com a sucessão correspondente.
4. Um grafo conexo de n vértices tem n + 1 arcos, um vértice de grau 3 ,
um vértice de grau 4 . Demonstrar que o grafo tem vértices de grau 1 .
5. Verificar se os grafos (a) e (b) sobre a figura 5.5 são isomorfos ou não?

(a) (b)

Figura 5.5: Grafos

6. Verificar se os grafos (a) e (b) sobre a figura 5.6 são isomorfos ou não?

(a) (b)

Figura 5.6: Grafos

7. Indicar os pares de grafos isomorfos (figura 5.7, (d),(e),(f),(g)).


8. (a) Construir todos os 14 grafos possíveis com 3 vértices e 3 arcos não
isomorfos
(b) Construir todos os grafos possíveis com 4 vértices e 4 arcos sem
laços e arcos paralelos
(c) Escolher dos grafos resultantes precedentes os grafos regulares.
84 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

(a) (b) (c)

(d) (e) (f ) (g)

Figura 5.7: Grafos

Figura 5.8: Escolher não isomorfos

9. (a) Construir todos os 5 grafos regulares com 4 vértices de grau 2


(b) Construir todos os grafos regulares com 4 vértices de grau 3 , e sem
laços e arcos paralelos
(c) Construir todos os grafos regulares com 5 vértices de grau 3 .
10. Um grafo sem laços e arcos paralelos G tem n ≥ 2 vértices. Demonstrar
que pelo menos dois vértices têm o mesmo grau
11. Achar o número de automorfismos de um subgrafo G′ ⊂ K3,3 obtido por
meio de eliminação de um arco.3
12. Eliminando dois arcos do grafo sobre a figura 5.8 obter todos não isomorfos

7.3 Caminhos e ciclos


1. Dê um exemplo de um grafo com vértices x, y, z e com 3 seguintes pro-
priedades:
3 O conjunto de vértices do grafo K
m,n é a união M ∪ N , |M | = m , |N | = n . Todos os
arcos são os arcos que ligam um vértice do M com um vértice do N
7. EXERCÍCIOS 85

(a) tem-se um ciclo usando x e y


(b) tem-se um ciclo usando y e z
(c) não se tem um ciclo usando x e z
2. Suponhamos que um ciclo contêm um laço. Qual é o seu comprimento?
3. Consideremos o grafo completo K8 com vértices v1 , . . . , v8 .
(a) Quantos subgrafos de K8 são isomorfos ao grafo K5 ?
(b) Quantos caminhos simples de 3 ou menos arcos têm-se de v1 para
v2 ?
(c) Quantos caminhos simples com 3 ou menos arcos têm-se em K8 ?
4. Quantos ciclos de comprimento 3 tem o grafo G obtido a partir do grafo
K5 removendo um arco?
5. Consideremos um grafo Cn que pode ser chamado cubo n -dimensional.
Os vértices do grafo são os vectores da forma x = (x1 , . . . , xn ) onde
xk = 0 ou xk = 1 , k ∈ {1, . . . , n} . Dois vértices x e y são adjacentes
se e somente se n − 1 componentes (coordenadas) coincidem, mas x e y
diferem numa coordenada. Por exemplo, x = (1, 0, 0, 1) e y = (1, 0, 1, 1)
são vértices adjacentes do cubo 4 -dimensional.
(a) Quantos vértices tem Cn ?
(b) Quantos arcos tem Cn ?
(c) Quantos ciclos de comprimento 4 tem Cn ?
6. Mostrar que qualquer grafo finito cujos vértices têm no mínimo grau 2 ,
contém um ciclo.
Resolução. Consideremos um caminho com vértices diferentes de máximo
comprimento possível: x1 , x2 , . . . , xn . O vértice xn tem grau que não é
menor que 2 portanto existem pelo menos dois arcos que ligam xn com
outros vértices. Um arco e1 → {xn−1 , xn } e outro arco e2 → {xn , v}
onde v é um dos vértices do caminho: v = xi , i ∈ {1, . . . , n} . Senão
temos contradição com escolha do caminho (máximo comprimento!). En-
tão temos o ciclo xi , xi+1 , . . . , xn , xi (caso i < n − 1 segundo o lema 5.1,
caso i = n temos o laço – ciclo, caso i = n − 1 temos ciclo com os dois
arcos diferentes e1 e e2 ).
7. Mostrar que cada grafo com n vértices e pelo menos n arcos contém um
ciclo (use indução matemática e exercício precedente)
8. Num grafo conexo G todos os vértices têm grau 2 . Demonstrar que o
grafo tem único ciclo que contém todos os vértices do grafo.
9. Achar o número de ciclos de comprimento 4 no grafo K3,3 .
10. Achar um caminho de Euler (se for possível) para o grafo na figura 5.9
86 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

0 3 6

1 7
4

2 5 8

Figura 5.9: Achar um caminho de Euler

(a) (b) (c) (d) (e)

Figura 5.10: Achar isomorfas

7.4 Árvores
1. Desenhar todas as árvores com 1, 2, 3, 4, 5 e 6 vértices não isomorfas.
2. Quais das árvores na figura 5.10 são isomorfas?
3. Consideremos uma árvore com n vértices. Sabe-se que ela possui n − 1
arcos. Daqui a soma dos graus dos vértices é igual a 2n − 2 .
(a) Uma árvore tem 2 vértices de grau 4, um vértice de grau 3, um vértice
de grau 2. Se outros vértices têm grau 1 quantos vértices tem esta
árvore?
(b) Desenhar pelo menos uma árvore correspondente a alínea (a).
4. Repetir o exercício 3 para uma árvore com 2 vértices de grau 5 , 3 vértices
de grau 3 , 2 de grau 2 e o resto de grau 1.
5. (a) Mostrar que existe uma árvore com 6 vértices de grau 1 , um vértice
de grau 2 , um vértice de grau 3 , 1 vértice de grau 5 e não existem
outros.
(b) Para n ≥ 2 consideremos n números inteiros positivos d1 , . . . , dn
cuja soma é 2n − 2 . Mostrar que tem-se uma árvore com n vértices
cujos vértices têm graus d1 , . . . , dn .
(c) Mostrar que a alínea (a) ilustra a alínea (b) onde n = 9
6. Desenhar as figuras de todos grafos conexos com 4 arcos e 4 vértices,
não esquecendo os laços e arcos paralelos.
7. Construir todos os subgrafos não isomorfos do grafo completo K5 que têm
5 vértices e 5 arcos. Construir os complementos4 dos grafos obtidos. Para
4 para
o grafo (V, E) e um subgrafo (V, E ′ ) o complemento é (V, E \ E ′ ) , por exemplo,
para o grafo completo K4 representado como um quadrado com diagonais o complemento do
quadrado é o par das diagonais
7. EXERCÍCIOS 87

(a) (b)

Figura 5.11: Árvores geradoras

cada um dos grafos do primeiro grupo achar um grafo isomorfo do segundo


grupo.
8. (a) Mostrar que uma floresta com n vértices e m componentes tem
n − m arcos.
(b) Mostrar que um grafo com n vértices, m componentes e n − m
arcos é uma floresta.
9. Calcular o número de árvores geradoras para cada um dos grafos na figura
5.11
10. Esboce uma árvore com pelo menos um arco e sem folhas.
11. Para o grafo K3,3 encontrar 2 árvores geradoras não isomorfas.
12. Mostrar que qualquer grafo conexo com n vértices tem pelo menos n − 1
arcos.
13. Num grafo conexo G eliminamos um arco e introduzimos um novo arco.
O grafo G′ resultante é uma árvore. Demonstrar que G é árvore.
14. Se um arco a pertence a todas as árvores geradoras de um grafo G então
o arco a não pertence a nenhum ciclo. Demonstrar.
15. Dado um grafo conexo G . Um vértice x é folha de uma árvore geradora.
Se eliminar o x e todos os arcos incidentes vamos ter um subgrafo G′ .
Demonstrar que G′ é conexo.
16. Um grafo conexo tem 30 arcos. Um vértice x de grau 3 é folha de uma
árvore geradora. Demonstrar que o grafo tem no máximo 30 vértices.
17. Um grafo conexo tem a sucessão de graus (0, 16, 3, 3, 3, 3) . Demonstrar
que o grafo tem pelo menos um ciclo.
18. Construir todas as árvores binárias regulares de altura 3 e com 4 vértices.
Quantas arvores binárias tem altura h e h + 1 vértices?
88 CAPÍTULO 5. INTRODUÇÃO À TEORIA DE GRAFOS E ÁRVORES

7.5 Exercícios diferentes


1. Construir todos os grafos conexos sem laços e arcos paralelos que contêm
único ciclo e a sucessão de graus (0, x, 1, 1, 1) . Justificar o resultado.
2. Construir pelo menos três grafos conexos que têm único ciclo e a mesma
sucessão de graus
3. Um grafo conexo sem vértices de graus 1 e 2 satisfaz à condição

|E(G)| = |V (G)| + 2.

Demonstrar que |V (G)| ≤ 4 . Encontrar 3 tais grafos com 4 vértices


4. Construir todas as árvores não isomorfas que têm a sucessão de graus
(0, x, 0, 2, 1)
5. Quantos automorfismos tem o grafo K2,3 ?
6. Construir todas as árvores com raiz não isomorfas de altura 2 e com 5
vértices
7. Construir todas as árvores com raiz não isomorfas com 6 vértices e altura
3.
8. Demonstrar que o número das folhas de qualquer árvore não é menor do
que o grau máximo dos vértices
9. Construir todas as árvores binárias regulares não isomorfas com 7 vértices
10. Uma árvore binária tem F folhas e altura h . Demonstrar que F ≤ 2h .
11. Um vértice v de um grafo G vamos chamar vértice crítico se depois de
remover o v e todos os arcos incidentes, o subgrafo obtido vai ser não
conexo.
(a) Construir um grafo com 6 vértices que têm exactamente 2 vértices
críticos
(b) Fazer o mesmo com condição que os vértices críticos não são adja-
centes
12. Do grafo completo com os vértices a, b, c, d, e, f, g, h são removidos os 4
arcos: {a, b} , {c, d} , {e, f } , {g, h} . Quantos ciclos de comprimento 3
tem o grafo obtido?
13. Achar o numero de árvores binárias regulares com n folhas
7. EXERCÍCIOS 89

(a) (b) (c)


1 1 1

Figura 5.12: Algoritmo TREE

350
240 220
120

330
180 240
270 320
280
90
200 300

280

Figura 5.13: Algoritmos de Kruskal e de Prim

7.6 Árvore geradora mínima. Algoritmos de Kruskal e de


Prim
1. Aplicar o algoritmo Tree(1) aos grafos sobre a figura 5.12
2. Aplicar os algoritmos de Kruskal e de Prim ao grafo sobre a figura 5.13
3. Seja G um grafo finito com pesos conexo em que todos os arcos têm pesos
diferentes. Mostre que G tem uma única árvore geradora mínima.
Indicação. Suponhamos que G tem duas (ou mais) árvores geradoras
mínimas. Consideremos um arco com o mínimo peso que pertence a uma
árvore mas não pertence à segunda. . .
Capítulo 6

Ordenação de um vector

1 Procura binária em vector ordenado


Dado o vector a1 , a2 , . . . , an que podemos imaginar como uma base de dados.
Suponhamos que existe uma função K(i) que coloque em correspondência ao
elemento ai uma sua característica. Vamos chamar K(i) por chave do elemento
ai . Por exemplo ai é uma informação sobre um cliente de um banco e K(i) é
o apelido do cliente.
O vector é ordenado conforme a comparação das chaves:
K(1) ≤ K(2) ≤ . . . ≤ K(n).
O seguinte algoritmo acha um índice l para o valor dado C de chave tal que
K(i) = C .
Notemos que ao terminar o ciclo não é necessário K(l) = C . Calculemos
a complexidade f (n) do algoritmo considerando a operação de comparação
K(l) < C como operação principal. O resultado depende dos dados a1 , . . . , an
portanto vamos calcular a complexidade máxima. O volume de dados é o número
de elementos. Dentro do ciclo vamos ficar com os dados ai , . . . , aj com volume
j − i + 1 . Não é difícil ver que
f (n) = 1 + f (⌊n/2⌋) (6.1)

i := 1; j := n;
while i < j do begin
l := (i + j) div 2;
if K(l) = C then begin
i := l; j := l
end;
if K(l) < C then
i := l + 1
else
j := l − 1
end

Figura 6.1: Algoritmo Binary Search

90
2. ORDENAÇÃO DE UM VECTOR. COMPLEXIDADE ESPACIAL 91

( ⌊x⌋ é parte inteira do x ). De facto, por exemplo, para n = 31 vamos ter


l = 16 e passamos para um dos intervalos 1..15 ou 17..31 . Caso n = 32
vamos ter l = 16 e intervalos 1..15 ou 17..32 . Então o comprimento novo do
intervalo é duas vezes menor que o comprimento precedente e a complexidade
satisfaz a relação recorrente (6.1). Seja n = 2m . Neste caso

f (n) = 1 + f (2m−1 ) = 2 + f (2m−2 ) = . . . = m + f (1) = m = log2 n.

Usando a indução matemática demonstre que caso geral

f (n) = ⌊log2 n⌋.

2 Ordenação de um vector. Complexidade espa-


cial
Colocação do problema. Dado um vector (a1 , . . . , an ) (base de dados) de ele-
mentos de um conjunto R (por exemplo, registos de clientes de um banco).
Seja K(i) uma chave do elemento ai (por exemplo, K(i) é o nome do cliente
ai ). É preciso ordenar o vector (a1 , . . . , an ) , isto é, obter uma permutação
ordenada ak1 , . . . , akn segundo os valores das chaves

K(k1 ) ≤ K(k2 ) ≤ . . . ≤ K(kn ).

Para definir complexidade de um algoritmo de ordenação vamos usar opera-


ção de comparação de duas chaves. No exercício 2 podemos ver um algoritmo
que serve para ordenar um vector (a1 , . . . , an ) de números reais em ordem
crescente. O algoritmo chama-se ordenação por bolha. Este algoritmo tem a
complexidade
n(n − 1)
f (n) = (n − 1) + (n − 2) + . . . + 1 = = O(n2 )
2
e tem ordem 2 de crescimento. O algoritmo não é eficiente. Por exemplo,
suponhamos que uma comparação de elementos precisa de tempo t0 = 0.0001
segundos. A figura 6.2 apresenta comparação de tempo do trabalho do algoritmo
para diferentes valores de n .

n 100 1000 10000 100000 1000000

t = f (n)t0 0.5 s 50 s 1 hora 23 min 139 horas 579 dias

Figura 6.2: Tempo de ordenação

2.1 Ordenação por união (merge sort)


Ideia do algoritmo merge sort
A ideia do algoritmo consiste em seguinte:
92 CAPÍTULO 6. ORDENAÇÃO DE UM VECTOR

1. Dividir a1 , . . . , an em duas partes iguais a1 , . . . , an/2 e an/2 , . . . , an


2. Ordenar a cada parte separadamente
3. Formar um vector das duas partes por meio de um algoritmo que se chama
Merge.
Notemos que para ordenar cada parte usa-se o mesmo algoritmo e portanto
o algoritmo é recursivo.

Complexidade do algoritmo merge sort


Suponhamos que a complexidade do algoritmo merge sort é o número de com-
parações necessárias para ordenar o vector (a1 , . . . , an ) . Seja f (n) a comple-
xidade. Da definição do algoritmo

f (n) = 2f (n/2) + µ(n)


(6.2)
f (1) = 0
onde µ(n) é a complexidade do algoritmo Merge. A primeira relação é valida
se n é par. Mas se n = 2k + 1 , f (2k + 1) = f (k) + f (k + 1) . É possível realizar
o Merge com complexidade µ(n) = n − 1 . Para simplicidade podemos tomar
que µ(n) ≈ n . Para simplicidade consideremos também o caso n = 2m :

f (2m ) ≈ 2f (2m−1 ) + 2m ≈ 2(2f (2m−2 ) + 2m−1 ) + 2m = 4f (2m−2 ) + 2 · 2m


≈ 8f (2m−3) + 3 · 2m ≈ . . . ≈ 2k f (2m−k ) + k2m ,
k ≤ m . Então finalmente vamos ter
f (2m ) ≈ 2m f (1) + m2m = m2m .
No exercício (3) pode-se ver uma relação exacta.
e em termos da variável n
f (n) ≈ n log2 n. (6.3)
Esta relação pode ser demonstrada para qualquer n , não só da forma n = 2m .
Daqui podemos concluir que a complexidade do algoritmo Merge é muito melhor
que do algoritmo do exercício 2.
Alem disso, é possível demonstrar que cada algoritmo de ordenação tem
complexidade no mínimo O(n log2 n) .
Infelizmente a parte principal do algoritmo merge precisa de memória com-
plementar e portanto não se usa em programas reais. Consideremos mais um
algoritmo que se usa com frequência e chama-se quicksort.

2.2 Quicksort
A ideia do algoritmo é conseguir a uma partição do vector (a1 , . . . , an ) em
duas partes de modo que cada elemento em primeira parte não é maior do que
cada elemento da segunda parte. Alem de mais temos que fazer isto sem usar
a memoria complementar. Claro que é melhor dividir em partes possivelmente
iguais. Depois de realizar a partição é suficiente ordenar cada parte usando o
mesmo algoritmo. Então vamos ter um algoritmo recursivo:
2. ORDENAÇÃO DE UM VECTOR. COMPLEXIDADE ESPACIAL 93

Procedure Quicksort( l, r : integer);


var
i, j : integer;
begin
if l < r then begin
Partição( l, r, i, j );
Quicksort( l, j );
Quicksort( i, r )
end
end

Os argumentos l, r do algoritmo servem para indicar o subvector (segmento)


al , . . . , ar que deve ser ordenado. A chamada Quicksort( 1, n ) realiza todo o
processo. O subalgoritmo Partição vai dividir o subvector em partes al , . . . , aj
e ai , . . . , ar como acima indicado.
Realizar o algoritmo ’Partição’ é possível por meio de diferentes métodos
que têm a complexidade n ou n − 1 (onde n é o número de elementos) de um
subvector. Sendo f (n) a complexidade do Quicksort(1, n) vamos ter

f (n) = n − 1 + f (m) + f (n − m)

onde o valor m ∈ {1, . . . , n − 1} . No pior caso pode ser por exemplo sempre
m = 1 e f (n) = n − 1 + f (1) + f (n − 1) = n − 1 + f (n − 1) . Daqui

f (n) = n(n − 1)/2

e a complexidade coincide com a complexidade de ordenação por bolha. Mas


no melhor caso a complexidade

f (n) = n − 1 + f (⌊n/2⌋) + f (⌊(n + 1)/2⌋)

coincide com a complexidade do algoritmo Merge sort. Daqui claro que o pro-
blema principal é construir um algoritmo ’partição’ para partir em duas partes
possivelmente iguais. Mas isto depende de escolha de um elemento x que divide
o vector. À esquerda dispomos todos os elementos menores do x e à direita os
elementos maiores. Um tal algoritmo é representado abaixo:

procedure partição(l,r: integer; var i,j: integer);


{ intervalo l..r dividimos em intervalos l..j e i..r }
var
x: keytype;
{ Resultado do procedimento
K(l)...K(i-1) <= x <= K(j+1)...K(r) ,
i > j
}
begin
x:=K((l+r) div 2);
i:=l; j:=r;
while i<=j do begin
while less(K(i),x) do
i:=i+1;
while less(x,K(j)) do
94 CAPÍTULO 6. ORDENAÇÃO DE UM VECTOR

j:=j-1;
{ K(j) <= x <= K(i) }
if i<=j then begin
troca(i,j); { K(i) <= x <= K(j) }
i:=i+1; j:=j-1; { K(i-1) <= x <= K(j+1) }
end;
end;
end;

2.3 Avaliação de complexidade de ordenação


Cada algoritmo de ordenação pode ser representado por meio de uma árvore
binária onde vértices são comparações e uma subárvore corresponde a resposta
’sim’ e outra - a resposta ’não’. Aplicar o algoritmo significa passar de raiz até
uma folha marcada por uma permutação s1 , s2 , . . . , sn dos índices 1, 2, . . . , n .
Esta permutação significa

as1 ≤ as2 ≤ . . . ≤ asn .

A complexidade do algoritmo no pior caso é altura da árvore. Como existem


n! tais permutações a árvore contém pelo menos n! folhas. Sejam h altura da
árvore e N número das folhas. Mas a árvore binária tem o máximo 2h folhas
e N ≤ 2h donde h ≥ log2 N ≥ log2 n! . Então temos a avaliação

h ≥ ⌈log2 n!⌉ .

É fácil demonstrar que n! ≥ (n/2)n/2 e portanto


n n n
h≥ log = (log n − 1).
2 2 2

3 Exercícios
1. Usando a indução matemática demonstre que no algoritmo Binary Search
6.1 para procura binária
f (n) = ⌊log2 n⌋

2. Dado um vector (var a: array[1..n] of real). Achar a complexidade do


algoritmo

for i := n downto 2 do
for j := 1 to i − 1 do
if a[j] > a[j + 1] then
Permutar (a[j], a[j + 1])

O que é que faz o algoritmo?


3. Demonstre que se

f (2m ) = 2f (2m−1 ) + 2m − 1 e f (1) = 0

então f (2m ) = (m − 1)2m + 1 .


Capítulo 7

Recursividade geral

1 Conceito geral da definição recursiva


Em construção de algoritmos usam-se os dois métodos principais:
o método de algoritmos cíclicos e método de algoritmos recursivos.
Para verificar algoritmos cíclicos serve o método da indução mate-
mática. Neste capítulo vamos considerar um princípio generalizado
de indução matemática que permite verificar algoritmos recursivos,
i.e., justificar que um algoritmo recursivo dá o resultado correto.
Notemos que o problema de percurso de árvores que tem aplicações
importantes pode ser facilmente resolvido por meio de algoritmos
recursivos.

1.1 Exemplos preliminares


O método da indução matemática usa a seguinte propriedade do conjunto N
dos números naturais
(B) 1 ∈ N
(R) Se n ∈ N então n + 1 ∈ N .
As condições (B) e (R) formam uma propriedade característica do conjunto N ,
quer dizer, estas condições completamente descrevem o conjunto N e podem
servir como uma Definição do conjunto N de todos os números naturais. Essa
ideia sugere um método geral para definições de conjuntos e chama-se Definição
recursiva de um conjunto. Vejamos dois exemplos de definições dessa forma.
Exemplo 7.1. Consideremos o subconjunto S ⊂ N de todos os números naturais
que consiste dos números satisfazendo as duas condições:
(B) 1 ∈ S
(R) Se n ∈ S então 2n ∈ S .
Conforme a regra (R) o conjunto S contem os números 2, 4, 8, . . . . Todos
os números naturais que podem ser derivados (construídos) desta maneira são
elementos do conjunto S . Mas se um número natural x não é possível derivar
desta maneira, x ∈
/ S!

95
96 CAPÍTULO 7. RECURSIVIDADE GERAL

A condição (R) contem uma regra de construção que serve para construir
elementos do conjunto S a partir dos elementos já construídos. Mas a regra
não permite verificar se um número natural dado pertence ao conjunto S .
Consideremos uma forma inversa da (R) que se pode usar para verificar
isso:
(R’) n ∈ S se n/2 ∈ S .
Claro que esta condição vale a pena aplicar só para os números n pares. Então,
temos a segunda forma da definição do conjunto S :
Um número natural n ∈ S num dos dois casos:
(B) n = 1 ou
(R’) n é par e n/2 ∈ S .
Mas se n for ímpar e n 6= 1 então n ∈
/ S!
Para verificar se n ∈ S por exemplo para o número n = 12 segundo (R)
precisamos provar o número n1 = 6 depois n2 = 3 que dá resultado n2 ∈
/S e
portanto n1 , n ∈
/S.
Notemos que usando a indução matemática pode-se demonstrar que

S ⊃ {2m : m ∈ Z+ }.

Para demonstrar isto considere a proposição P (m) = {2m ∈ S}, m ∈ Z+ . Por


outro lado é possível demonstrar que S não contem outros números (veja o
exemplo 7.8 na página 101).
A definição considerada determina um subconjunto de números naturais. No
seguinte exemplo defina-se um subconjunto do conjunto de todas as sucessões
finitas de símbolos (vamos chamar palavras).
Exemplo 7.2. Sejam Σ = {a, b} e Σ∗ o conjunto de todas as sucessões finitas
compostas dos símbolos a e b . Consideremos o conjunto M definido por meio
das regras
(B) a ∈ M
(R) Se s ∈ M então as concatenações asb ∈ M e as ∈ M .
Aqui s serve para qualquer s ∈ Σ∗ , isto é, s é uma variável o valor da qual é
uma palavra que contém os símbolos a e b . Por exemplo, s = ababb, s = aa
etc.
Usando a definição podemos concluir que

aab ∈ M, aaabb ∈ M, aaab ∈ M

etc. Claro que não é possível construir desta maneira nenhuma palavra que
começa com letra b .
Agora consideremos uma forma inversa para verificar se uma palavra de Σ∗
pertence ao conjunto M : uma palavra s ∈ M num dos casos seguintes
(B) s = a
(R’) 1. s = as′ b e s′ ∈ M
1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 97

2. s = as′ e s′ ∈ M
Mas se s começa com b , s ∈
/M!
As duas definições consideradas são recursivas por motivo seguinte. Para
verificar se um objecto é um elemento do conjunto definido é preciso chamar o
mesmo procedimento para um ou vários objectos da mesma espécie. Notemos
que as definições têm as duas formas. A primeira, forma de construção, permite
construir elementos do conjunto, mas a segunda permite verificar se um objecto
pertence ao conjunto definido ou não. A segunda vamos chamar forma inversa
ou forma de verificação.

1.2 Definição recursiva de um conjunto


As definições consideradas têm referência para o mesmo conceito e portanto
chamam-se definições recursivas. Qualquer definição recursiva tem as duas par-
tes, uma defina directamente um ou vários elementos (ou um conjunto infinito),
mas outra contém recursividade.
Definição 7.1. Definição recursiva de um conjunto S consiste das duas partes:
(B) uma base da forma
X⊂S (7.1)
onde o conjunto X é definido directamente.
(R) uma parte recursiva que consiste de uma ou várias regras r1 , . . . , rl da
forma
s1 , s2 , . . . , sm −→ s ou s = r(s1 , s2 , . . . , sm ). (7.2)
Se s é construído a partir de vários elementos de S por meio de uma das
regras dadas então s ∈ S .
Notemos que, as vezes, os elementos s1 , . . . , sm ∈ S obrigam-se obedecer con-
dições suplementares que são parte das regras, isto é, as condições formam um
domínio da regra (veja o exemplo 7.3).
Exemplo 7.3. Determinemos um subconjunto A de números naturais por
(B) 1 ∈ A ;
(R) Se n ∈ A então 3n ∈ A (regra 1 ) e se 2k + 1 ∈ A então k ∈ A
(regra 2 ).
A segunda regra pressupõe que um elemento n pode ser representado na forma
n = 2k + 1 , quer dizer se n ∈ A é um número ímpar então (n − 1)/2 ∈ A !
Então, a segunda regra nem sempre pode ser usada.
Investiguemos a definição. Aplicando duas vezes a regra 1 vamos ter os
números 3 e 9 . Usando a regra 2 para os números 3 e 9 obteremos 1 (que
já existe) e 4 . Vejamos mais um processo da produção de números:
1 1 1 2 2
1 −→ 3 −→ 9 −→ 27 −→ 13 −→ 6.

De quais números consiste o conjunto A ? Uma hipótese diz que

A = {1, 3, 4, 6, 7, 9, 10, 12, 13, . . .} = {n ∈ N : n 6≡ 2 (mod 3)}. (7.3)


98 CAPÍTULO 7. RECURSIVIDADE GERAL

Neste exemplo e no exemplo 7.2 um elemento do A pode ser produzido a


partir de elementos diferentes. Por exemplo, o número 12 pode ser derivado a
partir dos números 4 ou 25 . Existem diferentes caminhos para formar o 12

1 → 3 → 9 → 4 → 12

1 → 3 → 9 → 27 → 13 → 39 → 117 → 351 → 175 → · · · → 51 → 25 → 12.

1.3 Forma inversa. Definições determinadas unicamente


Exemplo 7.4. Em línguas de programação usa-se a noção de identificador (que
serve para nomes de variáveis) que é uma sucessão (ou uma palavra) de letras
e algarismos começando com uma letra. Consideremos a definição recursiva:
(B) Uma palavra de uma só letra é identificador
(R) A concatenação Iσ de um identificador I e de um símbolo σ que é uma
letra ou um algarismo é também um identificador
Esta definição pode ser também representada numa forma inversa que per-
mite verificar se uma sucessão dada for identificador:

(B) Uma palavra de uma só letra é identificador


(R’) A palavra dada é identificador se cumprem-se as condições

(a) o ultimo símbolo é letra ou algarismo


(b) depois de eliminar o último símbolo obtém-se identificador

Mas a palavra vazia não é identificador.


Por exemplo, consideremos a sucessão ω = ab∗4d . Apliquemos a segunda
definição
ab∗4d → ab∗4 → ab∗
O último símbolo não é letra nem algarismo. Então a palavra ω não é identifi-
cador.
Como já temos visto dos exemplos a parte recursiva (7.2) pode ser invertida e
apresentada numa forma inversa que permita verificar se um elemento pertence
ou não ao conjunto ao considerar. Para obter uma forma inversa é preciso
inverter cada uma das regras, isto é, achar o bloco (s1 , . . . , sk ) a partir do
elemento s
s → (s1 , . . . , sk ). (7.4)
Nota 1. A primeira forma de definição serve para construir (derivar) elementos
do conjunto definido, mas a segunda é para verificar se um objecto dado é
elemento do conjunto ou não.
No exemplo 7.3 a forma inversa da parte recursiva da definição é
(R’) n ∈ A se n/3 ∈ A ou se 2n + 1 ∈ A .
1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 99

O exemplo 7.3 mostra uma situação quando um elemento do conjunto pode


ter derivado a partir de diferentes elementos (usando regras diferentes ou uma
regra). Como vamos ver, é importante as vezes evitar esta situação e elaborar
definições quando qualquer elemento do conjunto tenha caminho único de deri-
vação. Quer dizer, para qualquer elemento x seja possível indicar de maneira
única os elementos precedentes (a partir dos quais pode ser derivado o elemento
x ).
Definição 7.2 (Condição DU ). Se qualquer elemento de um conjunto definido
recursivamente pode ser construído de maneira única (determina-se de maneira
única), diz-se que a definição é determinada unicamente. Neste caso vamos
dizer que a definição satisfaz a condição DU .
No exemplo 7.3 a definição do conjunto S não é determinado unicamente
(não satisfaz a condição DU ).
Exemplo 7.5. Seja Σ = {a, b} . Consideremos a definição:
(B) Σ ⊂ S ;
(R) Se w ∈ S então a concatenação awb ∈ S (aqui w é nome duma palavra,
i.e., a variável os valores da qual são palavras).
Neste exemplo o conjunto inicial X = Σ = {a, b} . Temos uma única regra
na parte recursiva, a letra w usa-se na regra para designar só uma sucessão
e não é letra própria. Se aplicarmos a regra (R) aos elementos a e b obte-
remos as palavras aab e abb respectivamente. Segunda aplicação produz as
sucessões aaabb e aabbb . Surge a suposição que o conjunto S consiste das
palavras da forma aa . . . abb . . . b com número n de a e número n − 1 de b
ou reciprocamente.
A forma inversa:
(R’) w ∈ S se a primeira letra é a , a última é b , isto é, w = aw′ b , e se
w′ ∈ S . Mas a palavra vazia λ ∈
/S
As definições consideradas têm formas inversas simples, porque qualquer que
seja um elemento x do conjunto definido é possível indicar um elemento a partir
do qual o elemento x foi formado. Mas existem situações mais complicadas.
Exemplo 7.6. É possível determinar o conjunto de árvores finitas recursivamente.
Diz-se que o grafo G′ é obtido do grafo G por meio de ligação com folha v no
caso

1. V (G′ ) = V (G) ∪ {v} 6= V (G) ,


2. E(G′ ) = E(G) ∪ {e} onde o arco e liga v com um vértice de G .

Definição. A classe de árvores determina-se recursivamente:

(B) Cada grafo de 1 vértice sem arcos é árvore (trivial);


(R) Se T é árvore e T ′ é obtido de T por meio de ligação com folha então
T ′ é árvore.

Claro que esta definição não é determinada unicamente (não satisfaz a con-
dição DU )
100 CAPÍTULO 7. RECURSIVIDADE GERAL

Exemplo 7.7. Consideremos o conjunto S determinado por


(B) 1 ∈ S ;
(R) (regra 1) se n ∈ S então 2n ∈ S , (regra 2) se 3n + 1 ∈ S com n ímpar
então n ∈ S .
A forma inversa para (R):
(R’) n ∈ S se n é par e n/2 ∈ S (regra 1), ou n é ímpar e 3n + 1 ∈ S (regra
2).
Como podemos ver, qualquer elemento do S tem definição única.
Existe a suposição que S = N mas este hipótese ninguém não demonstrou.

1.4 Princípio generalizado da indução matemática


No princípio de indução matemática considera-se o conjunto N de todos os
números naturais e uma proposição P (n) dada sobre este conjunto. A genera-
lização consiste em considerar um conjunto definido recursivamente, em vez do
conjunto N .
Seja dada uma definição recursiva de um conjunto S (definição 7.1) e uma
proposição P (s) definida sobre S .
Teorema 7.1 (Indução geral). Suponhamos que P (s) satisfaz as duas condi-
ções
(B) P (s) é verdadeiro para todos s ∈ X e
(R) P (s) é verdadeiro sempre que s pode ser produzido de outros elementos
t ∈ S para os quais P (t) é verdadeiro, isto é, para cada uma das regras
s = r(s1 , . . . , sm ) temos a implicação verdadeira

P (s1 ) ∧ P (s2 ) ∧ · · · ∧ P (sm ) → P (s). (7.5)

Então P (s) é verdadeiro qualquer que seja s ∈ S .


Demonstração. Seja S0 = X . Seja S1 o conjunto de todos os elementos do
X e elementos que podem ser construídos por meio de aplicação de uma das
regras aos elementos do conjunto X . De maneira análoga podemos considerar
os conjuntos S2 , S3 , . . . , Sn , . . . onde

Sn = Sn−1 ∪ Tn

onde Tn é o conjunto de todos os elementos que podem ser construídos a partir


dos elementos do Sn−1 . Notemos que qualquer elemento do conjunto Tn pode
ser construído aplicando as regras n vezes exactamente. Claro que

[
S= Sn .
n=0

Consideremos a proposição:

M (n) = ∀(s ∈ Sn )P (s).


1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 101

Claro que suficiente demonstrar que M (n) é verdadeiro qualquer que seja
n ∈ {0, 1, 2, . . .} . Para isso consideremos a indução. Se n = 0 a proposição
M (0) é verdadeira, porque P (s) é verdadeira para s ∈ S0 = X . Demonstre-
mos a implicação
M (k) → M (k + 1).
Seja s ∈ Sk+1 = Sk ∪ Tk+1 . Se s ∈ Sk , P (s) é verdadeira segundo a suposição
sobre M (k) . Se s ∈ Tk+1 ,

s = r(s1 , . . . , sm )

com P (s1 ), P (s2 ), . . . , P (sm ) verdadeiras. Daqui e da implicação 7.5 podemos


afirmar que P (s) é verdadeira.
Nota 1. Consideremos uma interpretação do princípio em termos de conjuntos.
Seja TP = {s : P (s)} , isto é, TP é o conjunto de todos os elementos s que
satisfazem à condição P (s) . Notemos que sempre s percorre não só o conjunto
S mas o conjunto que envolve o S . O conteúdo do teorema 7.1 é

S ⊂ TP

Agora consideremos vários exemplos para mostrar aplicação do teorema 7.1.


Exemplo 7.8. Para a definição recursiva do conjunto S no exemplo 7.1 na
página 95 demonstremos que cada elemento x ∈ S tem a forma x = 2m onde
m ≥ 0 é um inteiro.

Base 1 = 20 é verdadeiro.
Parte recursiva Conforme a regra x = 2n, n ∈ S . Segundo a suposição
n = 2m o elemento x = 2 · 2m = 2m+1 também tem forma da potência
de expoente inteira m + 1 com base 2 .

Exemplo 7.9. Consideremos o conjunto S definido no exemplo 7.5. Demons-


tremos que qualquer elemento s ∈ S tem uma das formas s = an bn+1 ou
s = an+1 bn onde n ≥ 0 . Aqui usa-se a notação reduzida an = aa . . . a} .
| {z
n
Base. a = a1 b0 , b = a0 b1 .
Indução. awb = aan bn+1 b = an+1 bn+2 ou awb = aan+1 bn b = an+2 bn+1 .
Exemplo 7.10. Consideremos um conjunto F das sucessões binárias

ω = (a1 , a2 , . . . , an )

onde ai ∈ {0, 1} . Nas regras a seguir vamos usar a designação ω ∗ ω1 para a


concatenação das sucessões ω e ω1 , por exemplo

(1, 0, 1) ∗ (0, 0, 1) = (1, 0, 1, 0, 0, 1).

Vamos usar também a notação reduzida 101 ∗ 001 = 101001 .


(B) (1) ∈ F
(R) se ω ∈ F então as sucessões ω ∗ 1 e ω ∗ 01 pertencem ao conjunto F .
102 CAPÍTULO 7. RECURSIVIDADE GERAL

Investiguemos o conjunto F por meio de dedução de vários elementos do con-


junto:
1 → 11 → 111 → . . . , 1 → 101 → 1011 → 101101.
Uma conclusão que pode-se deduzida daqui é: qualquer ω ∈ F não tem dois
zeros consecutivos. Notemos também que o primeiro e o último elemento são
unidades. Demonstremos isto por meio do teorema 7.1:
Base. A sucessão de um elemento (1) não tem zeros e o primeiro e o último
elementos são unidades.
Indução. Seja ω ∈ A e satisfaz as condições dadas. Claro que ω ∗ 1 satisfaz
também as mesmas. O mesmo podemos afirmar e para a sucessão ω ∗ 01 . De
fato, o penúltimo zero não tem zeros adjacentes, porque a sucessão ω termina
em 1 .

1.5 Funções sobre conjuntos dados recursivamente


Se um conjunto S é definido recursivamente, é natural usar recursividade para
definir uma função sobre o S . Ou seja f : S → A onde A conjunto de valores
de f . Vamos usar frequentemente A = N , mas existem problemas de aplica-
ções com o conjunto A tendo uma estrutura mais complicada, por exemplo, o
conjunto A pode coincidir com S .
A estrutura de definição de uma função é a seguinte. Para os elementos do
conjunto X os valores da função definam-se directamente. Para cada uma das
regras s = r(s1 , . . . , sm ) deve ser apresentada uma relação da forma

f (s) = Φ(f (s1 ), . . . , f (sm ))

ou mais geral
f (s) = Φ(f (s1 ), . . . , f (sm ), s1 , . . . , sm ).
Em palavras, o valor da função determina-se a partir dos valores da mesma
função sobre os elementos s1 , . . . , sm e provavelmente usando os próprios ele-
mentos.

Definição 7.3. A estrutura da definição recursiva de uma função f tem a


forma
(B) f (s) = {uma definição directa} se s ∈ X
(R) Para cada uma das regras da forma s = r(s1 , . . . , sm )

f (s) = Φ(f (s1 ), . . . , f (sm ), s1 , . . . , sm ).

Consideremos vários exemplos.


Exemplo 7.11. Consideremos mais uma vez o conjunto S :
(B) 1 ∈ S
(R) Se n ∈ S então 2n ∈ S .
Podemos definir sobre o S , por exemplo, a função σ de maneira seguinte
1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 103

• σ(1) = 1
• se x ∈ S , σ(2x) = σ(x) + 2x
Verifique que σ(x) = 2x − 1 .
Exemplo 7.12. Consideremos a definição do conjunto Σ∗ das sucessões de sím-
bolos ou palavras de um alfabeto (um conjunto finito) Σ .
(B) λ ∈ Σ∗ onde λ é palavra vazia
(R) Se ω ∈ Σ∗ e x ∈ Σ então ωx ∈ Σ∗
As letras ω e x são variáveis e servem para indicar a regra, ωx é uma conca-
tenação de uma palavra ω ∈ Σ∗ e uma letra x ∈ Σ .
Determinemos o comprimento l(ω) de uma palavra ω ∈ Σ∗ por meio da
definição:
• l(λ) = 0
• se ω ∈ Σ∗ e x ∈ Σ então l(ωx) = l(ω) + 1
A cada uma das regras da definição do conjunto corresponde uma relação
na definição de uma função. Por exemplo, consideremos mais uma definição
recursiva de um conjunto de números naturais A ⊂ N .
Exemplo 7.13. Dada uma definição de um conjunto A :
(B) 1 ∈ A
(R) Se x ∈ A então 2x ∈ A e 2x + 1 ∈ A
Qualquer função f : A → B que corresponde à definição deve ter a forma
• f (1) = . . .
• se x ∈ A então f (2x) = Φ(f (x)) e f (2x + 1) = Ψ(f (x))
Aqui Φ(f (x)) e Ψ(f (x)) são funções dadas que permitem encontrar valores a
partir do valor f (x) . Por exemplo
• f (1) = 1
• se x ∈ A então f (2x) = f (x) e f (2x + 1) = f (x) + 1
Exemplos de cálculo: f (2) = f (1) = 1 , f (5) = f (2) + 1 = 2 , f (11) = f (5) +
1 = 3.
É cómodo usar a forma inversa da definição do conjunto para definir funções.
No último exemplo a função f pode ser definida de maneira seguinte
• f (1) = 1
• f (x) = f (x/2) se x é par, e f (x) = f ( x−1
2 ) + 1 se x é ímpar

Consideremos a questão de ambiguidade. Nos exemplos precedentes os con-


juntos satisfazem à condição DU . Mas se o mesmo elemento x pode ser
obtido usando regras diferentes, o cálculo pode dar diferentes valores para o
mesmo f (x) , isto é, f (x) não tem valor único. Neste caso a definição não é
correcta.
104 CAPÍTULO 7. RECURSIVIDADE GERAL

Exemplo 7.14. Seja f : N × N → N a função definida de maneira seguinte


• f (1, 1) = 1
• f (m + 1, n) = 2f (m, n) , f (m, n + 1) = 1 + f (m, n) .
Esta definição é correcta? Não. Podemos encontrar f (2, 2) usando os dois
caminhos:

f (2, 2) = 2f (1, 2) = 2(1 + f (1, 1)) = 4

ou

f (2, 2) = 1 + f (2, 1) = 1 + 2f (1, 1) = 3.

Claro que a causa é que a definição correspondente do conjunto não satisfaz


à condição DU :
(B) (1, 1) ∈ A
(R) Se (m, n) ∈ A então (m + 1, n), (m, n + 1) ∈ A .

1.6 Árvores binárias e árvores com raízes


B -objectos
Árvores binárias é um objecto que tem natureza recursiva. De facto, conside-
remos as subárvores esquerda e direita de uma árvore binária. É fácil ver que
cada uma delas têm a mesma estrutura. Esta estrutura será usada na definição
abaixo. Primeiro vejamos uma definição de um conjunto B .
Definição 7.4 ( B -objectos). Seja X um conjunto que pode ser chamado con-
junto universo. O conjunto B é definido por meio da definição recursiva:
(B) X ⊂ B .
(R) Se r ∈ X, T1 , T2 ∈ B então os ternos ordenados

(r, T1 , T2 ), (r, ·, T2 ), (r, T1 , ·) ∈ B.

O símbolo ’ · ‘ vamos chamar símbolo vazio. Os elementos do conjunto B vamos


chamar B -objectos.
Investiguemos a definição. Seja X = {a, b, c, d, . . . , z} . Podemos formar,
por exemplo, os seguintes B -objectos:

(a, b, c), (a, d, e), (f, (a, b, c), d), (f, (a, b, c), (a, d, e)), (f, ·, (a, d, e)), . . .

Vamos chamar o primeiro elemento do terno (r, T1 , T2 ) por raiz, segundo por
sub B -objecto esquerdo e terceiro por sub B -objecto direito. Por exemplo no
B -objecto (f, (a, b, c), d) a raiz é f , o sub B -objecto esquerdo é (a, b, c) e o
sub B -objecto direito é d . O símbolo vazio · serve para indicar que o sub B -
objecto respectivo não é apresentado (é ausente).
1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 105

B -objectos e árvores binárias


Suponhamos que em qualquer processo de construção de B -objectos todos os
elementos do conjunto X são diferentes. Nesta restrição a cada um elemento do
conjunto B corresponde uma árvore binária se introduzirmos os arcos orientados
da raiz para sub B -objectos. Por exemplo ao terno (f, (a, b, c), d) correspondem
os arcos
f → a, f → d, a → b, a → c.
O símbolo vazio utiliza-se no caso um vértice não tem um filho (esquerdo ou
direito).
Conclusão. Temos uma definição recursiva para o conjunto auxiliar B mas
é possível não distinguir este conjunto e conjunto de árvores binárias (com con-
dição que na formação de B -objectos utilizam-se elementos do X diferentes).
Neste sentido o conjunto B e o conjunto de árvores binárias são isomorfos.

Árvores binárias
Aqui consideremos uma definição recursiva de árvores binárias que não utiliza
B -objectos. É cómodo introduzir previamente uma construção que vamos cha-
mar construção de ligamento de dois grafos. Sejam G e H dois grafos com
conjuntos V (G) ∩ V (H) = ∅ disjuntos e g ∈ G , h ∈ H dois vértices marca-
dos. Então temos os dois grafos (g, G) e (h, H) com vértices marcados. Para
simplicidade vamos omitir o vértice marcado e escrever G e H se está claro
que vértice está marcado.
Definição 7.5 (Construção de ligamento de dois grafos). Diz-se que o grafo

T = (V, E, γ)

com vértice marcado r é obtido por meio da construção de ligamento dos grafos
(veja a figura 7.1) com vértices marcados (g, G) e (h, H) e do elemento r se:
1. r ∈ / V (H) , V (G) ∩ V (H) = ∅ ,
/ V (G), r ∈
2. V = V (G) ∪ V (H) ∪ {r} ,
3. E = E(G) ∪ E(H) ∪ {e1 , e2 } , onde o arco e1 liga r com g , e2 liga r
com h .
O vértice r é o vértice marcado do grafo R .
É cómodo introduzir a notação

(r, T ) = lig(r, (g, G), (h, H))

ou simplesmente
T = lig(r, G, H). (7.6)
Nota 2. Os subgrafos G e H vamos chamar subgrafo esquerdo e subgrafo
direito respectivamente e usar a notação

G = esq(T ), H = dir(T ). (7.7)

Agora consideremos uma definição recursiva de árvores binárias regulares


106 CAPÍTULO 7. RECURSIVIDADE GERAL

lig(r, G, H)
r
e1 e2
g h

G H

Figura 7.1: Ligação de dois grafos

Definição 7.6 (Árvores binárias regulares). Seja U um conjunto universo.


Defina-se o conjunto Areg de árvores binárias regulares com vértices do con-
junto U :
(B) Se T é um grafo com único vértice r ∈ U e sem arcos então este grafo
T ∈ Areg ,
(R) Se G, H ∈ Areg , r ∈ U então T = lig(r, G, H) ∈ Areg 1
Note que deve ser V (G) ∩ V (H) = ∅ , r ∈
/ V (G) ∩ V (H) .
É cómodo introduzir a notação: ⊙ x é árvore que tem único vértice x . Por
exemplo, a árvore na figura 7.2 pode ser representada na forma
lig(1, lig(2, ⊙ 4, lig(5, ⊙ 6, ⊙ 7)), ⊙ 3).

2
3

4 5

6 7

Figura 7.2: Árvore binária

Para formar uma definição de árvores binárias que não são necessariamente
regulares e realizar isto de maneira mais simples vamos considerar árvores vazias.
Árvores vazias vamos usar para indicar faltas de uma (ou duas) das subárvo-
res. Designemos árvore vazia pelo símbolo nil . Temos que mudar também o
conteúdo da operação lig(r, G, H) . Por exemplo, no caso G = nil , o grafo
lig(r, nil, H) não tem arco que ligue o r com vértice não existente do grafo nil .
Vamos ter a seguinte definição
Definição 7.7 (Árvores binárias). Defina-se o conjunto Ab :
(B) nil ∈ Ab ,
(R) Se G, H ∈ Ab , então T = lig(r, G, H) ∈ Ab .
1 mais precisamente, se (g, G), (h, H) ∈ Areg então (r, T ) = lig(r, (g, G), (h, H)) ∈ Areg
1. CONCEITO GERAL DA DEFINIÇÃO RECURSIVA 107

Árvores com raízes


De mesma maneira pode-se construir uma definição recursiva de Árvores com
raízes. Antes que dar definição consideremos uma construção de ligamento de
grafos que pode ser dada análoga com que foi feita para árvores binárias. Sejam

G1 = (V1 , E1 , γ1 ), . . . , Gk = (Vk , Ek , γk )

grafos com os conjuntos V1 , . . . , Vk de vértices disjuntos. Seja ri ∈ Vi um


elemento marcado. Então, temos os grafos com elementos marcados (distintos):

(r1 , G1 ), (r2 , G2 ), . . . , (rk , Gk ).

lig(r, G1 , G1 , G3 )
r
e1 e3
r1 e2 r3
r2
G1 G3
G2

Figura 7.3: Construção de ligamento

Definição 7.8 (Construção de ligamento). Diz-se que o grafo com elemento


marcado r , (r, G) = (r, (V, E, γ)) é obtido por meio da construção de ligamento
dos grafos (veja a figura 7.3) com elementos marcados

(r1 , G1 ), (r2 , G2 ), . . . , (rk , Gk )

e de um elemento r se:
[
1. Os conjuntos V1 , . . . , Vk são disjuntos e r ∈
/ Vi
i

2. V = V1 ∪ . . . ∪ Vk ∪ {r} , e
3. E = E1 ∪ . . . ∪ Ek ∪ {e1 , . . . , ek } , onde o arco ei liga os vértices r e ri ,
isto é, γ(ei ) = (r, ri ) .

É cómodo introduzir a notação

(r, G) = lig(r, (r1 , G1 ), (r2 , G2 ), . . . , (rk , Gk ))

ou
G = lig(r, G1 , G2 , . . . , Gk ) (7.8)
Usando esta operação de ligação podemos dar uma definição recursiva do
conjunto Araiz de árvores com raiz :
108 CAPÍTULO 7. RECURSIVIDADE GERAL

Definição 7.9 (Árvores com raiz).


(B) Se T é um grafo com único vértice r ( T = ⊙ r ) e sem arcos então
T ∈ Araiz ;
(R) Se T é obtido de T1 , T2 , . . . , Tk ∈ Araiz e de um vértice r ∈ U por meio
da construção de ligamento:

T = lig(r, T1 , T2 , . . . , Tk )

então T ∈ Araiz .
Uma árvore obtida por meio da construção de ligamento veja na figura 7.4:

T = lig(r, T1 , T2 , T3 )

onde
T1 = lig(r1 , ⊙ a, lig(b, ⊙ c, ⊙ d)),
T2 = lig(r2 , lig(e, ⊙ f )),
T3 = lig(r3 , ⊙ g, ⊙ h, ⊙ i)

r1 r3
r2

Figura 7.4: Ligamento de árvores

Usando as definições recursivas de árvores não é difícil definir funções sobre


o conjunto de árvores.
Exemplo 7.15. Determinemos altura de árvores de raízes usando a definição
recursiva. Defina-se a função h(T ) :
(B) Altura de árvore T = ⊙ x com único vértice é zero: h(⊙ x) = 0 .
(R) Se T = lig(r, T1 , . . . , Tk ) então

h(T ) = 1 + max{h(T1 ), . . . , h(Tk )}.

2 Algoritmos recursivos
Usando as definições recursivas pode-se construir algoritmos recursivos. Vamos
seguir ao esquema

Definição recursiva −→ Algoritmo recursivo

Suponhamos que tem-se uma definição recursiva de um conjunto S . Os algo-


ritmos podem ser classificadas e separadas em três seguintes partes
2. ALGORITMOS RECURSIVOS 109

1. Cálculo de funções dadas recursivamente sobre o conjunto S .


2. Prova que elemento dado pertence ao S .
3. Produção (ou percurso) dos elementos do conjunto S .
É claro que cada um dos algoritmos recursivos possui as propriedades pareci-
das com definições correspondentes. Notemos que a definição recursiva consiste
de duas partes e respectivamente o algoritmo correspondente deve ter duas
partes respectivas. A primeira parte vai considerar os elementos definidos di-
rectamente e a segunda parte é a própria recursividade contendo chamadas
recursivas.

2.1 Calculo de funções dadas recursivamente


O problema consiste em Construir um algoritmo para calcular uma função dada
recursivamente sobre um conjunto S definido recursivamente.
Estrutura de definição recursiva de uma função é apresentada na definição
7.3. Construção de algoritmo consiste só em representar a definição dada na
forma usando notação específica. Mas o momento principal consiste em passar
da forma directa para a forma inversa da definição da função.
Exemplo 7.16. O conjunto de todos os números naturais pode ser definido de
maneira seguinte:
(B) 1 ∈ N .
(R) Se n ∈ N então n + 1 ∈ N .
Conforme esta definição sobre o conjunto N pode ser definida, por exemplo,
a função f (n) = n! :

f (1) = 1,
f (n + 1) = (n + 1) · f (n), se n ∈ N.

A forma inversa:

f (1) = 1,
f (n) = nf (n − 1), se n ∈ N e n > 1.

Para calcular esta função vamos ter algoritmo recursivo (função) na língua
de programação Pascal
Function f(n: integer): integer;
begin
if n=1 then
f:=1
else
f:=n*f(n-1)
End;
Nota importante: o conjunto N é determinado unicamente, isto é, qualquer
elemento tem definição única. Isto permite dar definição correta para função
f (n) . O elemento n tem único elemento n − 1 a partir do qual n pode ser
derivado: n − 1 → n .
110 CAPÍTULO 7. RECURSIVIDADE GERAL

Exemplo 7.17. Consideremos a função sobre o conjunto F definido no exemplo


7.10 (pagina 101) que calcula o número dos zeros da sucessão:


f (1) = 0,
f (ω ∗ 1) = f (ω),


f (ω ∗ 01) = f (ω) + 1.

Para construir a forma inversa notemos que qualquer ω ∈ F termina em 1 :




0, se ω = 1,
f (ω) = f (ω1 ), se ω = ω1 ∗ 1 e ω1 = ω2 ∗ 1,


f (ω2 ) + 1, se ω = ω2 ∗ 01

Notemos que a definição é correta só para ω ∈ F . O algoritmo apresentado na


figura 7.5 pressupõe que o argumento omega é um elemento do conjunto F .

function f(omega: string): integer;


var l: integer;
begin
l:=length(omega);
if omega=’1’ then
f := 0
else if copy(omega,l-1,l)=’01’ then
f := 1 + f(copy(omega,1,l-2))
else
f := f(copy(omega,1,l-1))
end;

Figura 7.5: Algoritmo no exemplo 7.17

O nosso objectivo é não considerar eficiência do algoritmo. Este exemplo


apresenta só uma aplicação da definição recursiva para construir algoritmo.

Exemplo de uma função para árvores binárias


Exemplo 7.18. Consideremos um algoritmo para calcular altura de uma árvore
binária regular. Antes de elaborar o próprio algoritmo consideremos a definição
de altura (veja o exemplo 7.15):

h(⊙ x) = 0,
h(lig(x, A1 , A2 )) = 1 + max{h(A1 ), h(A2 )}

A forma inversa:

h(⊙ x) = 0,
h(A) = 1 + max{h(esq(A)), h(dir(A))}

As esq(A) e dir(A) representam as subárvores esquerda e direita da árvore A .


O algoritmo podemos ver na figura 7.6.
2. ALGORITMOS RECURSIVOS 111

type arvorebin = ...

function h(A: arvorebin): integer;


begin
if A tem único vértice then
h := 0
else
h := 1 + max(esq(A),dir(A))
end;

Figura 7.6: Algoritmo para encontrar altura de uma árvore binária regular

2.2 Prova
Consideremos uma definição recursiva e o problema de prova se um elemento s
pertence ao conjunto S , isto é, se s satisfaz à definição recursiva. A distinção
principal do problema de prova e do cálculo de uma função consiste em domínio.
Cálculo de uma função só pode ser considerado sobre o conjunto S definido
recursivamente. Mas aqui o domínio D contém S , D ⊃ S , e é definido de
uma maneira mais simples.
Exemplo 7.19. Consideremos a definição do conjunto S no exemplo 7.1:
(B) 1 ∈ S
(R) Se n ∈ S então 2n ∈ S .
Sempre temos que encontrar uma forma inversa da definição para construir um
algoritmo:
(B) 1 ∈ S
(R’) m ∈ S se m é par e m/2 ∈ S
É importante: na forma inversa são apresentadas as condições suficientes e
necessárias da inclusão m ∈ S . Então, se m 6= 1 e m é ímpar, m ∈ S !
Para verificar se um número n pertence ao conjunto S vejamos uma função
f : S → {0, 1} tal que f (m) = 1 para m ∈ S e f (m) = 0 se m ∈ /S.
Segundo as regras (B) e (R’) teremos


1, se m = 1
f (m) = f (m/2) se m é par


0, se m é ímpar e m 6= 1.

O algoritmo correspondente pode-se exprimir assim


Function f(m: integer): integer;
begin
if m=1 then
f:=1
else if not odd(n) {m ’e par} then
f:=f(m div 2)
112 CAPÍTULO 7. RECURSIVIDADE GERAL

else {m ’e ímpar, m>1}


f:=0
End;
A chamada
Begin
write(f(12),f(8))
End.
produz os números 0 e 1.
Como funciona o algoritmo? A chamada f(12) leva a chamada f(6), depois
f(3) dá logo 0. Podemos representar isto pelo esquema:
f (12) → f (6) → f (3) = 0.
Mais uma chamada: f (8) → f (4) → f (2) → f (1) = 1 .
Outra forma do mesmo algoritmo que usa o tipo boolean em Pascal:
Function pertence(m: integer): boolean;
begin
pertence := (n=1) or (not odd(m) and pertence(m div 2))
end;
Note que esta forma não considera a terceira variante com resposta negativa!

Forma geral
Inicialmente temos um domínio D que contém S . O argumento da função
recursiva é um elemento x do conjunto D . Vamos construir uma função que
produz o valor 1 se o elemento x pertence ao conjunto S e o valor 0 caso
contrário, isto é, x ∈ D \ S .
Notemos que em geral a forma inversa de definição recursiva é a seguinte:
(B) x ∈ X
(R’) x ∈ X se o x pode ser produzido por meio de uma das regras a partir
de elementos x1 , . . . , xk ∈ S
Note que a definição pode ter várias regras e o resultado vai ser positivo se pelo
menos uma das regras apresenta o resultado positivo. Isto podemos chamar por
o princípio de disjunção.
Daqui a prova deve conter as partes:
Base: Se x ∈ X então f (x) = 1 .
Regras: Se x pode ser produzido a partir de vários elementos x1 , . . . , xk e se
f (xi ) = 1 para todos i = 1, . . . , k então f (x) = 1 .
Se o resultado é Negativo: No caso contrário f (x) = 0 .
Exemplo 7.20. No exercício 7.10 (pagina 101) é determinado o conjunto F de
sucessões binárias ω formadas dos 0 e 1 . Vamos construir um algoritmo para
verificar inclusão ω ∈ F i.e. construir uma função: f (ω) = 1 se ω ∈ F e
f (ω) = 0 se ω ∈ / F.
Notemos que da definição podemos concluir que o último algarismo de cada
linha ω ∈ F é 1 . A forma inversa da definição:
2. ALGORITMOS RECURSIVOS 113

(B) 1 ∈ F
(R1) ω ∈ F se ω = ω1 ∗ 1 e ω1 ∈ F
(R2) ω ∈ F se ω = ω2 ∗ 01 e ω2 ∈ F .
A resposta negativa vamos ter se não funcionam todas as três alternativas.
Daqui temos a definição da função f :
• f (ω) = 1 se pelo menos uma das condições é verdadeira:
1. ω = 1
2. ω = ω1 ∗ 1 e f (ω1 ) = 1
3. ω = ω2 ∗ 01 e f (ω) = 1
• f (ω) = 0 no caso contrário
Mas para optimizar o algoritmo notemos que se ω termina por 0 ou ω = λ
(sucessão vazia) então nenhum dos primeiros três casos não serve. Se ω = ω1 ∗ 0
ou ω = λ , f (ω) = 0 .
Agora é fácil construir o algoritmo correspondente em Pascal (com exemplo
de uma chamada):

function f(s: string): integer;


var l: integer;
begin
l:=length(s);
if (l=0) or (s[l]=’0’) then
f:=0
else if s=’1’ then
f:=1
else if s[l-1]=’0’ {s=s1*’01’} then
f:=f(copy(s,1,l-2))
else {s=s1*’11’}
f:=f(copy(s,1,l-1));
end;
Begin
writeln(f(’100101’))
End.

Pode ser mais natural usar o tipo boolean do Pascal:


function f(s: string): boolean;
var l: integer;
begin
l:=length(s);
f := (s=’1’)
or ((s[l]=’1’) and f(copy(s,1,l-1))
or ((copy(s,l-1,l)=’01’) and f(copy(s,1,l-2))

end;
114 CAPÍTULO 7. RECURSIVIDADE GERAL

2.3 Percurso dos elementos de um conjunto


O exemplo a seguir é simples mas pode servir como base de raciocínios em casos
mais complicados
Exemplo 7.21. Seja B o conjunto de todas as sucessões binárias ′ 1001′ ,′ 01′
etc. Este conjunto pode ser definido recursivamente
(B) λ ∈ B ( λ é a sucessão vazia)
(R) Se ω ∈ B então ω ∗ 0 ∈ B e ω ∗ 1 ∈ B .
Introduzimos a designação: B(ω) é o conjunto de todas as sucessões binárias
com parte inicial ω , isto é, o subconjunto do B das sucessões deriváveis a
partir da ω . Daqui vamos ter as duas relações

B = B(λ) (7.9)
[
B(ω) = B(ω ∗ 0) B(ω ∗ 1). (7.10)

O conjunto B é infinito. Para resolver um problema real é preciso introduzir


uma restrição para obter um conjunto finito. Por exemplo, consideremos o
conjunto de todas as sucessões de comprimento ≤ n . Vamos usar a designação
Bn para este subconjunto. Seja length(ω) o comprimento da sucessão ω .
Consideremos as seguintes relações

Bn = Bn (λ) (7.11)

Bn (ω) = {ω},
 se length(ω) = n,
Bn (ω) = ∅, se length(ω) > n, (7.12)

 S
Bn (ω) = Bn (ω ∗ 0) Bn (ω ∗ 1), no caso contrário.

Daqui vamos ter o algoritmo na notação do Pascal (com exemplo de uma


chamada):
procedure B(om: string; n: integer);
var l: integer;
begin
l:=length(om);
if l=n then
writeln(om)
else if l<n then
begin
B(om+’0’,n);
B(om+’1’,n)
end
end;
begin
B(’’,n)
end.
2. ALGORITMOS RECURSIVOS 115

Exemplo 7.22. Consideremos mais uma vez o conjunto F definido no exercício


7.10 (pagina 101) e o problema: encontrar todas as sucessões que têm compri-
mento n .
Sejam ω ∈ F sucessão arbitrária e F (ω) ⊂ F o conjunto de todas as su-
cessões de F que podem ser geradas a partir da sucessão ω . Da definição
segue

F = F ((1))
F (ω) = F (ω ∗ 1) ∪ F (ω ∗ 01).

Daqui decorre o algoritmo (com exemplo de uma chamada):

const n=6;
procedure Fib(om: string);
begin
if length(om)=n then
writeln(om)
else if length(om)<n then
begin
Fib(om+’1’);
Fib(om+’01’)
end
end;
Begin
Fib(’1’)
End.

Exemplo 7.23. Consideremos o seguinte problema (de Gauss). Dispor no quadro


de xadrez 8 rainhas de modo que 2 rainhas arbitrárias não têm encontro: cada
um par de rainhas esta situada sobre diferentes linhas horizontais, verticais e
diagonais. Observemos que 8 rainhas devem dispor-se sobre diferentes verti-
cais. Sobre a figura 7.7 podemos ver uma das soluções. Sejam f1 , f2 , . . . f8 os
números das linhas horizontais que podem ocupar rainhas. Então cada sucessão
ordenada ω = (f1 , f2 , . . . f8 ) determina disposição de rainhas. No desenho 7.7
a disposição é
ω = (1, 5, 8, 6, 3, 7, 2, 4).

Para resolver o problema consideremos o conjunto S de disposições acei-


táveis com número arbitrário de rainhas. Vamos considerar as disposições
(f1 , . . . , fk ) onde f1 , . . . , fk são posições de k rainhas que ocupam as primeiras
k verticais. Claro que k = 8 corresponde a uma solução, k = 0 significa que
o quadro está vazio.
Podemos determinar subconjunto S de todas as disposições recursivamente
de modo seguinte:

(B) λ ∈ S ( λ = () é a sucessão vazia).


(R) Se ω = (f1 , f2 , . . . , fk ) ∈ S então ω ∗ v = (f1 , f2 , . . . , fk , v) ∈ S se a
posição v não contradiz com cada um das primeiras k rainhas, i.e. se

v 6= fi e |v − fi | 6= k + 1 − i ∀i = 1, . . . , k
116 CAPÍTULO 7. RECURSIVIDADE GERAL

Figura 7.7: Uma solução do problema de Gauss

Seja S(ω) o conjunto de todas as sucessões de S que podem ser geradas a


partir da sucessão ω ∈ S . Da definição temos as relações:


S(ω) = {ω}, se length(ω) = 8,
[
 S(ω) = S(ω ∗ v), se length(ω) < 8 onde v não contradiz com ω.

v∈{1,...,8}

Todo o conjunto S tem a representação:


S = S(λ)
O algoritmo tem a seguinte estrutura usando a notação de Pascal:
procedure Rainhas(om: string);
begin
if length(om)=n then
writeln(om)
else if length(om)<n then
for v:=1 to 8 do
if om*v satisfaz a condicao necessaria then
Rainhas(om*v)
end;

3 Questões principais
1. Dada uma definicao recursiva de um conjunto A
(a) Usar a definição para construir elementos x ∈ A
(b) Quantos passos é necessário para construir?
(c) Achar o conjunto T1 (veja a demonstração do teorema 7.1), o con-
junto T2 , . . .
(d) Achar o conjunto A (achar uma descrição directa) se for possível
2. Construir uma forma inversa (forma de verificação) para uma definição
recursiva. Usar a forma obtida para demonstrar que x ∈ A ou x ∈ / A.
Verificar se a definição dada é determinada unicamente?
4. EXERCÍCIOS 117

3. Usar o Principio generalizado de indução (teorema 7.1) para demonstrar


uma proposição (um predicado) definida sobre o conjunto.
4. Funções: verificar se a definição de uma função definida sobre o conjunto
é correta? Calcular os valores da função (usando métodos iterativo e
recursivo).
5. Dar uma definição recursiva de uma função
6. Construir algoritmos recursivos para:
(a) calcular os valores de uma função
(b) verificar se um elemento x ∈ A
(c) realizar o percurso do conjunto A ou um subconjunto do A

4 Exercícios
Definições recursivas de conjuntos. Funções
1. Temos a definição recursiva de um conjunto A ⊂ N :
(B) 1 ∈ A
(R) Se x ∈ A então x + 4 ∈ A .

(a) Achar o conjunto A


(b) Construir uma forma inversa da definição
(c) Mostrar que 3 ∈
/A

2. Consideremos a definição
(B) 2, 3 ∈ F
(R) Se x, y ∈ F então xy ∈ F .

(a) Mostrar que 24 ∈ F


(b) Construir uma forma inversa da definição
(c) Mostrar que 30 ∈
/F
(d) Achar o conjunto F

3. Consideremos a definição de um conjunto A ⊂ Z


(B) 5, 8 ∈ A
(R) Se x, y ∈ A então x + y ∈ A e x − y ∈ A .

(a) Mostrar que 1 ∈ A


(b) Mostrar que A = Z
(c) Se em vez de 5 e 8 considerar dois números inteiros a e b , qual
será a condição para A = Z ?

4. Consideremos a definição no exemplo 7.2.


118 CAPÍTULO 7. RECURSIVIDADE GERAL

(a) Verifique se as sucessões aaab, aabb, abab são elementos do M ?


(b) Usando a forma inversa verifique que aaabb ∈ M
5. Seja S o conjunto definido no exemplo 7.1 (página 95).
(a) Mostrar que 2m ∈ S para todos m ∈ Z+
(b) Mostrar que se n ∈ S então n tem a forma n = 2m para certo
m ∈ Z+
(c) Concluir que S = {2m : m ∈ Z+ }
6. Seja A o conjunto definido no exemplo 7.3.
(a) Mostrar que se n ∈ A então n ≡ 0 (mod 3) ou n ≡ 1 (mod 3)
(b) Mostrar que 4, 6, 10, 12 ∈ A

7. Seja S o conjunto definido no exemplo 7.7.


(a) Mostrar que 1, 2, 3, 4, 5, 6 ∈ S
(b) Mostrar que 7 ∈ S
8. O subconjunto S de Z+ × Z+ é definido recursivamente
(B) (0, 0) ∈ S ;
(R) Se (m, n) ∈ S e m < n então (m + 1, n) ∈ S e
se (m, m) ∈ S então (0, m + 1) ∈ S .

(a) Descrever o conjunto S .


(b) Mostrar que (1, 2) ∈ S .
(c) Esta definição é determinada unicamente?

9. Repetir o exercício precedente para a definição:


(B) (0, 0) ∈ T ;
(R) Se (m, n) ∈ T então (m, n + 1) ∈ T e (m + 1, n + 1) ∈ T .
10. Consideremos a definição recursiva para um subconjunto T ⊂ Z+ × Z+ :
(B) (0, 0) ∈ T ;
(R) (m, n) ∈ T −→ (m + 1, n), (m + 1, n + 1) e (m + 1, n + 2) ∈ T .

(a) Indicar seis elementos do conjunto T .


(b) Mostrar que 2m ≥ n ∀(m, n) ∈ T .
(c) Esta definição é determinada unicamente?

11. Consideremos a seguinte definição para o subconjunto A ⊂ N × N :


(B) (1, 1) ∈ A ;
(R) (m, n) ∈ A −→ (m + 1, n) e (m, n + 1) ∈ A .

(a) Mostrar que A = N × N


4. EXERCÍCIOS 119

(b) Seja P (m, n) uma proposição dada sobre N × N . Descrever o pro-


cedimento de demonstração

∀((m, n) ∈ N × N )P (m, n)

usando o princípio generalizado da indução matemática

12. Um conjunto S ⊂ Z+ × Z+ é definido recursivamente:


(B) (0, 0) ∈ S ;
(R1) (m, 0) ∈ S → (m + 1, 0) ∈ S ,
(R2) (0, n) ∈ S → (0, n + 1) ∈ S ,
(R3) (m, n) ∈ S → (m + 1, n + 2) ∈ S .

(a) Mostrar que para qualquer (m, n) ∈ S é valida a asserção:

P (m, n) ≡ {(n é par) ∨ (n ≥ 2m + 1)}

13. Seja S o conjunto de todas as sucessões (palavras) das letras a e b em


que todas as letras a precedem às letras b . Por exemplo aaab, abb, a, b
e sucessão vazia (designemos por λ ). Mas bab ∈ / S.
/ S, ba ∈
(a) Dar definição recursiva do S .
(b) Use esta definição para mostrar que abbb ∈ S .
(c) Esta definição é determinada unicamente?
Resolução. A primeira definição:
(B) λ ∈ S
(R) Se s ∈ S então as ∈ S (regra 1) e sb ∈ S (regra 2).
Demonstremos que abbb ∈ S :
1 2 2 2
λ −→ a −→ ab −→ abb −→ abbb.

Existe um outro método de produção, por exemplo


2 2 1 2
λ −→ b −→ bb −→ abb −→ abbb.

Por isso a definição dada não é determinada unicamente.


Para o mesmo conjunto existe uma definição determinada unicamente:
(B) λ ∈ S
(R) Se s ∈ S então as ∈ S (regra 1) e se a primeira letra de s não é
letra a (ou s é a palavra vazia λ ) então bs ∈ S (regra 2).
Esta definição permite construir as palavras de S de maneira única, por
exemplo
2 2 2 1
λ −→ b −→ bb −→ bbb −→ abbb.

14. Consideremos uma função sobre o conjunto S definido no exercício 13.


120 CAPÍTULO 7. RECURSIVIDADE GERAL

• f (λ) = 0
• se s ∈ S então f (as) = f (s) + 1 e f (sb) = 2f (s)
Vamos experimentar:

f (a) = f (aλ) = f (λ) + 1 = 1, f (ab) = 2f (a) = 2.

mas podemos calcular o f (ab) e usando outro caminho

f (b) = f (λb) = 2f (λ) = 0, f (ab) = f (b) + 1 = 1.

Esta ambiguidade mostra que para definir funções temos de usar defini-
ções determinadas unicamente. Consideremos outra tentativa definir uma
função conforme a segunda definição do mesmo exercício.
• f (λ) = 0
• se s ∈ S então f (as) = f (s) + 1 e se a primeira letra de s não é
letra a (ou s é a palavra vazia λ ) então f (bs) = 2f (s) .
Neste caso temos único valor para f (ab) = f (b) + 1 = 2f (λ) + 1 = 1 .
15. Repetir o exercício 13 para o subconjunto T de sucessões que têm uma e
só uma letra a .
16. Seja Σ = {a, b} e um subconjunto B ⊂ Σ é definido recursivamente
(B) a e b ∈ B ;
(R) w ∈ B =⇒ abw e baw ∈ B .

(a) Construir seis elementos do B


(b) Mostrar que o comprimento de w ∈ B é ímpar
(c) A proposição inversa para a parte (b) é verdadeira?
(d) A definição é determinada unicamente?

17. Lembremos os números Cnk de combinações (coeficientes binomiais) im-


portantes em diferentes aplicações. Sabe-se que eles satisfazem às relações:
(B) Cn0 = Cnn = 1
k−1
(R) Cnk = Cn−1 k
+ Cn−1 se 0 < k < n .
Estes números são valores de uma função f (n, k) = Cnk definida sobre um
conjunto S ⊂ Z+ × Z+ :
(B) (n, 0), (n, n) ∈ S , n ∈ Z+
(R) (n − 1, k − 1), (n − 1, k) ∈ S → (n, k) ∈ S .
18. O conjunto S ⊂ Z+ × Z+ é definido recursivamente:
(B) (m, 0), (0, n) ∈ S , m, n ∈ Z+
(R) se (m − 1, n) ∈ S e (m, n − 1) ∈ S então (m, n) ∈ S .
É possível demonstrar que S = Z+ × Z+ .
4. EXERCÍCIOS 121

(a) Justificar que a definição é determinada unicamente


(b) Consideremos a função dada recursivamente sobre S

f (m, 0) = f (0, n) = 1,
f (m, n) = f (m − 1, n) + f (m, n − 1).

Calcular f (2, 3) .
Usando o princípio generalizado da indução matemática demonstrar
que
m n
f (m, n) = Cm+n = Cm+n .

19. (a) Dar uma definição recursiva para a classe de árvores m -árias regu-
lares
(b) Fazer o mesmo para as árvores m -árias completas

Exercícios em anexo. Funções


1. O conjunto Sb de todas as sucessões binárias pode ser definido de maneira
seguinte
(B) 0, 1 ∈ Sb
(R) se ω ∈ Sb então 0ω ∈ Sb e 1ω ∈ Sb .
Verifique que a função recursiva

f (0) = 0, f (1) = 1, f (0ω) = f (ω), f (1ω) = f (ω) + 1

calcula o número das unidades de ω ∈ Sb


2. Consideremos um conjunto P de sucessões binárias definido de maneira
seguinte
(B) λ ∈ P
(R) se ω ∈ P então 0ω1 ∈ P , se ω1 , ω2 ∈ P então ω1 ω2 ∈ P .

(a) Demonstre que para ω ∈ P o número dos zeros da ω é igual ao


número das unidades
(b) Demonstre que para qualquer parte inicial2 de qualquer ω ∈ P o
número dos zeros é maior ou igual do que o número das unidades
(c) Demonstre que qualquer sucessão binária que satisfaz as condições
(a) e (b) é um elemento do conjunto P
(d) Verifique que a definição não é determinada unicamente mas a função
f com a definição a seguir é definida correctamente

f (λ) = 0,
f (0ω1) = f (ω), f (ω1 ω2 ) = f (ω1 ) + f (ω2 ) + 1
2 Definição: β é uma parte inicial da α se α = βγ para uma γ , γ pode ser e linha vazia
122 CAPÍTULO 7. RECURSIVIDADE GERAL

(e) Calcule f (001011010011)

3. Dada uma função Φ : A → N , A ⊂ N

Φ(1) = 1,
Φ(2n) = Φ(n), Φ(2n + 1) = Φ(n) + Φ(n + 1)

(a) Calcule Φ(85)


(b) Demonstre que Φ é definida sobre o N

4. O conjunto Σ∗ de todas as sucessões binárias onde Σ = {a, b} pode ser


definido recursivamente de maneira seguinte
(B) a, b ∈ Σ∗
(R) Se ω ∈ Σ∗ então aω ∈ Σ∗ e bω ∈ Σ∗
Claro que esta definição é determinada unicamente (porque?). Considere-
mos a seguinte função:3

r(a) = a, r(b) = b
r(aω) = r(ω) ∗ a, r(bω) = r(ω) ∗ b

Achar r(abbab) . O que é que encontra a função r ? Justificar a resposta.


5. Dada a definição de uma função
  

 1 1 2

 se x ∈ , ,

 2 3 3

1  
1
f (x) = f (3x) se x ∈ 0, , (7.13)

 2 3

  

 1 1 2

 + f (3x − 2) se x ∈ ,1 .
2 2 3
Verifique se a função é definida correctamente?

Árvores binárias e com raízes


Consideremos as definições 7.6, 7.7, 7.9 dos conjuntos Areg , Ab , Araiz de
árvores binárias regulares, binárias, com raiz respectivamente. Note: ⊙ x é a
árvore com único vértice x .
1. Desenhe a árvore

T = lig(a, ⊙ b, lig(c, lig(e, ⊙ m, ⊙ n), ⊙ d)).

Desenhe qualquer árvore binária e represente usando a operação lig


2. (a) Verifique que a definição de altura dada no exemplo 7.15 concorde
com a definição de altura como o nível máximo dos vértices
(b) Define a altura para árvores de Ab . Como é que deve ser definido
h(nil) ?
3o símbolo ∗ significa a operação de concatenação
4. EXERCÍCIOS 123

3. Demonstre que a função n(T ) definida recursivamente

n(⊙ r) = 1, n(lig(r, T1 , T2 )) = 1 + n(T1 ) + n(T2 )

representa o número dos vértices da árvore T


4. Consideremos a definição de uma função p(n, T ) onde n ∈ N , T uma
árvore binária regular:

p(n, ⊙ x) = n, p(n, T ) = n + p(n + 1, esq(T )) + p(n + 1, dir(T )).

Calcule p(1, T ) para a árvore na figura 7.2.


5. Seja f : Ab → Ab definida por

f (nil) = nil, f (lig(x, T1 , T2 )) = lig(x, f (T2 ), f (T1 )).

Desenhe f (T ) para a árvore na figura 7.2.

Algoritmos recursivos
1. Construir uma algoritmo recursivo para calcular a função

f (1) = 1, f (2n) = f (n), f (2n + 1) = f (n) + 1

onde n ∈ N . Apresentar o funcionamento do algoritmo para os cálculos


de f (15) e f (13) .

2. O conjunto B de todas as sucessões binárias pode ser definido pelas con-


dições:
(B) {0, 1} ∈ B ,
(R) ω ∈ B → ω ∗ 0, ω ∗ 1 ∈ B
Construir uma algoritmo recursivo para calcular a função

f (1) = 1, f (0) = 0, f (ω ∗ 0) = f (ω), f (ω ∗ 1) = f (ω) + 1

Apresentar o funcionamento do algoritmo para os cálculos de f (1101) e


f (0101) .
3. Construir um algoritmo para formar uma lista de todas as sucessões bi-
nárias de comprimento n que contem m (m ≤ n) unidades. Veja o
exemplo 7.21.
Capítulo 8

Recursividade e árvores

1 Percurso de árvore com raiz


Árvores com raiz têm grande importância em aplicações. Um dos problemas
necessários para árvores com raiz é percurso, isto é, o problema seguinte. Dada
uma árvore A = (r, T ) com raiz r . É preciso percorrer a árvore, i.e. visitar
todos os vértices em ordem certo.
Existem diferentes ordens de percurso. Por exemplo, dada uma árvore com
raiz. É preciso formar uma lista de todos os vértices v1 , . . . , vn de modo que
todos os filhos seguirem depois dos seus pais. O mesmo vamos exigir para cada
uma das subárvores. Antes de formar um algoritmo consideremos um exemplo
de uma árvore percorrida segundo a ordem indicada. A figura 8.1 mostra uma
árvore e um caminho que realiza percurso. Neste método depois de cada um
pai seguirem todos os filhos dele. Obteremos a lista

v1 , v2 , v5 , v9 , v10 , v6 , v11 , v3 , v7 , v12 , v13 , v4 , v8 .

Para formar o algoritmo recursivo é natural usar a definição recursiva 7.9


na página 108 de árvores com raiz. Baseando sobre uma definição recursiva
é muito fácil construir um algoritmo. Como cada árvore A = (r, T ) com

v1

v2 v3 v4

v5 v6 v7 v8

v9 v10 v11 v12 v13

Figura 8.1: Percurso de árvore. PREORDER

124
2. PERCURSO DE ÁRVORE BINÁRIA 125

raiz r pode ser obtida através da operação de ligamento de árvores com raízes
(r1 , T1 ), . . . , (rm , Tm ) , é possível reduzir o problema dada aos mesmos proble-
mas para subárvores. Designemos as subárvores como

subarvore(1), subarvore(2), . . . , subarvore(m).

Então, o conjunto de todos os vértices é união dos vértices das subárvores e a


raiz r . Para resolver o nosso problema é suficiente dizer que deve ser visitada
a raiz e devem ser percorridas as subárvores. Mas o percurso das subárvores
pode ser feito recursivamente!

Procedure PREORDER(A: arvore);


begin
visitar(raiz(A));
For i:=1 to ns(A) do
PREORDER(subarvore(i,A))
end

Figura 8.2: Algoritmo PREORDER

Algoritmo PREORDER que podemos ver na figura 8.2 realiza o percurso para
uma árvore A . Sob a chamada visitar(x) subentende-se qualquer operação
aplicada ao vértice x . No nosso caso visitar(x) significa: adicionar o vértice
x no fim da lista. A função raiz(A) devolve a raiz da árvore A . Seja ns(A)
o número das subárvores A1 , . . . , Ans(A) da árvore A . Note que se a árvore A
tem único vértice, o número das subárvores ns(A) = 0 .
Relativamente a outros ordens veja o exercício 1.

2 Percurso de árvore binária


2.1 Procedimentos
Para árvores binárias é preciso indicar no algoritmo se existe um filho (esquerdo
ou direito). Os três casos diferentes obteremos se considerarmos as ordens di-
ferentes para visitar raiz e subárvores: os algoritmos PREORDER, INORDER e
POSTORDER
PREORDER: raiz, subárvore esquerda, subárvore direita
INORDER: subárvore esquerda, raiz, subárvore direita
POSTORDER: subárvore esquerda, subárvore direita, raiz
Sejam esq(A) e dir(A) árvores esquerda e direita da árvore A respectiva-
mente. O algoritmo PREORDER está apresentado na figura 8.3.
De maneira análoga podem ser realizados e os algoritmos INORDER e POS-
TORDER (veja os exercícios 3).
126 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

Procedure PREORDER(A: arvorebin);


begin
visitar(raiz(A));
if existe arvore esquerda then
PREORDER(esq(A));
if existe arvore direita then
PREORDER(dir(A))
end

Figura 8.3: PREORDER para árvore binária

2.2 Notação funcional


Se a operação visitar(x) consiste em adicionar o vértice x no fim da lista dos
vértices, o resultado do percurso é uma sucessão de todos os vértices da árvore.
Temos a correspondência
Arvore → Lista.
Esta correspondência determina uma função definida sobre o conjunto de todas
árvores binárias (suponhamos que os vértices das árvores são elementos de um
conjunto certo, por exemplo, são as letras a, b, c, . . . , z ). É cómodo usar a
notação funcional
f (A) = L
onde A é árvore, L é o resultado (lista). A função f pode ser definida recur-
sivamente. Consideremos uma definição recursiva para esta função no caso, por
exemplo, da ordem: raiz, subárvore esquerda, subárvore direita. Vamos usar a
notação lig introduzida na equação (7.8) (página 107) e ∗ para a operação de
concatenação

f (nil) = λ, f (lig(x, A1 , A2 )) = x ∗ f (A1 ) ∗ f (A2 )

Desta definição decorre o algoritmo em notação de Pascal


function lista(A: arvorebin):string;
begin
if A = nil then
lista := ’’
else
lista := raiz(A)+lista(esq(A))+lista(dir(A))
end

3 Fórmulas binárias
3.1 Fórmulas bem formadas
Há um vínculo entre árvores binárias e fórmulas binárias. Pode-se para cada
fórmula binária formar uma árvore binária de maneira única. Por exemplo a
expressão algébrica
(x − 4) ∗ 2 − (y + 2)/3
3. FÓRMULAS BINÁRIAS 127

∗ /

− +
2 3

x 4 y 2

Figura 8.4: Árvore binária para uma fórmula binária

pode-se representar em forma de uma árvore (a figura 8.4)


Notemos que o percurso desta árvore por meio de algoritmo INORDER dá
a fórmula binária inicial, mas sem parêntesis x − 4 ∗ 2 − y + 2/3 . Isto surge
ambiguidade. Para as duas árvores binárias pode ser obtida a mesma lista como
resultado do percurso. Por exemplo, a lista a + b ∗ c pode ser obtida a partir
das duas árvores, uma com a raiz + , outra com a raiz ∗ . Mas as parêntesis
permitem evitar ambiguidade.
Fórmulas binárias podem ser definidas recursivamente. Para manter a ordem
de operações vamos utilizar as parêntesis: ‘(’ e ‘)’. Nesta definição expressão da
forma (F + G) significa a concatenação dos cinco elementos (símbolos)
( ,F ,+ ,G ,)
Definição 8.1. Defina-se o conjunto F de linhas (fórmulas) recursivamente:
(B) As letras x, y, z, . . . e constantes são fórmulas, isto é, x, y, z, . . . ∈ F
(R) Se F ∈ F e G ∈ F então (F + G), (F − G), (F ∗ G) e (F/G) são
elementos do F .
Um exemplo de aplicação desta definição:
a, b → (a − b), 2, 3 → (2 ∗ 3), (a − b), (2 ∗ 3) → ((a − b)/(2 ∗ 3)).
Se não usar as regras de cálculo (ordem de operações) não se pode omitir
parêntesis. Uso das parêntesis permitem derivar qualquer fórmula de maneira
única (a definição é determinada unicamente). As parêntesis servem para indicar
esta ordem e escolher um único caminho para calcular. Utilizamos o método
formal, por isso nem cada fórmula que pode ser usada em álgebra é fórmula
segundo a definição 8.1. Por exemplo a expressão a + (b ∗ c) não é fórmula
(segundo a definição 8.1) porque não contém parêntesis exteriores.

3.2 Notação polaca


Se aplicarmos o algoritmo PREORDER à árvore na figura 8.4 vamos ter a lista
dos símbolos −, ∗, −, x, 4, 2, /, +, y, 2, 3 . Se omitirmos as vírgulas vamos ter o
resultado que se chama fórmula na forma polaca ou forma prefixa: − ∗ −x42/ +
y23 . Note que aqui 42 é a lista dos dois elementos 4 e 2 , não é o número 42 .
A vantagem desta forma é que não é necessário usar as parêntesis, a ordem dos
cálculos determina-se de maneira única (veja o exercício 12 na página 135). A
seguir é apresentada a definição recursiva de fórmulas binárias na forma polaca:
128 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

Definição 8.2. Fórmulas na forma polaca (ou forma prefixa)


(B) As variáveis x, y, z, . . . e constantes são fórmulas, i.e., x, y, z, . . . ∈ Fp
(R) Se F e G são fórmulas então +F G, −F G, ∗F G e /F G ∈ Fp .
Exemplo 8.1. Calcular o valor v(F ) da fórmula F = / − a + bc ∗ −abc com
valores a = 5 , b = 3 , c = 6 .
Resolução: v1 = +bc = 3 + 6 = 9 , v2 = −ab = 5 − 3 = 2 , v3 = −av1 = 5 −
9 = −4 . Daqui

v(F ) = / − av1 ∗ v2 c = /(−4) ∗ 2, 6 = /(−4)12 = (−4)/12 = −1/3.

Notemos que a forma infixa correspondente é (a − (b + c))/((a − b) ∗ c) .

O algoritmo POSTORDER para árvore na figura 8.4 forma a lista

x, 4, −, 2, ∗, y, 2, +, 3, /, −

Omitindo as vírgulas vamos ter uma fórmula na forma chamada forma polaca
inversa ou forma posfixa ou sufixa. A seguinte definição serve para obter o
conjunto Fpinv fórmulas em forma polaca inversa.
Definição 8.3. Fórmulas na forma polaca inversa (ou forma posfixa)
(B) As variáveis x, y, z, . . . e constantes são fórmulas, i.e., x, y, z, . . . ∈ Fpinv
(R) Se F e G são fórmulas então F G+, F G−, F G∗ e F G/ ∈ Fpinv .
Para calcular uma fórmula representada na forma prefixa ou na forma posfixa
é preciso verificar se as definições dos conjuntos Fp ou Fpinv determinam
as fórmulas de maneira única. Neste caso qualquer função recursiva sobre os
conjuntos pode ser definida correctamente.
Concederemos a definição do conjunto Fp . Previamente estabelecemos as
duas propriedades características dos elementos do conjunto.
Lema 8.1. Sejam c(F ) e z(F ) os números de letras e das operações da F
respectivamente. Seja
index(F ) = z(F ) − c(F ). (8.1)
Para qualquer fórmula F ∈ Fp temos

index(F ) = −1. (8.2)

Demonstração. Base. Se F é uma letra, index(F ) = 0 − 1 = −1 .


Agora consideremos a implicação

{index(G) = −1, index(H) = −1} → index(⊕ GH) = −1

onde ⊕ é qualquer das operações +, −, ∗, / . Temos

index(⊕ GH) = 1 + index(G) + index(H) = 1 + (−1) + (−1) = −1.

Conforme o princípio de indução, index(F ) = −1 qualquer que seja F ∈ Fp .


3. FÓRMULAS BINÁRIAS 129

Lema 8.2. Seja F ′ qualquer parte inicial própria da F , isto é, F ′ começa


com o primeiro símbolo da F mas F ′ 6= F . Então
index(F ′ ) ≥ 0. (8.3)
Demonstração. Um exemplo: para a fórmula F = / − a + bc ∗ −abc e partes
iniciais / , /− , / − a , etc. vamos ter os índices
1, 2, 1, 2, 1, 0, 1, 2, 1, 0, −1.
É natural que para linha vazia λ temos index(λ) = 0 . Daqui para a base
{a, b, . . .} ⊂ Fp esta proposição é verdadeira. A implicação tem a forma: se
F = ⊕ GH
(∀G′ , H ′ ){index(G′ ) ≥ 0, index(H ′ ) ≥ 0} → (∀F ′ ) index(F ′ ) ≥ 0.
Temos que considerar os casos seguintes: F ′ = ⊕ G′ , F ′ = ⊕ GH ′ (pode ser,
G′ = λ ou H ′ = λ ). No primeiro caso, index(F ′ ) = 1 + index(G′ ) ≥ 1 ,
no segundo index(F ′ ) = 1 + (−1) + index(H ′ ) ≥ 0 . Conforme o princípio de
indução, index(F ′ ) ≥ 0 qualquer que seja F ∈ Fp .
Teorema 8.1. Nas definições 8.2 e 8.3 os conjuntos Fp e Fpinv são determi-
nados unicamente.
Demonstração do teorema 8.1. Consideremos só o conjunto Fp .
Deve ser demonstrado que qualquer F ∈ Fp tem única representação na
forma F = ⊕ GH onde ⊕ é qualquer das operações, e G, H ∈ Fp ou F
contém único elemento (letra ou constante).
Das propriedades precedentes segue que para encontrar G é necessário es-
colher F ′ = ⊕ G tal que index(F ′ ) = 0 (porque deve ser index(G) = −1 ),
mas qualquer parte inicial G′ própria deve ter índice index(G′ ) ≥ 0 . O G
determina-se unicamente pelo primeiro 0 na sucessão dos índices (claro que tal
zero existe).
As propriedades estabelecidas nas lemas 8.1 e 8.2 são propriedades caracte-
rísticas, isto é, qualquer sucessão composta das variáveis e operações que satisfaz
as condições (8.2) e (8.3) é um elemento do conjunto Fp .
Teorema 8.2. Seja ω qualquer sucessão composta das variáveis e operações.
Se ω satisfaz as condições (8.2) e (8.3) então ω ∈ Fp .
Demonstração. Consideremos a indução em relação a comprimento n da ω .
Para n = 1 a proposição é verdadeira: se ω tem único elemento ω = x , x
deve ser uma variável porque index(x) = −1 . Mas x ∈ Fp .
Suponhamos agora que qualquer ω de comprimento n ≤ k que satisfaz as
condições (8.2) e (8.3) é fórmula do conjunto F . Demonstremos que se ω tem
comprimento k + 1 e satisfaz as condições (8.2) e (8.3) então ω ∈ Fp .
Na sucessão dos índices da F o primeiro zero determina as partes G e H
tais que F = ⊕ GH , index(⊕ G) = 0 , index(⊕ G′ ) ≥ 1 para qualquer parte
inicial G′ da G . Daqui claro que G e H satisfazem as condições (8.2) e (8.3).
Mas segundo a suposição G, H ∈ Fp . Isto implica que F ∈ Fp .
Exemplo 8.2. Achar G e H a partir da linha F = + − ∗ab ∗ cd/xy .
A sucessão de índices: 1, 2, 3, 2, 1, 2, 1, 0, 1, 0, −1 . O primeiro zero determina
G = − ∗ ab ∗ cd e H = /xy .
130 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

4 7

9 7

2 6

Figura 8.5: Árvore com pesos

3.3 Fórmulas do cálculo proposicional


Mais uma definição serve como exemplo de definições recursivas de fórmulas
binárias. Neste caso temos a definição das fórmulas do cálculo proposicional.
Definição 8.4. Fórmulas do cálculo proposicional: o conjunto Fcp
(B) As variáveis p, q, r, . . . são fórmulas, i.e., ∈ Fcp
(R) Se F e G ∈ Fcp então (F ∧G), (F ∨G), (F → G), (F ↔ G) e ¬F ∈ Fp .

Por exemplo (¬¬p ∧ (p ∨ q)) é fórmula do conjunto Fcp .

4 Árvore com pesos. Mínima árvore binária


Uma árvore com pesos é uma árvore com raiz em que a cada folha assinalado um
número certo não negativo chamado por peso da folha. Sejam T uma árvore,
n número das folhas e w1 , . . . , wn pesos das folhas. Designemos por l1 , . . . , ln
os níveis das folhas (i.e. li é comprimento do único caminho da raiz ate a folha
com peso wi ). Por definição o peso da árvore T é soma
n
X
W (T ) = wi li .
i=1

Para a árvore T sobre a figura 8.5 temos

W (T ) = 4 · 1 + 7 · 1 + 9 · 2 + 7 · 2 + 2 · 3 + 6 · 3.

Existem aplicações diferentes que levam para árvores com pesos.

4.1 Mínima árvore binária. Algoritmo de Huffman


Consideremos o problema: dada a lista de números positivos f1 , . . . , fn cons-
truir uma árvore binária com folhas marcadas pelos números f1 , . . . , fn e com o
mínimo peso possível. Vamos chamar esta árvore mínima árvore binária. Para
encontrar uma mínima árvore binária serve o algoritmo de Huffman.
A ideia do algoritmo: achar os dois números mínimos na lista f1 , . . . , fn ,
digamos f1 e f2 , substituir estes números por soma f1 + f2 . Depois disso,
4. ÁRVORE COM PESOS. MÍNIMA ÁRVORE BINÁRIA 131

resolver o problema (recursivamente) para a lista obtida com resultado que é


uma árvore A′ . E último passo é substituir a folha marcada por f1 + f2 por
árvore binária dos 3 elementos com duas folhas marcadas por f1 e f2 . Como
base pode servir uma lista de um só elemento, neste caso a árvore é única e
contém um só elemento.
Formalmente o considerado o pode se exprimido de modo seguinte. Sejam
f = (f1 , f2 , . . . , fn ) lista dada e A o resultado do algoritmo, isto é, árvore
binária. Notaremos esta situação por A = H(f ) . Para H temos a seguinte
definição recursiva. Sejam A1 = ⊙ f1 , . . . , An = ⊙(fn ) , isto é, a lista dos
números vamos representar por lista das árvores cada uma das quais tem único
vértice.
(
H(A) = A, se A é lista de um elemento (uma árvore)
(8.4)
H((A1 , A2 , . . . , An )) = H((A′ , A3 , . . . , An ))

onde A′ = lig(f1 + f2 , A1 , A2 ) .
Teorema 8.3 (Huffman). O algoritmo de Huffman constrói uma árvore mínima
binária.
Demonstração. Demonstração pode ser dada usando indução. Suponhamos que
para a lista f1 +f2 , f3 , . . . , fn o algoritmo apresenta uma árvore mínima T com
peso W (T ) . Depois de substituir f1 + f2 por árvore lig(f1 + f2 , ⊙ f1 , ⊙ f2 )
vamos ter a árvore com o peso

W (T ) + f1 + f2 . (8.5)

Consideremos qualquer árvore mínima Tm . É fácil ver que na arvore Tm os


vértices marcados por f1 e f2 têm o máximo nível porque, no caso contrario,
seja possível trocar os pesos e diminuir o peso Wm = W (Tm ) . Podemos tomar
que f1 e f2 têm o mesmo pai x . Se substituirmos lig(x, ⊙ f1 , ⊙ f2 ) por um
elemento f1 + f2 vamos ter uma árvore T ′ . Temos

W (T ) ≤ W (T ′ ), W (Tm ) = W (T ′ ) + f1 + f2 .

Destas relações e da relação (8.5) segue que W (T )+f1 +f2 é o mínimo peso.
Exemplo 8.3. Construir uma mínima árvore binária para a lista

4, 5, 6, 10, 13, 40.

Temos T1 = lig(9, ⊙ 4, ⊙ 5) . A nova lista de números é

6, 9, 10, 13, 40,

9 é a marca da raiz da árvore T1 . Os seguintes passos: T2 = lig(15, ⊙ 6, T1 ) ,


T3 = lig(23, ⊙ 10, ⊙ 13) , T4 = lig(38, T2 , T3 ) , T = lig(78, T4, ⊙ 40) .
O resultado é representado na figura 8.6.
132 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

78

38 40

15 23

9
6 10 13

4 5

Figura 8.6: Algoritmo de Huffman

4.2 Código prefixo


Codificação binária de símbolos baseada sobre um número fixo de zeros e uni-
dades (bits) apresenta um método simples mas não é único.
Código prefixo é um código binário que satisfaz as duas condições. A pri-
meira: o código de qualquer símbolo não pode ser uma parte inicial do código
de qualquer outro símbolo. Para exprimir a segunda consideremos uma árvore
binária regular e assinalemos a cada uma das folhas um símbolo. A partir da
raiz para cada folha existe um único caminho. Este caminho pode ser codificado
por uma sucessão binária se marcar cada arco por 0 ou 1 . Por convenção, os
arcos que saem de vértices para filho esquerdo vamos marcar por 0 , para filho
direito – por 1 . Por exemplo, para a árvore sobre a figura 8.6 vamos ter a
marcação mostrada na figura 8.7.

0 1
f (40)
0 1

0 1 0 1

c(6) 0 1 d(10) e(13)

a(4) b(5)

Figura 8.7: Código prefixo

Daqui vamos ter os seguintes códigos

a 0010
b 0011
c 000
d 010
e 011
f 1
5. EXERCÍCIOS 133

A segunda condição para o código prefixo é que a árvore binária é regular.

4.3 Código mínimo


A importância da questão sobre arvore mínima binária aparece no seguinte pro-
blema. Consideremos uma mensagem que contem símbolos de um conjunto. Por
exemplo, dada uma mensagem com as letras a, b, c, d, e, f com as ocorrências
4, 5, 6, 10, 13, 40 . Se usar os códigos da tabela em cima o comprimento total da
mensagem será igual a
4 · 4 + 5 · 4 + 6 · 3 + 10 · 3 + 13 · 3 + 40 · 1.
Esta soma é o peso da árvore sobre a figura 8.7. Entre todos os códigos prefi-
xos, o código que corresponde à arvore binária mínima apresenta a solução que
minimiza o comprimento da mensagem.

5 Exercícios
1. Construir o algoritmo para percorrer uma árvore com raiz com condição
que todos os vértices devem seguir depois dos seus filhos. Por exemplo
para árvore na figura 8.1 deve ser obtida a lista
v9 , v10 , v5 , v11 , v6 , v2 , v12 , v13 , v7 , v3 , v8 , v4 , v1 .

2. Desenhe uma árvore com raiz e aplique a esta árvore os algoritmos PRE-
ORDER e POSTORDER
3. Compor os algoritmos INORDER e POSTORDER para árvores binárias
4. Realizar o algoritmo

Procedure PreMarcar(A: arvorebin);


begin
contador:=contador+1;
marcar(raiz(A),contador);
PreMarcar(esq(A));
PreMarcar(dir(A))
end

(supondo que o valor inicial do contador é 0 ) para a árvore


A = lig(a, lig(b, c, d), lig(e, lig(f, g, h), i)).
Aqui a operação marcar(x,k) significa: assinalar ao vértice x o número
natural k .
5. A lista a, b, c, d, e, f, g, h, i, k, l, m, n é o resultado do algoritmo PREOR-
DER aplicado a uma árvore. Os vértices têm os números dos filhos dados
pela tabela
a b c d e f g h i k l m n
3 0 2 1 0 2 1 0 1 2 0 0 0
Reconstruir a árvore.
134 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

6. Dadas as listas f bhnkmpdcga e hmpkdnbgacf de vértices duma árvore


binária regular obtidas por meio dos algoritmos PREORDER e POSTOR-
DER respectivamente. Reconstruir a árvore.
7. Calcule as fórmulas F1 , F2 , F3 em forma polaca e apresente a árvore bi-
nária correspondente: F1 = 123456 − − + + , F2 = 2 + 3 − 4 ∗ 1/ ,
F3 = 184 + 96 − /∗ .
8. Verifique se as expressões seguintes são fórmulas segundo à definição 8.1:

(a) (x − (y − z) ∗ u) (b) (((x + y)/(x − y)) + 1)


(c) (1 + 1 + 1 + 1) (d) (x − y) ∗ (x + y)

9. O conjunto de fórmulas binárias determina-se através da definição recur-


siva:
(B) as letras a, b, . . . , z são fórmulas
(R) se F1 e F2 são fórmulas então as linhas ’ ∗F1 F2 ’, ’ ⊕ F1 − F2 ’
e ’ F1 F2 + ’ são fórmulas (representam produto, diferença e soma
respectivamente)
Determinar quais das expressões seguintes são fórmulas. Justificar a res-
posta.

(a) ⊕⊕a − b − c (b) ∗a ⊕ b − c


(c) ⊕ ∗ab − c (d) ⊕ ∗abc + − ∗ a ⊕ b − c

A definição é determinada unicamente?


10. Consideremos um conjunto A definido recursivamente que é um subcon-
junto de linhas de caracteres contendo os caracteres a, b, . . . , z e o símbolo
∗.
(B) a, b, . . . , z ∈ A .
(R) F1 , F2 , F3 ∈ A ⇒ ∗F1 F2 F3 ∈ A .

(a) Apresente duas linhas diferentes do A de comprimento 10 .


(b) Qualquer que seja F ∈ A designemos por c(F ) o número das le-
tras da F e por z(F ) o número dos símbolos ∗ . Demonstre que
∀F ∈ A c(F ) = 2z(F ) + 1 .

11. Seja F uma fórmula na forma posfixa que satisfaz à definição 8.3. Vamos
usar a notação c(F ) e z(F ) do exercício 10, mas neste caso z(F ) é o
número das operações +, −, ∗, / .
(a) Demonstre que c(F ) − z(F ) = 1
(b) Seja F ′ qualquer parte inicial da F , isto é, F ′ começa com o pri-
meiro símbolo da F . Por exemplo, para F = abc + −a∗ a parte
inicial é uma das linhas a , ab , abc , abc+ , abc + − , abc + −a ou
toda a fórmula F .
Demonstre que c(F ′ ) − z(F ′ ) ≥ 1
5. EXERCÍCIOS 135

(c) Seja F qualquer linha composta das letras e operações +, −, ∗, / .


Note que em geral F ∈ / Fpinv .
Demonstre que se c(F ′ ) − z(F ′ ) ≥ 1 para qualquer parte inicial F ′
e c(F ) − z(F ) = 1 então F ∈ Fpinv .
(d) Demonstre que nas condições precedentes a linha F tem única re-
presentação da forma F = F1 F2 x onde x é uma das operações.
12. Seja F uma fórmula na forma prefixa que satisfaz à definição 8.2. Vamos
usar a notação c(F ) e z(F ) do exercício 10, mas neste caso z(F ) é o
número das operações +, −, ∗, / . Seja index(F ) = z(F ) − c(F ) .
(a) Demonstrar que index(F ) = −1
(b) Seja F ′ qualquer parte inicial própria da F , isto é, F ′ começa
com o primeiro símbolo da F mas F ′ 6= F . Demonstrar que
index(F ′ ) ≥ 0
(c) Demonstrar que nas condições precedentes qualquer F ∈ Fp tem
única representação da forma F = xF1 F2 onde x é uma das opera-
ções, F1 , F2 ∈ Fp
13. Seja a sucessão a1 , a2 , . . . , as resultado de percurso de uma árvore binária
segundo o algoritmo POSTORDER. Demonstrar que o algoritmo PREOR-
DER, mas conforme o esquema

raiz → subárvore direita → subárvore esquerda

produz a sucessão inversa as , as−1 , . . . , a2 , a1 .


14. Dada uma árvore binária. Construir um algoritmo para encontrar
(a) o número de todos os vértices
(b) o número de todas as folhas
(c) a altura da árvore
15. Todos os vértices de P
uma árvore binária são marcados por números intei-
ros. Achar a soma wi li onde wi é o peso e li é o nível do vértice
i.
16. Construir um algoritmo para encontrar o peso de uma árvore com pesos

17. Dada uma árvore binária A e uma lista L de símbolos. É preciso marcar
os vértices usando os símbolos da lista. Construir o algoritmo.

Questões para teste


1. Definição recursiva de um conjunto. Estrutura
2. Forma inversa, uso para verificar x ∈ A ou x ∈
/A
3. Princípio generalizado de indução
4. Como é que deve ser definida uma função? Forma inversa. Saber dar
definições
136 CAPÍTULO 8. RECURSIVIDADE E ÁRVORES

5. Árvores com raiz, árvores binárias, operação lig


6. Funções sobre os conjuntos de arvores. Saber dar definições
7. Algoritmos recursivos. Funcionamento de algoritmo
8. Percurso de árvores, algoritmos PREORDER, POSTORDER, INORDER

9. Formulas binárias. Formas prefixa (polaca), infixa, posfixa (sufixa, polaca


inversa)
Capítulo 9

Digrafos, redes

1 Introdução
Lembramos a definição de digrafo ou grafo orientado.

Definição 9.1. Digrafo G é terno G = {V, E, γ} onde


• V é conjunto de vértices, V = V (G)
• E é conjunto de arcos, E = E(G)
• γ : E → V × V (função ou aplicação com domínio E . Valores desta
função pertencem ao conjunto V × V )
Vários teoremas sobre grafos é possível reformular para digrafos. Por exem-
plo é valido o seguinte teorema:
Teorema 9.1. Se u e v são vértices diferentes dum digrafo G , e se existe
um caminho no G de u para v , então existe um caminho acíclico de u para
v.
Para digrafos vamos ter também e outros conceitos. Sejam indeg(v) o
número dos arcos que entram ao vértice v e outdeg(v) o número dos arcos que
saem do v . Os casos indeg(v) = 0 e outdeg(v) 6= 0 vamos chamar que v
fonte e v é um ocaso se indeg(v) 6= 0 e outdeg(v) = 0 .
Teorema 9.2. Cada digrafo finito acíclico tem pelo menos 1 fonte e pelo menos
1 ocaso.
O teorema seguinte representa o teorema de Euler para digrafos.
Teorema 9.3. Suponhamos que um digrafo finito G é conexo se considerar o
como grafo não orientado. Existe um caminho fechado no G usando todos os
arcos de G se e somente se

indeg(v) = outdeg(v)

para cada um dos vértices v ∈ V (G) .

137
138 CAPÍTULO 9. DIGRAFOS, REDES

2 Digrafos com pesos


Existem aplicações quando precisa-se saber se existe um caminho num digrafo
G de um vértice u para um vértice v . Este problema é caso particular do
problema que consiste em encontrar um caminho mais curto, se introduzirmos
os comprimentos dos arcos. Suponhamos que a cada um dos arcos de um digrafo
G atribuído um número positivo, por exemplo preço do arco, peso, comprimento
etc. Este número vamos chamar peso e designar W (a) onde a ∈ E(G) é
qualquer arco. Vamos considerar apenas digrafos sem arcos paralelos e usar a
notação W (u, v) em vez de W (a) se u e v são as extremidades do a (isto é,
γ(a) = (u, v) , veja a definição 9.1).
P
m
Peso de um caminho e1 e2 . . . em é a soma W (ei ) . Ou, se usar a notação
i=1
com vértices,
m
X
W (v1 v2 . . . vm+1 ) = W (vi , vi+1 ). (9.1)
i=1

Por exemplo no digrafo (fig. 9.1) os caminhos v1 v2 v4 e v1 v2 v5 v4 têm os


pesos 3 + 7 = 10 e 3 + 1 + 5 = 9 respectivamente.
v2 7 v4 2 v6

3
8
v1 2 1 5 4
7
9 9

v3 4 v5 v7

Figura 9.1: Digrafo com pesos

Consideremos o seguinte problema: para dados vértices u e v achar um


caminho com o peso mínimo W ∗ (u, v) possível. Se tal caminho não existe
então por definição W ∗ (u, v) = +∞ . Então, desta maneira pode ser resolvido
o problema de existência de um caminho entre dois vértices.

2.1 Algoritmo de Dijkstra


O algoritmo de Dijkstra permite encontrar os valores da função W ∗ (u, v) . Isto
é achar os pesos dos caminhos mínimos do vértice u para todos os vértices v do
digrafo G . Este algoritmo utiliza a ideia seguinte. Comparemos dois caminhos
ux1 x2 · · · xn zv e uy1 y2 · · · ym zv.
Estes caminhos têm o último arco comum zv . Claro que o resultado de
comparação depende de comparação das primeiras partes dos caminhos:
W (ux1 x2 · · · xn zv) = W (ux1 x2 · · · xn z) + W (z, v)
W (uy1 y2 · · · ym zv) = W (uy1 y2 · · · ym z) + W (z, v)
2. DIGRAFOS COM PESOS 139

Então, entre todos os caminhos de u para v com penúltimo vértice z o


mínimo peso vai ter o óptimo (mínimo) caminho de u para z mais o arco
(z, v) . Daqui segue a conclusão: para encontrar um mínimo caminho de u
para v é suficiente achar os mesmos de u para todos os z1 , z2 , . . . adjacentes
ao v que formam os arcos z1 v, z2 v, . . . com v :
W ∗ (u, v) = min{W ∗ (u, z1 ) + W (z1 , v), W ∗ (u, z2 ) + W (z2 , v), . . .} (9.2)
Note que W ∗ (u, v) não é o peso do arco (u, v) ! Isto é o peso de um caminho
mínimo de u para v .
Para simplificar a notação suponhamos que V = {1, 2, . . . , n} e u = 1 .
O algoritmo de Dijkstra 9.1 permite passo a passo determinar vértices j e os
valores dos pesos de caminhos mínimos W ∗ (1, j) . Seja o conjunto de todos tais
vértices
L ⊂ {2, . . . n}.
Este conjunto consiste dos vértices para cada dos quais o peso mínimo W ∗ (1, j)
encontrado. Inicialmente L = ∅ e ao terminar o algoritmo o conjunto L deve
ser igual a L = {2, 3, . . . , n} .
Introduzimos as variáveis D2 , . . . , Dn que são os pesos correntes de caminhos
de 1 para os vértices 2, . . . n respectivamente. Inicialmente,
D2 = W (1, 2), D3 = W (1, 3), . . . , Dn = W (1, n)
representam os pesos dos caminhos que contêm apenas um arco. Se não existe
arco de 1 para j atribuímos por definição W (1, j) = ∞ . No fim do algoritmo
de Dijkstra deve ser Dj = W ∗ (1, j) .

Input: um digrafo G sem laços e arcos paralelos, uma função W : V (G) ×


V (G) → [0, ∞] (os pesos)
Output: valores da função W ∗ (1, j) que representa os pesos de caminhos mí-
nimos
L := ∅ ; V := {2, . . . , n} ;
for i ∈ V do
Di := W (1, i)
end for
while V 6= ∅ do
achar k ∈ V com mínimo Dk
L := L ∪ {k} ; V := V \ {k}
for j ∈ V do
if Dj > Dk + W (k, j) then
Dj := Dk + W (k, j)
end if
end for
end while
for j ∈ L do
W ∗ (1, j) := Dj
end for
Algoritmo 9.1: Algoritmo de Dijkstra

As condições a seguir são invariantes do algoritmo e permitem demonstrar


que o algoritmo faz realmente o trabalho que deve fazer:
140 CAPÍTULO 9. DIGRAFOS, REDES

Inicialmente e depois de cada passo do algoritmo o valor Dj é o peso de um


caminho de 1 para j tal que
(A) Di = W ∗ (1, i) se i ∈ L
(B) Di ≤ Dk para quaisquer i ∈ L e k ∈
/L
(C) Se k ∈
/ L , Dk é o peso de um caminho de 1 para k com todos os vértices
intermediários do L , alem disso

Dk = min(Di + W (i, k)) = min(W ∗ (1, i) + W (i, k)) (9.3)


i∈L i∈L

L
W (i1 , k1 )
k1
i1
D i1

W (i, k)
Di i k

Figura 9.2: Dk = W ∗ (1, k)

Nestas condições, se escolher um k com o mínimo valor Dk , k ∈


/ L , vamos
ter
Dk = W ∗ (1, k). (9.4)
De fato, qualquer caminho (veja a figura 9.2) C1,k = 1, . . . , i1 , k1 , . . . , k de 1
para k onde i1 ∈ L , k1 , . . . , k ∈
/ L tem peso não é menor que Dk porque

W (C1,k ) ≥ Di1 + W (i1 , k1 ) + · · · ≥ Di + W (i, k) ≥ Dk .

O algoritmo de Dijkstra permite


• manter as condições (A),(B),(C) como um invariante
• passo a passo aumentar o conjunto L
• por fim do algoritmo atingir a igualdade L = V (G) \ {1}

Exemplo 9.1. O funcionamento do algoritmo para o digrafo do fig. 9.1 podemos


ver na fig. 9.3 (convenção vi = i ). Observemos que os vértices 2, 5, 3, 4, 6, 7
são escolhidos em ordem crescente dos pesos dos caminhos: 3, 4, 8, 9, 11, 15 .

Teorema 9.4. Se os pesos dos arcos do grafo G são não negativos então o
algoritmo de Dijkstra termina com D(j) = W ∗ (1, j), j = 2, . . . , n .
2. DIGRAFOS COM PESOS 141

L D2 D3 D4 D5 D6 D7 Caminhos encontrados
∅ 3 9 ∞ ∞ ∞ ∞ (estado inicial)
{2} 3 9 10 4 ∞ ∞ 1, 2, 4 e 1, 2, 5
{2, 5} 3 8 9 4 13 ∞ 1, 2, 5, 3 e 1, 2, 5, 6
{2, 5, 3} 3 8 9 4 13 ∞
{2, 5, 3, 4} 3 8 9 4 11 17 1, 2, 5, 4, 6 e 1, 2, 5, 4, 7
{2, 5, 3, 4, 6} 3 8 9 4 11 15 1, 2, 5, 4, 6, 7

Figura 9.3: Protocolo do Algoritmo de Dijkstra

v2 7 v4 2 v6

3
8
v1 2 1 5 4
7
9 9

v3 4 v5 v7

Figura 9.4: Árvore dos caminhos mínimos

O algoritmo 9.1 não apresenta os caminhos mínimos. Uma modificação do


algoritmo pode dar todos os caminhos de 1 para j . Inicialmente temos os
caminhos de 1 para j de comprimento 1 se D(j) = W (1, j) < ∞ . No
exemplo 9.1 estes caminhos são (v1 , v2 ) e (v1 , v3 ) . Consideremos estes dois
arcos como árvore de raiz v1 . Depois de cada passo do algoritmo vamos ter um
novo caminho e como vamos ver abaixo, teremos uma árvore com raiz v1 até o
fim do processo. Afim de demonstrar esta asserção discutimos uma construção
de modificação de árvores com raiz.

2.2 Modificação do algoritmo de Dijkstra


O algoritmo de Dijkstra permite encontrar os pesos de caminhos mínimos de
um vértice ate todos os outros. Mas este algoritmo não apresenta os caminhos
próprios. Sobre a figura 9.4 podemos ver esses caminhos. Note que os caminhos
formam uma árvore com raiz no vértice inicial.
Temos uma árvore (T, r) . Se ligar mais uma árvore (Tk+1 , rk+1 ) evidente-
mente que vamos ter outra árvore com a mesma raiz r . Observemos também
que é possível substituir a subárvore (Ti , ri ) arbitrária por outra árvore com
raiz. Cada vértice v da árvore é raiz duma subárvore (T ′ , v) . Se ligarmos a
aresta (v, u) onde u ∈/ T vamos ter a subárvore (T ′′ , v) onde T ′′ = T ′ ∪ {v} .
Designemos esta operação por

(Te, r) = Add((T, r), v, u), v ∈ T,


142 CAPÍTULO 9. DIGRAFOS, REDES

v2 7 v4 2 v6 v2 7 v4 2 v6
3 3
8 8
v1 2 1 5 4 v1 2 1 5 4
7 7
9 9 9 9
v3 4 v5 v7 v3 4 v5 v7

v2 7 v4 2 v6 v2 7 v4 2 v6
3 3
8 8
v1 2 1 5 4 v1 2 1 5 4
7 7
9 9 9 9
v3 4 v5 v7 v3 4 v5 v7

v2 7 v4 2 v6 v2 7 v4 2 v6
3 3
8 8
v1 2 1 5 4 v1 2 1 5 4
7 7
9 9 9 9
v3 4 v5 v7 v3 4 v5 v7

Figura 9.5: O processo de construção da árvore óptima

e = (Te, r) )
ou se designarmos a árvore com raiz por uma letra R = (T, r) (e R
então
Re = Add(R, v, u),

(veja fig. 9.6).


A figura 9.5 mostra os estados consequentes depois de cada passo do algo-
ritmo.
Vamos chamar v pai do u ( u é filho do v ). A aresta que vai do v para u
é uma única aresta que vai para u . Designemos esta aresta por Indicator(u) ,
i.e. cada vértice ’sabe’ o seu Indicator(u) .
Introduzimos uma variável R que inicialmente vai ter o valor ({1}, 1) i.e. a
árvore tem um vértice 1 . A operação R e = Add(R, v, u) vai conservar asserção:
R é árvore de raiz 1 . Nós temos que nos convencer que esta árvore vai conservar
todos os caminhos óptimos de 1 até vértices da R . O que podemos ver do
exemplo 9.1, depois de cada passo do algoritmo, a árvore R contêm o conjunto
L de vértices na subsecção 2.1 com caminhos óptimos.
3. REDES. FLUXO MÁXIMO EM REDE 143

(T, r) (Te, r)

r r

v v

Figura 9.6: Mais um arco mantém árvore

3 Redes. Fluxo máximo em rede


3.1 Rede. Fluxo. Corte
Rede é um digrafo G com características e restrições certas. A cada um dos
arcos do digrafo G é atribuído um número que pode ser tempo, preço, capa-
cidade etc. Em geral o grafo G tem único vértice chamado fonte e um único
vértice terminal (ocaso).
Uma classe considerável de problemas em redes envolve o conceito de movi-
mento de quantidades de um artigo a partir da fonte para o vértice terminal. Os
arcos em rede representam canais para o fluxo de informação, carros (problema
de tráfico), água etc.
Definição 9.2. Rede é um digrafo G acíclico conexo sem arcos paralelos sa-
tisfazendo às condições:
1. O grafo G tem um único vértice a (vamos chamar fonte) que não tem
arcos que entram para este vértice, indeg(a) = 0
2. O grafo G tem um único vértice z (vamos chamar ocaso) que não tem
arcos que saem do vértice, outdeg(z) = 0
3. A cada arco e = (i, j) é atribuído um número c(i, j) não negativo que se
chama capacidade do arco.

Definição 9.3. Fluxo na rede G é uma função não negativa dada sobre o con-
junto dos arcos E(G) , i.e. f (i, j) (arco com extremidades i e j ) obedecendo
as condições:
1. fij ≤ cij , i.e. o fluxo não excede as capacidades
2. Para cada vértice j diferente da fonte e do ocaso
X X
fij = fjk (9.5)
i k

i.e. o fluxo que entra para o vértice vj coincide com o fluxo que sai do
vértice (condição de conservação do fluxo)
144 CAPÍTULO 9. DIGRAFOS, REDES

4, 4 d
b

3, 1 5, 4

z
3, 3
a

5, 5 8, 2

g
c 7, 5

Figura 9.7: Rede

É natural introduzir o valor de fluxo (diz-se também fluxo) como soma


X
F = fai (9.6)
i

O problema principal é encontrar o fluxo máximo possível na rede.


Para analisar este questão consideremos uma noção de corte.
Definição 9.4. Corte da rede G = (V, E) é uma partição do conjunto dos
vértices V em dois subconjuntos V ′ , V ′′ , i.e. V ′ ∪ V ′′ = V, V ′ ∩ V ′′ = ∅ tal
que a fonte a ∈ V ′ e o ocaso z é elemento do conjunto V ′′ .
Definição 9.5. Capacidade de um corte (V ′ , V ′′ ) da rede G = (V, E) é a
soma X
cij
i∈V ′ ,j∈V ′′

das capacidades de todos os arcos que saem do conjunto V ′ e entram para o


conjunto V ′′ .
Para analisar relação entre capacidade de um corte e o fluxo consideremos a
matriz 

fij se (i, j) ∈ E(G) é um arco,
fij = −fji se (j, i) ∈ E(G) é um arco, (9.7)


0 caso contrário.
Por exemplo, para a rede sobre a figura 9.7, a matriz tem a forma
a b c d g z
a • 1 5 · · ·
b −1 • · 4 −3 ·
c −5 · • · 5 ·
d · −4 · • · 4
g · 3 −5 · • 2
z · · · −4 −2 •
Todas as linhas da matriz excepto a primeira e a última têm a soma zero. Mas
a soma te todos os elementos da matriz é zero. Então
X X
F = fak = fjz .
k j
3. REDES. FLUXO MÁXIMO EM REDE 145

Consideremos um corte, por exemplo V ′ = {a, b, c}, V ′′ = {d, g, z} . A soma


dos elementos nas primeiras três linhas últimas três colunas é também o valor
do fluxo, porque a soma dos elementos das primeiras três linhas e colunas é zero:
X
F = fij .
i∈V ′ ,j∈V ′′

Se considerar os arcos próprios só,


X X
F = fij − fji (9.8)
i∈V ′ ,j∈V ′′ i∈V ′ ,j∈V ′′

Daqui logo
X X X
F = fij − fji ≤ cij = C. (9.9)
i∈V ′ ,j∈V ′′ i∈V ′ ,j∈V ′′ i∈V ′ ,j∈V ′′

Então, fluxo arbitrário não pode ser superior do que capacidade de corte qual-
quer: F ≤ C . Isto pode ser interpretado, se considerar a rede como rede
de transmissão de um produto. Cada unidade do produto deve percorrer um
caminho da fonte para o ocaso. Este caminho contem pelo menos um arco
(i, j), i ∈ V ′ , j ∈ V ′′ .

3.2 Algoritmo para encontrar fluxo máximo em rede


Existe um algoritmo simples para encontrar o fluxo máximo em rede. O algo-
ritmo consiste em aumentar sucessivamente o fluxo por meio de uma sucessão
de arcos do fonte para o ocaso. A sucessão pode não ser não um caminho porque
pode ter arcos que tem orientação oposta. Por exemplo para a rede na figura
9.7 usando a sucessão
3,1 3,3 8,2
a −→ b ←− g −→ z
é possível aumentar o fluxo
3,3 3,1 8,4
a −→ b ←− g −→ z.

Para encontrar uma sucessão desse tipo serve o procedimento Marcação (veja o
algoritmo 9.3). A partir da fonte a realiza-se marcação de vértices adjacentes
tais que ate esses vértices existe uma sucessão de arcos para aumentar o fluxo.
Se atingir desta maneira o vértice z , aparece possibilidade aumentar o fluxo.
O resultado do algoritmo Marcação (algoritmo 9.3) é um conjunto V ∈ V (G)
que contem os vértices v ∈ V marcados por pares (vp , δ) onde vp é o vértice
que precede o vértice v , δ é o valor em que pode ser aumentado o fluxo. Se o
z ∈ V existe uma sucessão de vértices do a para o z que usa-se para aumentar
o fluxo. Por exemplo, consideremos a marcação para a situação na rede sobre a
figura 9.7.

a(?, ∞) b(a, 2) g(b, 2)


b(a, 2) g(b, 2) c(g, 2)
z(g, 2)
O resultado de revisão do fluxo é o seguinte
3,3 3,1 8,4
a −→ b ←− g −→ z.
146 CAPÍTULO 9. DIGRAFOS, REDES

Input: G é uma rede com vértices ordenados a = 0, . . . , n = z


• a é fonte, z é ocaso
• cij é capacidade do arco (i, j)
Output: fluxo máximo f (i, j), i, j ∈ 0, . . . , n
for all arcos (i, j) do
atribuir fij := 0
end for
repeat
MARCAÇÃO (V ) {Encontrar um conjunto V de vértices ate os quais é pos-
sível aumentar o fluxo usando o procedimento Marcação, veja em baixo o
algoritmo 9.3}
if z ∈ V then
revisar o fluxo
end if
until z ∈/V
Algoritmo 9.2: Fluxo máximo em rede

Procedimento MARCAÇÃO(var V: subset in V(G))

Output: um conjunto V ⊂ V (G) de vértices ate os quais é possível aumentar


o fluxo, cada um dos vértices tem marca da forma (vp , δ) onde vp é o vértice
que precede e δ é o valor que é possível aumentar
Marcar a fonte a por (?, ∞) ; M := {a}
V := ∅
while z ∈ / M ∧ M \ V 6= ∅ do
escolher um vértice ν ∈ M \ V { (α, δ) é marca do vértice ν }
V := V ∪ {ν}
for all vértices w ∈
/ M adjacentes para ν do
if arco (ν, w) ∈ E(G) and fνw < cνw then
Marcar w por (ν, min{δ, cνw − fνw })
M := M ∪ {w}
else if arco (w, ν) ∈ E(G) and fwν > 0 then
Marcar w por (ν, min{δ, fwν })
M := M ∪ {w}
end if
end for
end while
{z ∈ M ∨M = V }
if z ∈ M then
V := V ∪ {z}
end if
Algoritmo 9.3: Procedimento Marcação
3. REDES. FLUXO MÁXIMO EM REDE 147

Claro que o algoritmo termina se considerar só números inteiros. Ao terminar


o algoritmo vamos ter um conjunto V que não contem z e que satisfaz à
condição: para qualquer arco (i, j) com i ∈ V e j ∈ / V temos fij = cij , mas
se i ∈
/ V , j ∈ V então fij = 0 .
De fato, ao terminar o algoritmo Marcação temos M = V . Alem disso,
o algoritmo Marcação tem um invariante a seguir: todos os arcos (i, j) com
i ∈ V e j ∈ / V e fij < cij tem extremidade j ∈ M , também, se i ∈ / V ,
j ∈ V , fij > 0 então i ∈ M (verifique!). Como M = V , não existem arcos
deste tipo.
Agora da equação (9.8) temos
X
F =C= cij ,
i∈V,j ∈V
/

isto é, o fluxo coincide com a capacidade do corte (V, V (G) \ V ) . Mas para
qualquer fluxo e qualquer corte temos F ≤ C , veja (9.9). Daqui o F é o fluxo
máximo e (V, V (G) \ V ) é o corte mínimo.
Capítulo 10

Linguagens e gramáticas.
Autómatos finitos

1 Linguagens e gramáticas
Linguagens formais têm estrutura bastante simples e têm aplicações em forma-
ção de linguagens de programação. Linguagem formal introduzem-se por meio
de uma gramática.

1.1 Definição de uma gramática


Seja A um conjunto finito. Vamos chamar A por alfabeto. Usa-se a designação:
A∗ é o conjunto de todas as linhas de elementos de A . λ ∈ A é a linha vazia.
Definição 10.1. Seja L ⊂ A∗ um subconjunto definido de uma maneira certa.
Vamos chamar L por linguagem formal. Elementos do L vamos chamar pala-
vras.
Na prática o conjunto L introduz-se recursivamente. Para este objectivo
introduz-se uma noção de gramática através da qual derivam-se as palavras da
linguagem L .
Definição 10.2. Seja A um alfabeto. Uma gramática é um cortejo

G = (N, T, P, σ ∗ )

onde
• um subconjunto T ⊂ A ,
• N =A\T ,
• P ⊂ (A∗ \ T ∗ ) × A∗ é um subconjunto finito,
• σ ∗ ∈ N é um elemento certo (marcado).
O conjunto T ⊂ A chama-se o conjunto de símbolos terminais, N ⊂ A é um
conjunto de símbolos não terminais, P é o conjunto de regras de derivação ou
produção, σ ∗ é o símbolo inicial.

148
1. LINGUAGENS E GRAMÁTICAS 149

O conjunto P tem papel principal em gramática, porque é instrumento de


criação de palavras. Notemos que cada regra é par ordenado (α, β) onde α
tem pelo menos um símbolo não terminal. Para apresentar as regras em vez de
(α, β) vamos usar a forma α → β .
Exemplo 10.1. Sejam T = {a, b} , N = {c, d} , σ ∗ = c , o conjunto P das
regras
P = {c → bc, c → a, bc → d}.
Então (N, T, P, σ ∗ ) é gramática.

1.2 Derivação
O conjunto P das regras vamos usar para derivar (produzir) as palavras da
linguagem L ⊂ A∗ i.e. linhas finitas de símbolos de A . A partir do elemento
inicial σ ∗ podem ser derivadas diferentes palavras conforme à definição
Definição 10.3. Seja G = (N, T, P, σ ∗ ) uma gramática. Se α → β é uma
regra de derivação e xαy ∈ A∗ então diz-se que xβy é derivável directamente
de xαy e escrever
xαy ⊢ xβy.
Se αi ∈ A para i = 1, . . . , n e αi+1 é derivável de αi (i = 1, . . . , n − 1) então
diz-se que αn é derivável de α1 e escreve-se

α1 ⊢ αn .

Note que as letras x, y, α e β servem para designar diferentes linhas (pa-


lavras) do conjunto A∗ e sob xαy subentende-se a concatenação simples das
linhas.
Consideremos duas derivações para a gramática definida no exemplo 10.1:
c ⊢ bc ⊢ bbc ⊢ bba
c ⊢ bc ⊢ bbc ⊢ bd.
Não é possível continuar a partir das palavras bba e bd .
Definição 10.4. Sejam A um alfabeto, G = (N, T, P, σ ∗ ) uma gramática.
Elementos deriváveis através da gramática G vamos chamar linhas terminais
se eles consistem de símbolos terminais que são elementos do conjunto T .
O conjunto L(G) ⊂ T ∗ de todas as linhas terminais forma linguagem formal
que se chama linguagem gerada por G .
É cómodo usar as letras maiúsculas para símbolos não terminais e letras
minúsculas para símbolos terminais. Consideremos mais uma gramática
Exemplo 10.2. Sejam N = {σ ∗ , S}, T = {a, b} ,

P = {σ ∗ → bσ ∗ , σ ∗ → aS, S → bS, S → b}.

Temos aSbb ⊢ abSbb (regra S → bS ).


A linha bbab é derivável de σ ∗ i.e. σ ∗ ⊢ bbab . A derivação é

σ ∗ ⊢ bσ ∗ ⊢ bbσ ∗ ⊢ bbaS ⊢ bbab.

Então bbab ∈ L(G) .


150 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

A definição 10.4 é caso particular da definição geral 7.1 para definir conjuntos
recursivamente. De facto o conjunto X na definição 7.1 neste caso consiste de
um só elemento σ ∗ e qualquer elemento de L(G) pode ser obtido por meio de
regras certas a partir de outros elementos obtidos antes (definição 10.3).
Exemplo 10.3. Seja G gramática no exemplo 10.2. Vamos analisar a linguagem
L(G) .
Por meio de um passo (directamente do σ ∗ ) é possível obter 2 elementos
só: bσ ∗ e aS . Notemos que cada uma destas palavras não é de T ∗ . Por meio
de 2 passos vamos ter
bbσ ∗ , baS e abS, ab.
Apenas a última linha ab é linha terminal, i.e., ab pertence ao conjunto T ∗ .
Continuação desta investigação mostra que L(G) consiste de todas as linhas
da forma bn abm onde n ≥ 0, m ≥ 1 e nada mais:
L(G) = {bn abm : n ≥ 0, m ≥ 1}.
Aqui bn é designação para a palavra de n letras b :
bb . . . }b
| {z .
n elementos
Demonstração. Vamos usar o princípio generalizado da indução matemática.
Demonstremos que cada linha l obtida tem forma
l = bn σ ∗ ou l = bn abm S̃ (10.1)
onde S̃ = S or S̃ = λ . Além disso se S̃ = λ então m ≥ 1 .
Base. É evidente que o símbolo σ ∗ obedece à condição dada.
Indução. Seja l = bn σ ∗ . As linhas bn+1 σ ∗ e bn aS que podem ser derivadas
da l directamente têm a forma (10.1). Agora seja l = bn abm S̃ . Caso S̃ = λ
a linha l é linha terminal e obedece a condição (10.1). Caso S̃ = S temos
l ⊢ bn abm+1 S, l ⊢ bn abm+1 . As últimas linhas satisfazem à condição (10.1).
As vezes usa-se uma notação mais curta para apresentar as regras, a notação
em forma de Backus – Naur. Por exemplo, várias regras de forma
A → α1 , A → α2 , . . . , A → αn
usa-se a forma
A ::= α1 |α2 | . . . |αn .
Exemplo 10.4. Um número inteiro é definido como uma sucessão de algarismos
que pode ter o sinal ( + ou − ) a frente. A seguir temos uma gramática para
isso
1. N = {D, I, S, U } , D é (digit) algarismo, I é inteiro, S é (signed integer)
inteiro com sinal, U é (unsigned integer) inteiro sem sinal
2. T = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, −}

D ::= 0|1|2|3|4|5|6|7|8|9
I ::= S|U
S ::= +U | − U
U ::= D|DU
I é o símbolo inicial.
2. CLASSIFICAÇÃO 151

2 Classificação
Definição 10.5 (Gramáticas regulares, livres de contexto, contexto sensíveis).
Consideremos os três casos abaixo
(A) Se cada regra de produção tem forma

αAβ → αδβ (10.2)

onde α, β ∈ A∗ , A ∈ N, δ ∈ A∗ \ {λ} vamos chamar G por gramática


contexto sensível,
(B) Se cada regra de produção tem forma

A→δ

onde A ∈ N, δ ∈ A∗ \ {λ} vamos chamar G gramática livre de contexto


(C) Se cada regra de produção tem forma

A → α ou A → αB

onde A, B ∈ N, α ∈ T \ {λ} vamos chamar G gramática regular.


Exemplo 10.5. Consideremos a gramática representada pelos conjuntos dos sím-
bolos não terminais e terminais

N = {σ ∗ , R, U, V }, T = {a, b},

o conjunto das regras

σ ∗ → aU V, σ ∗ → aV, U → aU R, U → aR, V → ba, Rb → bR, Ra → baa

e o símbolo inicial σ ∗ . A gramática não é gramática contexto sensível porque


a regra Rb → bR não satisfaz à condição (10.2).
Os casos (B) e (C) são casos particulares do (A) e portanto G não é livre
de contexto e não é regular.
Mas existe uma gramática que é equivalente a esta e é contexto sensível. As
duas gramáticas G1 e G2 são equivalentes se as linguagens geradas são iguais,
isto é
L(G1 ) = L(G2 ).
No caso da gramática no exemplo 10.5 em regras que contém b o b pode ser
substituído por um símbolo não terminal B , a regra RB → BR pode ser
substituída pelas regras

RB → RS, RS → BS, BS → BR

e introduzida uma nova regra B → b .


É possível mostrar que L(G) = {an bn an : n ≥ 1} .
Exemplo 10.6. Consideremos a gramática: T = {a, b, c}, N = {σ ∗ , A, B} , as
regras são

σ ∗ → BAB, σ ∗ → ABA, A → AB, B → BA, A → aA, A → ab, B → b,


152 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

o símbolo inicial é σ ∗ .
Notemos que esta gramática não é regular mas é livre de contexto. Verifi-
quemos se a linha abbbaabab pertence a L(G) , isto é abbbaabab ∈ L(G) ?
Primeiro consideremos todas as linhas que não contêm símbolos terminais
a, b . Tem-se uma simetria: se uma linha de letras A e B for derivável
de σ ∗ então a linha obtida por meio de troca A → B e B → A é tam-
bém derivável. Consideremos portanto a linha BAB só. Aplicando as regras
A → AB, B → BA é possível obter todas as linhas da forma BAm B n Al B k . . .
onde m ≥ 1, n ≥ 1 e linhas desta forma só (demonstre usando a indução mate-
mática).
Obteremos primeiro a linha ABBAA :

σ ∗ ⊢ ABA ⊢ ABAA ⊢ ABBAA ⊢


abBBAA ⊢ abbBAA ⊢ abbbAA ⊢ abbbaAA ⊢ abbbaabA ⊢ abbbaabab.

Em cada passo a barra mostra a letra para a qual aplicamos uma das regras.

3 Máquinas finitas
Definição 10.6. Uma máquina finita ou FSM (Finite State Machine) consiste
de
• Um conjunto finito I de símbolos de entrada
• Um conjunto finito O de símbolos de saída
• Um conjunto finito S de estados
• Uma função f : S × I → S que determina estado consequente
• Uma função (de extracção) g : S × I → O
• Um estado inicial σ ∗ ∈ S .
Escrevemos M = (I, O, S, f, g, σ ∗ ) .
Exemplo 10.7. Sejam I = {a, b}, O = {0, 1}, S = {σ0 , σ1 } . Determinemos as
funções f e g :
f (σ0 , a) = σ0 g(σ0 , a) = 0
f (σ0 , b) = σ1 g(σ0 , b) = 1
f (σ1 , a) = σ1 g(σ1 , a) = 1
f (σ1 , b) = σ1 g(σ1 , b) = 0
ou que é o mesmo por meio da tabela

f g
a b a b
σ0 σ0 σ1 0 1
σ1 σ1 σ1 1 0

Usa-se uma representação geométrica de máquinas. As funções f e g podem


ser definidas através do diagrama de transições (figura 10.1)
4. AUTÓMATOS FINITOS 153

a/0 b/0

b/1
σ0 σ1

a/1

Figura 10.1: Máquina finita

O diagrama de transições é um digrafo onde os vértices são estados. O estado


inicial σ ∗ = σ0 é indicado por uma seta. Como f (σ0 , b) = σ1 e g(σ0 , b) = 1
desenhamos um arco com direcção de vértice σ0 para vértice σ1 e marcamos
a por b/1 . Temos quatro tais transições que são arcos do digrafo.
Definição 10.7 (Diagrama de transições). Seja M = (I, O, S, f, g, σ ∗ ) uma
FSM. Diagrama de transições de M é um digrafo G cujos vértices são elementos
de S e com arcos marcados. Um arco orientado existe se e somente se existe
um i ∈ I tal que f (σ, i) = σ ′ . Neste caso se g(σ, i) = s então o arco (σ, σ ′ )
está marcado por i/s .
Uma seta indica o estado inicial σ ∗ .
A partir de uma linha de entrada de elementos de I a máquina finita M
pode produzir uma linha de saída elementos do conjunto O .
Exemplo 10.8. Encontrar a linha de saída correspondente à linha de entrada

aababba

para FSM no exemplo 10.7 (a diagrama de transições é apresentada na figura


10.1).
Inicialmente ficamos no estado σ0 . O primeiro símbolo de entrada é a .
Encontramos o arco que sai do σ0 e é marcado por a/x onde x é saída. Em
nosso caso x = 0 . Continuando teremos

0011001.

Representemos isto em forma da tabela

Estado corrente σ0 σ0 σ0 σ1 σ1 σ1 σ1 σ1
Símbolo de entrada a a b a b b a
Símbolo de saida 0 0 1 1 0 0 1

4 Autómatos finitos
Autómato finito é um caso particular de FSM:
Definição 10.8. Autómato finito é uma máquina finita A = (I, O, S, f, g, σ ∗ )
que satisfaz às condições
154 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

b/0 a/1
b a
a/1
a/1 a
σ0 b/0 σ1 σ2 σ0 σ1 a σ2
b

b/0 b

Figura 10.2: Máqina Figura 10.3: Autómato

• O = {0, 1}
• Estado corrente determina a última saída.
Os estados para os quais a última saída foi 1 chamam-se estados aceitáveis.
Exemplo 10.9. Consideremos FSM A definida por meio da tabela

f g
a b a b
σ0 σ1 σ0 1 0
σ1 σ2 σ0 1 0
σ2 σ2 σ0 1 0

O diagrama de transições é apresentada sobre a Figura 10.2.


O A é um autómato finito porque
• os valores da função g são 1 e 0
• para os estados σ1 e σ2 a última saída é 1 , para o estado σ0 a última
saída é 0 .
Os estados aceitáveis são σ1 e σ2 .
Vamos omitir sobre diagrama de transições símbolos de saída mas indicar os
estados aceitáveis por meio de circunferências duplas: veja a figura 10.3.
Tendo em vista esta convenção sobre diagramas de transições introduzimos
uma definição alternativa para autómato finito.
Definição 10.9. Autómato finito

A = (I, S, f, A, σ ∗ )

consiste de
• Um conjunto finito I de símbolos de entrada
• Um conjunto finito S de estados
• Uma função f : I × S → S
• Um subconjunto A ⊂ S de estados aceitáveis
4. AUTÓMATOS FINITOS 155

a b
b
σ0 σ1 b σ2
a

Figura 10.4: Diagrama de transições

• Um estado inicial σ ∗ ∈ S
Exemplo 10.10. Consideremos o autómato finito A = (I, S, f, A, σ ∗ ) onde

I = {a, b}, S = {σ0 , σ1 , σ2 }, A = σ2 , σ ∗ = σ0

e a função f é dada por meio da tabela

a b
σ0 σ0 σ1
σ1 σ0 σ2
σ2 σ0 σ2

O diagrama de transições é apresentada sobre a figura 10.4.

Definição 10.10. Se α = x1 x2 . . . xn é uma linha de entrada e

(a) σ0 = σ ∗
(b) f (σi−1 , xi ) = σi para i = 1, . . . , n
diz-se que a linha α representa o caminho
1 x 2 x x
σ0 −→ σ1 −→ · · · −→
n
σn

O problema principal consiste em seguinte. Dada uma linha de símbolos de


I determinar se último estado for aceitável ou não.
Definição 10.11. Sejam A = (I, S, f, A, σ ∗ ) um FSA e α = x1 . . . xn uma
linha não vazia com xi ∈ I . Se existe uma sucessão de estados σ0 , . . . , σn
satisfazendo
(a) σ0 = σ ∗
(b) f (σi−1 , xi ) = σi para i = 1, . . . , n
(c) σn ∈ A
vamos chamar α aceitável por A .
156 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

Em outras palavras, α é aceitável se α representa um caminho com estado


terminal aceitável.
Vamos usar a notação Ac(A) para o conjunto de todas as linhas aceitáveis
segundo o autómato A .
Se analisarmos o autómato no exemplo 10.10 (veja a figura 10.4) podemos
notar que qualquer linha l aceitável termina por duas letras b consecutivas.
Verifique que esta condição é também suficiente para l ∈ Ac(A) .
Exemplo 10.11. Construir uma autómato que aceita as linhas que contêm um
número ímpar das letras a .
Solução. Para distinguir linhas com número par ou ímpar das letras a é
suficiente introduzir os dois estados I (ímpar) e P (par). Sempre que aparece
letra a , temos mudança do estado corrente. A letra b não tem importância
para estado corrente. A solução é apresentada na figura 10.5

b b

a
P I

Figura 10.5: O número de letras a é ímpar

5 Relação entre autómatos finitos e gramáticas


5.1 Gramática regular determina um diagrama
Segundo a definição de gramática regular cada regra de produção tem uma das
duas formas
S → x ou S → xS1
onde x é um símbolo terminal e S e S1 são símbolos não terminais. Considere-
mos o processo de derivação usando regras desta forma. Qualquer linha derivada
a partir do símbolo inicial consiste de vários símbolos terminais e termina em
símbolo não terminal. Isto permite introduzir um diagrama e interpretar o pro-
cesso de derivação como um caminho sobre o diagrama (veja o exemplo 10.12
abaixo).
Exemplo 10.12. Dada a gramática regular T = {a, b}, N = {σ ∗ , C} com as
regras de produção

σ ∗ → bσ ∗ , σ ∗ → aC, C → bC, C → b

e com símbolo inicial σ ∗ . Consideremos por exemplo o processo de derivação


de uma palavra bbabb ∈ L(G) :

σ ∗ ⊢ bσ ∗ ⊢ bbσ ∗ ⊢ bbaC ⊢ bbabC ⊢ bbabb.

Notemos que o processo pode ser codificado por meio do caminho


b b a b b
σ ∗ −→ σ ∗ −→ σ ∗ −→ C −→ C −→ F.
5. RELAÇÃO ENTRE AUTÓMATOS FINITOS E GRAMÁTICAS 157

b b

a b
σ∗ C F

Figura 10.6: Gramática → Diagrama

Este caminho é um caminho no diagrama (figura 10.6).


O diagrama está feita de modo que se α ∈ L(G) então a α ∈ Ac(A) . Para
x
atingir isto, a cada regra da forma σ → xσ1 constrói-se um arco σ −→ σ1 :
x
σ → xσ1 → σ −→ σ1 .

Mas para usar as regras terminais introduz-se mais um mais um elemento F .

5.2 Autómato determina uma gramática


Autómatos finitos têm os diagramas de transições. Consideremos o problema
inverso, a partir do diagrama de transições de um autómato A achar uma
gramática regular
A −→ G.
Para isso é bastante inverter o precedente.
O objectivo é: para um autómato finito A = (I, S, f, A, σ ∗ ) é preciso en-
contrar uma gramática regular G tal que

L(G) = Ac(A). (10.3)

Isto pode ser realizado usando as duas regras:


x
• A cada arco orientado (S → S ′ ) com marca x introduzimos a regra de
produção da forma S → xS ′
x
(S → S ′ ) −→ S → xS ′ . (10.4)
x
• Além disso a cada arco (S → S1 ) que liga o estado S com um estado
aceitável Sa deve ser introduzida uma regra da forma S → x .
x
(S → Sa ) −→ S → x. (10.5)

Exemplo 10.13. Consideremos o autómato sobra a figura 10.5.


O nosso objectivo é determinar uma gramática G = (N, T, P, σ ∗ ) que sa-
tisfaça a relação (10.3). Claro que T = {a, b} = I . No nosso caso temos o
conjunto P de regras

P → bP, P → aI, I → bI, I → aP

e
I → b, P →a
respectivamente. A gramática G = (N, T, P, σ ∗ ) com N = {P, I}, σ ∗ = P
vai gerar a linguagem L(G) = Ac(A) . De facto L(G) consiste de palavras
contendo número ímpar de letras a .
158 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

Teorema 10.1. Seja A = (I, S, f, A, σ ∗ ) um autómato finito. Consideremos


a gramática G = (N, T, P, σ ∗ ) obtida do A pelas igualdades

N = S, T =I

e (10.4), (10.5). Então G é gramática regular com

L(G) = Ac(A).

5.3 Uma gramática regular determina um autómato inde-


terminado
Agora consideremos o problema inicial: a partir de uma gramática G regular
construir um autómato finito
G −→ A.
Dada uma gramática regular G encontrar um autómato finito de modo que
L(G) = Ac(A) onde Ac(A) é o conjunto de todas as linhas aceitáveis por
autómato A . Isto será feito por meio de dois passos. O primeiro permite
construir um autómato indeterminado Ae tal que

e
L(G) = Ac(A).

O segundo permite construir um autómato finito A tal que


e = Ac(A).
Ac(A)

Vamos inverter o método do teorema 10.1. Para regras da produção da forma


x x
S → xS ′ e S → x construímos os arcos (S → S ′ ) e (S → F ) onde F é um
estado introduzido como estado final aceitável.
Por exemplo, consideremos a gramática do exemplo 10.12. Então temos os
4 arcos (Fig. 10.7). Mas o resultado não é autómato. O vértice C não tem
arcos marcados por a que saem do C e tem dois arcos marcados por b .

a b
b b
σ∗ {C} {σ ∗ }
a b C ∅ {C, F }
σ∗ C F
F ∅ ∅

Figura 10.7: Autómato indeterminado

Este exemplo mostra que não é suficiente inverter o método do teorema 10.1.
Definição 10.12 (Autómato indeterminado). Autómato finito indeterminado
e consiste de
A
(a) Um conjunto finito I de símbolos de entrada
(b) Um conjunto finito S de estados
(c) Uma função f : S × I → P(S) onde P(S) significa o conjunto de todos
os subconjuntos de S
5. RELAÇÃO ENTRE AUTÓMATOS FINITOS E GRAMÁTICAS 159

(d) Um subconjunto A ⊂ S de estados aceitáveis


(e) Um estado inicial σ ∗ ∈ S
O diagrama sobre Fig. 10.7 representa o autómato indeterminado

I = {a, b}, S = {σ ∗ , C, F }, A = {F },

com estado inicial σ ∗ e a função f dada pela tabela na mesma figura.


Exemplo 10.14. Construir o diagrama de transições para autómato indetermi-
nado
I = {a, b}, S = {σ ∗ , C, D}, A = {C, D},
com estado inicial σ ∗ e função f dada pela tabela

a b
σ∗ {σ ∗ , C} {D}
C ∅ {C}
D {C, D} ∅
O resultado é apresentado sobre a figura 10.8.

a b a

a a
σ∗ C F

Figura 10.8: Diagrama de transições

Temos que dar definição de linhas aceitáveis por autómato indeterminado.


Definição 10.13 (Linha aceitável). Sejam A e = (I, S, f, A, σ ∗ ) autómato in-
determinado e α = x1 . . . xn uma linha não vazia com xi ∈ I . Se existe uma
sucessão de estados σ0 , . . . , σn satisfazendo
(a) σ0 = σ ∗
(b) σi ∈ f (σi−1 , xi ) para i = 1, . . . , n

(c) σn ∈ A
vamos chamar α aceitável por A . Designemos Ac(A) o conjunto de todas as
linhas aceitáveis.
Notemos que a sucessão σ0 , . . . , σn e as marcas x0 , . . . , xn dos arcos no
diagrama de transições determinam um caminho (único) no digrafo que apre-
senta o diagrama de transições. Em termos do digrafo pode-se dizer que a linha
α = x1 . . . xn é aceitável se e somente se existe um caminho
1 x 2 x x
σ0 −→ σ1 −→ · · · −→
n
σn
160 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

com um estado aceitável σn . Vamos dizer que a linha α representa o caminho.


A linha α = bbabb é aceitável por autómato em diagrama 10.7. De facto
existe o caminho
b b a b b
σ ∗ −→ σ ∗ −→ σ ∗ −→ C −→ C −→ F

que leva para estado aceitável. É suficiente encontrar um tal caminho.


A linha α = aabaabbb é aceitável por autómato no diagrama 10.7. O cami-
nho correspondente é
a a b a a b b b
σ ∗ −→ σ ∗ −→ σ ∗ −→ D −→ D −→ C −→ C −→ C −→ C.

5.4 Autómato indeterminado — autómato


O objectivo desta secção é encontrar um algoritmo para construir um autómato
finito A′ equivalente a um autómato indeterminado A . A equivalência dos
autómatos A e A′ entende-se como sempre:

Ac(A′ ) = Ac(A).

Para analisar isso consideremos o problema seguinte. Dada uma linha (pa-
lavra) α = x1 x2 . . . xn , xi ∈ I achar o conjunto de todos os estados atingíveis
usando esta linha α . Um estado σ vai ser atingível se existe pelo menos um
caminho representado pela α do estado inicial para o estado σ , isto é, um
caminho da forma
x x x
σ ∗ −→
1 2
σ1 −→ · · · −→
n
σn , σn = σ.

Por exemplo, os valores f (σ ∗ , a) e f (σ ∗ , b) no caso de I = {a, b} representam


os conjuntos de estados atingíveis para as linhas que contêm única letra ( a ou
b ).
Para encontrar o conjunto atingível, por exemplo, para a linha bbab , sufici-
ente encontrar o conjunto C para a linha bba e depois achar a união
[
f (σ, b), σ ∈ C.

A sucessão bbab determina uma sucessão de conjuntos de maneira única. Isto


permite construir um autómato finito com estados que são subconjuntos do
conjunto de estados S .
O teorema 10.2 é conclusão desta secção.
Teorema 10.2. Seja G = {N, T, P, σ ∗ } gramática regular. Sejam

I=T
S = N ∪ {F } onde F ∈ / N ∪T
(
[ F se σ → x ∈ P ,
f (σ, x) = {σ ′ | σ → xσ ′ ∈ P }
∅ no caso contrário.

Então o autómato A = (I, S, f, A, σ ∗ ) aceita exactamente as linhas de L(G)


isto é
Ac(A) = L(G).
6. EXERCÍCIOS 161

5.5 Construção directa de autómatos


Exemplo 10.15. Construir dois autómatos que aceitam as linhas que contêm bb
e bab respectivamente (linhas formadas das letras a e b , isto é, I = {a, b} ).
As respostas são apresentadas nas figuras 10.9 e 10.10. Vamos analisar as
soluções.
O estado B1 do primeiro autómato diz que uma linha corrente termina em
b . Isto resulta logo que no estado F1 vamos ter uma linha corrente que contem
duas letras b consecutivas.
Agora consideremos o diagrama do segundo autómato. O B2 tem a mesma
informação: a linha corrente termina em b . O estado BA diz que alinha
corrente termina em ba .

a a

σ1 b b
B1 F1
a

Figura 10.9: Contem bb

a a
a

b a b
σ∗ B2 BA F1

b b

Figura 10.10: Contem bab

O método considerado no exemplo 10.15 utiliza raciocínio que pode ser cha-
mado uso de informação dos estados. O método serve bom para autómatos
bastante simples.

6 Exercícios
6.1 Gramáticas
Nos exercícios 1-6 determinar se a gramática dada é contexto-sensível, livre de
contexto, regular ou não pertence a nenhuma classe.
1. T = {a, b}, N = {σ ∗ , A} com regras
σ ∗ → bσ ∗ , σ ∗ → aA, A → aσ ∗ , A → bA, A → a, σ ∗ → b
e símbolo inicial σ ∗ .
2. T = {a, b, c}, N = {σ ∗ , A, B} com regras de produção
σ ∗ → AB, AB → BA, A → aA, B → Bb, A → a, B → b
162 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

e símbolo inicial σ ∗ .
3. T = {a, b}, N = {σ ∗ , A, B} com regras de produção

σ ∗ → A, σ ∗ → AAB, Aa → ABa, A → aa, Bb → ABb, AB → ABB, B → b

e símbolo inicial σ ∗ .
4. T = {a, b, c}, N = {σ ∗ , A, B} com regras de produção

σ ∗ → BAB, σ ∗ → ABA, A → AB, B → BA, A → aA, A → ab, B → b

e símbolo inicial σ ∗ .
5. Regras em forma de Backus – Naur

S ::= bS | aA | a
A ::= aS | bB
B ::= bA | aS | b

e símbolo inicial S .
6. T = {a, b}, N = {σ ∗ , A, B} com regras

σ ∗ → AAσ ∗ , AA → B, B → bB, A → a

e símbolo inicial σ ∗ .

Nos exercícios 7–11 mostrar que as linhas abaixo α ∈ L(G) para as gra-
máticas G correspondentes.
7. bbabbab , exercício 1
8. abab , exercício 2
9. aabbaab , exercício 3
10. abbbaabab , exercício 4
11. abaabbabba , exercício 5
Nos exercícios 12–13 caracterizar as gramáticas
12. Seja G a gramática do exercício 1. Mostrar que α ∈ L(G) se e somente
se α é linha não vazia e contém um número par de letras a .
13. Caracterizar L(G) para G do exercício 5.
Solução. Para qualquer l ∈ (T ∪ N )∗ introduzimos a designação na (l)
que é o número das letras a desta linha. Por exemplo na (abbabaa) = 4 .
L(G) consiste de linhas que têm a forma l = l′ b2m onde l′ termina em
a (isto é, l termina em b2m ), m ≥ 0 , e na (l) é um número ímpar.
Indicação. Demonstre que se aplicarmos apenas as regras não terminais
(excepto S → a e B → b ), vamos ter uma linha l que satisfaz a uma
das condições seguintes
6. EXERCÍCIOS 163

(a) na (l) é ímpar e l termina em A ou B


(b) na (l) é par e l termina em S

Nos exercícios 14-18 formar uma gramática regular que gera as linhas não
vazias com propriedades indicadas.

14. T = {a, b} , a primeira letra é a .


Resolução. Seja σ ∗ o símbolo inicial. A primeira regra pode ter a forma
σ ∗ → aS . Se usarmos regras de gramática livre de contexto nenhuma
substituição não pode mudar a primeira letra a (está para sempre). O
símbolo S serve como símbolo inicial para criar todas as palavras de letras
a e b
S ::= a|b|aS|bS
Desta maneira podemos derivar palavra qualquer que contém pelo menos
2 símbolos. É preciso introduzir a regra σ ∗ → a . Então, as regras da
gramática são
σ ∗ ::= aS|a, S ::= a|b|aS|bS.

15. T = {a, b} , no fim tem ba .


Resolução. As regras σ ∗ ::= aσ ∗ |bσ ∗ podemos interpretar assim: se uma
palavra σ ∗ termina em ba então as palavras aσ ∗ e bσ ∗ terminam em
ba também. Uma solução é

σ ∗ ::= aσ ∗ |bσ ∗ |ba.

A terceira regra pode ser usada no fim do processo de derivação. Esta


regra pode ser substituída por duas regras σ ∗ → bA e A → a para obter
uma gramática regular.
16. T = {a, b} , contém ba .
Resolução. Pode-se raciocinar de mesma maneira: as regras σ ∗ ::= aσ ∗ |bσ ∗
servem para indicar que a parte inicial é qualquer ate apanhar ba . Adi-
cionamos mais duas regras σ ∗ → bA e A → aS para formar ba . Mas A
serve para qualquer palavra que começa com a : A ::= a|aS . Resposta:

σ ∗ ::= aσ ∗ |bσ ∗ |bA, A ::= a|aS, S ::= a|b|aS|bS

17. T = {a, b} , não termina em ab


18. Números inteiros que não começam com 0 (veja o exemplo 10.4)

Nos exercícios 20-21 formar uma gramática livre de contexto que gera as
linhas de letras a e b não vazias com propriedades indicadas.

19. T = {a, b} , linhas simétricas x1 . . . xn = xn . . . x1


164 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

20. Sejam na e nb os números de letras a e letras b respectivamente. A


condição é na = nb . Quer dizer, os números das letras a e b devem ser
iguais. Por exemplo, abbaba .
Solução. Seja σ0 é símbolo inicial.

σ0 ::= aB|bA,
B ::= bσ0 |aBB|b,
A ::= aσ0 |bAA|a,

Estas regras podem ser interpretadas de maneira seguinte. Designemos


por dif(l) = na − nb a diferença entre os números na e nb de letras
a e b da linha l . Suponhamos que uma linha l é derivada usando a
primeira regra σ → aB : σ ⊢ aB ⊢ . . . l . Claro que a partir de B pode
ser derivadas apenas linhas β com condição dif(β) = −1 . O mesmo
pode ser dito sobre A : dif(α) = 1 , se a linha α pode ser derivada a
partir de A . Agora tem de ser claro o conteúdo da regra B → aBB . Por
exemplo uma derivação B ⊢ aBB . . . ⊢ aaababbbba pode ser construída de
maneira seguinte: dividimos aaababbbbab em três partes a, aababbb, bab .
Porque assim? As linhas l1 = aababbb e l2 = bab satisfazem à condição
dif(l1 ) = −1 e dif(l2 ) = −1 , e por isso podem ser derivadas a partir de
B!
21. (∗ ) Repetir o exercício 20 com a condição 2na = nb .
Resposta:

σ0 ::= aII|bU, I ::= aIII|b|bσ0 , U ::= aI|bD, D ::= a|aσ0 |bU D|bDU

Indicação. Introduzimos uma característica de linha que vamos chamar


por índice
index(l) = 2na − nb .
A mesma característica index(X) = index(l) introduz-se e para símbolos
não terminais se a partir do símbolo X pode ser derivada uma palavra l
com index(l) .
Temos

index(σ0 ) = 0, index(I) = −1, index(U ) = 1, index(D) = 2.

Note que não é suficiente substituir D por U U .


22. Demonstrar que a linguagem

L = {an bn ck : n, k ≥ 1}

é livre de contexto.

6.2 Autómatos
1. Determinar se a linha α = aabaabb é aceitável por autómato no exemplo
10.10 (veja a figura 10.4)?
6. EXERCÍCIOS 165

O caminho que corresponde à α = aabaabb é


a a b a a b b
σ0 −→ σ0 −→ σ0 −→ σ1 −→ σ0 −→ σ0 −→ σ1 −→ σ2 .

O estado final é σ2 e por isso a linha α é aceitável.


2. Demonstrar que uma linha α que consiste de letras a e b for aceitável
por o autómato 10.10 se e somente se α tem na extremidade bb .
Necessidade. É claro que α contém não é menor que duas letras. Letra
a leva para o estado σ0 e não é possível alcançar σ2 por meio de uma
transição. Suficiência é evidente.
3. Construir um diagrama de transições de um autómato finito que aceita o
conjunto de linhas α contendo a e b e satisfazendo a uma das condições:
(a) Contém pelo menos uma letra b (veja a resposta sobre a figura 10.11).
(b) Contém um número ímpar de a (veja a figura 10.5).
(c) Contem ab .
(d) Termina em ab .
4. Elaborar um autómato indeterminado que aceita linhas não vazias de a
e b e satisfazendo às condições
(a) começa com abb ou ba
(b) termina em abb ou ba
(c) contém abb ou ba
(d) contém bab e bb
(e) cada um de b tem a seguir um a (ou vários)
(f) começa com abb e termina em ab
(g) começa com ab e não termina em ab
(h) não contém ba ou bbb (significa que não contém pelo menos uma
das duas linhas)
(i) não contém abba ou bbb

a a

b
σ∗ F

Figura 10.11: Contém pelo menos uma letra b


166 CAPÍTULO 10. LINGUAGENS E GRAMÁTICAS

Solução do exercício 4d
Existe um método que permite construir um autómato directamente. Já sa-
bemos qualquer linha das letras determina um caminho sobre o diagrama do
autómato. Depois de usar uma parte inicial da linha o autómato está numa
posição (num estado), e este estado deve caracterizar a parte inicial indicada da
linha. Por exemplo, consideremos o exercício 4d. Introduzimos a tabela seguinte
das proposições que vamos aplicar a parte inicial da linha:
proposição a linha corrente . . .
B termina em b
BA termina em ba
A termina em a
Cbb contém bb
Cbab contém bab
F estado final, F = Cbb ∧ Cbab
Cada um dos estados pode ser caracterizado por meio das proposições da tabela.
Por exemplo, o estado Cbab ∧ A diz que a parte inicial corrente contém bab e
termina em a .
O resultado veja sobre a figura 10.12:

a b b a

b b a a
σ∗ B Cbb , B Cbb , BA Cbb , A

a b
a
a
b
b a
BA Cbab , B Cbab , A F b
b
a

Figura 10.12: Contém bab e bb

Por exemplo, consideremos o estado Cbab , A . Se a letra corrente é a , não


há nenhuma alteração, porque a linha com esta letra a continua terminar em
a . Por isso, temos laço. Se a letra corrente é b , a linha com letra b termina
em b , e estado a seguir é Cbab , B .

Solução do exercício 4h
Solução do exercício 4h. Consideremos a negação da proposição, i.e., uma linha
contém ba e contém bbb . Seja σ0 o símbolo inicial. A seguir são as regras de
uma gramática que é equivalente a uma gramática regular

σ0 ::= aσ0 |bσ0 |baB|bbbA


6. EXERCÍCIOS 167

onde B contém bbb , A contém a . Para A e B deve ser:

A ::= bA|aF |a, F ::= aF |bF |a|b

B ::= aB|bB|bbb|bbbF
Esta gramática permite construir uma autómato indeterminado. O autómato
pode ser invertido no sentido de fazer aceitável cada um de estados não aceitáveis
e vice versa.
Bibliografia

[1] N. L. Biggs. Discrete Mathematics. School of Economics, University of


London, Clarendon Press, 1990.
[2] J. E. Hopcroft. Introduction to Automata Theory, Languages, and Compu-
tation.
[3] R. Johnsonbaugh. Discrete Mathematics. Macmillan Publishing Company,
New York, Collier Macmillan Publishers, London, 1989.
[4] Kenneth A. Ross and Charles R.B. Wright. Discrete Mathematics. Prentice-
Hall International, 1992.
[5] S. Labovski. Elementos de Matemática Discreta. UEM, DMI, Maputo, 1999.
[6] M. Sipser. Introduction to the Theory of Computation. MIT PWS Publishing
Company.
[7] D. R. Stinson. Cryptography, Theory and Practice.
[8] D. J. Velleman. How To Prove It, A Structured Approach. Cambridge
University Press.

168

Você também pode gostar