Você está na página 1de 131

MAT

ERI
ALS
UPL
EME
NTARP
ARAACOMP
ANHAR
Guia de Estudos Online
Capítulo

Lógica Formal 1
O Capítulo 1 é uma introdução à lógica simbólica, ou formal, e a algumas de suas aplicações
à ciência da computação. Precisamos encontrar, primeiro, uma notação para representar
argumentos lógicos de maneira formal ou simbólica. Inicialmente isso pode parecer
estranho — por que deveríamos tentar tornar algo sem sentido? Porque retirar o significado
(e quaisquer noções preconceituosas que possamos ter sobre aquele significado) permite que
nos concentremos na forma pura do argumento.

Considere o seguinte argumento:

O Havaí é o 50o estado americano.


Honolulu está na ilha de Oahu.
Portanto, Honolulu é a capital do Havaí.

Como compreendemos o significado dessas afirmações — e como todas elas são verda-
deiras —, poderíamos achar que esse é um argumento lógico. Mas não é; essas são apenas
três afirmações separadas e verdadeiras. A afirmação de que Honolulu é a capital do Havaí
não é uma consequência lógica das duas primeiras afirmações.
Se simbolizarmos esse argumento como

A
B

portanto, C,
é fácil ver que as diversas frases não estão relacionadas e esse não é um argumento lógico.
Em um argumento lógico, a conclusão segue por causa da maneira em que está relacionada
estruturalmente com as hipóteses. A lógica simbólica estuda essas relações estruturais de
modo abstrato para se concentrar em sua forma.
No Capítulo 1, veremos como representar um argumento simples simbolicamente e
determinar se é um argumento lógico correto. A Seção 1.1 começa com afirmações simples
(às vezes denominadas proposições) que não são verdadeiras nem falsas e depois discute
como essas afirmações simples podem ser combinadas usando-se conectivos lógicos que
manipulam os valores lógicos de acordo com regras bem definidas. As afirmações resul-
tantes são chamadas de fórmulas bem formuladas proposicionais. A Seção 1.2 discute
regras de dedução que podem ser usadas para gerar um argumento válido envolvendo fór-
mulas proposicionais bem formuladas.
As letras de proposição, as regras de equivalência e as regras de inferência da lógica
proposicional não são suficientes para provar tudo que consideraríamos um argumento ló-
gico válido. Em vez de letras de proposição simples, introduzimos quantificadores que
nos permitem decidir se “alguns” ou “todos” os elementos de determinado domínio têm
alguma propriedade específica. O quantificador existencial ($x)P(x) diz que pelo menos
um elemento no domínio tem a propriedade P. O quantificador universal (∀x)P(x) diz que

1
2 Guia de Estudos Online

todo elemento no domínio tem a propriedade P. A combinação de expressões desse tipo


com conectivos lógicos fornece as fórmulas bem formuladas predicadas, introduzidas
na Seção 1.3.
Um argumento na lógica de predicados tem a forma

P1 P2 ... Pn Q

em que os Pi e o Q são fbf (fórmulas bem formuladas) predicadas. Esse será um argumento
válido se for verdadeiro em todas as interpretações possíveis. Para provar a validade,
introduzimos regras de inferência adicionais a nosso sistema lógico formal que nos permi-
tem inserir ou retirar quantificadores. Como a lógica proposicional, a lógica de predicados
(Seção 1.4) é um sistema formal completo e correto.
Além de fornecer a estrutura subjacente para o pensamento lógico, a lógica formal tem
duas aplicações diretas para a ciência da computação — programação lógica e demons-
tração de correção. Esses tópicos são discutidos nas Seções 1.5 e 1.6, respectivamente.

Sistemas Completos e Corretos


Sistemas de lógica formal tentam demonstrar que certas proposições da forma P Q são
inerentemente verdadeiras. A conclusão Q tem que seguir da hipótese P por causa da rela-
ção estrutural entre P e Q, e não devido a nenhum significado particular dado a P ou a Q.
(Lembre-se de que essa é a motivação por trás da simbolização.) Assim, se as fbfs em P e
em Q forem fbfs proposicionais, então P Q tem que ser verdadeira para todos os valores
lógicos, ou seja, P Q tem que ser uma tautologia. Se as fbfs em P e em Q forem fbfs pre-
dicadas, então P Q tem que ser verdadeira para todas as interpretações, ou seja, P Q tem
que ser válida. Podemos testar se uma proposição é uma tautologia por meio de uma tabela-
verdade, mas não existe um teste mecânico correspondente para a validade, e dependemos
de um sistema de regras de dedução para provar que Q segue de P.

Argumento Lógico P Q
Lógica Proposicional Lógica de Predicados
P Q é uma tautologia P Q é válida
Pode testar através de uma tabela-verdade Não existe teste mecânico

As regras de dedução devem permitir a demonstração de todo condicional P Q que


é verdadeiro (o sistema é completo) e nada que não seja verdade (o sistema é correto). No-
vamente, “verdade” na lógica proposicional significa tautologia e na lógica de predicados
significa validade.

Visão Ger al da Seção 1.1

Proposições são sentenças com valores lógicos. Uma frase simples pode ser representada
por uma letra de proposição (A, B etc.). Letras de proposição podem ser combinadas em
proposições novas usando os conectivos lógicos de

• conjunção
• disjunção
• condicional
• equivalência
• negação
Guia de Estudos Online 3

Os valores lógicos da proposição nova são obtidos dos valores lógicos de suas componentes
de acordo com as tabelas-verdade para os conectivos. As tabelas-verdade definem como
cada conectivo opera nos valores lógicos. As tabelas-verdade são relativamente intuitivas,
com a possível exceção do condicional. O condicional

A B

é definido como verdade EXCETO quando A for V e B for F.


Para encontrar o valor lógico de uma fórmula bem formulada (fbf) complexa, cons-
trua sua tabela-verdade. Construa a tabela a partir das componentes da fbf, começando com
o pedaço menor. Use a tabela-verdade para cada conectivo lógico que encontrar.
Uma fbf que é verdadeira para qualquer combinação de valores lógicos atribuídos
às suas letras de proposição é uma tautologia. Uma fbf que é falsa para qualquer com-
binação de valores lógicos atribuídos às suas letras de proposição é uma contradição.
Você pode identificar tautologias e contradições fazendo uma tabela-verdade para a fbf.
Se o conectivo principal de uma fbf for um condicional, ou seja, se “olhando de longe” a
proposição parece com

P Q

Você também pode usar o Algoritmo TestaTautologia para decidir se é uma tautologia.
Esse algoritmo funciona atribuindo a P o valor V e a Q o valor F. Você então segue as con-
sequências dessas atribuições passando pelas várias componentes até todas as ocorrências
de uma letra de proposição terem recebido um valor lógico. Se alguma letra tiver recebido
dois valores lógicos diferentes durante esse processo, então as atribuições originais P-V e
Q-F são impossíveis e a fbf é uma tautologia. Caso contrário, você encontrou uma atribui-
ção que torna P-V e Q-F possível e a fbf não é uma tautologia.

Amostras de Solução de Problemas


• Problema 1 — Construindo tabelas-verdade para fbfs compostas.
• Problema 2 — Reconhecendo tautologias e contradições.

Tabelas-Verdade para os Conectivos Lógicos

• Conjunção ( )
• Disjunção ( )
• Condicional ( )
• Equivalência ( )
• Negação ( 9 )

A B A B A   B A B A B A9
V V V V V V F
V F F V F F F
F V F V V F V
F F F F V V V

Construindo Tabelas-Verdade para Fbfs Compostas


Problema:
Construa uma tabela-verdade para a fbf
(A9 B) (C9 A)
4 Guia de Estudos Online

Solução:
Passo 1. Construa o início da tabela-verdade. Decida quantas linhas ela terá e forneça valo-
res lógicos às letras de proposição.

A B C
V
F
V
F
V
F
V
F

A B C
V V
V F
F V
F F
V V
V F
F V
F F

A B C
V V V
V V F
V F V
V F F
F V V
F V F
F F V
F F F

Passo 2. Construa a tabela-verdade para a componente A9 B.

A B C A9
V V V F
V V F F
V F V F
V F F F
F V V V
F V F V
F F V V
F F F V
Guia de Estudos Online 5

A B C A9 A9 B
V V V F V
V V F F V
V F V F V
V F F F V
F V V V V
F V F V V
F F V V F
F F F V F

Passo 3. Construa a tabela-verdade para a componente C9 A.

A B C A9 A9 B C9
V V V F V F
V V F F V V
V F V F V F
V F F F V V
F V V V V F
F V F V V V
F F V V F F
F F F V F V

Passo 4. Junte as duas componentes principais.

A B C A9 A9 B C9 C9 A ( A9 B) ( C9 A)
V V V F V F V V
V V F F V V V V
V F V F V F V V
V F F F V V V V
F V V V V F F F
F V F V V V V V
F F V V F F F F
F F F V F V V V

Reconhecendo Tautologias e Contradições


Problema:
Determine se a fbf

[(A B9) B] A

é uma tautologia.

Solução:
Passo 1. Decida sobre o método a ser usado — Algoritmo TestaTautologia.
6 Guia de Estudos Online

Passo 2. Atribua valores lógicos ao antecedente e ao consequente.


[(A B9) B] A
V F
donde concluímos que
A é falsa
B é verdadeira
B9 é falsa
A é verdadeira
A recebeu dois valores lógicos, falsa e verdadeira. A fbf é uma tautologia.

Visão Ger al da Seção 1.2

Suponha que um argumento tem a forma P1 P2 . . . Pn Q. Uma demonstração em


um sistema de lógica formal de que esse argumento é válido é uma sequência

W1
W2

em que os Ws (e o Q) são fbfs que são um dos dois tipos a seguir:


• uma das hipóteses Pi, ou
• obtida de fbfs anteriores na demonstração pelas regras de dedução do sistema formal.
Na lógica proposicional, existem dois tipos de regras de dedução.
• Regras de equivalência: uma regra de equivalência afirma que a fbf R é equivalen-
te à fbf S. Isso significa que, se uma fbf contendo R aparece em uma sequência de
demonstração, então a fbf obtida desta substituindo R por S pode ser adicionada à
sequência de demonstração.
• Regras de inferência: uma regra de inferência diz que, se uma fbf que já está na
sequência de demonstração coincide com determinado padrão, então uma fbf nova
pode ser adicionada à sequência de demonstração.

As regras de dedução são simplesmente padrões para a transformação de fbfs, e precisamos


ser capazes de reconhecer quando alguma fbf na sequência de demonstração coincide com
um desses padrões ou com parte de um deles.
Podemos provar a validade de argumentos em português transformando suas compo-
nentes em lógica proposicional e provando o condicional resultante P1 P2 . . . Pn Q .

Amostras de Solução de Problemas


• Problema 1 — Demonstrando um teorema em lógica proposicional.
• Problema 2 — Usando lógica proposicional para provar a validade de um argumento
em português.

Demonstrando um teorema em lógica proposicional


Problema:
Prove que a fbf

[A (B C) (B9 A9)] [A (C B)]

é um teorema na lógica proposicional.


Guia de Estudos Online 7

Solução:
Construiremos uma sequência de demonstração. (Uma tabela-verdade poderia ser usada
para verificar que a fbf é uma tautologia, o que significa — já que o sistema é completo —
que é um teorema, mas queremos, de fato, construir a demonstração.)

Passo 1. Comece a sequência de demonstração listando as hipóteses. Isso fornece a “muni-


ção” para a demonstração.
1. A (B C) hipótese
2. B9 A9 hipótese

Passo 1. Comece a sequência de demonstração listando as hipóteses. Isso fornece a “muni-


ção” para a demonstração. Use o método dedutivo para adicionar a hipótese extra A.
1. A (B C) hipótese
2. B9 A9 hipótese
3. A hipótese

Passo 2. Procure coisas óbvias para fazer a seguir.


1. A (B C) hipótese
2. B9 A9 hipótese
3. A hipótese
4. B C 1, 3, mp

Passo 3. Considere o objetivo desejado.


1. A (B C) hipótese
2. B9 A9 hipótese
3. A hipótese
4. B C 1, 3, mp

n. C B conclusão desejada

Passo 4. Pense no que mais você pode obter das hipóteses.


(B9 A9) passo 2

A B contraposição

1. A (B C) hipótese
2. B9 A9 hipótese
3. A hipótese
4. B C 1, 3, mp
5. A B 2, cont

Passo 5. Termine a demonstração.


1. A (B C) hipótese
2. B9 A9 hipótese
3. A hipótese
4. B C 1, 3, mp
5. A B 2, cont
6. B 3, 5, mp
7. C 4, 6, mp
8. C B 6, 7 conj

Usando Lógica Proposicional para Provar a Validade de um


Argumento em Português
Problema:
Prove a validade do seguinte argumento:
8 Guia de Estudos Online

Das duas uma: ou seu carro está com defeito, ou não é sua culpa. Se seu carro estiver com
defeito, a seguradora irá pagar. É sua culpa. Portanto, a seguradora irá pagar.

Solução:
Representaremos o argumento em lógica proposicional e depois construiremos uma de-
monstração.

Passo 1. Identifique e simbolize as componentes do argumento.


A = seu carro está com defeito
B = é culpa sua
C = a seguradora irá pagar

Passo 2. Simbolize o argumento.


A = seu carro está com defeito
B = é culpa sua
C = a seguradora irá pagar

A B9 Das duas uma: ou seu carro está com defeito, ou não é sua culpa.
A C Se seu carro estiver com defeito, a seguradora irá pagar.
B É sua culpa.
C A seguradora irá pagar.

Passo 2. Simbolize o argumento.


A = seu carro está com defeito
B = é culpa sua
C = a seguradora irá pagar
[(A B9) (A C) B] C

Passo 3. Prove o argumento [(A B9) (A C) B] C. Comece com as hipóteses.

1. A B9 hipótese
2. A C hipótese
3. B hipótese

Passo 3. Prove o argumento [(A B9) (A C) B] C. Reescreva a primeira hipótese.

1. A B9 hipótese
2. A C hipótese
3. B hipótese
4. B9 A 1, com
5. B A 4, cond

Passo 3. Prove o argumento [(A B9) (A C) B] C.

1. A B9 hipótese
2. A C hipótese
3. B hipótese
4. B9 A 1, com
5. B A 4, cond
6. A 3, 5 mp
7. C 2, 6 mp
Guia de Estudos Online 9

Visão Ger al da Seção 1.3

Considere a afirmação “Todo aluno adora matemática discreta”. Essa é uma afirmação ver-
dadeira (talvez não!), mas, de qualquer jeito, as fbfs da Seção 1.1 (denominadas fbfs propo-
sicionais) não podem representar o que essa afirmação diz, ou seja, que todos os objetos de
determinada coleção (os alunos) têm determinada propriedade (adoram matemática discreta).
Precisamos de uma representação nova para as propriedades que objetos podem ter e se
alguns ou todos os objetos têm essa propriedade.
Notações como P(x), Q(y), W(x, y) são usadas para significar que x tem a propriedade
P, y tem a propriedade Q e x e y têm a propriedade W. Quantificadores (o quantificador
universal, simbolizado por ∀, e o quantificador existencial, simbolizado por $) indicam
quantos objetos têm determinada propriedade. Fbfs predicadas são feitas de quantificado-
res, símbolos predicados e símbolos constantes, além de conectivos lógicos. O valor lógico
de uma fbf predicada depende de sua interpretação, que consiste em três partes:
• o domínio — a coleção dos objetos sob discussão, dos quais deve existir pelo menos um
• a atribuição de uma propriedade dos objetos no domínio para cada símbolo predicado
• a atribuição de um objeto particular do domínio a cada símbolo constante
Assim, a fbf predicada

(∀x)P(x)

é verdadeira com a interpretação de que o domínio é o conjunto dos inteiros maiores do que
10 e P(x) significa “x é positivo”, já que todo inteiro maior do que 10 é positivo. A fbf

($y)G( y, 0)

é verdadeira com a interpretação de que o domínio é o conjunto de todos os inteiros, o sím-


bolo constante 0 significa zero e G(y, z) significa y > z, já que existe pelo menos um inteiro
positivo.
Fornecer uma interpretação para uma fbf predicada é como atribuir valores lógicos a
letras de proposição em uma fbf proposicional — a interpretação determina o valor lógico
da proposição. Fbfs predicadas válidas são verdadeiras com todas as interpretações, como
as tautologias são verdadeiras para todos os valores lógicos. Embora possamos testar, usan-
do uma tabela-verdade, se uma fbf proposicional é uma tautologia, não existe algoritmo
para decidir se uma fbf predicada é válida.

Amostras de Solução de Problemas


• Problema 1 — Determinando o valor lógico de uma fbf predicada com uma inter-
pretação dada
• Problema 2 — Escrevendo afirmações em português como fbfs predicadas

Determinando o valor lógico de uma fbf predicada com uma


interpretação dada
Problema:
Dada a interpretação
domínio = todos os animais
M(x) é “x é um mamífero”
C(x) é “x é um cavalo”
O(x) é “x põe ovos”
determine o valor lógico das fbfs
a. (∀x)(M(x) C(x))
b. ($x)(M(x) O(x))
10 Guia de Estudos Online

Solução:
Passo 1. Comece com a fbf (a). Coloque os quantificadores e conectivos em português.
(a): Para todo x no domínio, se M(x), então C(x).

Passo 2. Aplique a interpretação para escrever a fbf em português e decidir sobre seu valor
lógico.
(a): Para todo x no domínio, se M(x), então C(x).
Para todo animal x, se x for um mamífero, então x será um cavalo.
Todos os mamíferos são cavalos.
FALSO

Passo 1. Considere a fbf (b). Coloque os quantificadores e conectivos em português.


(b): Existe um x no domínio com as propriedades M(x) e O(x).

Passo 2. Aplique a interpretação para escrever a fbf em português e decidir sobre seu valor
lógico.
(b): Existe um x no domínio com as propriedades M(x) e O(x).
Existe um mamífero que põe ovos.
VERDADE

Escrevendo Afirmações em Português como fbfs Predicadas


Problema:
Represente as afirmações
a. Existe um gato felpudo.
b. Apenas gatos sibilam para cachorros.
como fbfs predicadas. Suponha que o domínio é o mundo inteiro.

Solução:
Passo 1. Decida sobre os predicados e sua notação.
F(x) — x é felpudo
G(x) — x é um gato
C(x) — x é um cachorro
S(x, y) — x sibila para y

Problema:
Represente a afirmação
a. Existe um gato felpudo.
como uma fbf predicada. Suponha que o domínio é o mundo inteiro.

Solução:
F(x) — x é felpudo
G(x) — x é um gato
C(x) — x é um cachorro
S(x, y) — x sibila para y

Passo 2. Encontre uma sentença intermediária para (a).


Existe alguma coisa que é felpuda e é um gato.

Passo 3. Escreva a sentença intermediária como uma fbf predicada.


Existe alguma coisa que é felpuda e é um gato.

($x)F(x) G(x)

Problema:
Represente a afirmação
b. Apenas gatos sibilam para cachorros.
como uma fbf predicada. Suponha que o domínio é o mundo inteiro.
Guia de Estudos Online 11

Solução:
F(x) — x é felpudo
G(x) — x é um gato
C(x) — x é um cachorro
S(x, y) — x sibila para y

Passo 2. Encontre uma sentença intermediária para (b).


Para duas coisas quaisquer, se uma é um cachorro e a outra sibila para ele, então a outra é
um gato.

Problema:
Represente a afirmação
b. Apenas gatos sibilam para cachorros.
como uma fbf predicada. Suponha que o domínio é o mundo inteiro.

Solução:
F(x) — x é felpudo
G(x) — x é um gato
C(x) — x é um cachorro
S(x, y) — x sibila para y

Passo 3. Escreva a sentença intermediária como uma fbf predicada.


Para duas coisas quaisquer, se uma é um cachorro e a outra sibila para ele, então a outra é
um gato.

(∀x)(∀y)(C(y) S(x, y) G(x))

ou
(∀x)(∀y)(C(x) S(y, x) G(y))

Problema:
Represente a afirmação
b. Apenas gatos sibilam para cachorros.
como uma fbf predicada. Suponha que o domínio é o mundo inteiro.

Solução:

(∀x)(∀y)(C(y) S(x, y) G(x)) é o mesmo que (∀x)(∀y)([C(y) S(x, y)] G(x))

de modo que o conectivo principal é o condicional.

(∀x)(∀y)(C(y) S(x, y) G(x)) não é o mesmo que (∀x)(∀y)(C(y) [S(x, y) G(x)])

Visão Ger al da Seção 1. 4

O funcionamento da lógica de predicados é semelhante ao da lógica proposicional. Você


constrói uma sequência de demonstração usando as regras de dedução da lógica de predi-
cados. Elas incluem todas as regras de dedução para a lógica proposicional, exceto que as
fórmulas bem formuladas são, agora, fbfs predicadas, em vez de fbfs proposicionais. São
dadas regras de inferência adicionais para tratar quantificadores. Essas regras têm algumas
restrições sobre seu uso para garantir a preservação dos valores lógicos.
A lógica de predicados é completa e correta, de modo que todas as fbfs válidas, e ape-
nas essas, são teoremas, da mesma forma que, na lógica proposicional, todas as tautologias,
e apenas essas, são teoremas.
12 Guia de Estudos Online

Mas existe uma grande diferença. Você pode usar uma tabela-verdade para testar se
uma fbf proposicional é uma tautologia, de modo que você nunca precisa, de fato, construir
uma sequência de demonstração (só fizemos para praticar). Você não pode testar se uma fbf
predicada é válida, de modo que você não tem escolha a não ser construir uma sequência de
demonstração (foi por isso que praticamos).

Amostras de Solução de Problemas


• Problema 1 — Demonstrando um teorema na lógica de predicados.
• Problema 2 — Usando a lógica de predicados para demonstrar a validade de um
argumento em português.

Sistemas Completos e Corretos


Sistemas de lógica formal tentam demonstrar que certas proposições da forma P Q são
inerentemente verdadeiras. A conclusão Q tem que seguir da hipótese P por causa da rela-
ção estrutural entre P e Q, e não devido a qualquer significado particular dado a P ou a Q.
(Lembre-se de que essa é a motivação por trás da simbolização.) Assim, se as fbfs em P e
em Q forem fbfs proposicionais, então P Q tem que ser verdadeira para todos os valores
lógicos, ou seja, P Q tem que ser uma tautologia. Se as fbfs em P e em Q forem fbfs pre-
dicadas, então P Q tem que ser verdadeira para todas as interpretações, ou seja, P Q tem
que ser válida. Podemos testar se uma proposição é uma tautologia por meio de uma tabela-
verdade, mas não existe um teste mecânico correspondente para a validade, e dependemos
de um sistema de regras de dedução para provar que Q segue de P.

Argumento Lógico P Q
Lógica Proposicional Lógica de Predicados
P Q é uma tautologia P Q é válida
Pode testar através de uma tabela-verdade Não existe teste mecânico

As regras de dedução nos permitem provar todo condicional P Q que é verdadeiro (o sistema
é completo) e nada que não seja verdade (o sistema é correto). Novamente, “verdade” na
lógica proposicional significa tautologia e na lógica de predicados significa validade.

Demonstrando um teorema na lógica de predicados


Problema:
Prove que a fbf

(∀x)P(x) ($x)($y)Q(x, y) ($y)($x)[P(x) Q(x, y)

é um teorema na lógica de predicados.

Solução:
Vamos construir uma sequência de demonstração. Em primeiro lugar, note que a fbf parece
ser válida — se P é sempre verdade e se existem dois valores para os quais Q é verdade
então existem dois valores para os quais P e Q são verdadeiras.

Passo 1. Liste as hipóteses.


1. (∀x)P(x) hipótese
2. ($x)($y)Q(x, y) hipótese
Guia de Estudos Online 13

Passo 2. Retire os quantificadores.

1. (∀x)P(x) hipótese
2. ($x)($y)Q(x, y) hipótese
3. ($y)Q(a, y) 2, pe
4. Q(a, b) 3, pe
5. P(a) 1, pu

Passo 3. Manipule as partes sem quantificadores.

1. (∀x)P(x) hipótese
2. ($x)($y)Q(x, y) hipótese
3. ($y)Q(a, y) 2, pe
4. Q(a, b) 3, pe
5. P(a) 1, pu
6. P(a) Q(a, b) 4, 5, conj

Passo 4. Insira os quantificadores.

1. (∀x)P(x) hipótese
2. ($x)($y)Q(x, y) hipótese
3. ($y)Q(a, y) 2, pe
4. Q(a, b) 3, pe
5. P(a) 1, pu
6. P(a) Q(a, b) 4, 5, conj
7. ($x)[P(x) Q(x, b)] 6, ge
8. ($y)($x)[P(x) Q(x, y)] 7, ge

Usando a Lógica de Predicados para Provar a Validade de um


Argumento em Português
Problema: Prove a validade do seguinte argumento:
Todo deputado é um político. Kevin é um advogado que não é um político. Portanto, existe
pelo menos um advogado que não é deputado.

Solução:
Vamos representar o argumento na notação da lógica de predicados e depois construir uma
demonstração.

Passo 1. Representar os predicados e o objeto constante.


D(x) — x é um deputado
A(x) — x é um advogado
P(x) — x é um político
k — Kevin

Passo 2. Represente o argumento.

(∀x)[D(x) P(x)] A(k) [P(k)]9 conclusão


14 Guia de Estudos Online

Passo 2: Represente o argumento.

(∀x)[D(x) P(x)] A(k) [P(k)]9 ($x)[A(x) [D(x)]9]

Passo 3. Construa a sequência de demonstração. Comece com as hipóteses.

1. (∀x)[D(x) P(x)] hipótese


2. A(k) hipótese
3. [P(k)]9 hipótese

Passo 4. Retire os quantificadores


1. (∀x)[D(x) P(x)] hipótese
2. A(k) hipótese
3. [P(k)]9 hipótese
4. [D(k) P(k)] 1, pu

Passo 5. Manipule as fbfs sem quantificadores.

1. (∀x)[D(x) P(x)] hipótese


2. A(k) hipótese
3. [P(k)]9 hipótese
4. D(k) P(k) 1, pu
5. [P(k)]9 [D(k)]9 4, cont
6. [D(k)]9 3, 5, mp
7. A(k) [D(k)]9 2, 6, conj
8. ($x)[A(x) [D(x)]9] 7, ge

Visão Ger al da Seção 1. 5

A lógica formal não é apenas um modo de pensar sobre as coisas de maneira lógica, tem
aplicações diretas na ciência da computação. Uma linguagem de programação (Prolog) ba-
seada na lógica de predicados é muito usada em inteligência artificial, especialmente na área
de sistemas especialistas. Um programa em Prolog (um banco de dados) consiste em propo-
sições sobre quais objetos no domínio satisfazem determinadas propriedades ou proposições
que são definições para predicados novos. A execução de um programa em Prolog consiste
em consultas sobre as conclusões lógicas que podem ser deduzidas dessas hipóteses. As
regras de dedução e como fazer as deduções estão embutidas na própria linguagem.

Amostra de Solução de Problemas


• Problema 1 — Formulando fatos, regras e consultas do tipo Prolog.

Formulando fatos, regras e consultas do tipo Prolog


Problema:
Um banco de dados Prolog contém atualmente informação sobre sociedades que controlam
diretamente outras companhias. Os fatos atuais são:

controla(ComidasEngracadas, RefriIrados)
controla(ComidasEngracadas, Gostosuras)
controla(Gostosuras, AbobrinhasLtda.)
Guia de Estudos Online 15

controla(RJT, ProdutosSaudaveis)
controla(ProdutosSaudaveis, FertilizantesDaFazenda)
controla(IndustriasCapitais, ComidasEngracadas)

Formule uma regra Prolog para definir quando uma companhia é dona de outra. Formule
uma consulta sobre que companhias pertencem às Indústrias Capitais.

Solução:
Defina, primeiro, a regra donade(x, y). Essa regra pode se tornar parte do banco de dados
Prolog. A pesquisa poderia ser formulada durante a execução do programa.
Como “ser dona de” é uma propriedade que pode ser passada por uma hierarquia de
companhias, sua definição deve usar uma regra recursiva.
Caso básico: donade(x, y) se controla(x, y) ou donade(x, y) <= controla(x, y)

Caso básico: donade(x, y) <= controla(x, y)


Caso recorrente: donade(x, y) <= controla(x, z) e donade(z, y)

Problema:
Um banco de dados Prolog contém atualmente informação sobre sociedades que controlam
diretamente outras companhias. Os fatos atuais são:

controla(ComidasEngracadas, RefriIrados)
controla(ComidasEngracadas, Gostosuras)
controla(Gostosuras, AbobrinhasLtda.)
controla(RJT, ProdutosSaudaveis)
controla(ProdutosSaudaveis, FertilizantesDaFazenda)
controla(IndustriasCapitais, ComidasEngracadas)

donade(x, y) <= controla(x, y)


donade(x, y) <= controla(x, z) e donade(z, y)

Formule uma consulta sobre que companhias pertencem às Indústrias Capitais.

Solução:
?donade(IndustriasCapitais, X)
Os resultados da consulta são:
ComidasEngracadas (obtido da relação controla)
RefriIrados
Gostosuras
AbobrinhasLtda.

Visão Ger al da Seção 1.6

Outra aplicação de lógica formal em ciência da computação está na área de demonstração


da correção de um programa. A demonstração de correção garante, matematicamente, com
base nas regras de inferência, que, se as variáveis de um programa satisfizerem determinado
predicado (a precondição) antes de o programa ser executado, terão que satisfazer outro
predicado específico (a pós-condição) depois da execução do programa. Os exemplos que
veremos são tão simples que seria fácil “argumentar” sobre sua correção, mas a ideia por
trás das regras de inferência é fornecer um processo mecânico para demonstrar a correção.

Amostra de Solução de Problemas


• Problema 1 — Verificando a correção de um segmento de programa que inclui
proposições condicionais e de atribuição.
16 Guia de Estudos Online

Verificando a Correção de um Segmento de Programa que Inclui


Proposições Condicionais e de Atribuição
Problema:
Verifique a correção do segmento de programa a seguir com as asserções indicadas:

{x = 11}
 y = x – 1
{y = 10}
se y ≤ 0 então
z=y–1
senão
z=y13
fim do se
{z = 13}

Solução:
O programa tem duas proposições: a primeira é uma atribuição, e a segunda é um condicional.
Elas têm que ser tratadas separadamente.

Atribuição:

{?} y = x – 1 {y = 10}


x – 1 = 10
x = 11
Condicional:

{y = 10 e y ≤ 0} z = y – 1 {z = 13}

{y = 10 e y > 0} z = y 1 3 {z = 13}

Parte do se:

{y = 10 e y ≤ 0} z = y – 1 {z = 13}
F

Parte do senão:

{y = 10 e y > 0} z = y 1 3 {z = 13}

{?} z = y 1 3 {z = 13}

{y = 10 e y > 0} z = y 1 3 {z = 13}

{?} z = y 1 3 {z = 13}

y 1 3 = 13
y = 10
y = 10 e y > 0
Capítulo

Demonstrações, Indução e
Teoria dos Números
2
Mas não fizemos demonstrações o tempo todo — demonstrações em lógica proposicional
e demonstrações em lógica de predicados? Sim, mas provamos argumentos universalmente
verdadeiros devido à sua estrutura interna — argumentos que eram tautologias (lógica pro-
posicional) ou fbfs válidas (lógica de predicados).
Suponha que queremos provar resultados sobre alguma área específica — física, geome-
tria, teoria dos números, álgebras de Boole etc. Ainda vamos querer demonstrar algo da forma
P Q, mas Q não será consequência de P por lógica pura, será devido a fatos adicionais que
são verdadeiros na área sob discussão. Fatos específicos de cada área tornam-se hipóteses
adicionais para a demonstração de que P Q nesse contexto específico. É claro que o truque
é saber reconhecer quais fatos serão relevantes para que você possa deduzir Q de P.
Demonstrações, em geral, não são tão formais como as dadas em lógica proposicional e
lógica de predicados. Elas são feitas, muitas vezes, como narrativas, em vez de um formato
passo a passo. As justificativas podem ser menos explícitas do que em uma demonstração
formal. Entretanto, isso não é desculpa para argumentos feitos de qualquer jeito, sem os de-
vidos cuidados; se for necessário, você tem que ser capaz de transformar sua demonstração
informal em uma demonstração formal, justificando cada passo. Se não puder fazer isso,
provavelmente sua demonstração informal está errada.
A Seção 2.1 apresenta algumas abordagens genéricas para demonstrações e fornece al-
gumas provas simples em “teoria dos números”, ou seja, sobre inteiros. A Seção 2.2 discute
uma técnica de demonstração especialmente importante em ciência da computação, indu-
ção matemática. A indução nos permite estender as ideias sobre correção de programas,
introduzidas na Seção 1.6, para incluir laços (Seção 2.3). A Seção 2.4 explora tópicos adi-
cionais sobre teoria dos números, como o Teorema Fundamental da Aritmética, números
primos e máximo divisor comum.

Visão Ger al da Seção 2 .1

Ao encontrar a conjectura P Q, é preciso decidir, primeiro, se você deve tentar refutá-la


ou provar que é verdadeira. Para refutar a conjectura (ou provar que ela é falsa), você precisa
encontrar um contraexemplo — um exemplo em que P é verdadeira e Q é falsa.
Para provar a conjectura, você pode tentar um entre diversos métodos de ataque.
Técnica de demonstração Abordagem para provar que P Q Justificativa
Demonstre que P Q em todos os casos Você mostra que sempre que P for
Demonstração Exaustiva
possíveis. verdadeira Q também o será.
Demonstração Direta Suponha P, deduza Q9. Isso é o mesmo que P Q.
Demonstração pela Contrapositiva Suponha Q9, deduza P9. (Q9 P9) (P Q) é uma tautologia.
Demonstração por Absurdo Suponha P Q9, deduza uma contradição. (P Q9 = 0) (P Q) é uma tautologia.

17
18 Guia de Estudos Online

O procedimento usual é a demonstração direta. A demonstração exaustiva só funciona


quando há apenas um número finito de casos a considerar. Use a contrapositiva quando
parece que supor Q9 vai dar mais “munição” do que supor P. Tente uma demonstração por
absurdo quando sua conclusão é da forma “... logo alguma coisa não é válida”.

Amostras de Solução de Problemas


• Problema 1 — Construindo uma demonstração #1.
• Problema 2 — Construindo uma demonstração #2.
• Problema 3 — Construindo uma demonstração #3.

Construindo uma Demonstração #1


Problema:
Prove ou refute: n2 1 n 1 1 é primo qualquer que seja o inteiro positivo n.

Solução:
Passo 1. Compreenda todos os termos.

Passo 2. Decida se vai tentar provar ou refutar.


12 1 1 1 1 = 3, primo
22 1 2 1 1 = 7, primo
32 1 3 1 1 = 13, primo

Passo 3. Tente uma demonstração por absurdo. Suponha


n2 1 n 1 1 não é primo.
n2 1 n 1 1 = pq em que p e q são inteiros diferentes de 1.

Passo 4. Para terminar a demonstração por absurdo, deduza alguma situação impossível.
n2 1 n 1 1 = pq em que p e q são inteiros diferentes de 1.
n2 1 n 1 1 2 pq = 0 .........???
n2 1 n 2 pq = 21 .........???
n( n 1 1) 2 pq = 21 .........???

Se n for par, n = 2k,


(2k)2 1 2k 1 1 = pq
4k2 1 2k 1 1 = pq
2k(2k 1 1) 1 1 = pq
número ímpar = pq .........???

Sem saída?

Passo 5. Repense a conjectura.


42 1 4 1 1 = 21 = 3*7

Contraexemplo!

Construindo uma Demonstração #2


Problema:
Prove ou refute: n4 – n2 é divisível por 3 para todo inteiro positivo n.

Solução:
Passo 1. Compreenda todos os termos.
n4 – n2 ser divisível por 3 significa que n4 – n2 = 3k para algum inteiro k.
Guia de Estudos Online 19

Passo 2. Decida se vai provar ou refutar.


14 2 12 = 0 = 3*0
24 2 22 = 12 = 3*4
34 2 32 = 72 = 3*24
44 2 42 = 240 = 3*80

Passo 3. Manipule a expressão.


n4 2 n2 = n2(n2 2 1) = n2(n 1 1)(n 2 1) = n(n)(n 1 1)(n 2 1)

Passo 4. Examine os casos testados para verificar como o número 3 aparece.


n4 2 n2 = n(n)(n 1 1)(n 2 1)
n = 1: 14 2 12 = 0 = 3*0 Caso particular: 0 = qualquer coisa * 0

n4 2 n2 = n(n)(n 1 1)(n 2 1)

n = 2: 24 2 22 = 12 = 2*2*3*1
n = 3: 34 2 32 = 72 = 3*3*4*2
n = 4: 44 2 42 = 240 = 4*4*5*3

Passo 5. Reescreva a expressão novamente.


n4 2 n2 = n(n)(n 1 1)(n 2 1)
= n(n 2 1)n(n 1 1)

Um dos três inteiros consecutivos n – 1, n ou n 1 1 tem que ser um múltiplo de 3.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . .

Construindo uma Demonstração #3


Problema:
Prove ou refute: qualquer que seja o inteiro positivo n, n2 – 2 nunca é divisível por 3.

Solução:
Passo 1. Compreenda todos os termos.
n2 – 2 ser divisível por 3 significa que n2 – 2 = 3k para algum inteiro k.

Passo 2. Decida se vai provar ou refutar.


12 – 2 = – 1, não é um múltiplo de 3
22 – 2 = 2, não é um múltiplo de 3
32 – 2 = 7, não é um múltiplo de 3
42 – 2 = 14, não é um múltiplo de 3

Passo 3. Tente uma demonstração por absurdo.


Suponha que n2 – 2 = 3k para algum inteiro k.
n2 = 3k 1 2

Suponha que n2 = 3k 1 2

Passo 4. Considere os três casos:


n = 3p
n = 3p 1 1
n = 3p 1 2
em que p é um inteiro.

Suponha que n2 = 3k 1 2.
20 Guia de Estudos Online

Passo 5. Caso 1: n = 3p, em que p é um inteiro.


(3p)2 = 3k 1 2
9p2 = 3k 1 2
9p2 2 3k = 2
3(3p2 2 k) = 2 em que 3p2 2 k é um inteiro

Contradição: 2 não é múltiplo de 3.


Suponha que n2 = 3k 1 2.

Passo 6. Caso 2: n = 3p 1 1, em que p é um inteiro.


(3p1 1)2 = 3k 1 2
9p2 1 6p 1 1 = 3k 1 2
9p2 1 6p 2 3k = 2 2 1
3(3p2 1 2p 2 k) = 1

Contradição: 1 não é múltiplo de 3.


Suponha que n2 = 3k 1 2.

Passo 7. Caso 3: n = 3p 1 2, em que p é um inteiro.


(3p1 2)2 = 3k 1 2
9p2 1 12p 1 4 = 3k 1 2
9p2 1 12p 2 3k = 2 2 4
3(3p2 1 4p 2 k) = 2 2

Contradição: – 2 não é múltiplo de 3.


CONCLUSÃO: n2 – 2 não é um múltiplo de 3.

Visão Ger al da Seção 2 .2

Indução matemática é uma técnica de demonstração particularmente útil em ciência da com-


putação. É usada para demonstrar a veracidade de algumas afirmações sobre todos os intei-
ros maiores ou iguais a algum valor fixo.
Suponha que P(n) afirma que a propriedade P é satisfeita pelo inteiro n. O Primeiro
Princípio de Indução Matemática afirma que

1. P(1) verdade P(n) verdade para todo n ≥ 1


2. (∀x)[P(x) verdade P(k 1 1) verdade]

Isso é um condicional; para obter a conclusão, precisamos demonstrar as hipóteses, que


são as proposições 1 e 2. A proposição 2 é um condicional; para prová-lo, precisamos supor
P(k) e provar P(k 1 1).

Passos em uma demonstração usando o Primeiro Princípio de Indução


Passo A Prove o caso básico, ou seja, prove que a propriedade P é válida para 1
(ou qualquer que seja o valor básico).
Passo B Suponha que a propriedade P é válida para k.
Passo C Usando a hipótese, prove que a propriedade P vale para n = k 1 1.

Em geral, o passo A é trivial e o passo B requer apenas escrever a hipótese correta-


mente. O passo C é que requer algum trabalho, pois primeiro precisamos escrever o que
queremos demonstrar e depois precisamos reconhecer como usar a hipótese de indução
(o que escrevemos no passo B) para provar o que queremos.
Guia de Estudos Online 21

O Segundo Princípio de Indução Matemática afirma que


1. P(1) verdade
2. (∀x)[P(r) verdade para todo r P(n) verdade para todo n ≥ 1
1≤r≤k P(k 1 1) verdade]
Os dois princípios são equivalentes, mas o segundo é útil quando a informação conhe-
cida está “mais para trás” do que o valor anterior.

Amostras de Solução de Problemas


• Problema 1 — Usando o Primeiro Princípio de Indução em demonstrações.
• Problema 2 — Usando o Segundo Princípio de Indução em demonstrações.

Usando o Primeiro Princípio de Indução em Demonstrações


Problema:
Prove que 1 1 4 1 7 1 ... 1 (3n – 2) = (1/2)(3n2 – 2) para todo n ≥ 1

Solução:
Como queremos demonstrar alguma coisa para todos os inteiros positivos, a indução mate-
mática é uma técnica de demonstração apropriada.
O caso básico é n = 1.
Caso básico
n = 1:

1 = (1/2)(3*12 – 1)
= (1/2)(3 – 1)
= (1/2)(2)
=1

Verdade

Suponha verdade para n = k:

1 1 4 1 7 1 ... 1 (3k – 2) = (1/2)(3k2 – k)

Mostre que é verdade para n = k 1 1:

1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) = (1/2)[3(k 1 1)2 – (k 1 1)]

Mostrar: Hipótese:
1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) = (1/2)[3(k 1 1)2 – (k 1 1)] 1 1 4 1 7 1 ... 1 (3k – 2) = (1/2)(3k2 – k)

1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) =
1 1 4 1 7 1 ... 1 (3k – 2) 1 (3(k 1 1) – 2)

Mostrar: Hipótese:
1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) = (1/2)[3(k 1 1)2 – (k 1 1)] 1 1 4 1 7 1 ... 1 (3k – 2) = (1/2)(3k2 – k)

1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) =

1 1 4 1 7 1 ... 1 (3k – 2) 1 (3(k 1 1) – 2) = (1/2)(3k2 – k) 1 (3(k 1 1) – 2)


22 Guia de Estudos Online

Mostrar: 1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) = (1/2)[3(k 1 1)2 – (k 1 1)]

1 1 4 1 7 1 ... 1 (3(k 1 1) – 2) =
1 1 4 1 7 1 ... 1 (3k – 2) = (3(k 1 1) – 2) = (1/2)(3k2 – k) 1 (3(k 1 1) – 2)
= (1/2)(3k2 – k) 1 (3k 1 3 – 2)
= (1/2)(3k2 – k) 1 (3k 1 1)
= (1/2)(3k2 – k) 1 (1/2)(6k 1 2)
= (1/2)[3k2 – k 1 6k 1 2]
= (1/2)[3k2 1 5k 1 2]
= (1/2)[3k2 1 6k 1 3 – k – 1]
= (1/2)[3(k 1 1)2 – (k 1 1)]

Usando o Segundo Princípio de Indução em Demonstrações


Problema:
Prove que qualquer inteiro maior ou igual a 4 pode ser obtido como uma combinação de
números iguais a 2 e a 5.

Solução:
Seja P(n) a afirmação n = 2p + 3q, em que p e q são inteiros não negativos. O problema é
mostrar que P(n) é verdade para todo n ≥ 4.

Problema:
Prove que n = 2p + 5q para todo n ≥ 4.

Solução:
Caso básico

P(4): 4 = 2*2 + 0*5.

Verdade

Problema:
Prove que n = 2p + 5q para todo n ≥ 4.

Solução:
k + 1 = (k 2 1) + 2.
P(k + 1) depende de P(k – 1), não de P(k). Use o segundo princípio de indução.
Suponha que P(r) é verdade, 4 ≤ r ≤ k. Mostre P(k + 1).
Para k – 1 ≥ 4, é preciso que k + 2 ≥ 6.
P(4) verdade
P(5): 5 = 0*2 + 1*5. verdade
P(4) verdade, P(5) verdade.
Suponha que P(r) é verdade, 4 ≤ r ≤ k. Mostre P(k + 1).

Para k + 1 ≥ 6, k – 1 ≥ 4. Por hipótese, existem inteiros p e q tais que k – 1 = 2p + 5q.


k + 1 = (k – 1) + 2 = (2p + 5q) + 2 = 2( p + 1) + 5q
P(k + 1) verdade

Ilustração:
4 = 2*2 + 0*5
5 = 0*2 + 1*5
6 = 4 + 2 = (2*2 + 0*5) + 2 = 3*2 + 0*5
7 = 5 + 2 = (0*2 + 1*5) + 2 = 1*2 + 1*5
8 = 6 + 2 = (3*2 + 0*5) + 2 = 4*2 + 0*5
9 = 7 + 2 = (1*2 + 1*5) + 2 = 2*2 + 1*5
10 = 8 + 2 = (4*2 + 0*5) + 2 = 5*2 + 0*5 = 0*2 + 2*5
Guia de Estudos Online 23

Visão Ger al da Seção 2 .3

Em nossa busca por métodos formais para demonstrar a correção de programas, encontra-
mos regras de inferência para tratar comandos de atribuição e condicionais. O único outro
tipo de trechos de programa que precisamos discutir são laços. Uma regra de inferência para
a demonstração de correção de um laço depende da existência de um invariante de laço —
uma relação que seja verdadeira antes da entrada no laço e que permaneça verdadeira depois
de cada iteração. Como o número de iterações é arbitrário, demonstramos invariantes de
laço usando indução matemática.

Amostra de Solução de Problemas


• Problema 1 — Verificando invariantes de laço.

Verificando invariantes de laço


Problema:
Mostre a correção do segmento de programa em pseudocódigo a seguir que calcula nx para
n ≥ 1.
Múltiplo(inteiro x, inteiro não negativo n)
//retorna o valor de nx
{
inteiros i, j
i=1
j=x
enquanto (i n) faça
{
j=j+x
i=i+1
}
//j agora tem o valor nx
retorne j
}

Solução:
Use a Regra de Inferência do Laço.

Problema:
Prove a correção do segmento de programa

i=1
j=x
B
enquanto (i n) faça
{
S j=j+x
P
i=i+1
}

//j agora tem o valor nx


retorne j

Solução:
Use a Regra de Inferência do Laço.
A condição B é “i n”.
24 Guia de Estudos Online

Queremos {Q}s{Q B9}, que significa que tanto Q quanto B9 devem ser verdadeiras
depois da execução de s.
A condição j = nx também deve ser verdadeira depois da execução de s, de modo que
Q B9 tem que ser j = nx.
B9 é i = n.

A condição Q B9 será j = nx se Q for a condição j = ix




( j = ix) (i = n)  j = nx

Q é a condição j = ix.

Seja Q(n) a proposição de que Q é verdade depois de n passagens pelo laço.

Q(n): jn = inx.

Use indução para mostrar que isso é verdade para todo n ≥ 0.

Solução:
Prove o invariante do laço.
Q(n): j = ix depois de n passagens pelo laço.
Caso básico
n = 0: j0 = x, i0 = 1, logo j0 = i0x

Problema:
Prove a correção do segmento de programa.

i=1
j=x
enquanto (i n) faça
{
j=j+x
i=i+1
}
//j agora tem o valor nx
retorne j

Solução:
Prove o invariante do laço.
Q(n): j = ix depois de n passagens pelo laço.
Suponha Q(k): jk = ik x
Mostre Q(k + 1): jk+1 = ik+1x

jk+1 = jk + x ik+1 = ik + 1
= ik x + x hipótese de indução
= (ik + 1)x colocando x em evidência
= (ik + 1)x = (ik + 1 = ik + 1)

Visão Ger al da Seção 2 . 4

A teoria dos números consiste — surpresa! — no estudo dos números, em geral os intei-
ros positivos. Como estamos todos familiarizados com esse sistema numérico, conhecemos
Guia de Estudos Online 25

bem um monte de resultados de teoria dos números. Mas muitas conjecturas — fáceis de
enunciar e de compreender — permanecem sem demonstração.
Um resultado bem conhecido é que qualquer inteiro positivo maior ou igual a 2 pode
ser escrito de maneira única como um produto de números primos. Por exemplo, 50 = 2*52;
2 e 5 são primos e nenhum outro produto de primos tem o valor 50. A demonstração desse
Teorema Fundamental da Aritmética envolve, é claro, propriedades de números primos
(inteiros maiores do que 1 divisíveis apenas por 1 e por eles mesmos). Também envolve o
máximo divisor comum entre dois inteiros positivos a e b.
O algoritmo de Euclides da Seção 2.3 é um método para encontrar o mdc(a, b), mas
também pode ser usado para revelar os coeficientes inteiros i e j que tornam o mdc(a, b)
uma combinação linear ia + jb de a e b. De fato, o mdc(a, b) é a menor combinação linear
positiva de a e b. Se mdc(a, b) = 1, então a e b são primos entre si. Por exemplo, 4 e 15
são primos entre si, embora nenhum deles seja um número primo. Poderíamos perguntar
quantos números menores ou iguais a 15 têm essa propriedade (4 é um desses números).
O resultado pode ser expresso usando a função fi de Euler, j(15). Como 15, expresso como
produto de primos, é igual a 3*5, j(15) tem o valor 2*4 = 8. Os oito números são 1, 2, 4, 7,
8, 11, 13, 14.

Amostra de Solução de Problemas


• Problema 1 — Escreva mdc(a, b) como uma combinação linear de a e b.

Escreva mdc(a, b) como uma Combinação Linear de a e b


Problema:
Encontre mdc(2268, 735) e escreva-o como uma combinação linear i*2268 + j*735, em
que i e j são inteiros.

Solução:
Use o algoritmo de Euclides para encontrar mdc(2268, 735) e, “trabalhando de trás para a
frente”, encontre i.

2268 735 735 63 63 42 42 21


2 2205 3 263 11 242 1 242 2
63 105 21 0
263
42

2268 = 3*735 + 63
735 = 11*63 + 42
63 = 1*42 + 21
42 = 2*21 + 0

21 = 63 2 1*42
42 = 735 2 11*63
63 = 2268 2 3*735

21 = 63 2 1*42 (Equação 1)
= 63 2 1*[735 2 11*63] (Equação 2)
= 12*63 2 1*735 (simplificando)
= 12*[2268 2 3*735] 2 1*735 (Equação 3)
= 12*2268 2 37*735 (simplificando)

21 = 12*2268 2 37*735
Capítulo

Recursividade, Relações de
Recorrência e Análise de Algoritmos
3
Uma definição recorrente inclui a coisa sendo definida como parte da definição. Em par-
ticular,

1. No caso básico, casos “pequenos” ou simples são definidos explicitamente.


2. Na parte recursiva, novos casos são definidos em termos dos casos anteriores, “menores”.

A Seção 3.1 mostra como determinados conjuntos, sequências, operações e algoritmos


podem ser definidos recursivamente.
A definição recursiva de uma sequência S(n) toma a forma de uma relação de recor-
rência, por exemplo

S(1) = 1
S(n) = 5S(n 2 1) + (n 2 1) para n ≥ 2

Resolver a relação de recorrência significa encontrar uma fórmula em forma fechada


para S(n), uma expressão na qual você substitui o valor de n e obtém o valor de S(n). Para
determinadas formas de relações de recorrência, é possível encontrar uma solução em for-
ma fechada usando a técnica de “expandir, conjecturar, verificar” (a verificação envolve
uma demonstração por indução) ou deduzindo uma solução geral. São dadas soluções ge-
rais para três tipos de relações de recorrência na Seção 3.2.
Muitas vezes as relações de recorrência aparecem junto com análise de algoritmos, o
assunto da Seção 3.3.

Visão Ger al da Seção 3.1

Coisas que podem ser definidas recursivamente incluem

• sequências (listas ordenadas)


• conjuntos (coleções não ordenadas)
• operações sobre objetos (como elevar um número a uma potência inteira)
• algoritmos

Você deve ser capaz de aplicar uma definição recorrente para gerar coisas que fo-
ram definidas recursivamente ou testar se algum item específico pode ser gerado dessa
forma.

Amostra de Solução de Problemas


• Problema 1 — Reconhecendo objetos em uma coleção definida recursivamente.
26
Guia de Estudos Online 27

Reconhecendo objetos em uma coleção definida recursivamente


Problema:
Uma coleção C de cadeias de caracteres é definida recursivamente por
1. p e q pertencem a C
2. Se X pertencer a C, então pqX e qpX também pertencerão

Quais das cadeias a seguir pertencem a C?


(a) pqq (b) pq (c) pqpp (d) qpqpq

Solução:
Decida quais cadeias podem ser geradas pela “receita”.
Todas as quatro cadeias começam com pq ou qp — até aqui tudo bem.
Cadeia (a): pq | q = pqX onde X = q > C
pqq > C

Solução:
Cadeia (b): pq | l mas l R C

pq R C
Cadeia (c): pq | pp mas pp R C

pqpp R C
Cadeia (d): qp | qpq

qpq = qp = qpX em que X = q > C logo qpq = X9 > C


= qpX9 em que X9 > C logo qpX9 = qpqpq > C

Visão Ger al da Seção 3.2

Relações de recorrência fornecem o valor de uma sequência S(n) em termos de um ou mais


valores anteriores da sequência, com algum ou alguns casos básicos. Podemos calcular o
valor de S(n) para qualquer n fixo começando com o(s) caso(s) básico(s) e calculando o
próximo valor, depois o próximo e assim por diante, até chegar a S(n). Mas queremos, de
fato, encontrar uma solução em forma fechada, ou seja, uma fórmula na qual podemos, sim-
plesmente, substituir o valor desejado de n.
Uma abordagem para encontrar uma solução em forma fechada é através de um pro-
cesso de expansão, conjectura e verificação para cada relação de recorrência específica
que queremos resolver. Outra abordagem é classificar as relações de recorrência em tipos
diversos e tentar obter uma fórmula para a solução geral das relações de recorrência de cada
um desses tipos.

Relações de recorrência lineares de primeira ordem com coeficientes constantes têm a


forma

(1) S(1) = a
(2) S(n) = cS(n 2 1) + g(n) n≥2

Aqui S(n) só depende do valor anterior da sequência S, com um coeficiente constante.


Procuramos resolver a relação de recorrência (2) sujeita à condição inicial (caso básico) (1).
A solução geral é da forma

n
S(n) = cn21 S(1)=+ cn21g(i)

i=
=2
28 Guia de Estudos Online

Você então pode resolver tal relação de recorrência identificando c e g(n) e substituindo
na solução geral, embora essa não seja uma expressão em forma fechada até que a soma
seja calculada.
Relações de recorrência lineares homogêneas de segunda ordem com coeficientes
constantes são da forma

S(n) = c1S(n 2 1) + c2S(n 2 2) para n > 2

sujeita às condições iniciais (casos básicos) S(1) = a e S(2) = b. Sua solução depende da
resolução da “equação característica”

t 2 2 c1t 2c2 = 0

Relações de recorrência dividir para conquistar são da forma

(1) S(1) = a
(2) S(n) = cS(n/2) + g(n) para n ≥ 2, n = 2m.

Essa não é uma relação de primeira ordem nem de segunda ordem, já que o valor de
S(n) não depende do termo anterior nem dos dois termos anteriores, mas de um valor na
metade do caminho. A fórmula da solução geral é
−n
log
S(n) = clog n S(1)=+ c(log n)−2i g(2i)
i=
=1

na qual, novamente, é preciso encontrar uma expressão para o somatório.

Amostras de Solução de Problemas


• Problema 1 — Resolvendo uma relação de recorrência pelo método expandir/con-
jecturar/verificar.
• Problema 2 — Resolvendo uma relação de recorrência linear de primeira ordem
com coeficientes constantes usando a fórmula para a solução.
• Problema 3 — Resolvendo uma relação de recorrência do tipo dividir para con-
quistar usando a fórmula para a solução.

Resolvendo uma Relação de Recorrência pelo Método Expandir/


Conjecturar/Verificar
Problema:
Resolva a relação de recorrência

S(1) = 3
S(n) = 3S(n 2 1) + 3 n≥2

Solução:
Use o método expandir/conjecturar/verificar.
Expanda:

S(n) = 3S(n 2 1) + 3
= 3[3S(n 2 2) + 3] + 3 = 32S(n 2 2) + 32 + 3
= 32[3S(n 2 3) + 3] + 32 + 3 = 33S(n 2 3) + 33 + 32 + 3

= 3kS(n 2 k) + 3k + 3k 2 1 + ... + 32 + 3
Guia de Estudos Online 29

Quando n – k = 1 e k = n – 1,

= 3n 2 1 S(1) + 3n 2 1 + 3n 22 + ... + 32 + 3
= 3n + 3n 2 1 + 3n 22 + ... + 32 + 3
S(n) = 3n + 3n 2 1 + 3n 22 + ... + 32 + 3

Usando a fórmula para os n primeiros termos de uma série geométrica com a = 3 e r = 3


[veja o Exercício 27 na Seção 2.2],

S(n) = 3 2 3*3n = 3 2 3n 1 1 = 3n 1 12 3
123 22 2

S(n) = 3n 1 12 3
2

Para n = 1: S(1) = 31 1 1 2 3 = 32 2 3 = 9 2 3 = 6 = 3 correto


2 2 2 2

S(n) = 3n 1 12 3
2

Suponha que S(k) = 3k 1 12 3 Mostre que S(k + 1) = 3k 1 22 3


2 2

S(k + 1) = 3S(k) + 3 (relação de recorrência)


= 3 3k 1 12 3 1 3 (hipótese de indução)
2

= 3k 1 22 32 1 6 = 3k 1 22 3 (álgebra)
2 2 2

Resolvendo uma Relação de Recorrência Linear de Primeira Ordem


com Coeficientes Constantes Usando a Fórmula para a Solução
Problema:
Resolva a relação de recorrência

S(1) = 3
S(n) = 3S(n 2 1) 1 3 n ≥ 2

Solução:
Use a fórmula geral para a solução de uma relação de recorrência linear de primeira ordem
com coeficientes constantes.
Sabemos que a solução geral é da forma

S(n) = cS(n 2 1) 1 g(n)

S(n) = 3S(n 2 1) 1 3

c=3
g(n) = 3
30 Guia de Estudos Online


n
S(n) = cn21 S(1)=+ cn2ig(i)

i=
=2
−n −
n
= 3n 2 1 S(1)=+ 3n 2 −
i
(3) = 3n 21 (3)=+ + 3n −
2i+1
i=
=2 i=
=2

= 3n + 3n 2 1 + 3n 22 + ... + 32 + 3
S(n) = 3n + 3n 2 1 + 3n 22 + ... + 32 + 3

Usando a fórmula para os n primeiros termos de uma série geométrica com a = 3 e r = 3


[veja o Exercício 27 na Seção 2.2],

S(n) = 3 2 3*3n = 3 2 3n 1 1 = 3n 1 12 3
123 22 2

Resolvendo uma Relação de Recorrência do Tipo Dividir para


Conquistar Usando a Fórmula para a Solução
Problema:
Resolva a relação de recorrência
S(1) = 2
n
( (
S(n) = 2S 2 + 4 para n ≥ 2, n = 2m

Solução:
Use a solução geral para relações de recorrência da forma
n
(
S(n) = cS 2 + g(n)
(
Forma geral:
n
(
S(n) = cS 2 + g(n)
(
n
(
S(n) = 2S 2 + 4
(
c=2 g(n) = 4 para todos os valores do argumento n

A solução de equações da forma


n
(
S(n) = cS 2 + g(n)
(
é dada pela expressão
−n
log
log n n) 2 i
S(n) = c S(1)=+ c(log − g(2i )
i=1
=

Faça c = 2 e g(n) = 4 na solução geral:


−n
log
S(n) = clog n S(1)=+ n) 2 i
c(log − g(2i )
i=1
=

−n
log
S(n) = 2log n S(1)=+ n) 2 i
2(log− (4)
i=1
=
Guia de Estudos Online 31

Simplifique:
−n
log
S(n) = 2log n S(1)=+ 2(log n)−2 i (4) (2log n2 n)
i=1
=

−n
log
n) 2 i
= 2n=+ 2(log − (4)
i=1
=

Simplifique:
−n
log
S(n) = 2n=+ 2(log n)−2 i (4)
i=1
=

−n
log
S(n) = 2n +=4 2(log n)−2 i
i=1
=

Simplifique:
−n
log
S(n) = 2n +=4 2(log n)−2 i
i=1
=

= 2n + 4[2log n 2 i + 2log n 2 2 + . . . + 20]

Simplifique:

S(n) = 2n + 4[2log n 2 i + 2log n 2 2 + . . . + 20]


= 2n + 4[2log n 2 i + 2log n 2 2 + . . . + 1]

Use 1 + 2 + 22 + . . . + 2n = 2n + 1 2 1. [Exemplo 15, Seção 2.2]

S(n) = 2n + 4[2log n 2 1]

Simplifique:

S(n) = 2n + 4[2log n 2 1]
= 2n + 4[n2 1]
= 6n 2 4

Verifique que S(n) = 6n – 4 é a solução correta.


Para n = 1,
S(1) = 6(1) – 4 = 2.
Está de acordo com o caso básico.
S(1) = 2.
Para n = 2,
S(2) = 6(2) – 4 = 8.
Da relação de recorrência, S(2) = 2S(1) + 4 = 2(2) + 4 = 8, correto.
S(1) = 2.
S(2) = 8.
Para n = 4:
S(4) = 6(4) – 4 = 20
Da relação de recorrência, S(4) = 2S(2) + 4 = 2(8) + 40 = 20, correto.
32 Guia de Estudos Online

Visão Ger al da Seção 3.3

Muitas vezes estamos interessados em analisar a eficiência de um algoritmo. Para isso, de-
cidimos qual é a “unidade de trabalho” básica efetuada pelo algoritmo e contamos o número
de vezes em que é efetuada uma unidade de trabalho quando o algoritmo é executado. Esse
número, em geral, é uma função do tamanho n da entrada do algoritmo — quanto maior a
entrada, maior o trabalho para processá-la. Mas o trabalho pode não crescer de modo linear
com o tamanho da entrada; pode ocorrer que, se a entrada for dobrada, o trabalho não au-
mente por um fator de dois, mas por um fator de dois ao quadrado ou até mais!
Para um algoritmo direto, a análise pode ser feita, muitas vezes, simplesmente olhando-
se um esquema do pseudocódigo do algoritmo. Se a unidade de trabalho aparecer dentro de
um laço de para (um laço com contador) que vai de 1 até n, então a unidade de trabalho será
executada n vezes. Mas se o algoritmo for recursivo, o número de execuções de uma unidade
de trabalho como função do tamanho n da entrada será, em geral, expresso por uma relação
de recorrência em n. Nesse caso, a análise do algoritmo envolve a resolução de uma relação de
recorrência. Aprendemos diversas técnicas para resolver relações de recorrência na Seção 3.2.

Amostra de Solução de Problemas


• Problema 1 — Faça uma análise no pior caso de um algoritmo diretamente da
descrição do algoritmo ou de uma relação de recorrência.

Faça uma Análise no Pior caso de um Algoritmo Diretamente da


Descrição do Algoritmo ou de uma Relação de Recorrência
Problema:
Analise uma versão iterativa e uma versão recursiva de um algoritmo para encontrar o ele-
mento máximo em uma lista com n elementos L[1], L[2], . . ., L[n].

Versão iterativa:
função Máximo(lista L)
i=1
max = L[i]

para i = 1 até n faça


se L[i] > max, então
max = L[i]
fim do se
fim do para
retorne max
fim da função Máximo

Versão recursiva (chamado inicialmente com i = 1 e j = n):


Função MáximoRec(lista L, inteiro i, inteiro j)
se i = j, então
retorne L[i]
senão
encontre o índice k do item do meio na lista
max1 = MáximoRec(L, i, k)
max2 = MáximoRec(L, k + 1, j)
se max1 > max2 então
retorne max1
senão
retorne max2
fim do se
fim do se
fim da função MáximoRec
Guia de Estudos Online 33

Solução:
Identifique a unidade de trabalho e determine o número de vezes que ela é executada quando
o algoritmo roda.
A versão iterativa do algoritmo percorre a lista do princípio ao fim, atualizando o valor
máximo se for encontrado um elemento maior na lista.
O trabalho fundamental executado por esse algoritmo é comparar elementos da lista
com o valor atual de max.
Essa unidade de trabalho ocorre dentro de um laço que vai de 2 até n, logo n – 1 vezes. Por-
tanto, o número de comparações é n – 1 (em todos os casos — pior caso, caso médio, melhor caso).

Problema:
Analise uma versão iterativa e uma versão recursiva de um algoritmo para encontrar o ele-
mento máximo em uma lista com n elementos L[1], L[2], . . ., L[n].

Versão recursiva (chamado inicialmente com i = 1 e j = n):


Função MáximoRec(lista L, inteiro i, inteiro j)
se i = j, então
retorne L[i]
senão
encontre o índice k do item do meio na lista
max1 = MáximoRec(L, i, k)
max2 = MáximoRec(L, k + 1, j)
se max1 > max2 então
retorne max1
senão
retorne max2
fim do se
fim do se
fim da função MáximoRec

Solução:
A versão recursiva do algoritmo tem como caso básico uma lista com um elemento. Caso
contrário, encontra-se o valor máximo de cada metade da lista e o maior desses valores é o
valor máximo geral.
A unidade de trabalho é comparação entre elementos na lista, mas, por causa da recor-
rência, é difícil ver quantas vezes essa operação é executada.
Seja C(n) = o número de comparações feitas para se encontrar o máximo em uma lista
com n elementos.
Então C(1) = 0.
Seja C(n) = o número de comparações feitas para se encontrar o máximo em uma lista
com n elementos.
Então C(n/2) representa o número de comparações feitas para se encontrar o máximo
em uma lista com n/2 elementos.

C(1) = 0
C(n) = C(n/2) + C(n/2) + 1
= 2C(n/2) + 1

Resolva a relação do tipo dividir para conquistar

C(1) = 0
C(n) = 2C(n/2) + 1

n
C(n) = cC + 2 ( ( g(n)
34 Guia de Estudos Online

Forma geral:

c = 2, g(n) = 1

Resolva

C(1) = 0
C(n) = 2C(n/2) + 1

c = 2, g(n) = 1

Solução geral:

logn
C(n) = clogn C(1)=+ −i g(2i )
clogn 2
i=1
=

Meu caso:

n −
n
C(n) = 2logn(0)=+ 2logn −
2i
(1) = 0=+ 2logn −
2i
i=1
= i=1
=

= 2logn 2 1 + 2logn 2 2 + . . . +20


= 2logn 2 1 + 2logn 2 2 + . . . +1
= 2logn 2 1 (Exemplo 15, Seção 2.2)
= n2 1

Resolva

C(1) = 0
C(n) = 2C(n/2) + 1

Solução:

C(n) = n 2 1
Capítulo

Conjuntos, Combinatória
e Probabilidade
4
A Seção 4.1 introduz (embora nunca defina formalmente) o conceito de conjunto. Conjuntos
podem ser combinados e manipulados de diversas maneiras. Conjuntos podem ser finitos
ou infinitos, e existem diversos “tamanhos de infinito”. Entretanto, iremos nos preocupar
principalmente com conjuntos finitos. Em particular, estaremos interessados no número de
elementos pertencentes a algum conjunto finito.
As Seções de 4.2 a 4.4 fornecem diversas técnicas para resolver problemas de conta-
gem ou combinatórios. Essas técnicas incluem as dadas a seguir, que também podem ser
misturadas.

Técnica Quando Usar


Princípio de Multiplicação para contar o resultado de eventos sucessivos
Princípio de Adição para contar o resultado de eventos disjuntos
Árvores de decisão para contar o resultado de uma sucessão de eventos em
que o número de resultados depende de eventos anteriores
Princípio de Inclusão e Exclusão para contar partes em conjuntos que se intersectam
Princípio das Casas de Pombo para contar eventos que podem ser expressos como colo-
cação de coisas em caixas
Fórmula de permutação para contar arranjos ordenados de r coisas escolhidas em
um conjunto com n coisas
Fórmula de combinação para contar a escolha de r coisas em um conjunto com n
coisas

O Teorema Binomial, demonstrado na Seção 4.5 por um argumento combinatório e


por indução, é simplesmente uma generalização da fórmula familiar do quadrado de um
binômio, (a + b)2 = a2 + 2ab + b2. A Seção 4.6 fornece uma introdução à probabilidade, que
é uma extensão natural de contagem.

Visão Ger al da Seção 4 .1

Embora o termo “conjunto” não tenha sido definido formalmente, significa, informal-
mente, uma coleção não ordenada de objetos caracterizados por alguma propriedade em
comum. Assim,

{x | x = 2y, em que y é um inteiro}

descreve o conjunto dos inteiros pares. Um conjunto importante é o conjunto vazio >, o
conjunto que não tem elemento algum.

35
36 Guia de Estudos Online

Um conjunto A será dito um subconjunto de um conjunto B (A  B) se todo elemento


de A for um elemento de B. O conjunto das partes de A, ℘(A), é o conjunto de todos os sub-
conjuntos de A. Se A tiver n elementos, então ℘(A) terá 2n elementos.
Se os conjuntos A e B forem subconjuntos de algum “conjunto universal” S, então as
seguintes operações podem ser executadas em A e B.

• União: A B = {x| x > A ou x > B}


• Interseção: A B = {x| x > A e x > B}
• Complementar: A9 = {x| x > S e x R A}
• Produto Cartesiano: A 3 B = {(x, y)| x > A e y > B}

As identidades básicas que governam essas operações estão listadas na Seção 4.1. Note
que elas vêm em pares, cada identidade tendo uma identidade dual obtida trocando-se
união por interseção e vice-versa, e trocando-se o conjunto vazio pelo conjunto universal
e vice-versa.
Em um conjunto finito com k elementos, podemos listar todos os elementos: s1, s2, ..., sk.
Um conjunto enumerável é um conjunto infinito no qual é possível enumerar os elementos
de tal maneira que cada elemento do conjunto apareça nessa enumeração. Por exemplo, o
conjunto dos inteiros pares positivos é um conjunto enumerável, pois 2, 4, 6, 8, 10, 12, ...
é uma enumeração do conjunto inteiro. O argumento da diagonalização de Cantor mostra
que existem conjuntos grandes demais para serem enumerados; tais conjuntos são ditos não
enumeráveis.

Amostras de Solução de Problemas


• Problema 1 — Formando novos conjuntos por meio da união, da interseção e do
complemento de conjuntos.
• Problema 2 — Demonstrando identidades sobre conjuntos usando as identidades
básicas.

Formando Novos Conjuntos Através da União, da Interseção e do


Complemento de Conjuntos
Problema:
S = {x | x > 1 e 1 ≤ x ≤ 15}
A = {x | x > S e (∃y) (y > S e x = y2)}
B = {x | x > S e x2 > 75}

Encontre A B, A B, B9 e B92 A.

Solução:
Aplique as definições dessas operações nos conjuntos.
S = todos os inteiros entre 1 e 15, inclusive
A = {1, 4, 9}
B = {9, 10, 11, 12, 13, 14, 15}

A B = {1, 4, 9, 10, 11, 12, 13, 14, 15}


A B = {9}
B9 = {x | x | 1≤ x ≤ 8}
B92 A = {2, 3, 5, 6, 7, 8}
Guia de Estudos Online 37

Visão Ger al da Seção 4 .2

Existem diversas técnicas gerais para se resolver problemas de contagem (combinatórios).


Para determinar o número total de resultados de muitos eventos, considere:

Se os eventos ocorrerem em sequência, multiplique o número de resultados de cada


evento (Princípio de Multiplicação).
Se os eventos forem disjuntos, some o número de resultados de cada evento (Princípio
de Adição).
Se os eventos ocorrerem em sequência, mas se o resultado de um evento depender do
resultado de um evento anterior, use uma árvore de decisão.

Essas técnicas podem ser usadas em conjunto em um único problema.

Amostra de Solução de Problemas


• Problema 1 — Usando o Princípio de Multiplicação e o Princípio de Adição para
contar o número de objetos em um conjunto finito.

Usando o Princípio de Multiplicação e o Princípio de Adição para


Contar o Número de Objetos em um Conjunto Finito
Problema:
Em determinado estado nos EUA, as placas de carro podem ser “regulares”, contendo 2
letras seguidas de 3 algarismos, ou podem ser “customizadas”, contendo 5 letras. Para cada
um desses tipos, a placa pode ser simples (letras azuis em um fundo branco) ou ambientais
especiais (letras verdes em um fundo branco com uma imagem do pássaro estadual, um
abutre). Quantas placas diferentes podem ser feitas?

Solução:
Esse é um problema de contagem. Analise os eventos.

Eventos disjuntos:
maneiras de escolher placas regulares + maneiras de escolher placas customizadas
maneiras de escolher placas regulares: escolha o caractere 1, depois o caractere 2, depois
o caractere 3, depois o caractere 4, depois o caractere 5 e depois se é simples ou ambiental

maneiras de escolher placas customizadas: escolha o caractere 1, depois o caractere 2, depois


o caractere 3, depois o caractere 4, depois o caractere 5 e depois se é simples ou ambiental
maneiras de escolher placas regulares: escolha o caractere 1, depois o caractere 2, de-
pois o caractere 3, depois o caractere 4, depois o caractere 5 e depois se é simples ou
ambiental

26*26*10*10*10*2

maneiras de escolher placas customizadas: escolha o caractere 1, depois o caractere 2, depois


o caractere 3, depois o caractere 4, depois o caractere 5 e depois se é simples ou ambiental

26*26*26*26*26*2

26*26*10*10*10*2 + 26*26*26*26*26*2
38 Guia de Estudos Online

Visão Ger al da Seção 4 .3

O Princípio de Adição diz que o número de resultados de eventos disjuntos é a soma do


número de resultados de cada evento. Ilustrando os eventos como conjuntos disjuntos, isso
diz que o número de elementos em uma união de conjuntos disjuntos é a soma do número
de elementos em cada conjunto.
O Princípio de Inclusão e Exclusão estende essa ideia para cobrir os casos em que os
conjuntos não são disjuntos. Para encontrar o número total de elementos em uma união de
dois conjuntos finitos, some o número de elementos de cada conjunto e subtraia o número
de elementos na interseção (de modo a não os contar duas vezes). Simbolicamente, pode-
mos escrever isso na forma

|A B| = | A| + | B| 2| A B|.

A fórmula pode ser estendida para qualquer número finito de conjuntos finitos.
O Princípio das Casas de Pombo diz que, se você tentar colocar mais de k coisas em k
caixas, pelo menos uma caixa terminará com mais de uma coisa. Esse princípio pode ser
usado para resolver determinados problemas de contagem se você puder identificar corre-
tamente as coisas e as caixas.

Amostra de Solução de Problemas


• Problema 1 — Usando o Princípio de Inclusão e Exclusão para encontrar o núme-
ro de elementos em uma união de conjuntos.

Usando o Princípio de Inclusão e Exclusão para Encontrar o Número


de elementos em uma União de Conjuntos
Problema:
22 membros de um clube de atletismo são pesquisados pelos proprietários. Desses, 10 são
surfistas, 16 são corredores e 13 são ciclistas. Sete dos surfistas também são corredores e 6
dos surfistas também são ciclistas. Nove pessoas são, ao mesmo tempo, ciclistas e corredo-
res. Quantas pessoas participam dos três esportes?

Solução:
Identifique os conjuntos e use o Princípio de Inclusão e Exclusão.

A = conjunto de surfistas
B = conjunto de corredores
C = conjunto de ciclistas

| A B C| = 22
| A| = 10
| B| = 16
| C| = 13
| A B| = 7
| A C| = 6
| B C| = 9

Princípio de Inclusão e Exclusão para três conjuntos:

|A B C| = | A| + | B| + | C| 2 | A B| 2 | A C| 2 | B C| + | A B C|
22 = 10 + 16 + 13 2 7 2 6 2 9 + | A B C|
|A B C| = 5
Guia de Estudos Online 39

Visão Ger al da Seção 4 . 4

Uma permutação é um arranjo ordenado de objetos. Para contar o número de permutações


de r objetos em um conjunto de n objetos, usamos a fórmula de permutação
n!
P(n, r) =
(n 2 r)!
Se a ordem dos objetos for irrelevante, para contar o número de maneiras de selecionar
r objetos em um conjunto com n objetos use a fórmula de combinação
n!
C(n, r) =
r!(n 2 r)!
Lembre-se: se a ordem for relevante, é um problema de permutação. Caso contrário, é
um problema de combinação.
É fácil obter soluções que parecem razoáveis, mas estão incorretas, em problemas en-
volvendo permutações ou combinações. Em geral, tais soluções envolvem contar algumas
coisas mais de uma vez.
Outra sugestão é que, se um problema pede de quantas maneiras “pelo menos 1”
pode ser incluído, isso significa que você poderia incluir 1 ou 2 ou 3 ou ..., de modo
que resolver esse problema diretamente irá envolver encontrar o resultado de muitos
eventos disjuntos e somá-los (usado ao Princípio da Adição). Considere encontrar o
número de maneiras de incluir 0 e depois subtraia esse resultado do número total de
resultados possíveis.
Quando os objetos podem ser selecionados e reusados, é preciso aplicar fórmulas di-
ferentes.

Amostra de Solução de Problemas


• Problema 1 — Usando permutações e combinações junto com os Princípios de
Multiplicação e de Adição.

Usando Permutações e Combinações Junto com os Princípios de


Multiplicação e de Adição
Problema:
Um grupo de estudantes de ciências consiste em

12 alunos de biologia
9 alunos de química
10 alunos de ciência da computação
5 alunos de geologia
7 alunos de matemática
2 alunos de física

Ninguém está fazendo dois cursos ao mesmo tempo. Deve-se escolher um conselho com
5 estudantes. De quantas maneiras é possível formar tal conselho se

a. não houver restrições?


b. o conselho tiver que ter exatamente 2 alunos de biologia e 1 de ciência da computação?
c. o conselho tiver que ter no máximo 1 aluno de física?
d. o conselho tiver que ter pelo menos 1 aluno de ciência da computação?

Solução:
Devemos selecionar subconjuntos de pessoas de várias maneiras em um grupo. Use permu-
tações ou combinações.
40 Guia de Estudos Online

A ordem é irrelevante. Use combinações.


a. Sem restrições.
C(45, 5)

b. O conselho tem que ter exatamente 2 alunos de biologia e 1 aluno de ciência da com-
putação * maneiras de escolher 2 alunos de biologia * maneiras de escolher 1 aluno de
ciência da computação * maneiras de escolher o resto = C(12,2) * C(10, 1) * C(23, 2)

c. O conselho tem que ter no máximo 1 aluno de física


0 aluno de física + exatamente 1 aluno de física

d. O conselho tem que ter pelo menos 1 aluno de ciência da computação


Número total — 0 aluno de ciência da computação
C(45, 5) – C(35, 5)

Visão Ger al da Seção 4 . 5

Dadas duas quantidades a e b, o binômio (a + b) pode ser elevado a uma potência inteira
não negativa n. O valor de

(a + b)n

pode ser obtido multiplicando-se repetidamente (a + b) por si mesmo. O teorema binomial


é uma fórmula que fornece diretamente o resultado, sem a necessidade de multiplicações
repetidas. Essa expressão também é chamada de expansão binomial de (a + b)n. A expansão
tem n + 1 parcelas com coeficientes C(n, r), 0 ≤ r ≤ n.

(a + b)n = C(n, 0)anb0 + C(n, 1)an21b1 + C(n, 2)an22b2 +...+ C(n, k)an2kbk +...+ C(n, n)a0bn

A fórmula é fácil de lembrar; comece o primeiro termo com “a” elevado a n e “b” ele-
vado a 0. Para cada termo sucessivo, diminua a potência de a de 1 e aumente a potência de
b de 1. Os coeficientes são, simplesmente, as diversas combinações de r coisas escolhidas
entre n coisas, com r variando de r = 0 até r = n, que formam a n-ésima linha do triângulo
de Pascal.
A fórmula também permite que você encontre qualquer parcela particular na expansão
binomial. O termo

C(n, k)an2kbk

é a parcela k + 1. Note que a soma das potências de a e de b é sempre igual a n.

Amostras de Solução de Problemas


• Problema 1 — Usando o teorema binomial para expandir um binômio.
• Problema 2 — Usando o teorema binomial para encontrar uma parcela específica
na expansão de um binômio.

Usando o Teorema Binomial para Expandir um Binômio


Problema:
Expanda a expressão

(3c – 2)6
Guia de Estudos Online 41

Solução:
Use o teorema binomial.
Passo 1. Identifique a, b e n.

(a + b)n

(3c – 2)6 = ([3c] + [–2])6

a: 3c
b: –2
n: 6

Passo 2. Escreva o primeiro termo da expansão.

(3c – 2)6 = ([3c] + [–2])6 = C(6, 0)(3c)6(–2)0 + ...

Passo 3. Escreva os termos restantes da expansão.

(3c – 2)6 = ([3c] + [–2])6 = C(6, 0)(3c)6(–2)0 + C(6, 1)(3c)5(–2)1 + C(6, 2)(3c)4(–2)2 +
C(6, 3)(3c)3(–2)3 + C(6, 4)(3c)2(–2)4 + C(6, 5)(3c)1(–2)5 + C(6,6)(3c)0(–2)6

Passo 4. Simplifique os termos da expansão.


Substituindo

n!
C(n, r) =
r!(n 2 r)!

em

(3c – 2)6 = C(6, 0)(3c)6(–2)0 + C(6, 1)(3c)5(–2)1 + C(6, 2)(3c)4(–2)2 + C(6, 3)(3c)3(–2)3
+ C(6, 4)(3c)2(–2)4 + C(6, 5)(3c)1(–2)5 + C(6, 6)(3c)0(–2)6

obtemos

6! 6! 6!
= (3c)6(–2)0 + (3c)5(–2)1 + (3c)4(–2)2 +
0!(6 2 0)! 1!(6 2 1)! 2!(6 2 2)!
6! 6! 6!
(3c)3(–2)3 + (3c)2(–2)4 + (3c)1(–1)5 +
3!(6 2 3)! 4!(6 2 4)! 5!(6 2 5)!
6!
(3c)0(–2)6
6!(6 2 6)!

= 1(3c)6(–2)0 + 6(3c)5(–2)1 + 15(3c)4(–2)2 + 20(3c)3(–2)3 + 15(3c)2(–2)4 + 6(3c)1(–2)5 +


1(3c)0(–2)6
= 729c6 – 6(243)(2)c5 + 15(81)(4)c4 – 20(27)(8)c3 + 15(9)(16)c2 – 6(3)(32)c + 64
= 729c6 – 2916c5 + 4860c4 – 4320c3 + 2160c2 – 576c + 64

Usando o Teorema Binomial para Encontrar uma Parcela Específica


na Expansão de um Binômio
Problema:
Encontre o coeficiente de x5 y7 na expansão de (7x + 3y)12.
42 Guia de Estudos Online

Solução:
Use o teorema binomial.

(a + b)n

(7x + 3y)12

a: 7x
b: 3y
n: 12

k: 7

C(n, k)an2kbk = C(12, 7)(7x)1227(3y)7

12! 12 . 11 . 10 . 9 . 8 5 7 5 7
= (7x)5(3y)7 = 73xy
7!(12 2 7)! 1.2.3.4.5

= 792(16807)(2187) x5y7 = 29.111.471.928 x5y7

Visão Ger al da Seção 4 .6

Probabilidade trata do problema de quão provável é que determinados resultados ocorram


ao se executar alguma ação. Sua base está nas técnicas de contagem, pois consideramos a
razão entre os tamanhos de conjuntos finitos.
O conjunto de todos os resultados possíveis de uma ação é chamado de espaço amos-
tral S da ação. Se esses resultados forem igualmente prováveis e se quisermos encontrar a
probabilidade de que determinado subconjunto E (chamado de um evento) do espaço amos-
tral ocorra, precisaremos apenas considerar a razão entre o tamanho do conjunto evento e
o tamanho do espaço amostral.

|E|
P(E) =
|S|

Por exemplo, ao se jogar uma moeda equilibrada, uma em que é igualmente provável
dar cara ou coroa, a probabilidade de dar cara é ½, já que o espaço amostral contém dois
valores, C (cara) e K (coroa), enquanto o evento desejado contém apenas um valor, C.
O espaço amostral ou o evento poderia ser formado como uma união ou interseção
de conjuntos; nesse caso, encontrar o tamanho do espaço amostral ou do evento poderia
envolver o princípio de adição ou o de multiplicação, o princípio de inclusão e exclusão ou
a fórmula para a combinação de r coisas escolhidas em um conjunto com n coisas, C(n, r).
Como a probabilidade de E mede a razão entre o tamanho de um subconjunto de S e o
tamanho do próprio S, seu valor máximo é 1,0, o que ocorrerá se o evento for todo o espaço
amostral (acontece com certeza). O valor mínimo é 0,0, o que ocorrerá se o evento for o
conjunto vazio (nunca acontece).
Quando todos os resultados em S são igualmente prováveis, então, para um dado evento
E, cada resultado em E tem uma probabilidade igual a 1/|S|. A probabilidade de E é a soma
de cada uma dessas probabilidades separadas:
|E| − 1 −
P(E) = == ==− p(xi)−
| S | xi=E% | S | xi=E%
> >
Guia de Estudos Online 43

Se os resultados em S não forem igualmente prováveis, pode ser atribuída uma proba-
bilidade a cada resultado distinto xi. Usando essa distribuição de probabilidade, a probabi-
lidade do evento E, novamente, é igual a

==
P(E) p(xi)−
xi=
>E%

Se uma tarefa consistir em eventos sucessivos, a probabilidade de um resultado de-


sejado irá mudar se tivermos algum conhecimento do resultado do primeiro evento. Para
calcular a probabilidade de os eventos E1 e E2 ocorrerem, dado que você conhece a proba-
bilidade de E1, use a fórmula
P(E1 E2)
P(E2 | E1) =
P(E1)
Uma associação de um valor numérico X(xi) a cada resultado distinto xi no espaço
amostral é chamada de uma variável aleatória. Se tivermos uma variável aleatória definida
em S e uma distribuição de probabilidade, podemos calcular o valor esperado da variável
aleatória, definido por

n
E(X =
)= − i)
X (xi)p(x
i=
=1

O valor esperado é um “profeta” do valor numérico associado a resultados de tentativas


futuras.

Amostras de Soluções de Problemas


• Problema 1 — Calculando a probabilidade de um evento quando todos os resulta-
dos são igualmente prováveis.
• Problema 2 — Calculando a probabilidade condicional de um evento dado que
outro evento ocorreu.

Calculando a Probabilidade de um Evento Quando Todos os


Resultados São Igualmente Prováveis
Problema:
Dois prêmios vão ser sorteados de um conjunto de 12 carros novos e 9 pacotes de férias.
Qual é a probabilidade de se sortear

a. dois carros novos?


b. dois pacotes de férias?
c. um carro e um pacote de férias?

Solução:
Encontre o tamanho do espaço amostral e o tamanho de cada evento.
S = seleção de 2 coisas entre 21

21! 21*20
| S | = C(21,2) = = = 210
19!2! 2

| S | = 210

E = 2 carros novos

12! 12*11
| E | = C(12,2) = = = 66
10!2! 2

P(E) = 66/210 ~ 0,314


44 Guia de Estudos Online

| S | = 210

E = 2 pacotes de férias

9! 9*8
| E | = C(9,2) = = = 36
7!2! 2

P(E) = 36/210 ~ 0,171

Encontre o tamanho do espaço amostral e o tamanho de cada resultado.

| S | = 210

E = um carro e um pacote de férias

| E | = C(12,1)* C(9,1) = 12*9 = 108

P(E) = 108/210 ~ 0,514


Capítulo

Relações, Funções e Matrizes 5


Relações binárias em um conjunto são coleções de pares ordenados (x, y) de elementos no
conjunto, em que x e y estão “relacionados” de alguma maneira. Por exemplo, no conjunto
de inteiros, (2, 3), (7, 17) e (-4, 1) seriam pares em uma relação “menor do que”: 2 é menor
do que 3, 7 é menor do que 17 e -4 é menor do que 1. É claro que existem muitos outros
pares nessa relação.
Na Seção 5.1, consideramos diversas propriedades que relações podem ter e conside-
ramos dois tipos de relação particularmente úteis — ordens parciais e relações de equi-
valência. Uma ordem parcial em um conjunto pode ser transformada em uma ordem total
por meio de um processo chamado de ordenação topológica, como discutido na Seção 5.2.
Relações têm um papel importante em bancos de dados relacionais, discutidos rapida-
mente na Seção 5.3.
A Seção 5.4 discute funções, que são tipos especiais de relações binárias de um con-
junto para outro. Funções também podem ter outras propriedades, como ser injetora ou so-
brejetora. Em ciência da computação, a complexidade computacional de um algoritmo pode
ser enunciada em termos da ordem de grandeza de uma função que representa as unidades
de trabalho executadas pelo algoritmo. Se o trabalho executado puder ser expresso por
uma relação de recorrência do tipo dividir para conquistar, o Teorema Mestre, discutido
na Seção 5.5, poderá fornecer um modo particularmente simples de determinar a ordem
de grandeza. Uma função particularmente simples, a função modular, tem um número
surpreendente de aplicações muito úteis, incluindo aspectos de segurança computacional.
Algumas dessas aplicações são exploradas na Seção 5.6.
Matrizes e operações matriciais são revistas na Seção 5.7, incluindo o método de
Gauss para a resolução de sistemas de equações lineares. Especialmente interessantes são
as matrizes booleanas, cujos elementos são todos iguais a 0 e a 1. Para essas matrizes,
é definida uma multiplicação matricial diferente. Matrizes, em geral, irão fornecer mais
tarde exemplos de estruturas algébricas, e matrizes booleanas serão úteis para representar
relações e grafos.

Visão Ger al da Seção 5.1

Dados dois conjuntos S e T, uma relação binária de S para T é um subconjunto de S 3 T, ou


seja, é uma coleção de pares ordenados. No caso particular em que S = T, temos uma relação
binária em S, que é uma coleção de pares ordenados de elementos em S. O foco principal
dessa seção será relações binárias em um conjunto S.
Como uma relação binária r é um conjunto, ela pode ser descrita das maneiras usuais
de descrição de um conjunto:
• através de uma lista de elementos (os pares ordenados) do conjunto r:
Exemplo: S = {2, 3, 4}, r = {(2, 3), (2, 4), (3, 4)}.

45
46 Guia de Estudos Online

• através de uma propriedade que caracterize os pares ordenados no conjunto r:


Exemplo: S = {2, 3, 4}, r = {(x, y)| x < y}.

A tabela a seguir lista algumas propriedades que uma relação binária r em um conjunto
S pode ter.
Informalmente, a reflexividade significa que todo elemento no conjunto está relaciona-

Nome da
Definição
Propriedade
Reflexividade (∀x)(x > S (x, x) > r)
Simetria (∀x)(∀y)(x > S y>S (x, y) > r ( y, x) > r)
Transitividade (∀x)(∀y)(∀z)(x > S y>S z>S (x, y) > r ( y, z) > r (x, z) > r)
Antissimetria (∀x)(∀y)(x > S y>S (x, y) > r ( y, z) > r x = y)

do consigo mesmo. A simetria diz que, se x estiver relacionado com y, então y estará relacio-
nado com x. A transitividade afirma que, se x estiver relacionado com y e y estiver relacionado
com z, então x estará relacionado com z. A antissimetria diz que a única maneira de x estar
relacionado com y e y estar relacionado com x ao mesmo tempo é x ser igual a y.
Uma relação binária em um conjunto que é reflexiva, antissimétrica e transitiva é uma
ordem parcial no conjunto. A característica que distingue uma ordem parcial de outras
relações binárias (em um conjunto finito) é que ela pode ser visualizada por meio de um
diagrama de Hasse. Uma relação binária em um conjunto que é reflexiva, simétrica e tran-
sitiva é uma relação de equivalência no conjunto. A característica que distingue uma rela-
ção de equivalência de outras relações binárias é que ela forma uma partição do conjunto,
dividindo-o em classes de equivalência distintas e disjuntas. Depois as classes podem ser
tratadas como objetos.

Amostras de Solução de Problemas


• Problema 1 — Testando uma relação binária para as propriedades de reflexivida-
de, simetria, antissimetria e transitividade.
• Problema 2 — Encontrando as classes de equivalência associadas a uma relação
de equivalência.

Testando uma Relação Binária para as Propriedades de


Reflexividade, Simetria, Antissimetria e Transitividade
Problema:
Seja S o conjunto de todas as cadeias de comprimento finito formada com os símbolos
{p, q}. Defina r em S por x r y  o comprimento da cadeia xy é par.
Verifique se r é reflexiva, simétrica, antissimétrica ou transitiva.

Solução:
Aplique as definições das diversas propriedades. Mas, primeiro, compreenda o conjunto S.
S consiste em todas as cadeias de comprimento finitas formadas pelos símbolos “p” e “q”,
tais como p, ppqqq e qpqpqp.

|p| = 1
|ppqqq| = 5
|qpqpqp| = 6

S é um conjunto infinito.
Guia de Estudos Online 47

Aplique as definições das diversas propriedades.


Se x = pq e y = q, então xy é a concatenação dessas duas cadeias: xy = pqq.

|pqq| = 3

Como o comprimento de xy não é par, x não está relacionado com y; (x, y) R r.


Reflexividade: x r x para toda cadeia x?
se |x| for ímpar, então |xx| será par.
se |x| for par, então |xx| será par,
r é reflexiva
Simetria: x r y y r x?
se |xy| for par, então |yx| será par
r é simétrica
Antissimetria: x r y y r x x = y?
se |xy| for par e se |yx| for par, podemos concluir que x = y?
Antissimetria: x r y y r x x = y?
Contraexemplo: sejam x = p e y = q.
Então x r y, já que |pq| = 2. Além disso, como |qp| = 2, y r x. Mas x y.
r não é antissimétrica.
Transitividade: x r y y r z x r z?
se |xy| for par e se |yz| for par, podemos concluir que |xz| é par?

Exemplo:
1. Seja x = p, de modo que |x| = 1.
2. Para que x r y, |y| tem que ser ímpar. Seja y = qqq.
3. Então, para que y r z, |z| também tem que ser ímpar. Seja z = q.
4. Então |xz| = |pq| = 2 e x r z.

Demonstração:
1. Suponha que |x| é ímpar.
2. Para que x r y, |y| tem que ser ímpar.
3. Então, para que y r z, |z| também tem que ser ímpar.
4. Então |xz| é par (concatenação de duas cadeias ímpares) e x r z.
5. Suponha que |x| é par.
6. Para que x r y, |y| tem que ser par.
7. Então, para que y r z, |z| também tem que ser par.
8. Então |xz| é par (concatenação de duas cadeias pares) e x r z.

r é transitiva
r é reflexiva, simétrica e transitiva, logo r é uma relação de equivalência em S.

Encontrando as Classes de Equivalência Associadas a uma Relação


de Equivalência
Problema:
Seja S o conjunto de todas as cadeias de comprimento finito formada com os símbolos
{p, q}. Defina r em S por
x r y  o comprimento da cadeia xy é par.
Então r é uma relação de equivalência em S (veja o problema anterior). Quais são as classes
de equivalência?

Solução:
Pense sobre quais cadeias estão relacionadas entre si.
[x] = { y | y > S x r y}
se |x| for par, então [x] = {cadeias de comprimento par em S}
48 Guia de Estudos Online

se |x| for ímpar, então [x] = {cadeias de comprimento ímpar em S}


S
cadeias de
comprimento par

cadeias de
comprimento
ímpar

Visão Ger al da Seção 5.2

Dado um conjunto de tarefas em que algumas têm que ser completadas antes que outras
possam começar, podemos usar essa informação de “pré-requisitos” para definir uma ordem
parcial no conjunto de tarefas. Suponha que é dado um tempo de finalização para cada ta-
refa. Então o diagrama de Hasse para essa ordem parcial, desenhado de lado, é chamado de
um diagrama PERT (do nome em inglês, Program Evaluation and Review Technique, que
significa Técnica de Avaliação e Revisão de Programas). Logo, um diagrama PERT é um
grafo direcionado, em que as tarefas que têm que ser completadas primeiro ficam à esquerda
das que são feitas depois. Os caminhos ao longo do diagrama PERT podem ser traçados para
se determinar o tempo mínimo de finalização do conjunto completo de tarefas, e as tarefas
ao longo do caminho crítico podem ser identificadas (as tarefas que, se atrasarem, atrasarão
a finalização do conjunto inteiro de tarefas).
Uma ordenação topológica em uma ordem parcial em um conjunto finito é uma ordem
total que preserva a relação de predecessor. Se uma ordem parcial representar um conjunto
de tarefas, então uma ordenação topológica fornecerá um modo de as tarefas serem com-
pletadas sequencialmente. Uma ordenação topológica para uma ordem parcial não é única,
em geral.

Amostras de Solução de Problemas


• Problema 1 — Construindo um diagrama PERT de uma tabela de tarefas.
• Problema 2 — Fazendo uma ordenação topológica em um conjunto parcialmente
ordenado.

Construindo um Diagrama PERT de uma Tabela de Tarefas


Problema:
Dada a tabela de tarefas a seguir para costurar uma camisa, construa um diagrama PERT.

Tarefa Pré-requisitos Minutos para Execução


1. Comprar o padrão de corte Nenhum 30
2. Comprar o tecido Nenhum 75
3. Colocar o padrão sobre o tecido 1, 2 80
4. Cortar o tecido segundo o padrão 3 70
5. Costurar a gola 4 20
6. Costurar as mangas 4 25
7. Costurar o corpo da camisa 4 45
8. Costurar as mangas no corpo da camisa 6, 7 45
9. Costurar a gola no corpo da camisa 5, 7 20
10. Fazer as casas para os botões 7 65
11. Pregar os botões na camisa 7 50
12. Fazer a bainha na camisa 7 30
Guia de Estudos Online 49

Solução:
Identifique os pré-requisitos de cada tarefa e use essa relação como base para a ordem parcial.

As tarefas 1 e 2 não têm pré-requisito.


1(30)

2(75)

A tarefa 3 depende das tarefas 1 e 2, a tarefa 4 depende da 3.

1(30)
3(80)
4(70)
2(75)

As tarefas 5, 6 e 7 dependem da 4.
5(20)
1(30)
3(80) 7(45)
4(70)
2(75) 6(25)

A tarefa 8 depende das tarefas 6 e 7, a tarefa 9 depende de 5 e 7.

5(20)
1(30) 9(20)
3(80) 7(45)
4(70)
2(75) 8(45)
6(25)

Todas as tarefas que restam dependem da 7.


5(20) 10(65)
9(20)
3(80) 7(45)
11(50)
4(70)
8(45) 12(30)
2(75)
6(25)

Fazendo uma Ordenação Topológica em um Conjunto Parcialmente


Ordenado
Problema:
Dado o diagrama de PERT (para costurar uma camisa) a seguir, encontre uma ordenação
topológica.
5(20) 10(65)
1(30) 9(20)
3(80) 7(45)
11(50)
4(70)
8(45) 12(30)
2(75)
6(25)

Solução:
Use o Algoritmo de Ordenação Topológica; remova sucessivamente os elementos minimais
do conjunto de nós e adicione-os à lista totalmente ordenada.
50 Guia de Estudos Online

Elementos minimais: 1 e 2
Ordenação Total: 1
5(20) 10(65)
9(20)
3(80) 7(45)
11(50)
4(70)
8(45) 12(30)
2(75)
6(25)

Solução:
Elemento minimal: 2
Ordenação Total: 1, 2
5(20) 10(65)
9(20)
3(80) 7(45)
11(50)
4(70)
8(45) 12(30)
6(25)

Solução:
Elementos minimais: 3 e depois 4
Ordenação Total: 1, 2, 3, 4
5(20) 10(65)
9(20)
7(45)
11(50)
8(45) 12(30)
6(25)

Solução:
Elementos minimais: 5, 6, 7
Ordenação Total: 1, 2, 3, 4, 7, 6, 5

9(20) 10(65)

11(50)
8(45) 12(30)

Solução:
Elementos minimais: 8, 9 e depois 10, 11, 12
Ordenação Total: 1, 2, 3, 4, 7, 6, 5, 8, 9, 10, 11, 12

Visão Ger al da Seção 5.3

Em um banco de dados relacional, a informação sobre entidades em algum empreendimento


é mantida em uma tabela como uma relação n-ária, ou seja, como uma coleção de n-tuplas de
valores de atributos. Cada relação (tabela) tem uma chave primária — algum subconjunto
dos atributos da relação (colunas da tabela) cujos valores identificam cada tupla de maneira
única. Os atributos em uma relação podem assumir os mesmos valores que as chaves pri-
márias em outras relações; tais atributos são chamados de chaves estrangeiras nas outras
relações. São esses atributos em comum que ligam as diversas tabelas em um banco de dados.
Guia de Estudos Online 51

O poder de um banco de dados vem da maneira em que as operações podem ser exe-
cutadas em relações para criar relações novas. A operação de restrição seleciona determi-
nadas linhas em uma tabela de relação de acordo com as características de alguns dos atri-
butos; a operação de projeção seleciona determinadas colunas. A operação de junção liga
duas tabelas que tenham um atributo em comum. Podem ser executadas diversas pesquisas
em um banco de dados relacional combinando essas operações de maneiras adequadas.
A álgebra relacional, a linguagem internacional padrão de banco de dados relacional,
SQL, e o cálculo relacional fornecem sintaxe para combinar essas operações em um banco
de dados. São, portanto, linguagens para formular pesquisas em bancos de dados.
Na manutenção de um banco de dados — adicionar informações novas, modificar ou
apagar informações existentes — é preciso tomar cuidado para preservar a integridade
(consistência) do banco de dados. A integridade da entidade diz que cada tupla tem que
ter um conjunto completo de valores não nulos para os atributos de sua chave primária. A
integridade dos dados diz que os valores dos atributos de uma tupla têm que vir do domí-
nio apropriado. E a integridade referencial diz que os valores de uma chave estrangeira
têm que estar de acordo com os valores das chaves primárias nas outras relações (ou ser
nulos), de modo que não ocorram exclusões ou inclusões “parciais”.

Amostras de Solução de Problemas


• Problema 1 — Usando as operações de restrição, projeção e junção em um banco
de dados relacional.
• Problema 2 — Formulando pesquisas em bancos de dados relacionais usando ál-
gebra relacional, SQL e cálculo relacional.

Usando as Operações de Restrição, Projeção e Junção em um


Banco de Dados Relacional
Problema:
Dadas as tabelas de relação a seguir, escreva os resultados das seguintes operações:
1. Restrição de Empregado onde Cargo = “vendedor” fornecendo Resultado1
2. Projeção de Empregado sobre (Nome, Cargo) fornecendo Resultado2
3. Junção de Empregado e EscalaDePagamento sobre Cargo fornecendo Resultado3

Empregado
Nome Idade Cargo
Paula Costa 32 Cortador de tecidos
Samanta Teixeira 41 Comprador
Ana Wong 37 Projetista
Artur Santos 25 Cortador de tecidos
Carla Williams 33 Vendedor
Shirley Quaresma 45 Vendedor

EscalaDePagamento
Cargo Valor
Projetista 18,50
Comprador 14,00
Vendedor 12,50
Cortador de tecidos 8,75
52 Guia de Estudos Online

Solução:
Execute as operações para produzir tabelas novas.

Empregado
Nome Idade Cargo
Paula Costa 32 Cortador de tecidos
Samanta Teixeira 41 Comprador
Ana Wong 37 Projetista
Artur Santos 25 Cortador de tecidos
Carla Williams 33 Vendedor
Shirley Quaresma 45 Vendedor

EscalaDePagamento
Cargo Valor
Projetista 18,50
Comprador 14,00
Vendedor 12,50
Cortador de tecidos 8,75

Solução:
Execute as operações para produzir tabelas novas.

Resultado1
Nome Idade Cargo
Carla Williams 33 Vendedor
Shirley Quaresma 45 Vendedor

Resultado2
Nome Cargo
Paula Costa Cortador de tecido
Samanta Teixeira Comprador
Ana Wong Projetista
Artur Santos Cortador de tecido
Carla Williams Vendedor
Shirley Quaresma Vendedor

Resultado3
Nome Idade Cargo Valor
Paula Costa 32 Cortador de tecido 8,75
Samanta Teixeira 41 Comprador 14,00
Ana Wong 37 Projetista 18,50
Artur Santos 25 Cortador de tecido 8,75
Carla Williams 33 Vendedor 12,50
Shirley Quaresma 45 Vendedor 12,50
Guia de Estudos Online 53

Formulando Pesquisas em Bancos de Dados Relacionais Usando


álgebra Relacional, SQL e Cálculo Relacional
Problema:
Dadas as tabelas de relações a seguir, escreva uma pesquisa para obter os nomes de todos os
empregados que recebem menos de R$15,00 por hora. Use a notação de

a. álgebra relacional
b. SQL
c. cálculo relacional

Empregado
Nome Idade Cargo
Paula Costa 32 Cortador de tecidos
Samanta Teixeira 41 Comprador
Ana Wong 37 Projetista
Artur Santos 25 Cortador de tecidos
Carla Williams 33 Vendedor
Shirley Quaresma 45 Vendedor

EscalaDePagamento
Cargo Valor
Projetista 18,50
Comprador 14,00
Vendedor 12,50
Cortador de tecidos 8,75

Solução:
Encontre as operações relacionais apropriadas e expresse-as na sintaxe de cada abordagem.

passo 1. restrição de EscalaDePagamento onde Valor < “15,00”

passo 2. junção de Empregado e (restrição de EscalaDePagamento onde Valor < “15,00”)


sobre Cargo

passo 3. projeção de (junção de Empregado e (restrição de EscalaDePagamento onde


Valor < “15,00”) sobre Cargo) sobre Nome fornecendo Resultado4

a. álgebra relacional:
projeção de (junção de Empregado e (restrição de EscalaDePagamento onde Valor <
“15,00”) sobre Cargo) sobre Nome fornecendo Resultado4

b. SQL:
SELECT Nome
FROM Empregado, EscalaDePagamento
WHERE Empregado.Cargo = EscalaDePagamento.Cargo
AND Valor < “15.00”

c. cálculo relacional (incompleto)


O conjunto dos valores de x é Empregado
O conjunto dos valores de y é EscalaDePagamento

{x.Nome | existe y(x.Cargo = y.Cargo e y.EscalaDePagamento < “15,00”)}


54 Guia de Estudos Online

Visão Ger al da Seção 5. 4

Uma função (aplicação) de um conjunto S (o domínio) em um conjunto T (o contradomí-


nio) é um subconjunto de S 3 T tal que cada elemento de S tem que aparecer exatamente
uma vez como primeiro elemento de um par ordenado. Em outras palavras, uma função f
associa a cada elemento s de S um elemento de T, chamado de imagem de s sob f e denotado
por f(s). (Como subconjunto de S 3 T, uma função é uma relação binária de S em T com
algumas restrições.)
O conjunto das imagens de todos os elementos em S é um subconjunto de T; se esse
conjunto for igual a T, a função é dita sobrejetora. Pela definição de função, cada ele-
mento s em S só pode ter uma imagem f (s). Mas elementos diferentes de S podem ter a
mesma imagem. Se isso NÃO acontece, a função é dita injetora ou um para um. Uma
função que é, ao mesmo tempo, injetora e sobrejetora é uma bijeção. Toda bijeção tem
uma função inversa que vai no sentido oposto — de T em S — levando f (s) de volta
em s. Uma bijeção de um conjunto nele mesmo é chamada de função permutação. Tais
funções podem ser escritas usando-se a notação em ciclos; por exemplo, no conjunto
S = {1, 2, 3} a função permutação f = (1, 3) é a função que leva 1 em 3, 3 em 1 e 2 em 2
(porque não aparece).
Dadas uma função f de S em T e uma função g de T em U, a função composta g ∘ f,
que leva S em U, é definida por (g ∘ f )(s) = g( f (s)), ou seja, dado s em S, aplica-se primeiro
f em s e depois se aplica g no resultado.

Amostras de Solução de Problemas


• Problema 1 — Testar se uma função dada é injetora ou sobrejetora.
• Problema 2 — Escrever permutações em um conjunto usando a notação de ciclos.

Testar se uma Função Dada é Injetora ou Sobrejetora


Problema:
Dada a função a seguir, decida se ela é injetora ou sobrejetora.

f: 1 1
f (x): x + 1

Solução:
Aplique o teste padrão para cada propriedade.
Mas, primeiro, compreenda a função.

f (0) = 1
f (1) = 2
f (2) = 3

Visualize a função.

0 1 2 3 4 5 6

0 1 2 3 4 5 6

Não é sobrejetora
Guia de Estudos Online 55

0 1 2 3 4 5 6

0 1 2 3 4 5 6

É injetora

Para provar que não é sobrejetora, mostre que 0 é diferente de f (x) para todo x em 1.

Demonstração de que f não é sobrejetora.

f (x) = 0 para algum x > 1 hipótese


x + 1 = 0 definição de f (x)
x = -1 álgebra

Contradição! -1 R 1.

Demonstração de que f é injetora.


Suponha que f (s1) = f (s2) para s1, s2 > 1. Então
s1 + 1 = s2 + 1 definição de f
s1 = s2 álgebra
f é injetora

Escrever Permutações em um Conjunto Usando a Notação de Ciclos


Problema:
Dadas as funções a seguir em S = {1, 2, 3, 4, 5}, escreva suas composições em notação de ciclos.

f = (4, 2, 3, 1)
g = (5, 2, 1, 3, 4)

Solução:
Determine o que f ∘ g e g ∘ f fazem com cada elemento do domínio.

( f ∘ g)(x) = f ( g(x))
f ∘ g = (4, 2, 3, 1) ∘ (5, 2, 1, 3, 4)

1 3

3 1

logo 1 1

f ∘ g = (4, 2, 3, 1) ∘ (5, 2, 1, 3, 4)

2 1

1 4

logo 2 4

f ∘ g = (2, 4 ...
56 Guia de Estudos Online

Visão Ger al da Seção 5. 5

Ordem de grandeza é uma expressão geral para a “taxa de crescimento” de uma função.
Funções que têm a mesma ordem de grandeza são funções que crescem a taxas aproxima-
damente equivalentes quando seus argumentos ficam cada vez maiores. Usando o conceito
de ordem de grandeza, podemos classificar o trabalho executado por diversos algoritmos em
ordens de grandeza diferentes. Coeficientes constantes não afetam a ordem de grandeza, de
modo que podemos dizer que f (x) = 4x2 e g(x) = 15x2 têm a mesma ordem de grandeza; ambas
têm a mesma ordem de grandeza que x2. Isso poderia ser escrito como

f = Q(g) = Q(x2)

Em análise de algoritmos, uma vez identificada a unidade (ou as unidades) de trabalho,


tentamos encontrar uma expressão para a quantidade de unidades de trabalho executadas
pelo algoritmo em função do tamanho da entrada. Em vez de uma função exata, muitas ve-
zes consideramos apenas por uma expressão da ordem de grandeza, como f(n) = Q(log n) ou
f(n) = Q(n2). Se pudermos expressar o trabalho executado como uma relação de recorrência
do tipo dividir para conquistar com determinada forma, o “Teorema Mestre” fornece um
modo rápido (e precipitado) de obter a ordem de grandeza da solução sem resolver a relação
de recorrência.

Amostra de Solução de Problema


• Problema 1 — Usando o Teorema Mestre para encontrar a ordem de grandeza da
solução de algumas relações de recorrência do tipo dividir para conquistar.

Usando o Teorema Mestre para Encontrar a Ordem de Grandeza da


Solução de Algumas Relações de Recorrência do Tipo Dividir para
Conquistar
Problema:
Dada a relação de recorrência

26 + n2 para ≥ 2

use o Teorema Mestre para determinar a ordem de grandeza da solução.

Solução:
Lembre-se do Teorema Mestre, verifique que essa relação de recorrência é da forma neces-
sária para aplicar o Teorema Mestre e faça os cálculos necessários.

Teorema Mestre
Considere a relação de recorrência
1 >0

=a + nc para ≥
b
em que n = bm, a e b são inteiros, a ≥ 1, b > 1 e c é um número real não negativo. Então

1. se a < bc S(n) = Q(nc)


2. se a = bc S(n) = Q(nc log n)
3. se a > bc S(n) = Q(nlogba)
Guia de Estudos Online 57

Teorema Mestre

a = 6, b = 2, c = 2

6 > 22

1. se a < bc S(n) = Q(nc)


2. se a = bc S(n) = Q(nc log n)
3. se a > bc S(n) = Q(nlogba)

Teorema Mestre

a = 6, b = 2, c = 2

Como a > bc, a solução é

S(n) = Q(nlogba) = Q(nlog26)

S(n) = Q((nlog26) ~ Q(n2,58)

Visão Ger al da Seção 5.6

Dado um inteiro positivo n, a função módulo n opera em qualquer inteiro x da seguinte ma-
neira: divida x por n e escreva o resultado com um resto positivo.

x = qn + r, 0 ≤ r < n

O resto é x módulo n, abreviado como x mod n. Por exemplo, 17 mod 6 = 5, já que


17 = 2(6) + 5. A função módulo n tem um número surpreendente de aplicações para uma
função tão simples.
Um modo de armazenar e recuperar valores inteiros é por “dispersão” dos valores
usando uma função módulo n, em que n é o tamanho da tabela de dispersão (array) na
qual os valores serão armazenados. O resultado da dispersão de um valor a ser armazenado
será um índice da tabela. Valores diferentes podem ser levados ao mesmo índice, causando
uma colisão. Suponha que x1 mod n = p e que x1 está armazenado na tabela de dispersão no
índice p. Mais tarde x2 deve ser armazenado na tabela de dispersão, mas x2 mod n também
é igual a p. Para resolver a colisão, pode-se procurar linearmente pelo próximo lugar vazio
na tabela de dispersão, em que x2 será armazenado, ou x2 pode ser adicionado a uma lista
encadeada que já contém x1 e está armazenada no índice p. Ao se buscar um valor dado x,
procura-se no índice apropriado da tabela de dispersão. Se o valor não for encontrado lá,
será necessário seguir a pista dos possíveis locais em potencial determinados pelo esquema
de colisão, até encontrar x ou se determinar que x não está na tabela de dispersão.
A função módulo também é usada em diversos esquemas de criptografia, desde o có-
digo histórico simples César até esquemas modernos como DES (do inglês Data Encryp-
tion Standard, que significa Padrão de Encriptação de Dados), AES (do inglês Advanced
Encryption Standard, que significa Padrão de Encriptação Avançado) e RSA para proteger
mensagens transmitidas eletronicamente. Também é comum o uso de uma função de dis-
persão criptográfica, muitas vezes envolvendo a função módulo, para proteger senhas de
usuários em sistemas computacionais.
A função módulo também é usada em muitos códigos diferentes de identificação, como
o ISBN encontrado nos livros e o código de barras UPC-A, encontrado em praticamente
todos os produtos alimentícios industrializados. Pode até ser usada para se criar desenhos
geométricos interessantes.
58 Guia de Estudos Online

Amostras de Solução de Problemas


• Problema 1 — Construa ou faça uma busca em uma tabela de dispersão que usa
encadeamento para a resolução de colisões.
• Problema 2 — Faça uma codificação e uma decodificação usando o algoritmo de
encriptação com chave pública RSA.

Construa ou Faça uma Busca em uma Tabela de Dispersão que Usa


Encadeamento para a Resolução de Colisões
Problema:
Construa uma tabela de dispersão de tamanho 7 usando a função de dispersão h(x) = x mod 7.
Use encadeamento para a resolução de colisões. Armazene os valores

21, 12, 15, 14, 26, 54

Depois de construir a tabela, descreva o que acontece se for feita uma busca pelos
números 26 e 8.

Solução:
Construa a tabela de dispersão aplicando a função de dispersão a cada valor e usando listas
encadeadas em cada índice. Todas as listas na tabela inicial estão vazias.

0 l

1 l

2 l

3 l

4 l

5 l

6 l

Construa a tabela de dispersão aplicando a função de dispersão a cada valor e usando


listas encadeadas em cada índice.

21 mod 7 = 0

0 21 l

1 l

2 l

3 l

4 l

5 l

6 l

Construa a tabela de dispersão aplicando a função de dispersão a cada valor e usando


listas encadeadas em cada índice.

12 mod 7 = 5

15 mod 7 = 1
Guia de Estudos Online 59

0 21 l

1 15 l

2 l

3 l

4 l

5 12 l

6 l

Construa a tabela de dispersão aplicando a função de dispersão a cada valor e usando


listas encadeadas em cada índice.

14 mod 7 = 0

0 14 21 l

1 15 l

2 l

3 l

4 l

5 12 l

6 l

Construa a tabela de dispersão aplicando a função de dispersão a cada valor e usando


listas encadeadas em cada índice.

26 mod 7 = 5

54 mod 7 = 5

0 14 21 l

1 15 l

2 l

3 l

4 l

5 54 26 12 l

6 l
60 Guia de Estudos Online

Procure 26 e 8 na tabela de dispersão.

26 mod 7 = 5

0 14 21 l

1 15 l

2 l
Não é igual,
3 l continue Sucesso

4 l

5 54 26 12 l

6 l

Procure 26 e 8 na tabela de dispersão.

8 mod 7 = 1

0 14 21 l

1 15 l

2 l

3 l
Não é igual —
4 l falha

5 54 26 12 l

6 l

Faça uma Codificação e uma Decodificação Usando o Algoritmo de


Encriptação com Chave Pública RSA
Problema:
Use a codificação/decodificação RSA com p = 7, q = 13. Escolha e = 11. Codifique T = 12
usando a chave pública (n, e), depois decodifique o resultado para recuperar o 12.

Solução:
Aplique os passos do algoritmo RSA.

Solução:
Eis os passos iniciais e as condições.

7 e 13 são primos
n = p*q = 7*13 = 91
j(n) = ( p 2 1) * (q 2 1) = 6*12 = 72
mdc(e, j(n)) = mdc (11, 72) = 1
0<T<n

e = 11, j(n) = 72
Guia de Estudos Online 61

Use o algoritmo de Euclides para encontrar d e f tais que 1 = d*e + f *j(n)

72 = 6*11 + 6 ou 6 = 72 2 6*11
11 = 1*6 + 5 5 = 11 2 1*6
6 = 1*5 + 1 1 = 6 2 1*5
5 = 5*1 + 0

e = 11, j(n) = 72. Encontre d e f tais que 1 = d*e + f *j(n). Pelo algoritmo de Euclides,

6 = 72 2 6*11
5 = 11 21*6
1 = 6 21*5

Usando essas equações de baixo para cima, resolva para 1 como combinação linear de 11 e 72.

1 = 6 2 1*5
= 6 2 1[11 2 1*6] = 2*6 2 1*11
= 2*[72 2 6*11] 2 1*11 = 2*72 2 13*11 = 213*11 + 2*72
1 = 213*11 + 2*72

Manipule a combinação linear para obter um valor para d, 1 < d < j(n).

e = 11, j(n) = 72

1 = 213*11 + 2*72
= 213*11 + 11*72 + 2*72 2 11*72
= 59*11 2 9*72

d = 59

Codifique a mensagem T.

e = 11, n = 91, T = 12

A mensagem codificada é T e mod n = 1211 mod 91

1211 mod 91 = (124)2*123 mod 91


= (79)2*90 mod 91
= 53*90 mod 91
= 38

Decodifique a mensagem codificada 38 para recuperar T.


d = 59, n = 91, (T = 12), T codificado = 38

3859 mod 91 = (384)7*(384)7*383 mod 91


= (53)7*(53)7*90 mod 91
= (533)2*(533)2*532*90 mod 91
= 12*12*12 = 12 = T
62 Guia de Estudos Online

Visão Ger al da Seção 5.7

Uma matriz é um arranjo retangular de valores. Matrizes de mesmo tamanho podem ser
somadas por meio da soma de seus elementos correspondentes. Se A e B forem matrizes
n 3 m, então C = A + B será a matriz n 3 m dada por

cij = aij + bij

Para encontrar o produto matricial A . B, o número de colunas de A tem que ser igual
ao número de linhas de B. Assim, se A for n 3 m e B for m 3 p, o produto C = A . B será
a matriz n 3 p definida por

m
cij== aikbkj−
k=
=1

Se A e B forem matrizes booleanas, é preciso haver a mesma compatibilidade de tama-


nhos para se calcular o produto booleano C = A 3 B. Os elementos do produto booleano
são dados por
m
cij = (aik bkj)
k =1

em que denota a operação booleana E e   denota a operação booleana OU.

Amostras de Solução de Problemas


• Problema 1 — Multiplicando matrizes.
• Problema 2 — Efetuando multiplicação booleana.

Multiplicando Matrizes
Problema:
Dadas as matrizes


= =

encontre A . B

Solução:
Siga as regras para a multiplicação de matrizes.
A é 2 3 3, B é 3 3 2. O resultado será uma matriz 2 3 2.

Para a primeira linha, a primeira coluna é:




=

(4 3 2) + (3 3 4) + (22 3 0) = 8 + 12 + 0 = 20

(4 3 (21)) + (3 3 3) + (22 3 3) = 24 + 9 + (26) = 21


Guia de Estudos Online 63

Para a segunda linha, a primeira coluna é:



− −
=

(1 3 2) + (3 3 4) + (5 3 0) = 2 + 12 + 0 = 14

(1 3 (21)) + (3 3 3) + (5 3 3) = 21 + 9 + 15 = 23

Efetuando Multiplicação Booleana


Problema:
Dadas as matrizes

= =

encontre A 3 B

Solução:
Siga as regras para a multiplicação booleana de matrizes.
A é 2 3 3, B é 3 3 3. O resultado será uma matriz 2 3 3.

3 =

(0 1)   (1 0)   (1 1) = 0   0   1 = 1

3 =

(0 1)   (1 1)   (1 1) = 0   1   1 = 1

3 =

(0 0)   (1 1)   (1 1) = 0   1   1 = 1

3 =
Capítulo

Grafos e Árvores 6
Grafos são convenientes para visualizar certos tipos de informação, e muitas coisas bastante
úteis podem ser modeladas como grafos (redes de computadores, sistemas de comutação
telefônica e fluxo de informação em uma organização, para citar algumas). Árvores são ti-
pos especiais de grafos usadas, muitas vezes, para representar relações entre itens de dados.
A Seção 6.1 introduz um monte de terminologia sobre grafos. Define, também, o que
significa dois grafos serem isomorfos. Isomorfismo é um tópico que encontraremos nova-
mente; duas estruturas são isomorfas se uma é a imagem espelhada da outra, ou seja, as
duas se comportam da mesma forma sob um esquema apropriado de mudanças de nome.
Grafos isomorfos são nosso primeiro encontro com esse conceito. Grafos podem repre-
sentar visualmente itens (os nós do grafo) que têm determinadas relações (as arestas do
grafo). Dado um grafo, precisamos de um modo de armazenar suas informações sobre nós
e arestas em um computador, de modo que sua representação visual possa ser recriada mais
tarde. As escolhas usuais são as representações usando a matriz de adjacência ou a lista de
adjacência.
A Seção 6.2 apresenta a terminologia de árvores, representação para árvores binárias e
maneiras sistemáticas de “visitar” cada nó em uma árvore.
Árvores de decisão, que foram usadas no Capítulo 4 para resolver alguns problemas de
contagem, são usadas na Seção 6.3 para representar as ações de algoritmos. A análise de
árvores de decisão pode fornecer uma cota inferior para o trabalho necessário feito por um
algoritmo que usa comparação para procurar ou ordenar elementos em uma lista.
O algoritmo de codificação de Huffman, na Seção 6.4, usa árvores binárias para en-
contrar esquemas de codificação binária com comprimento variável para caracteres em um
arquivo. Esse esquema pode resultar em compressão significativa de dados, mas requer
uma análise do conteúdo do arquivo para ser aplicado.

Visão Ger al da Seção 6 .1

Certifique-se de que você compreendeu o significado de cada um dos termos a seguir sobre
grafos:

• nó (vértice)
• aresta (arco)
• nós adjacentes
• laço
• arestas paralelas
• grafo simples
• grau de um nó
• grafo completo

64
Guia de Estudos Online 65

• caminho
• comprimento de um caminho
• grafo conexo
• ciclo
• grafo acíclico

e sobre grafos direcionados:

• ponto inicial
• ponto final
• caminho
• nó acessível

Dois grafos G e H serão ditos isomorfos se existirem uma bijeção do conjunto de nós
de G no conjunto de nós de H e outra bijeção do conjunto de arestas de G no conjunto de
arestas de H tais que arcos correspondentes ligam pontos correspondentes. Se o grafo for
simples, então basta uma bijeção entre os nós, já que existe, no máximo, um arco entre dois
nós, de modo que a bijeção entre as arestas fica determinada. A bijeção entre os nós é um
isomorfismo.
Grafos isomorfos são estruturalmente idênticos, embora suas aparências físicas pos-
sam ser diferentes. Por exemplo, os dois grafos a seguir são isomorfos.

O isomorfismo está ilustrado a seguir. Note que nós adjacentes são levados em nós
adjacentes.

Nesse caso, é fácil ver que os grafos são estruturalmente idênticos: se o grafo à esquer-
da for “aberto” e colocado em linha reta, vai ficar igualzinho ao grafo à direita.
Muitas vezes pensamos em um grafo como uma representação visual de dados (nos
nós) e relações entre dados (quais vértices são adjacentes). Hoje em dia poderíamos arma-
zenar um arquivo de imagem, preservando, assim, uma representação visual do grafo. Mas
aí não teríamos como manipular os dados contidos nos nós. Além disso, a definição de um
grafo não inclui sua representação visual e podem ser feitas figuras diferentes para o mes-
mo grafo. De modo que não é a representação visual que é importante, e sim os dados e suas
relações de adjacência. Podemos armazenar essa informação em uma forma

a. mais compacta que um arquivo de imagem (o arquivo usa menos espaço)


b. que permita a manipulação de dados, ou seja, que permita que algoritmos operem
nos dados
c. que contenha toda a informação necessária para recriar alguma representação vi-
sual do grafo, se desejado
66 Guia de Estudos Online

As duas representações de grafos mais comuns em computadores são a matriz de adja-


cência e a lista de adjacência.
Se um grafo tiver n nós, numere esses nós (arbitrariamente) de n1 até nn. A matriz de
adjacência do grafo é uma matriz n 3 n cujo elemento i, j é igual ao número de arestas
entre os nós ni e nj. (Em um grafo direcionado, o elemento i, j é igual ao número de arestas
do nó ni para o nó nj.) Em um grafo não direcionado, a matriz de adjacência é simétrica. Se
o grafo não tiver arcos paralelos, a matriz de adjacência será uma matriz booleana.
Um grafo também pode ser representado por uma lista de adjacência. Isso é um array
de listas encadeadas, uma para cada nó, de modo que a lista de adjacência do nó ni contém
todos os nós nj para os quais existe uma aresta entre ni e nj (grafos não direcionados) ou
uma aresta de ni para nj (grafos direcionados). (Para aqueles que não conhecem as listas enca-
deadas, cada elemento na lista tem duas partes, o dado no nó e um ponteiro para o próximo
elemento na lista. Um ponteiro especial nulo termina a lista.)
As duas representações têm vantagens e desvantagens. Se o grafo tem poucas arestas
em relação ao número de nós, então a matriz de adjacência, que necessita de n2 locais de
armazenagem, conterá muitos zeros. Nesse caso, a representação como lista encadeada,
mesmo levando em consideração o espaço necessário para armazenar um ponteiro, pro-
vavelmente será mais eficiente. Mas se houver uma grande quantidade de arcos, a lista
encadeada será longa e essa representação pode precisar de tanto espaço quanto a matriz
de adjacência, ou até de mais espaço. Outro fator na escolha da representação de um grafo
está relacionado com que tipos de operações você vai querer fazer nos dados do grafo. Por
exemplo, se você quiser saber todos os nós adjacentes ao nó ni, então será provavelmente
mais rápido percorrer a lista de adjacência do nó ni do que percorrer toda a linha i da matriz
de adjacência. Mas se você só quiser saber se algum nó particular nj é adjacente ao nó ni,
então a matriz de adjacência fornece a resposta na hora (basta olhar o elemento i, j), já que
é uma estrutura de acesso aleatório. Para decidir sobre essa questão em uma representação
com listas encadeadas, pode ser que você tenha que percorrer toda a lista em ni.

Amostras de Solução de Problemas


• Problema 1 — Prove que dois grafos são isomorfos ou prove que não são.
• Problema 2 — Construa matrizes de adjacência para grafos e grafos direcionados.
• Problema 3 — Construa listas de adjacência para grafos e grafos direcionados.

Prove que Dois Grafos são Isomorfos ou Prove que Não São
Problema:
Prove que os dois grafos a seguir são isomorfos ou explique por que não são.

Solução:
Examine as propriedades dos dois grafos. Procure coisas que pode mostrar que não são
isomorfos.

Cada grafo tem 5 nós. Isso não mostra que não são isomorfos.
Cada grafo tem 6 arestas. Isso não mostra que não são isomorfos.
Ambos os grafos são simples.
Ambos os grafos são conexos.
Guia de Estudos Online 67

Ambos os grafos contêm ciclos. Isso não mostra que não são isomorfos.
Cada grafo contém três nós de grau 2.
Cada grafo contém dois nós de grau 3. Isso não mostra que não são isomorfos.

O grafo à direita contém dois nós adjacentes de grau 3.


O grafo à esquerda não contém nós adjacentes de grau 3.

Os grafos não podem ser isomorfos.

Construa Matrizes de Adjacência para Grafos e Grafos Direcionados


Problema:
Dado o grafo

1 2

3 4

construa sua matriz de adjacência.

Solução:
Construa uma matriz n 3 n e preencha os elementos com base na adjacência.
_ _ _ _
_ _ _ _
A=
_ _ _ _
_ _ _ _

0 _ _ _
_ _ _ _
A=
_ _ _ _
_ _ _ _

0 1 1 1
_ _ _ _
A=
_ _ _ _
_ _ _ _

0 1 1 1
A= 1 1 0 1
_ _ _ _
_ _ _ _

0 1 1 1
A= 1 1 0 1
1 0 0 1
_ _ _ _
68 Guia de Estudos Online

0 1 1 1
A= 1 1 0 1
1 0 0 1
1 1 1 0

A é booleana, simétrica, e tem apenas um elemento igual a 1 na diagonal principal.

Construa Listas de Adjacência para Grafos e Grafos Direcionados


Problema:
Dada a lista de adjacência a seguir, que representa um grafo direcionado, desenhe o grafo.

1 2 3 l

2 1 3 l

3 l

4 2 l

5 l

Solução:
Coloque a informação contida na lista de adjacência em forma visual.

2 3

2 3

2 3

2 3

4 5
Guia de Estudos Online 69

Visão Ger al da Seção 6 .2

Certifique-se de que você compreende o significado dos seguintes termos sobre árvores:

• raiz
• nó filho
• nó pai
• nó interno
• nó folha
• profundidade de um nó
• profundidade de uma árvore
• árvore binária
• árvore binária cheia

Árvores binárias são particularmente úteis em ciência da computação, e são usadas repre-
sentações especiais para árvores binárias de modo a capturar as propriedades de filhos esquer-
dos e filhos direitos. Novamente, são possíveis representações com arrays ou com ponteiros.
Algoritmos para percurso em uma árvore em ordem simétrica, em pré-ordem ou em
pós-ordem fornecem maneiras sistemáticas de visitar todos os nós na árvore.

Amostra de Solução de Problemas


• Problema 1 — Percorrer os nós de uma árvore em ordem simétrica.

Percorrer os Nós de uma árvore em Ordem Simétrica


Problema:
Escreva os nós da árvore a seguir usando percurso em ordem simétrica.
C

D E F

G H I

Solução:
Lembre-se das regras para o percurso em ordem simétrica.
Esquerda, Raiz, Direita
Considere a subárvore esquerda de a.
C

D E F

G H I

Considere a subárvore esquerda de b. Ela consiste em um único nó, e — visite-o.


Percurso: e, ...

D E F

G H I
70 Guia de Estudos Online

Solução:
Lembre-se das regras para o percurso em ordem simétrica.
Esquerda, Raiz, Direita
Agora visite a raiz b.
Percurso: e, b, ...
C

D E F

G H I

A seguir, as subárvores de b que restam, que são os nós f e g.


Percurso: e, b, f, g­, ...

D E F

G H I

Acabou a subárvore esquerda de a; visite a raiz, a.


Percurso: e, b, f, g, a, ...

D E F

G H I

Visão Ger al da Seção 6 .3

Árvores de decisão são representações visuais de ações e suas consequências. Em particu-


lar, uma árvore de decisão pode representar as atividades de um algoritmo ao processar um
conjunto de dados. Cada nó interno da árvore de decisão representa uma ação do algoritmo,
as arestas para os filhos de um nó representam os resultados possíveis dessa ação e os filhos
internos de um nó representam as próximas ações a serem executadas com base nesses re-
sultados. As folhas representam conclusões baseadas no caminho de resultados da raiz até
a folha.
Para um algoritmo de busca, cuja operação fundamental é a comparação de um ele-
mento alvo com uma lista de elementos, cada nó interno de sua árvore de decisão repre-
senta uma dessas comparações. Os resultados de tal comparação mostram as relações do
elemento alvo com os elementos da lista (relações como igualdade, menor do que etc.).
Cada resultado leva a um filho, que pode representar outra comparação, ou a uma folha, que
chega a alguma conclusão sobre o elemento alvo e suas relações com os elementos da lista.
Para um algoritmo de ordenação, cuja operação fundamental é a comparação de dois
elementos da lista, cada nó interno de sua árvore de decisão representa uma dessas compa-
rações. Novamente os resultados são igualdade, menor do que etc., e cada resultado leva a
um filho, que pode representar outra comparação, ou a uma folha. As folhas representam as
diversas possibilidades de ordenação dos elementos na lista.
Guia de Estudos Online 71

Usando propriedades de árvores, podemos estabelecer cotas inferiores para busca e


ordenação, pelo menos para os algoritmos cuja operação fundamental é a comparação
(de um elemento alvo com os elementos da lista ou de dois elementos na lista). Em um
algoritmo de busca, o alvo precisa ser comparado a todos os elementos da lista, o que
resulta em um número mínimo para os nós internos na árvore de decisão e, portanto, uma
profundidade mínima. Em consequência, qualquer algoritmo de busca tem que fazer pelo
menos log n + 1 comparações no pior caso. O algoritmo de busca binária é ótimo, pois não
precisa de mais trabalho do que essa cota inferior. Analogamente, uma árvore de decisão
para um algoritmo de ordenação tem que ter um número mínimo de folhas para representar
todas as ordenações possíveis, o que, novamente, resulta em uma árvore de profundidade
mínima. Em consequência, qualquer algoritmo de ordenação tem que fazer pelo menos
log n! comparações no pior caso.
Árvores de decisão são, simplesmente, representações visuais das ações de um al-
goritmo. No entanto, uma árvore binária de busca é uma estrutura de dados de fato em
que cada nó é maior do que todos os valores na sua subárvore à esquerda e menor do que
todos os valores na sua subárvore à direita. Uma árvore binária de busca começa no nó
raiz, compara um elemento alvo com um elemento em um nó e a) encontra o alvo, ou b)
vai para a subárvore à esquerda se o alvo for menor do que o nó, ou c) vai para a subár-
vore à direita se o alvo for maior do que o nó. O mesmo conjunto de dados pode produzir
muitas árvores de busca binárias diferentes, dependendo da ordem em que os elementos
são colocados na árvore.

Amostras de Solução de Problemas


• Problema 1 — Desenhando uma árvore de decisão para uma busca binária em uma
lista com n elementos.
• Problema 2 — Criando uma árvore binária de busca.

Desenhando uma árvore de Decisão para uma Busca Binária em


uma Lista com n Elementos
Problema:
Desenhe uma árvore de decisão para uma busca binária em uma lista ordenada com seis
elementos.

Solução:
Identifique a comparação que ocorre em cada nó.
A lista consiste em

L[1], L[2], L[3], L[4], L[5], L[6]

O elemento médio é L[3]; a raiz da árvore de decisão representa essa comparação.

x: L[3]

x: L[3]

< >

x: L[1] x: L[5]
72 Guia de Estudos Online

[/=?

[/=? [/=?

 

[/=? [/=? [/=? [/=?

[/=?

[/=? [/=?

 

[/=? [/=? [/=? [/=?

  

[ /=?
/=?[/=? /=?[/=? /=?[/=?

/=?[/=? /=?[/=?

[/=?

[/=? [/=?

 
SURIXQGLGDGH 

[/=? [/=? [/=? [/=?

  

[ /=?
/=?[/=? /=?[/=? /=?[/=?

/=?[/=? /=?[/=?

profundidade = 1 + log n = 1 + log 6 = 1 + 2.++ = 1 + 2 = 3


Guia de Estudos Online 73

Criando uma árvore binária de busca


Problema:
Construa uma árvore binária de busca usando os dados 54, 78, 23, 62, 15, 99.

Solução:
Leia os elementos da esquerda para a direita e insira cada um deles na árvore binária de
busca.

54 é inserido como raiz.

54

78 > 54

54

78

23 < 54

54

23 78

62 > 54, 62 < 78



 


74 Guia de Estudos Online

15 < 54, 15 < 23

99 > 54, 99 > 78



 

  

Procurando por 70:



 

  

""""
70 não está na árvore.

Visão Ger al da Seção 6 . 4

Um esquema de codificação usual para representar caracteres em forma binária é ASCII (do
inglês American Standard Code for Information Interchange, que significa Código Ameri-
cano Padrão para Troca de Informação). Ele associa um único código (palavra) binário de
8 bits a cada caractere. O padrão novo Unicode permite códigos de comprimento fixo de 8,
16 ou 32 bits para cada caractere. Usando códigos de comprimento fixo de n bits, o número
de bits necessário para armazenar um arquivo é, simplesmente, o produto do número de
caracteres no arquivo por n.
Um esquema de codificação de comprimento variável poderia economizar arma-
zenamento atribuindo cadeias binárias de comprimento menor aos caracteres usados
com mais frequência e de comprimento maior aos caracteres pouco usados. Para tal
esquema, seria necessário conhecer o conteúdo do arquivo a ser armazenado, a saber,
a frequência de ocorrência de cada caractere. Além disso, há o custo computacional
adicional para determinar que código usar para cada caractere. Logo esses esquemas
de compressão ou compactação de dados só são úteis para arquivos grandes que não
devem ser modificados.
Guia de Estudos Online 75

O código de qualquer caractere não deve ser o prefixo de um código para algum
caractere diferente. Isso evita falsos começos e voltas para trás ao decodificar uma ca-
deia binária. Tais códigos de prefixo podem ser representados como árvores binárias,
tendo os caracteres como folhas. Começar na raiz e percorrer o caminho até uma folha
dada revela o código binário para aquela folha, usando uma convenção de que todo ramo
esquerdo representa 0 e todo ramo direito representa 1. A profundidade da folha será,
então, o número de bits em seu código binário. Logo, o número total de bits no arquivo
será proporcional a

= −
(d(i)f(i))
= as
todas
folhas i

em que d(i) é a profundidade da folha i na árvore e f (i) é o percentual da frequência de ocor-


rência da folha i no arquivo. O esquema de codificação de Huffman cria uma árvore binária
codificadora que minimiza essa expressão.
O primeiro passo é determinar a frequência de ocorrência de cada caractere distinto
no arquivo. O algoritmo de codificação de Huffman supõe que essas frequências foram
colocadas em uma lista ordenada por frequência. O algoritmo considera, repetidamente, as
duas menores frequências da lista, remove-as da lista e as transforma em filhos esquerdo e
direito de um nó novo cuja frequência é a soma delas duas. O nó novo com a nova frequên-
cia é inserido em ordem na lista. Quando a lista estiver reduzida a um único nó, esse nó é a
raiz da árvore binária codificadora.

Amostra de Solução de Problemas


• Problema 1 — Encontrando códigos de Huffman dado um conjunto de caracteres
com suas frequências.

Encontrando Códigos de Huffman Dado um Conjunto de Caracteres


com Suas Frequências
Problema:
Encontre os códigos de Huffman, dados os seguintes caracteres com suas frequências

Caracteres r e b s m

Frequência 13 32 17 22 16

Solução:
Construa uma árvore de Huffman.

Ordene as frequências

13 16 17 22 32

Some as duas frequências menores

Insira 29 na lista como pai de 13 e de 16.

17 22 29 32

13 16
76 Guia de Estudos Online

Some as duas frequências menores

39

17 22 29 32

13 16

Insira 39 na lista como pai de 17 e de 22.


29 32 39

13 16 17 22

Some as duas frequências menores


61

29 32 39

13 16 17 22

Insira 61 na lista como pai de 29 e de 32.


39 61

17 22 29 32

13 16
Some as duas frequências menores

100

39 61

17 22 29 32

13 16

Insira 100 na lista como pai de 39 e de 61.


100

39 61

17 22 29 32

13 16

Atribua caracteres a folhas.


100

39 61

17 22 29 32
b s e
13 16
r m
Capítulo

Algoritmos para Grafos 7


O Capítulo 7 discute alguns algoritmos para grafos bastante conhecidos. A Seção 7.1 con-
sidera grafos direcionados e suas representações como matrizes booleanas, além de desen-
volver diversos algoritmos para decidir se um nó é acessível de outro nó; certamente esse é
um problema com consequências práticas para, por exemplo, uma rede de computadores em
que você quer que todos os nós sejam acessíveis de todos os outros.
A Seção 7.2 considera dois problemas: como determinar se um grafo contém um ca-
minho de Euler (um caminho que usa cada arco do grafo exatamente uma vez) e como
determinar se um grafo tem um circuito hamiltoniano (um ciclo contendo todos os nós do
grafo). Embora esses dois problemas pareçam semelhantes, existe um algoritmo relativa-
mente eficiente para responder o problema do caminho de Euler, mas nenhum algoritmo
razoável foi encontrado para o problema do circuito hamiltoniano.
Os algoritmos na Seção 7.3 resolvem os problemas de encontrar um caminho mínimo entre
dois nós em um grafo e de encontrar uma árvore geradora de peso mínimo em um grafo. No-
vamente, esses são dois problemas importantes em qualquer rede de comunicação ou de trans-
porte. Uma rede de computadores em uma área abrangente que encaminha pacotes de e-mails
quer encontrar o caminho mais curto para mandar uma mensagem, enquanto uma companhia de
transporte (ou mapas Google!) quer encontrar o caminho mais curto para determinado destino.
Os algoritmos de percursos em grafos na Seção 7.4 fornecem maneiras organizadas de
visitar todos os nós em um grafo, como os algoritmos de percurso em grafos que são árvo-
res. A busca em profundidade é implementada melhor por uma pilha, enquanto a busca
em nível usa uma fila. Outro algoritmo importante, discutido na Seção 7.5, localiza pontos
de articulação, nós em um grafo simples conexo cuja remoção (ou seja, falha) transforma-
ria o grafo em um grafo desconexo.

Visão Ger al da Seção 7.1

Já sabemos que um grafo direcionado sem arcos paralelos tem uma representação na forma
de uma matriz booleana de adjacência. Podemos também definir uma relação binária no
conjunto de nós do grafo: o nó i está relacionado com o nó j se existe uma aresta de i para j.
De qualquer uma dessas três formas — o grafo, a matriz booleana ou os pares ordenados na
relação de adjacência — pode-se encontrar as outras duas representações.
A acessibilidade em um grafo direcionado é uma questão importante. Se você é um nó
em uma rede de computadores, por exemplo, você quer ser acessível de outros computado-
res ou nunca vai receber seus e-mails (o que na verdade pode ser interessante!). Embora seja
fácil identificar nós não acessíveis em uma representação visual de um grafo direcionado
pequeno, isso não resolve o problema para grafos direcionados grandes. Precisamos de uma
solução algorítmica para o problema de acessibilidade.
Dois algoritmos são desenvolvidos na Seção 7.1, ambos envolvendo manipulação de
matrizes.

77
78 Guia de Estudos Online

A abordagem 1 começa com a matriz de adjacência A para um grafo direcionado sem


arcos paralelos. A é uma matriz booleana que terá 1 na posição i, j se existir uma aresta do
nó i para o nó j e terá 0 nessa posição caso contrário. Logo a matriz A fornece a acessibili-
dade do nó j a partir do nó i por um caminho de comprimento 1. Podemos efetuar a multi-
plicação booleana de matrizes em A para obter a matriz booleana A(2). Pode-se mostrar que
o elemento i, j de A(2) fornece a acessibilidade do nó j a partir do nó i por um caminho de
comprimento 2. A(3) fornece informação sobre acessibilidade por caminhos de comprimen-
to 3 e assim por diante. O maior caminho em um grafo com n nós que não repete nó algum,
exceto, talvez, as extremidades, tem comprimento n. Isso significa que, se houver algum
caminho de i para j, o elemento i, j em pelo menos uma das matrizes A, A(2), A(3), ..., A(n)
terá que ser 1. Mas então o elemento i, j da matriz R será 1, em que

R=A A(2) A(3) ... A(n)

R é chamada a matriz de acessibilidade do grafo. A multiplicação booleana de


duas matrizes booleanas n 3 n requer Q(n3) operações booleanas E, OU. Como essa
multiplicação tem que ser feita n – 1 vezes para encontrar R, o trabalho total envolvido
é Q(n 4).
A matriz de acessibilidade R também define uma relação binária nos vértices do gra-
fo, ou seja, o nó i estará relacionado com o nó j se o elemento i, j de R for igual a 1 (o
que significa que j é acessível de i). Essa relação binária é o fecho transitivo da relação
de adjacência do grafo original. Isso fornece um modo sistemático de se calcular o fecho
transitivo, em oposição ao método “vai colocando mais pares ordenados até funcionar”
usado no Capítulo 5.
A abordagem 2 é usar o algoritmo de Warshall. Ele também começa com a matriz
de adjacência A = M0 e termina com a matriz de acessibilidade R = Mn, mas as matrizes
intermediárias são diferentes. O algoritmo aparece nesta seção e é fácil ver, da descrição do
pseudocódigo, que o algoritmo é Q(n3), uma melhora de uma ordem de grandeza em relação
ao algoritmo anterior. No entanto, é bem difícil compreender como implementar o algoritmo
dessa descrição. A tabela a seguir fornece uma abordagem passo a passo para calcular os
elementos de Mk+1 a partir da matriz Mk.

1. Considere a coluna k + 1 em Mk
2. Para cada linha com 0 nessa coluna, copie essa linha e coloque em Mk + 1.
3. Para cada linha com 1 nessa coluna, faça a operação booleana ou dessa linha
com a linha k + 1 e coloque o resultado na linha correspondente em Mk + 1.

Amostra de Solução de Problemas


• Problema 1 — Calcule a matriz de acessibilidade R para um grafo direcionado G
usando o algoritmo de Warshall.

Calcule a Matriz de Acessibilidade R para um Grafo Direcionado G


Usando o Algoritmo de Warshall
Problema:
Dado o grafo direcionado descrito pela matriz de adjacência

0 1 0 1
A= 0 0 1 0
0 0 0 1
0 0 0 0

encontre a matriz de acessibilidade R usando o algoritmo de Warshall.


Guia de Estudos Online 79

Solução:
Aplique os passos do algoritmo de Warshall para construir as matrizes M1, M2, M3 e M4 = R.

0 1 0 1
M0 = 0 0 1 0
0 0 0 1
0 0 0 0

0 1 0 1 0 1 0 1
M0 = 0 0 1 0 M1 = 0 0 1 0
0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0

0 1 0 1 0 1 0 1 2 2 2 2
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 1 0 1 0 1 0 1 1 1
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 1 0 1 0 1 0 1 1 1
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2
M3 = 2 2 2 2
0 0 0 1
0 0 0 0

0 1 0 1 0 1 0 1 0 1 1 1
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1
M3 = 0 0 1 1
0 0 0 1
0 0 0 0
80 Guia de Estudos Online

0 1 0 1 0 1 0 1 0 1 1 1
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0

0 1 1 1 0 1 1 1
M3 = 0 0 1 1 M4 = 0 0 1 1
0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0

0 1 0 1 0 1 0 1 0 1 1 1
M0 = 0 0 1 0 M1 = 0 0 1 0 M2 = 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 1 1 1
M3 = 0 0 1 1 M4 = R = 0 0 1 1
0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0

1 2

4 3

os nós 2, 3, 4 são acessíveis de 1


os nós 3 e 4 são acessíveis de 2
o nó 4 é acessível de 3

Visão Ger al da Seção 7.2

Um caminho de Euler em um grafo é um caminho que usa cada arco do grafo exatamente
uma vez. A determinação da existência ou não de um caminho de Euler é chamada, algumas
vezes, de “problema do inspetor de rodovias”. Exceto em alguns casos triviais, o grafo tem
que ser conexo para que exista um caminho de Euler, de modo que vamos supor que o grafo
é conexo.
A resposta sobre a existência de um caminho de Euler pode ser encontrada por meio
de uma abordagem de força bruta, traçando todos os caminhos possíveis no grafo, mas o
esforço e a manutenção dos registros necessários para tal abordagem são proibitivos para
um grafo de qualquer tamanho. Uma abordagem muito mais eficiente usa os graus dos nós
no grafo. O grau de um nó é o número de extremidades de arcos naquele nó. Classificamos
um nó como ímpar ou par com base em seu grau. Não é difícil provar que todo grafo tem
que ter um número par de nós ímpares. A tabela a seguir resume o problema de existência
de um caminho de Euler.
Guia de Estudos Online 81

Existe um caminho de Euler; ele pode começar em qualquer nó e


0 nó ímpar
vai terminar nesse mesmo nó.
Existe um caminho de Euler; ele começa em um dos nós ímpares e
2 nós ímpares
termina no outro.
Mais de 2 nós ímpares Não existe caminho de Euler.

O algoritmo para o caminho de Euler em um grafo conexo opera na matriz de adjacên-


cia A. Ele percorre cada linha da matriz, somando os elementos de cada linha para deter-
minar o grau do nó correspondente, mantendo um registro do número de nós ímpares. Se
o número de nós ímpares for maior do que 2, o algoritmo termina — não existe caminho.
No pior caso, esse algoritmo tem que examinar cada elemento na matriz de adjacência,
resultando em um algoritmo Q(n2).
O problema do circuito hamiltoniano consiste em descobrir se o grafo tem um ciclo que
visita todos os nós do grafo. Uma abordagem por tentativa e erro também pode ser usada,
mas — embora esse problema pareça ser semelhante ao do caminho de Euler — não foi
encontrado um algoritmo eficiente que o resolva, e existem razões para suspeitar de que
tal algoritmo não existe. Em um grafo com pesos, a busca de um ciclo de peso mínimo é
conhecida como o “problema do caixeiro-viajante”.

Amostra de Solução de Problemas


• Problema 1 — Determinando se existe um caminho de Euler em um grafo.

Determinando se Existe um Caminho de Euler em um Grafo


Problema:
Determine se existe um caminho de Euler no grafo

Solução:
Use o algoritmo CaminhoDeEuler
Numere os nós e construa a matriz de adjacência.

6 2

3
5 4

0 1 0 0 0 1
1 0 1 1 0 0
0 1 0 1 0 0
A=
0 1 1 0 1 1
0 0 0 1 0 1
1 0 0 1 1 0
82 Guia de Estudos Online

Some o número de elementos não nulos em cada linha da matriz. Determine se o grau é par
ou ímpar.

0 1 0 0 0 1 2 par
1 0 1 1 0 0 3 ímpar
0 1 0 1 0 0 2 par
A=  
0 1 1 0 1 1 4 par
0 0 0 1 0 1 2 par
1 0 0 1 1 0 3 ímpar

Totalize o número de nós ímpares.

0 1 0 0 0 1 2 par
1 0 1 1 0 0 3 ímpar
0 1 0 1 0 0 2 par
A=  
0 1 1 0 1 1 4 par
0 0 0 1 0 1 2 par
1 0 0 1 1 0 3 ímpar

Total: 2 nós ímpares, nós 2 e 6.

Comece no nó 2, termine no nó 6.
1

6 2

3
5 4

6 2

3
5 4

6 2

3
5 4

6 2

3
5 4
Guia de Estudos Online 83

Visão Ger al da Seção 7.3

Dados dois nós x e y em um grafo conexo simples com pesos, existe um caminho — talvez
mais de um — de x para y. O problema do caminho mínimo consiste em encontrar o cami-
nho de peso mínimo. Esse é um problema extremamente prático de roteamento para redes
de computadores, sistemas de comutação telefônica, rotas de caminhões etc.
Primeiro, modifique a matriz de adjacência A do grafo para que o elemento A[i, j] seja
o peso do arco de i para j, se existir; caso contrário, coloque o valor ∞ (na prática, ∞ é um
valor suficientemente grande para ser reconhecido como não representando arco algum).
O algoritmo de Dijkstra para resolver o problema do caminho mínimo usa um con-
junto IN de nós do grafo que contém, inicialmente, só o nó x. O conjunto IN vai aumentando
à medida que o algoritmo prossegue. Em qualquer ponto e para qualquer nó atualmente em
IN, o algoritmo conhece o caminho mais curto de x para z usando apenas nós pertencentes
a IN e conhece o nó em IN adjacente a z nesse caminho. Na figura a seguir, o caminho mais
curto de x para z usando só nós em IN passa pelo nó w, que é adjacente a z nesse caminho.

z
w
p
x
IN

Para expandir o conjunto IN, o nó que não está atualmente em IN e que corresponde ao
caminho mais curto é colocado em IN (vínculos são quebrados arbitrariamente). Quando é
acrescentado um nó novo em IN, todos os outros nós não pertencentes a IN são reavaliados
para ver se eles encurtam o caminho de x até esse novo nó. Na figura anterior, p é o nó fora
de IN que fornece o menor caminho a partir de x, de modo que é o próximo nó a ser incluído
em IN. Agora que p pertence a IN, z descobre um caminho passando por p que é mais curto
que o que passa por w (veja a figura a seguir). O nó z tem um caminho mais curto novo e
um nó novo adjacente nesse caminho.

z
w
p
x
IN

O algoritmo termina quando o nó y pertencer a IN.


O algoritmo de Dijkstra pertence a uma classe de algoritmos conhecidos como algo-
ritmos gulosos. No caso do algoritmo de Dijkstra, o nó fora de IN com o caminho mínimo
atual é o próximo nó a ser apanhado. Agir repetidamente desse modo “guloso” produz o
caminho mínimo.
O algoritmo de Prim, outro algoritmo guloso, constrói uma árvore geradora mínima
para um grafo, ou seja, uma árvore sem raiz que usa os arcos do grafo para ligar todos os
nós. No algoritmo de Prim há também um conjunto IN de nós, e, para qualquer nó z não
pertencente a IN, é conhecida a menor distância de z a qualquer nó em IN. IN é aumentado
adicionando-se o nó mais próximo e depois reajustando-se as distâncias dos nós que não
pertencem a IN.
84 Guia de Estudos Online

Amostras de Solução de Problemas


• Problema 1 — Usando o algoritmo de Dijkstra para encontrar o caminho mínimo
de um nó para outro em um grafo.
• Problema 2 — Usando o algoritmo de Prim para encontrar uma árvore geradora
mínima.

Usando o Algoritmo de Dijkstra para Encontrar o Caminho Mínimo


de um nó para outro em um Grafo
Problema:
Dado o grafo a seguir, encontre o caminho mínimo de x para y.

X 4 a 5 b

2
6 5 3 4 y
5

c 2 d

Solução:
Use o algoritmo de Dijkstra.

Construa a matriz de adjacência.


a b c d x y
a
b
c
d
x
y

a b c d x y
a ∞ 5 5 3 4 ∞
b
c
d
x
y

a b c d x y
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 ∞ ∞ 2 6 ∞
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞
Guia de Estudos Online 85

Inicialize IN, d e s.

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 2 6 a b c d x y
∞ ∞ ∞
d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 2 6 a b c d x y
∞ ∞ ∞
d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5
s x x x x - x
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞

Adicione o nó de distância mínima a IN.

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 2 6 a b c d x y
∞ ∞ ∞
d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5
s x x x x - x
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞ IN = {x, a}

Recalcule as distâncias e os nós anteriores.

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5 s x x x x - x
x 4 ∞ 6 ∞ ∞ ∞
y 5 IN = {x, a}
∞ 2 ∞ ∞ ∞
a b c d x y
d 4 9 6 ∞ 0 ∞
s x a x x - x
86 Guia de Estudos Online

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5 s x x x x - x
x 4 ∞ 6 ∞ ∞ ∞
y 5 IN = {x, a}
∞ 2 ∞ ∞ ∞
a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x

Adicione o nó de distância mínima a IN e faça os ajustes.

a b c d x y
IN = {x}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞
d 3 4 2 ∞ ∞ 5 s x x x x - x
x 4 ∞ 6 ∞ ∞ ∞
y 5 IN = {x, a}
∞ 2 ∞ ∞ ∞
a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x

IN = {x, a, c}

a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x

a b c d x y
IN = {x} IN = {x, a, c, d}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞ d 4 9 6 7 0 12
d 3 4 2 ∞ ∞ 5 s x x x x - x s x a x a - d
x 4 ∞ 6 ∞ ∞ ∞
y 5 IN = {x, a}
∞ 2 ∞ ∞ ∞
a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x

IN = {x, a, c}

a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x
Guia de Estudos Online 87

a b c d x y
IN = {x} IN = {x, a, c, d}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞ d 4 9 6 7 0 12
d 3 4 2 ∞ ∞ 5 s x x x x - x s x a x a - d
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞ IN = {x, a} IN = {x, a, c, d, b}
a b c d x y a b c d x y
d 4 9 6 7 0 ∞ d 4 9 6 7 0 11
s x a x a - x s x a x a - b

IN = {x, a, c}

a b c d x y
d 4 9 6 7 0 ∞
s x a x a - x

Adicione y a IN e encontre o caminho de distância mínima.

a b c d x y
IN = {x} IN = {x, a, c, d}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 4 ∞ 6 ∞ 0 ∞ d 4 9 6 7 0 12
d 3 4 2 ∞ ∞ 5 s x x x x - x s x a x a - d
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞ IN = {x, a} IN = {x, a, c, d, b}
a b c d x y a b c d x y
d 4 9 6 7 0 ∞ d 4 9 6 7 0 11
s x a x a - x s x a x a - b

IN = {x, a, c} IN = {x, a, c, d, b, y}
a b c d x y a b c d x y
d 4 9 6 7 0 ∞ d 4 9 6 7 0 11
s x a x a - x s x a x a - b

Comprimento do caminho de distância mínima para y = 11

Caminho = y, b, a, x ou x, a, b, y

Usando o Algoritmo de Prim para Encontrar uma árvore Geradora


Mínima
Problema:
Dado o grafo a seguir, encontre uma árvore geradora mínima.
88 Guia de Estudos Online

X 4 a 5 b

2
6 5 3 4 y
5

c 2 d

Solução:
Use o algoritmo de Prim.

Construa a matriz de adjacência.


a b c d x y
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 ∞ ∞ 2 6 ∞
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞

Escolha um nó arbitrário para IN e inicialize d e s.

a b c d x y
IN = {a}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2
c 5 2 6 a b c d x y
∞ ∞ ∞
d 0 5 5 3 4 ∞
d 3 4 2 ∞ ∞ 5
s a a a a a a
x 4 ∞ 6 ∞ ∞ ∞
y ∞ 2 ∞ 5 ∞ ∞

Traga o nó de distância mínima e recalcule.

a b c d x y
IN = {a}
a ∞ 5 5 3 4 ∞
b 5 ∞ ∞ 4 ∞ 2 a b c d x y
c 5 ∞ ∞ 2 6 ∞ d 0 5 5 3 4 ∞
d 3 4 2 ∞ ∞ 5 s a a a a a a
x 4 ∞ 6 ∞ ∞ ∞
y 5 IN = {a, d}
∞ 2 ∞ ∞ ∞
a b c d x y
d 0 4 2 3 4 5
s a d d a a d
Guia de Estudos Online 89

a b c d x y IN = {a}
a ∞ 5 5 3 4 ∞
b 5 4 2 a b c d x y
∞ ∞ ∞
d 0 5 5 3 4 ∞
c 5 ∞ ∞ 2 6 ∞ s a a a a a a
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞ IN = {a, d}
y ∞ 2 ∞ 5 ∞ ∞
a b c d x y
d 0 4 2 3 4 5
s a d d a a d

IN = {a, d, c}
a b c d x y
d 0 4 2 3 4 5
s a d d a a d

a b c d x y IN = {a} IN = {a, d, c, b}
a ∞ 5 5 3 4 ∞
b 5 4 2 a b c d x y a b c d x y
∞ ∞ ∞
d 0 5 5 3 4 ∞ d 0 4 2 3 4 2
c 5 ∞ ∞ 2 6 ∞ s a
s a a a a a a d d a a b
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞ IN = {a, d}
y ∞ 2 ∞ 5 ∞ ∞ a b c d x y
d 0 4 2 3 4 5
s a d d a a d

IN = {a, d, c}
a b c d x y
d 0 4 2 3 4 5
s a d d a a d

a b c d x y IN = {a} IN = {a, d, c, b}
a ∞ 5 5 3 4 ∞
b 5 4 2 a b c d x y a b c d x y
∞ ∞ ∞
d 0 5 5 3 4 ∞ d 0 4 2 3 4 2
c 5 ∞ ∞ 2 6 ∞ s a
s a a a a a a d d a a b
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞ IN = {a, d} IN = {a, d, c, b, y}
y ∞ 2 ∞ 5 ∞ ∞ a b c d x y a b c d x y
d 0 4 2 3 4 5 d 0 4 2 3 4 2
s a d d a a d s a d d a a b

IN = {a, d, c}
a b c d x y
d 0 4 2 3 4 5
s a d d a a d
90 Guia de Estudos Online

a b c d x y IN = {a} IN = {a, d, c, b}
a ∞ 5 5 3 4 ∞
b 5 4 2 a b c d x y a b c d x y
∞ ∞ ∞
d 0 5 5 3 4 ∞ d 0 4 2 3 4 2
c 5 ∞ ∞ 2 6 ∞ s a
s a a a a a a d d a a b
d 3 4 2 ∞ ∞ 5
x 4 ∞ 6 ∞ ∞ ∞ IN = {a, d} IN = {a, d, c, b, y}
y ∞ 2 ∞ 5 ∞ ∞
a b c d x y a b c d x y
d 0 4 2 3 4 5 d 0 4 2 3 4 2
s a d d a a d s a d d a a b

IN = {a, d, c} IN = {a, d, c, b, y, x}
a b c d x y a b c d x y
d 0 4 2 3 4 5 d 0 4 2 3 4 2
s a d d a a d s a d d a a b

Visão Ger al da Seção 7. 4

Já conhecemos diversos algoritmos para percurso em árvores — percurso em pré-ordem,


em ordem simétrica e em pós-ordem. Os algoritmos de percurso fornecem maneiras siste-
máticas de visitar cada nó em uma árvore e fazer o que quisermos lá, como, por exemplo,
apresentar o valor do nó como resultado. Uma árvore é um tipo especial de grafo e agora
queremos algoritmos para visitar sistematicamente cada nó em um grafo.
Existem duas abordagens, busca em profundidade e busca em nível. Cada aborda-
gem requer algum mecanismo para manter registros de nós que já foram visitados. A busca
em profundidade pode ser escrita como um algoritmo recursivo, de modo que seu meca-
nismo de armazenagem é uma pilha (uma estrutura de dados do tipo o último a entrar é o
primeiro a sair). Busca em nível usa uma fila (uma estrutura de dados do tipo o primeiro a
entrar é o primeiro a sair).

Amostras de Solução de Problemas


• Problema 1 — Conduzindo uma busca em profundidade em um grafo.
• Problema 2 — Conduzindo uma busca em nível em um grafo.

Conduzindo uma Busca em Profundidade em um Grafo


Problema:
Dado o grafo a seguir, faça uma busca em profundidade começando no nó w.

p r

s
w
x
z

u q

t
y
Guia de Estudos Online 91

Solução:
Use o algoritmo de busca em profundidade.

Marque w como visitado, coloque-o na pilha.

Pilha: w
p r

s
w
x
z

u q

t
y

Percorra um caminho a partir de w.

Pilha: w, p, r, x

p r

s
w
x
z

u q

t
y

Visite s, coloque na pilha — fim da linha, volte, retire s da pilha.

Pilha: w, p, r, x, s

p r

s
w
x
z

u q

t
y
92 Guia de Estudos Online

Visite y, coloque na pilha — fim da linha, volte, retire y da pilha.

Pilha: w, p, r, x, s, y

p r

s
w
x
z

u q

t
y

Visite z e q, coloque na pilha, depois retire q da pilha e volte para z.

Pilha: w, p, r, x, s, y, z, q

p r

s
w
x
z

u q

t
y

Visite u, depois retire e volte para z, x, r, p, w.

Pilha: w, p, r, x, s, y, z, q, u
w, p, r, x, s, y, z, q, u

p r

s
w
x
z

u q

t
y
Guia de Estudos Online 93

Finalmente, visite t. Coloque na pilha t, retire t, depois retire w.

Pilha: w, p, r, x, s, y, z, q, u, t
w, p, r, x, s, y, z, q, u, t

p r

s
w
x
z

u q

t
y

Resultado da busca em profundidade: w, p, r, x, s, y, z, q, u, t

Conduzindo uma Busca em Nível em um Grafo


Problema:
Dado o grafo a seguir, faça uma busca em nível a partir do nó w.
p r

s
w
x
z

u q

t
y

Solução:
Use o algoritmo de busca em nível.

Marque w como visitado e coloque-o na fila.

Fila: w

p r

s
w
x
z

u q

t
y
94 Guia de Estudos Online

Visite e coloque na fila os nós adjacentes a w, depois retire w da fila.

Fila: w, p, t, x
p r

s
w
x
z

u q

t
y

Visite e coloque na fila os nós não visitados adjacentes a p, depois retire p da fila.

Fila: w, p, t, x, r
p r

s
w
x
z

u q

t
y

Retire t da fila.

Fila: w, p, t, x, r

Visite e coloque na fila os nós não visitados adjacentes a x, depois retire x da fila.

Fila: w, p, t, x, r, s, y, z

Retire r, s e y da fila.

Fila: w, p, t, x, r, s, y, z

p r

s
w
x
z

u q

t
y
Guia de Estudos Online 95

Visite e coloque na fila q e u, retire z da fila.

Fila: w, p, t, x, r, s, y, z, q, u

p r

s
w
x
z

u q

t
y

Remova q e u da fila.

Fila: w, p, t, x, r, s, y, z, q, u

Resultado da busca em nível: w, p, t, x, r, s, y, z, q, u

Visão Ger al da Seção 7. 5

Em um grafo que representa uma rede de comunicações, é importante que todos os nós se-
jam acessíveis a partir de todos os outros, ou seja, que o grafo seja conexo. Uma árvore mí-
nima geradora (Seção 7.3) forma um grafo conexo com seus nós, mas um no qual não pode
haver falha em um único arco. Um ponto de articulação em um grafo conexo simples é um
nó cuja falha (o que removeria, logicamente, o nó e todos os seus arcos adjacentes) tornaria
o grafo resultante desconexo. A Seção 7.5 apresenta um algoritmo para detectar pontos de
articulação em um grafo conexo simples.
O algoritmo depende de um percurso usando uma busca em profundidade, junto com
um esquema de numeração que mantém o número de árvore de cada nó (a ordem segundo
a qual o nó é visitado na busca em profundidade) e o número de trás de cada nó (o número
de árvore do nó mais longe — o menor número de árvore — no percurso do grafo aces-
sível desse nó). Como a busca em profundidade volta para um nó visitado anteriormente,
pode ser necessário ajustar o número de trás daquele nó com base nos caminhos de trás
de nós mais embaixo no caminho da busca em profundidade. Um ponto de articulação
ocorre quando, nesse processo de voltar atrás, nenhum nó abaixo do nó atual n tem nú-
mero de trás menor do que n; isso significa que a única maneira de acessar nós abaixo do
nó n é através de n, de modo que, se n for removido, esses nós se tornarão inacessíveis e
o grafo ficará desconexo.

Amostra de Solução de Problemas


• Problema 1 — Encontrando pontos de articulação em um grafo simples conexo.

Encontrando Pontos de Articulação em um Grafo Simples Conexo


Dado o grafo simples conexo
96 Guia de Estudos Online

a b

d c

f g

encontre todos os pontos de articulação.

Solução: Aplique o algoritmo PontoDeArt


Comece com o nó a e faça uma busca em profundidade de a para b para c para d, marcando
os arcos de árvore, os números de árvore e os números de trás.

(1,1)a b(2,2)

(4,4)d c(3,3)

f g

De d, há um arco de trás para a; ajuste o número de trás de d.

(1,1)a b(2,2)

1
(4,4)d c(3,3)

f g

Continue a busca em profundidade, indo para os nós e, f, g.

(1,1)a b(2,2)

1
(4,4)d c(3,3)

(5,5)e

(6,6)f g(7,7)
Guia de Estudos Online 97

Em g, existe um arco de trás para e, ajuste o número de trás de g.

(1,1)a b(2,2)

1
(4,4)d c(3,3)

(5,5)e
5
(6,6)f g(7,7)

Volte para f e ajuste seu número de trás. Volte para e. O número de trás de f é igual ao
número de árvore de e, logo e é um ponto de articulação.

(1,1)a b(2,2)

1
(4,4)d c(3,3)

(5,5)e
5 5
(6,6)f g(7,7)

Volte para d. O número de trás de e é maior do que o número de árvore de d, logo d é


um ponto de articulação.

(1,1)a b(2,2)

1
(4,4)d c(3,3)

(5,5)e
5 5
(6,6)f g(7,7)

Volte dos nós c e b para a. O nó a é o nó inicial e não é um ponto de articulação.

1
(1,1)a b(2,2)

1 1
(4,4)d c(3,3)

(5,5)e
5 5
(6,6)f g(7,7)
98 Guia de Estudos Online

As componentes biconexas do grafo são:


a b

d c

f g
Capítulo

Álgebra de Boole 8
Tanto em lógica proposicional quanto em teoria dos conjuntos, trabalhamos com uma cole-
ção de elementos, alguns dos quais eram especiais, efetuamos operações nesses elementos e
observamos determinadas regras. Veja a tabela a seguir.

Lógica proposicional Teoria dos conjuntos

Elementos letras de proposição conjuntos


Elementos especiais contradições conjunto vazio
tautologias conjunto universal
Operações conjunção interseção
disjunção união
negação complementação
10 Regras comutatividade comutatividade
associatividade associatividade
distributividade distributividade
identidade propriedades da identidade
complemento propriedades do complemento

Uma álgebra de Boole é qualquer coleção de elementos contendo dois elementos es-
peciais, 0 e 1, em conjunto com as operações de +, . e 9 satisfazendo as mesmas 10 regras
aplicadas às operações de álgebras de Boole. Como anteriormente, as regras ocorrem em
pares duais. Assim, a lógica proposicional e a teoria dos conjuntos são exemplos de álgebras
de Boole.
Usando essas regras, provaremos (Seção 8.1) algumas outras propriedades de álgebras
de Boole. A ideia de isomorfismo também se aplica à estrutura de álgebras de Boole. Para
grafos isomorfos, precisávamos de uma bijeção entre nós que preservasse a adjacência;
para álgebras de Boole, precisamos de uma bijeção entre os elementos que preserve os
efeitos das operações.
Álgebras de Boole são importantes porque um circuito lógico (igual a centenas do
mesmo tipo que são encontradas dentro de seu computador) pode ser representado por uma
expressão booleana. Reciprocamente, qualquer expressão booleana tem uma representação
como um circuito. Podemos usar a álgebra de Boole para desenvolver uma expressão bo-
oleana para fazer algumas coisas e depois construir o circuito correspondente (Seção 8.2).
Foram desenvolvidos algoritmos para simplificar expressões booleanas e, consequentemen-
te, seus circuitos lógicos correspondentes (Seção 8.3).

99
100 Guia de Estudos Online

Propriedades Básicas de Álgebras de Boole

1a. x + y = y + x 1b. x . y = y . x comutatividade

2a. (x + y) + z = x + (y + x) 2b. (x . y) . z = x . (y . z) associatividade

3a. x + (y . z) = (x + y) . (x + z) 3b. x . (y + z) = x . y + x . z distributividade

4a. x + 0 = x 4b. x . 1 = x propriedades da identidade

5a. x + x9 = 1 5b. x . x9 = 0 propriedades do complemento

Visão Ger al da Seção 8 .1

A definição de uma álgebra de Boole garante determinadas propriedades a que os elementos


nessa estrutura, sob as operações na estrutura, têm que obedecer. De maneira análoga ao
que fizemos quando usamos as tautologias básicas para desenvolver novas tautologias em
lógica proposicional, ou quando usamos as identidades básicas de conjuntos para provar
novas identidades na teoria dos conjuntos, podemos demonstrar novas propriedades sobre
álgebras de Boole usando as propriedades existentes. À medida que demonstramos novas
propriedades, elas são adicionadas à nossa “caixa de ferramentas” e podem ser usadas para
provar ainda outras propriedades.
No entanto, as propriedades de álgebras de Boole representam padrões; como no caso
de tautologias ou identidades envolvendo conjuntos, para usar uma propriedade temos que
nos certificar de que a expressão booleana segue o mesmo padrão que a propriedade
que queremos usar. Por exemplo, se tivermos algo da forma

(x . y) . (z + w)

podemos substituí-la por

(x . y) . z + (x . y) . w

usando a distributividade 3b, com x . y no lugar de x, z no lugar de y e w no lugar de z. Mas


não existe uma regra que nos permita substituir

(z + w) . (x . y)

com

z . (x . y) + w . (x . y)

Teríamos primeiro que escrever

(z + w) . (x . y) = (x . y) . (z + w) 1b
= (x . y) . z + (x . y) . w 3b
= z . (x . y) + w . (x . y) 1b

Para definir qualquer álgebra de Boole particular, você precisa especificar os elemen-
tos, identificar os elementos especiais 0 e 1 e definir as operações +, . e 9. O ponto aqui é que
você precisa ver os símbolos das operações +, . e 9 abstratamente, de maneira genérica. Em
qualquer álgebra booleana específica, + não significa, necessariamente, soma — significa
o que quer que tenha sido definido. (Poderia significar união de conjuntos, por exemplo.)
Além disso, não se engane pensando que as regras de álgebras de Boole são como as
regras da álgebra usual, ou seja, que tudo vai ser como na soma e multiplicação de números.
Guia de Estudos Online 101

Algumas propriedades são iguais, como x + y = y + x, mas outras não. Um dos Problemas
Práticos, por exemplo, mostra que x + 1 = 1, o que certamente não é verdade na soma usual
de números quando x é um número.
Suponha que [B, +, . , 9, 0, 1] é uma álgebra de Boole e que [b, &, *, 99, f, 1] é outra
álgebra de Boole. Nessa segunda álgebra, & é o símbolo usado para representar a operação
+ na definição, * é o símbolo usado para representar a operação . etc. Para que essas duas
álgebras de Boole sejam isomorfas, você tem que encontrar uma função f: B 6 b tal que

1. f é uma bijeção
2. f (x + y) = f (x) & f ( y)
3. f (x . y) = f (x) * f ( y)
4. f (x9) = [ f (x)]99

O isomorfismo (a função) preserva os efeitos das operações. Você pode efetuar a


operação e depois aplicar a função ou primeiro aplicar a função e depois efetuar a ope-
ração. (Veja a Figura 8.3.) A Equação 2, por exemplo, diz que, se você primeiro efetuar a
operação + em B e depois aplicar a função no resultado, obterá um elemento em b igual
ao obtido se primeiro levar x e y em b e depois efetuar a operação correspondente & lá.
Ao trabalhar com isomorfismos, preste atenção em que conjunto você está (se em B ou
em b) e quais são as operações nesse conjunto.

Amostra de Solução de Problemas


• Problema — Demonstrar propriedades sobre álgebras de Boole.

Demonstrar Propriedades sobre álgebras de Boole


Problema:
Prove que

x . y + (x + y) . ( y + x9) = y

é verdade em qualquer álgebra de Boole.


Solução:
Use as propriedades de álgebra de Boole para manipular um dos lados da equação até obter
o outro lado. Comece com o lado mais complicado.

x . y + (x + y) . ( y + x9)

x . y + (x + y) . ( y + x9)

Uma parte disso parece com

3a x + ( y . z) = (x + y) . (x + z)

Regra 3a x + ( y . z) = (x + y) . (x + z)

x . y + (x + y) . ( y + x9) = x . y + ( y + x) . ( y + x9) 1a
102 Guia de Estudos Online

Regra 3a x + ( y . z) = (x + y) . (x + z)

x . y + (x + y) . ( y + x9) = x . y + ( y + x) . ( y + x9) 1a

= x . y + [ y + ( x . x9) 3a

x . y + (x + y) . ( y + x9) = x . y + ( y + x) . ( y + x9) 1a
= x . y + [ y + ( x . x9)] 3a
= x . y + [ y + 0] 5b
=x.y+y 4a

concentre em y ...

x . y + (x + y) . ( y + x9) = x . y + ( y + x) . ( y + x9) 1a
= x . y + [ y +(x . x9)] 3a
= x . y + [ y + 0] 5b
= x.y+y 4a
= y.x+y 1b

y . x + y . 1
= 4b

y . (x + 1)
= 3b
y . 1
= Problema Prático

y
= 4b

Visão Ger al da Seção 8 .2

Uma função booleana leva n-uplas de valores V-F em um valor V-F. (As tabelas-verdade
para as fbfs proposicionais faziam a mesma coisa.)
Dada qualquer expressão booleana, é possível construir uma tabela que descreve a fun-
ção booleana representada por ela. Você também pode desenhar um circuito lógico para
a expressão (usando portas E, OU e inversores para as operações booleanas +, . e 9) que
representa a mesma função booleana, ou seja, dado um padrão de entradas de zeros e uns,
o circuito produzirá o valor lógico determinado pela função.
Dado um circuito lógico, você pode construir uma tabela para sua função booleana ou
a expressão booleana que representa a mesma função.
Finalmente, dada qualquer função booleana (na forma de uma tabela), você pode
obter uma expressão booleana que a representa e, portanto, um circuito lógico corres-
pondente.
Em outras palavras, a partir de qualquer uma das representações a seguir, você pode
obter qualquer uma das outras duas:

Expressão booleana Função booleana Circuito lógico

O mais difícil é obter uma expressão booleana correspondente começando com uma fun-
ção booleana. Felizmente, existe um algoritmo que faz isso. O algoritmo produz uma forma
Guia de Estudos Online 103

canônica como soma de produtos. O que isso significa? Uma soma de produtos poderia
ser uma expressão da forma

(x1 . x2 . x3) + (x19 . x2 . x39)

ou (em geral, usamos apenas justaposição para o operador .)

(x1x2x3) + (x19x2x39)

Logo, a expressão é uma soma de produtos. A parte “canônica” significa que esse al-
goritmo sempre funciona, embora seja possível encontrar uma expressão mais simples em
alguns casos apenas examinando a função booleana. Isso é análogo ao que ocorre com a
fórmula para equações do segundo grau — é um algoritmo que sempre funciona, embora
em alguns casos (quando as raízes são inteiras) você seja capaz de encontrar a solução mais
rapidamente por fatoração.
A tabela a seguir mostra os passos necessários para construir uma expressão booleana
em forma canônica como soma de produtos a partir de uma função booleana.

1. Olhe todos os valores lógicos resultantes da função


booleana e pule todos os que forem iguais a 0.
2. Em cada linha em que o valor lógico da função
booleana for 1, faça o passo 3 para formar um produto.
3. Percorra a linha. Para os valores de entrada xi que
forem iguais a 1 nesta linha, coloque xi no produto. Para
os valores de xi que forem iguais a 0 nesta linha, coloque
xi9 no produto.
4. Some todos os produtos.

Amostras de Solução de Problemas


• Problema 1 — Construir um circuito lógico com a mesma função booleana que
uma expressão booleana dada.
• Problema 2 — Obter uma expressão booleana em forma canônica como soma de
produtos a partir de uma função booleana.

Construir um Circuito Lógico com a Mesma Função Booleana que


uma Expressão Booleana Dada
Problema:

xy + x9

Solução:
Use portas E, portas OU e inversores para representar as operações booleanas.

Componentes necessários:

Porta E Porta OU Inversor


104 Guia de Estudos Online

x xy

x9

x xy

x9 xy + x9

x xy

Obter uma Expressão Booleana em forma Canônica como Soma de


Produtos a Partir de uma Função Booleana
Problema:
Dada a função booleana a seguir, encontre a expressão booleana em forma canônica como
soma de produtos.

x1 x2 x3 f(x1, x2, x3)


1 1 1 0
1 1 0 1
1 0 1 1
1 0 0 0
0 1 1 0
0 1 0 1
0 0 1 0
0 0 0 0

Solução:
Use o Algoritmo Soma-De-Produtos.

Três linhas têm o valor 1 na tabela da função booleana.

x1 x2 x3 f(x1, x2, x3)


1 1 1 0
1 1 0 1
1 0 1 1
1 0 0 0
Guia de Estudos Online 105

0 1 1 0
0 1 0 1
0 0 1 0
0 0 0 0

x1x2x39

x1x2x39 + x1x29x3

x1x2x39 + x1x29x3 + x19x2x39

Visão Ger al da Seção 8 .3

A partir de uma função booleana, podemos produzir uma expressão booleana em forma ca-
nônica como soma de produtos. Podemos então transformar essa expressão em um circuito
lógico que implementa a função booleana. Gostaríamos de ser capazes de minimizar uma
expressão booleana, ou seja, obter uma expressão mais simples que representa a mesma
função booleana. Então o circuito lógico correspondente teria menos portas.
A Seção 8.3 contém dois algoritmos que simplificam uma soma de produtos em uma
soma de produtos mínima (que pode não corresponder ao mínimo absoluto). A abordagem
do mapa de Karnaugh, que depende de escrever a expressão booleana em determinado
arranjo retangular, é fácil de usar, mas só funciona para um número pequeno de variáveis.
O método de Quine-McCluskey, mais complicado de fazer à mão, pode ser facilmente au-
tomatizado e funciona para qualquer número de variáveis.
Ao montar o mapa de Karnaugh, tome cuidado para nomear corretamente os rótulos.
Esse método depende de os rótulos de quadrados adjacentes corresponderem a expressões
que diferem em apenas uma variável; se você colocar rótulos errados, irá obter resultados
incorretos.

Amostras de Solução de Problemas


• Problema 1 — Minimizar uma forma canônica como soma de produtos correspon-
dente a uma função booleana usando o mapa de Karnaugh.
• Problema 2 — Minimizar uma forma canônica como soma de produtos correspon-
dente a uma função booleana usando o procedimento de Quine-McCluskey.

Minimizar uma Forma Canônica como Soma de Produtos


correspondente a uma Função Booleana Usando o Mapa de
Karnaugh
Problema:
Use o mapa de Karnaugh para encontrar uma forma mínima como soma de produtos para a
função booleana na tabela a seguir:

x1 x2 x3 x4 f(x1, x2, x3, x4)


1 1 1 1 1
1 1 1 0 0
106 Guia de Estudos Online

1 1 0 1 1
1 1 0 0 0
1 0 1 1 0
1 0 1 0 1
1 0 0 1 0
1 0 0 0 0
0 1 1 1 1
0 1 1 0 1
0 1 0 1 1
0 1 0 0 0
0 0 1 1 0
0 0 1 0 1
0 0 0 1 0
0 0 0 0 0

Solução:
Desenhe um mapa de Karnaugh com 4 variáveis, preencha com 1 apropriadamente e agrupe
os quadrados marcados.

x1 x2 x1 x29 x19x29 x19x2

x3 x4

x3 x49

x39x49

x39x4

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1

x3 x49

x39x49

x39x4
Guia de Estudos Online 107

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1

x3 x49

x39x49

x39x4 1

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1
108 Guia de Estudos Online

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1
Guia de Estudos Online 109

Expressão booleana: x2x4

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

Expressão booleana: x2x4 + x29x3x49

x1 x2 x1 x29 x19x29 x19x2

x3 x4 1 1

x3 x49 1 1 1

x39x49

x39x4 1 1

Expressão booleana: x2x4 + x29x3x49 + x19x3x49 ou x2x4 + x29x3x49 + x19x2x3


Capítulo

Modelagem Aritmética, Computação


e Linguagens
9
Lembre-se de que desenvolvemos a estrutura de álgebras de Boole como uma generalização
de dois exemplos que já havíamos visto, lógica proposicional e teoria dos conjuntos. A es-
trutura de álgebras de Boole — um conjunto com dois elementos específicos, 0 e 1, e opera-
ções que obedecem a determinadas regras — captura as propriedades desses dois exemplos.
Portanto, uma álgebra de Boole é uma espécie de modelo, do qual lógica proposicional e
teoria dos conjuntos são dois exemplos particulares.
Neste capítulo, queremos introduzir estruturas que modelam cálculos e linguagens.
Começamos na Seção 9.1 com estruturas algébricas. Essas estruturas modelam, natu-
ralmente, álgebra ou aritmética usuais, o tipo de coisas que usamos para calcular desde o
ensino fundamental. (A Seção 9.2 sobre teoria da codificação é uma espécie de desvio para
uma aplicação da estrutura de grupos que é importante na ciência da computação.)
Usamos computadores para “cálculos” mais complexos do que aritmética. Na Seção
9.3, consideraremos uma estrutura denominada máquina de estado finito que modela
muitas das propriedades de um computador, logo pode fazer tarefas mais gerais, como
reconhecer determinados padrões de entrada. No entanto, é fácil encontrar tarefas de
reconhecimento que nós podemos fazer, mas uma máquina de estado finito não pode, o
que sugere que máquinas de estado finito não formam um modelo para “computação” em
seu sentido mais geral. Para esse tipo de modelo, investigaremos as máquinas de Turing
(Seção 9.4). Veremos que, apesar de sua simplicidade, uma máquina de Turing é consi-
derada o modelo final de “computação”. Usando essa visão de uma máquina de Turing,
podemos provar que alguns problemas são incomputáveis — problemas para os quais
não existe uma solução algorítmica. As máquinas de Turing também podem ser usadas
para classificar os problemas solúveis como tratáveis ou intratáveis, o que leva ao famoso
problema P = NP.
Depois disso, consideraremos modelos de linguagens, tanto de linguagens naturais
como português ou inglês, quanto de linguagens de programação como Java e C++. Vere-
mos aqui que gramáticas formais são os mecanismos apropriados para definir a estrutura
de tais linguagens e para gerar “sentenças” sintaticamente corretas nessas linguagens.
A habilidade de reconhecer tais sentenças é crucial para a programação de compiladores
de linguagens.

Visão Ger al da Seção 9.1

Vamos considerar estruturas que consistem em um conjunto não vazio S de elementos junto
com uma operação binária no conjunto. Lembre-se de que, para que ∘ seja uma operação
binária em S, é preciso que, quaisquer que sejam x, y > S,

110
Guia de Estudos Online 111

x ∘ y existe e é único (a operação está bem definida)

x ∘ y > S (a operação é fechada)

(Essas estruturas são mais simples do que álgebras de Boole, que têm duas operações biná-
rias e uma operação unária.)
Seja S um conjunto não vazio no qual está definida uma operação binária ∘. Então [S, ∘]
será um grupo se todas as propriedades da tabela a seguir forem satisfeitas:

Propriedade Significado

∘ é associativa (x ∘ y) ∘ z = x ∘ ( y ∘ x) para todo x, y, z > S

S tem um elemento identidade i em relação a ∘ x ∘ i = i ∘ x para todo x > S


Cada elemento x em S tem um elemento
x ∘ x21 = x21 ∘ x = i para todo x > S
inverso x21 em relação a ∘

O conjunto S pode ser um conjunto de números e a operação ∘ pode ser uma operação
aritmética usual. Por exemplo, [Z, +] é um grupo, em que Z é o conjunto dos inteiros e + é
a soma usual de números inteiros. Para ver isso, note que + está bem definida e é fechada
em Z; além disso,

(x + y) + z = x + (y + z) para todos os inteiros x, y, z, de modo que + é associativa,


0 é um inteiro tal que x + 0 = 0 + x = x para todo inteiros x, de modo que 0 é o elemento
identidade, x + (-x) = (-x) + x = 0 para todo inteiro x, de modo que -x é o elemento
inverso de x.

No entanto, quando você for testar se um conjunto S junto com uma operação binária
forma um grupo, lembre-se de que S pode ter elementos que são matrizes, ou funções, ou
cadeias, ou polinômios, ou ..., e que a operação pode ser multiplicação de matrizes, ou com-
posição de funções, ou concatenação de cadeias, ou soma de polinômios, ou .... O símbolo
∘ na definição acima é, simplesmente, uma representação da operação binária em S; é um
símbolo genérico que pode ser substituído por uma operação real em qualquer exemplo
particular. (O livro usa um ponto para esse símbolo genérico, mas o símbolo ∘ é mais fácil
de ver na tela.)
Se não for necessário existir um inverso em S para cada elemento, então você terá uma
estrutura chamada de monoide. Se retirar também a propriedade de existência de um ele-
mento identidade, terá um semigrupo. As propriedades para um semigrupo são as menos
restritivas, enquanto as propriedades para um grupo são as mais restritivas. Todo grupo é
um monoide, e todo monoide também é um semigrupo, mas existem semigrupos que não
são monoides e existem monoides que não são grupo.

semigrupo
monoide

grupo

Usando as propriedades que um grupo tem que satisfazer segundo a definição, pode-
mos demonstrar outras propriedades de grupo, de maneira análoga ao que fizemos para
provar outras propriedades de álgebras de Boole. Entre essas propriedades estão: o ele-
mento identidade é único, o inverso de cada elemento é único, as leis de cancelamento são
112 Guia de Estudos Online

válidas em qualquer grupo e equações lineares têm soluções únicas em um grupo. Essas
últimas propriedades são fundamentais para a álgebra usual, e você as usa há muitos anos.
Poderíamos afirmar, por exemplo, no grupo [Z, +],

se x + 3 = y + 3, então x = y
se x + 7 = 10, então existirá uma única solução para x em Z

Se [G, ∘] for um grupo e se A for um subconjunto de G tal que [A, ∘] também é um


grupo, então [A, ∘] será dito um subgrupo de G. A associatividade da operação ° é herdada
de G, de modo que, para verificar se [A, ∘] é um subgrupo, precisamos testar se A é fechado
em relação à operação ∘, se o elemento identidade pertence a A e se, qualquer que seja x em A,
x-1 pertence a A.
Isomorfismo tem o mesmo significado que antes. Os grupos [S, ∘] e [T, +] serão iso-
morfos se existir uma bijeção f : S g T tal que f (x ∘ y) = f (x) + f ( y); “operação seguida de
aplicação é igual a aplicação seguida de operação”.

Amostra de Solução de Problemas


• Problema 1 — Testar se determinado conjunto munido de uma operação tem as
propriedades necessárias para formar um grupo.

Testar se Determinado Conjunto Munido de uma Operação tem as


Propriedades Necessárias para Formar um Grupo
Problema:
Considere o conjunto de transformações em um retângulo no plano.

Existem quatro transformações que podem ser aplicadas no retângulo e que manterão
inalterada sua imagem no plano. São elas:

T1: Girar em torno do eixo vertical V


T2: Girar em torno do eixo horizontal H
T3: Fazer uma rotação no sentido horário em torno do centro de 180°
T4: Fazer uma rotação no sentido horário em torno do centro de 360°

(Por exemplo, se você considerar o retângulo como um pedaço de papelão, T1 vira para
baixo a face de cima e coloca a extremidade que estava à direita do lado esquerdo, mas o
formato das bordas externas permanece o mesmo.)
Seja S o conjunto dessas transformações e seja ∘ a composição. Por exemplo, T1 ∘ T3
diz para primeiro aplicar a transformação T3 e depois aplicar a transformação T1. (A com-
posição sempre é da direita para a esquerda.) Prove que [S, ∘] é um grupo.
Guia de Estudos Online 113

Solução:
Testes as propriedades necessárias de grupo. Numere os cantos e imagine que o lado de cima
é branco e o de baixo é cinza.
V

1 2

4 3

Aplique T3
V T3 V


1 2 3 4

H H

4 3 2 1

Depois aplique T1
V T1 V


3 4 4 3

H H

2 1 1 2

V T1 o T3 V


1 2 4 3

H H

4 3 1 2
114 Guia de Estudos Online

V T2 V


1 2 4 3

H H

4 3 1 2

T1 ∘ T3 = T2

Faça uma tabela para descrever a operação.

∘ T1 T2 T3 T4

T1 T2

T2

T3

T4

T1 ∘ T3 = T2

Faça uma tabela para descrever a operação.

∘ T1 T2 T3 T4

T1 T4 T3 T2 T1

T2 T3 T4 T1 T2

T3 T2 T1 T4 T3

T4 T1 T2 T3 T4
Guia de Estudos Online 115

A composição é associativa.

X ∘ T4 = T4 ∘X = X, logo T4 é o elemento identidade.

∘ T1 T2 T3 T4

T1 T4 T3 T2 T1

T2 T3 T4 T1 T2

T3 T2 T1 T4 T3

T4 T1 T2 T3 T4

A composição é associativa.

X ∘ T4 = T4 ∘X = X, logo T4 é o elemento identidade.


Cada elemento é seu próprio elemento inverso.

∘ T1 T2 T3 T4

T1 T4 T3 T2 T1

T2 T3 T4 T1 T2

T3 T2 T1 T4 T3

T4 T1 T2 T3 T4

Visão Ger al da Seção 9.2

A teoria de codificação trata o problema de gerenciamento da degeneração de dados biná-


rios, dados que degeneram na armazenagem ou na transmissão. O método geral é codificar
uma cadeia binária como uma cadeia binária mais longa. Os bits adicionais aumentam o
que vai ser armazenado ou transmitido, mas fornecem uma redundância suficiente para que
erros nos bits sejam detectados e talvez até corrigidos. Tais métodos nunca são infalíveis,
mas se baseiam na suposição de que erros têm uma probabilidade baixa de ocorrer, de
modo que, se uma cadeia recebida difere de todas as mensagens codificadas, provavel-
mente é uma versão embaralhada da mensagem codificada da qual ela difere o mínimo.
A capacidade de detectar ou corrigir erros depende da distância mínima (diferença) entre
todas as mensagens codificadas.
O método de codificação discutido nesta seção usa bits adicionais que agem como
bits de paridade em diversos elementos da cadeia binária original. Ele depende de alguns
resultados da teoria dos grupos e usa uma matriz canônica de verificação de paridade H
116 Guia de Estudos Online

para codificar o grupo das m-uplas binárias em um conjunto de mensagens codificadas


que formam um subgrupo do grupo das n-uplas binárias, em que m < n. Decodificar uma
n-upla X recebida envolve encontrar a síndrome da mensagem (o produto de X por H),
encontrar o líder da classe lateral com a mesma síndrome e somar (módulo 2) o líder da
classe lateral a X.

Amostras de Solução de Problemas


• Problema 1 — Dada uma matriz canônica de verificação de paridade H n 3 r,
escreva o conjunto de m-uplas binárias que H codifica e escreva a mensagem codi-
ficada para cada uma delas.
• Problema 2 — Dada uma matriz canônica de verificação de paridade H n 3 r para
um código perfeito, decodifique uma n-upla recebida calculando sua síndrome e
encontrando o líder de sua classe lateral.

Dada uma Matriz Canônica de Verificação de Paridade H n 3 r,


Escreva o Conjunto de m-uplas Binárias que H Codifica e Escreva a
Mensagem Codificada para cada uma Delas
Problema:
A matriz H mostrada aqui é a matriz canônica de verificação de paridade com n = 5 e r = 3.
Qual é o conjunto de m-uplas binárias que H codifica e quais são as mensagens codificadas
correspondentes?

0 1 1
1 0 1
H= 1 0 0
0 1 0
0 0 1

Solução:
m = n – r = 2. H codifica todo o Z2m em um subgrupo de Z2n, ou seja, todo o Z22 é codificado
em um subgrupo de Z25. As mensagens codificadas consistirão em dois bits de Z22 seguidos
de três bits de verificação determinados pela multiplicação pela matriz H.
O conjunto Z22 é {00, 01, 10, 11}. Cada 2-upla binária será convertida em uma mensa-
gem codificada que é uma 5-upla binária.
Escolha mensagens codificadas da forma x1x2 x3x4x5 tais que

0 1 1
1 0 1
(x1x2x3x4x5) . 1 0 0 = (000)
0 1 0
0 0 1

Para x1x2, a mensagem codificada seria x1x2c1c2c3 tal que

0 1 1
1 0 1
(x1x2c1c2c3) . 1 0 0 = (000)
0 1 0
0 0 1
Guia de Estudos Online 117

Para a 01, a mensagem codificada será 01c1c2c3 tal que

0 1 1
1 0 1
.
(01c1c2c3) 1 0 0 = (000)
0 1 0
0 0 1

0*0 + 1*1 + 1*c1 + 0*c2 + 0*c3 = 0


1 + c1 = 0
c1 = 1

1*0 + 0*1 + 0*c1 + 1*c2 + 0*c3 = 0


c2 = 0

1*0 + 1*1 + 0*c1 + 0*c2 + 1*c3 = 0


1 + c3 = 0
c3 = 1

01 6 01101

Para a 10, a mensagem codificada será 10c1c2c3 tal que

0 1 1
1 0 1
(10c1c2c3) . 1 0 0 = (000)|
0 1 0
0 0 1

0*1 + 1*0 + 1*c1 + 0*c2 + 0*c3 = 0


c1 = 0

1*1 + 0*0 + 0*c1 + 1*c2 + 0*c3 = 0


1 + c2 = 0
c2 = 1

1*1 + 1*0 + 0*c1 + 0*c2 + 1*c3 = 0


1 + c3 = 0
c3 = 1

10 6 10011
00 6 00000
01 6 01101
10 6 10011
11 6 11110

Peso mínimo = 3 = 2(1) + 1, logo corrige um único erro.


118 Guia de Estudos Online

Dada uma Matriz Canônica de Verificação de Paridade H n 3 r para


um Código Perfeito, Decodifique uma n-upla Recebida Calculando
Sua Síndrome e Encontrando o Líder de Sua Classe Lateral
Problema:
A matriz canônica de verificação de paridade mostrada a seguir é 15 3 4, o que significa que
n = 15 e r = 4. Logo, m = n – r = 11 = 2r – 1 – r, de modo que irá produzir um código perfeito.

1 1 0 0
1 0 1 0
1 0 0 1
0 1 0 1
0 0 1 1
0 1 1 0
1 1 1 0
H= 1 1 0 1
1 0 1 1
0 1 1 1
1 1 1 1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1 |

Decodifique a 15-upla recebida X = 110100110100011.

Solução:
Encontre a síndrome da mensagem codificada X, encontre o líder da classe lateral E com
essa síndrome e calcule a soma X +2 E.

A síndrome de X é

1 1 0 0
1 0 1 0
1 0 0 1
0 1 0 1
0 0 1 1
0 1 1 0
1 1 1 0
.
(110100110100011) 1 1 0 1 = (0100)
1 0 1 1
0 1 1 1
1 1 1 1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Guia de Estudos Online 119

A síndrome de X é (0100). Ela ocorre na linha 13 de H.


O líder da classe lateral é 000000000000100.
O X original será decodificado como mensagem codificada X + líder da classe lateral =
(110100110100011) +2 (000000000000100) = 110100110100111

Visão Ger al da Seção 9.3

Os grupos na Seção 9.1 eram modelos da aritmética. Para uma visão mais geral de compu-
tação, vamos considerar máquinas de estado finito, que modelam muitas características de
um computador de propósito geral.
Uma máquina de estado finito pode estar em qualquer um entre um número finito de
estados e pode receber um único símbolo de um alfabeto de entrada. Usando esse par es-
tado atual/símbolo atual, uma função de saída nos dá o único símbolo do alfabeto de saída
que sairá da máquina, e a função próximo estado irá dizer em que estado a máquina ficará.
Assim, uma máquina de estado finito é descrita por meio de um conjunto de estados, os
alfabetos de entrada e de saída e essas duas funções. Essas descrições podem ser na forma
de tabelas de estado ou grafos de estado.
São dados a seguir uma tabela de estado e um grafo de estado para uma máquina com
três estados e alfabeto de entrada = alfabeto de saída = {0, 1}. Tanto a tabela quanto o grafo,
dizem, por exemplo, que quando a máquina está no estado s0 e recebe um símbolo de entra-
da 0 irá fornecer um símbolo de saída 0 e irá para o estado s1.

Próximo estado
Entrada atual
Estado atual 0 1 Saída
s0 s1 s0 0
s1 s2 s1 1
s2 s1 s0 1

Supõe-se que a máquina sempre começa no estado s0 e que o primeiro símbolo de saída
é, simplesmente, uma reflexão desse estado inicial, não uma resposta a uma entrada, logo
pode ser ignorado. Cadeias de símbolos de entrada são processadas pela mudança de estado
para estado, como direcionado pela função próximo estado.
Máquinas de estado finito podem ser usadas para o reconhecimento de determinados
tipos de cadeias de entrada. Certos estados da máquina são designados como estados fi-
nais e a máquina reconhece qualquer cadeia que leva a máquina a um estado final no final
do processamento da cadeia. Ocorre que as máquinas de estado finito podem reconhecer
exatamente os conjuntos de cadeias que podem ser descritos usando expressões regulares.
Uma expressão regular representa um conjunto regular que é construído de símbolos
120 Guia de Estudos Online

individuais usando um operador de concatenação, um operador de escolha e um operador


de repetição. Por exemplo, o conjunto regular representado por

(11 0)*

contém cadeias que consistem em qualquer número (inclusive nenhum) de repetições ou


(escolhas) de pares de 1 (concatenação), ou de 0. Entre outras cadeias, esse conjunto contém

l (a cadeia vazia)
11 (uma repetição, escolhendo 11)
0 (uma repetição, escolhendo 0)
011 (duas repetições, escolhendo primeiro 0 e depois 11)
11011
00011

etc.

Uma vez encontrada uma máquina que reconhece determinado conjunto regular, seria
bom minimizar essa máquina — encontrar uma máquina que reconhece o mesmo conjun-
to, mas tem o menor número possível de estados. O algoritmo para fazer isso consiste em
definir uma relação de equivalência no conjunto dos estados, dividindo o conjunto de esta-
dos em classes de equivalência e usando essas classes como os estados da nova máquina.
Esse é o mesmo tipo de abstração um nível acima que discutimos ao definir uma relação
de equivalência no conjunto de frações e transformar as classes de equivalência resultantes
em número racionais.

Amostra de Solução de Problemas


• Problema 1 — Construir uma máquina de estado finito para reconhecimento de
determinado tipo de entrada.

Construir uma Máquina de Estado Finito para Reconhecimento de


Determinado Tipo de Entrada
Problema:
Construa uma máquina de estado finito que reconheça o conjunto regular 00 (11)*.

Solução:
Desenhe um grafo de estado.

s0

1
s0 s1

s2
Guia de Estudos Online 121

1 1
s0 s1 s3

s2
122 Guia de Estudos Online

Visão Ger al da Seção 9. 4

Uma máquina de Turing é o modelo mais geral de um dispositivo computacional. Uma


cabeça de leitura, que lê e escreve, e que pode estar em qualquer um entre um número finito
de estados, lê o conteúdo de uma célula em uma fita infinitamente longa. Com base no esta-
do e no símbolo lido, a máquina de Turing executa a ação de escrever um símbolo na célula
(talvez o mesmo símbolo que está lá), mudar o estado (mas, talvez, para o mesmo estado que
antes) e mover uma célula para a esquerda ou para a direita. Logo, as ações de uma máquina
de Turing são descritas por uma série de quíntuplas da forma: (estado atual, símbolo atual,
símbolo escrito, próximo estado, movimento)
Os símbolos na fita são retirados de um alfabeto da fita, que inclui um símbolo em
branco b. Apenas um número finito de células não está em branco em qualquer instante; por
convenção, a máquina de Turing começa no estado 0 lendo o símbolo que está na primeira
célula à esquerda que não está em branco na fita.
A máquina de Turing é determinística em suas ações, o que significa que um dado par
estado/símbolo está no início de, no máximo, uma quíntupla. Logo, um estado atual e um
símbolo atual resultam em exatamente uma ação. Se o par estado atual/símbolo atual não é
igual ao início de nenhuma quíntupla, a máquina para.
Máquinas de Turing podem ser usadas para reconhecer, parando em um estado final
especial, quando a fita de entrada é um elemento de algum conjunto especificado. Máqui-
nas de Turing também podem ser usadas para calcular funções que transformam a fita de
entrada (o argumento da função) na fita de saída. Tais funções calculáveis por Turing são
funções de teoria dos números e levam inteiros não negativos (representados em forma
unária na fita) em inteiros não negativos. A saída é o número representado na fita quando a
máquina para; se a fita, naquele ponto, não contém a representação de um número, a função
está indefinida para aquele valor de entrada.

Amostras de Solução de Problemas


• Problema 1 — Construindo uma máquina de Turing para reconhecer um conjunto
dado.
• Problema 2 — Construindo uma máquina de Turing para calcular uma função de
teoria dos números dada.

Construindo uma Máquina de Turing para Reconhecer um Conjunto Dado


Problema:
Encontre uma máquina de Turing que reconhece o conjunto de todas as cadeias da forma
w*wc, em que w é uma cadeia arbitrária e wc é o complemento de w (tem 0 nos lugares em
que w tem 1 e tem 1 nos lugares em que w tem 0).
Guia de Estudos Online 123

Solução:
Decida sobre as quíntuplas na máquina de Turing.

Tem que aceitar 1101*0010

1101*0010bbb 6 X101*0010bbb

0 1

(0, 1, X, 1, R) símbolo lido foi 1

X101*0010bbb 6 X101*0010bbb

1 2

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)

X101*0010bbb 6 X101*X010bbb

2 3

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
(2, 0, X, 3, L) símbolo lido foi 0, volte

X101*X010bbb 6 X101*X010bbb

3 0

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
(2, 0, X, 3, L) símbolo lido foi 0, volte
(3, *, *, 4, L) mova para a esquerda, passando do marcador
(4, 1, 1, 4, L)
(4, 0, 0, 4, L) mova para a esquerda e comece de novo
(4, X, X, 0, R)
124 Guia de Estudos Online

X101*X010bbb 6 XX01*XX10bbb

1 0

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
(2, X, X, 2, R) mova passando dos marcadores
(2, 0, X, 3, L) símbolo lido foi 0, volte
(3, X, X, 3, L) mova passando dos marcadores
(3, *, *, 4, L) mova para a esquerda, passando do marcador do meio
(4, 1, 1, 4, L)
(4, 0, 0, 4, L) mova para a esquerda e comece de novo
(4, X, X, 0, R)

XX01*XX10bbb 6 XXX1*XX10bbb 6 XXX1*XX10bbb

0 5 6

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
(2, X, X, 2, R) mova passando dos marcadores
(2, 0, X, 3, L) símbolo lido foi 0, volte
(3, X, X, 3, L) mova passando dos marcadores
(3, *, *, 4, L) mova para a esquerda, passando do marcador do meio
(4, 1, 1, 4, L)
(4, 0, 0, 4, L) mova para a esquerda e comece de novo
(4, X, X, 0, R)

(0, 0, X, 5, R) símbolo lido foi 0


(5, 1, 1, 5, R)
(5, 0, 0, 5, R) mova para a direita, passando do marcador do meio
(5, *, *, 6, R)
(6, X, X, 6, R) mova passando dos marcadores
(6, 1, X, 3, L) símbolo lido foi 1, volte

XXXXX*XXXXbbb 6 XXXXX*XXXXbbb 6 XXXXX*XXXXbbb

0 7 8

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
Guia de Estudos Online 125

(2, X, X, 2, R) mova passando dos marcadores


(2, 0, X, 3, L) símbolo lido foi 0, volte
(3, X, X, 3, L) mova passando dos marcadores
(3, *, *, 4, L) mova para a esquerda, passando do marcador do meio
(4, 1, 1, 4, L)
(4, 0, 0, 4, L) mova para a esquerda e comece de novo
(4, X, X, 0, R)

(0, 0, X, 5, R) símbolo lido foi 0


(5, 1, 1, 5, R)
(5, 0, 0, 5, R) mova para a direita, passando do marcador do meio
(5, *, *, 6, R)
(6, X, X, 6, R) mova passando dos marcadores
(6, 1, X, 3, L) símbolo lido foi 1, volte
(0, *, *, 7, R) não há mais dados à esquerda
(7, X, X, 7, R) passe sobre os marcadores
(7, b, b, 8, R) não há mais dados à direita, pare e aceite

10*11bbb 6 X0*11bbbb pare, mas não aceite

0 2

10*011bb 6 XX*XX1bb pare, mas não aceite

0 7

100*01bb 6 XXX*XXbb pare, mas não aceite

0 6

(0, 1, X, 1, R) símbolo lido foi 1


(1, 1, 1, 1, R)
(1, 0, 0, 1, R) mova para a direita, passando do marcador do meio
(1, *, *, 2, R)
(2, X, X, 2, R) mova passando dos marcadores
(2, 0, X, 3, L) símbolo lido foi 0, volte
(3, X, X, 3, L) mova passando dos marcadores
(3, *, *, 4, L) mova para a esquerda, passando do marcador do meio
(4, 1, 1, 4, L)
(4, 0, 0, 4, L) mova para a esquerda e comece de novo
(4, X, X, 0, R)

(0, 0, X, 5, R) símbolo lido foi 0


(5, 1, 1, 5, R)
(5, 0, 0, 5, R) mova para a direita, passando do marcador do meio
(5, *, *, 6, R)
126 Guia de Estudos Online

(6, X, X, 6, R) mova passando dos marcadores


(6, 1, X, 3, L) símbolo lido foi 1, volte
(0, *, *, 7, R) não há mais dados à esquerda
(7, X, X, 7, R) passe sobre os marcadores
(7, b, b, 8, R) não há mais dados à direita, pare e aceite

Construindo uma Máquina de Turing para Calcular uma Função


Problema:
Encontre uma máquina de Turing que calcule a função f (n) = 3n.

Solução:
Decida os quíntuplos da máquina de Turing.

Função: 1 6 3 2 6 6 0 6 0
Fita: 11 6 1111 111 6 1111111 161

1bb 6 bbb 6 b1b

0 1 25

(0, 1, b, 1, R) apague o 1 extra


(1, b, 1, 25, R) fita tinha um único 1, coloque de volta

111bbbb... 6 b11bbb... 6 bX1*bb...

0 1 3

(0, 1, b, 1, R) apague o 1 extra


(1, b, 1, 25, R) fita tinha um único 1, coloque de volta
(1, 1, X, 2, R) desmarque um 1
(2, 1, 1, 2, R) mova para a direita
(2, b, *, 3, R) insira um marcador e mude o estado
(2, *, *, 3, R) passe sobre o marcador e mude o estado

bXb*bb... 6 bX1*1b... 6 bX1*11b... 6 bX1*111b...

3 4 5 6

(0, 1, b, 1, R) apague o 1 extra


(1, b, 1, 25, R) fita tinha um único 1, coloque de volta
(1, 1, X, 2, R) desmarque um 1
(2, 1, 1, 2, R) mova para a direita
(2, b, *, 3, R) insira um marcador e mude o estado
(2, *, *, 3, R) passe sobre o marcador e mude o estado
(3, 1, 1, 3, R) mova para a direita procurando uma célula em branco
(3, b, 1, 4, R)
(4, b, 1, 5, R) encontrou célula em branco, escreva três 1s
(5, b, 1, 6, L)
Guia de Estudos Online 127

bX1*111b... 6 bX1*111b... 6 bX1*111b... 6 bX1*111b...

6 6 7 1

(0, 1, b, 1, R) apague o 1 extra


(1, b, 1, 25, R) fita tinha um único 1, coloque de volta
(1, 1, X, 2, R) desmarque um 1
(2, 1, 1, 2, R) mova para a direita
(2, b, *, 3, R) insira um marcador e mude o estado
(2, *, *, 3, R) passe sobre o marcador e mude o estado
(3, 1, 1, 3, R) mova para a direita procurando uma célula em branco
(3, b, 1, 4, R)
(4, b, 1, 5, R) encontrou célula em branco, escreva três 1s
(5, b, 1, 6, L)
(6, 1, 1, 6, L)
(6, *, *, 7, L)
(7, 1, 1, 7, L) mova para a esquerda até o marcador X, comece de novo
(7, X, X, 1, R)

bXX*111111b... 6 bXX1111111b... 6 bbb1111111b...

1 8 8

(0, 1, b, 1, R) apague o 1 extra


(1, b, 1, 25, R) fita tinha um único 1, coloque de volta
(1, 1, X, 2, R) desmarque um 1
(2, 1, 1, 2, R) mova para a direita
(2, b, *, 3, R) insira um marcador e mude o estado
(2, *, *, 3, R) passe sobre o marcador e mude o estado
(3, 1, 1, 3, R) mova para a direita procurando uma célula em branco
(3, b, 1, 4, R)
(4, b, 1, 5, R) encontrou célula em branco, escreva três 1s
(5, b, 1, 6, L)
(6, 1, 1, 6, L)
(6, *, *, 7, L)
(7, 1, 1, 7, L) mova para a esquerda até o marcador X, comece de novo
(7, X, X, 1, R)
(1, *, 1, 8, L) todos os dados processados, adicione um 1 extra
(8, X, b, 8, L) limpe a seção original da fita

Visão Ger al da Seção 9. 5

Nossa tentativa final de “modelagem” trata de linguagens, tanto as linguagens naturais (fala-
das) quanto as linguagens de programação. Consideraremos linguagens formais, a estrutura
abstrata projetada para capturar as propriedades importantes de linguagens “reais”. Certa-
mente, as construções permitidas na linguagem são propriedades importantes. As regras de
sintaxe determinam que, por exemplo,
128 Guia de Estudos Online

O cachorro corre rapidamente

é uma frase aceitável em português, já que segue as regras de sintaxe que esperamos encon-
trar (tem um substantivo e um verbo, por exemplo), enquanto

Rapidamente corre cachorro o

não é aceitável. Note que

Um livro voa lentamente

está correto sintaticamente, tendo exatamente a mesma sintaxe que a primeira frase acima
(artigo, substantivo, verbo, advérbio), mas não faz sentido semanticamente. Em outras pala-
vras, a forma está correta, mas o sentido não está claro.

A sintaxe, tanto das linguagens naturais quanto das linguagens de programação, pode
ser determinada pelas regras de gramática da linguagem. Embora linguagens de progra-
mação inteiras tenham sido completamente especificadas por gramáticas formais, as lin-
guagens naturais não o foram, apesar de gramáticas formais terem aparecido inicialmente
como um esforço para analisar linguagens naturais. O problema é que linguagens naturais
são muito mais complexas e maiores do que linguagens de programação (mesmo lingua-
gens “grandes” como C++).
Uma gramática formal identifica símbolos terminais e símbolos não terminais, além
de um símbolo não terminal específico chamado de símbolo inicial. A gramática também
define produções da forma a 6 b, em que a e b são cadeias que permitem que a seja
substituído por b em qualquer cadeia em que ocorra a. Dessa maneira, pode-se começar
com o símbolo inicial e, usando produções, gerar uma série de cadeias até resultar em uma
cadeia formada por terminais. Tal cadeia de terminais pertence à linguagem especificada
pela gramática.
Um compilador para uma linguagem de programação usa as produções da gramática da
linguagem para determinar se uma asserção ou um comando no programa é, de fato, uma
cadeia de símbolos na linguagem, ou seja, se pode ser gerado do “símbolo inicial” usando
as produções da linguagem. Se a asserção não puder ser gerada assim, então não está sin-
taticamente correta e o compilador vai apontar um erro de sintaxe (com graus variáveis de
facilidade ou ajuda).

Amostra de Solução de Problema


• Problema 1 — Defina uma gramática para gerar uma linguagem dada.

Defina uma Gramática para Gerar uma Linguagem Dada


Problema:
Construa uma gramática que gere a linguagem que consiste em todas as cadeias formadas
com 0 e 1 tais que os dois primeiros caracteres são 00 e o último é 1.

Solução:
Crie as produções que geram todas essas cadeias e nenhuma outra.

Amostras de cadeias em L:

001

0001
0011
00001
00011
Guia de Estudos Online 129

00101
00111
000001
etc.

S 6 00A1

A 6 l | 0A | 1a

Use A 6 l para terminar.

S 6 00A1
A 6 l | 0A | 1A

Gere 0001001

S 6 00A1

S 6 00A1
A 6 l | 0A | 1A

Gere 0001001

S 6 00A1 6 000A1

S 6 00A1
A 6 l | 0A | 1A

Gere 0001001

S 6 00A1 6 000A1 6 0001A1

S 6 00A1
A 6 l | 0A | 1A

Gere 0001001

S 6 00A1 6 000A1 6 0001A1 6 00010A1 6 000100A1

S 6 00A1
A 6 l | 0A | 1A

Gere 0001001

S 6 00A1 6 000A1 6 0001A1 6 00010A1 6 000100A1 6 0001001

Você também pode gostar