You are on page 1of 180

Introduo Programao

uma Abordagem Funcional


Credin Silva de Menezes, Maria Cludia Silva oeres,
Maria C!ristina "alle #auber, $!ais %elena Castro,
Alberto &ogueira de Castro '(nior, Cludia )alarda
"arassin
*e+artamento de In,ormtica - .F/S
*e+artamento de Ci0ncia da Com+utao 1 .FAM
2334
C5&C/I$5S 6SIC5S
787 I&$#5*.9:5
Neste curso o leitor estar se envolvendo com a aprendizagem de conceitos e
mtodos bsicos para a construo de programas de computador. A abordagem
que daremos est voltada para o envolvimento do aprendiz com a soluo de
problemas ao invs da atitude passiva de ver o que os outros fizeram. Uma
questo central que permeia o curso a de que construir programas uma tarefa
de engenharia, e que, portanto produzir artefatos com os quais o ser humano
ter de conviver. Artefatos estes que devem satisfazer requisitos de qualidade e
serem, portanto, passveis de constatao.
!ptamos desenvolver o curso orientado " descrio de fun#es, um
formalismo bastante conhecido por todos os que chegam a este curso.
$speramos, com isso, atenuar algumas dificuldades tpicas do ensino introdut%rio
de programao. Nas se#es seguintes apresentamos alguns conceitos bsicos
que nos parecem importantes ter em mente antes de iniciarmos um curso de
programao.
7828 C5MP.$A*5#/S
&enominamos de computador uma mquina de processar dados, numricos ou
simb%licos, que funciona atravs da e'ecuo de programas. Ao contrrio das
in(meras mquinas que conhecemos, tais como) mquina de lavar roupa,
liquidificador, enceradeira, aspirador de p%, e tantas outras, que realizam uma
(nica funo, o computador uma mquina multiuso. *odemos us+lo como uma
mquina de escrever sofisticada, como uma mquina de fa', como uma prancheta
de desenho sofisticada, como um fichrio eletr,nico, como uma planilha de
clculos e de tantas outras formas. - e'atamente como o nosso conhecido
videogame) para mudar de .ogo basta trocar o cartucho. No videogame, cada novo
.ogo determinado por um novo programa.
$m linhas gerais podemos entender um computador como uma mquina
capaz de)
a/ interpretar dados que lhe so fornecidos, produzindo resultados
em forma de novos dados ou comportamentos, usando para isso
conceitos que lhe foram antecipadamente informados e,
b/ aceitar a descrio de novos conceitos e consider+los na
interpretao de novas situa#es.
Alguns e'emplos de uso de um computador)
/; 7) &escrever para uma mquina a relao mtrica que e'iste entre os
lados de um tri0ngulo ret0ngulo. &e posse desse conhecimento, a mquina
poderia, por e'emplo, determinar o valor de um dos lados quando conhecido o
valor dos outros dois.
1
/; 2) 2nformar a uma mquina as regras de con.ugao de verbos. 3om este
conhecimento a mquina pode determinar a forma correta para um determinado
tempo e pessoa de um verbo especfico.
/; <) 4raduo de te'tos5
/; =) 3lassificao de te'tos quanto " sua natureza) romance, poesia,
documentrio, entrevista, artigo cientfico5
/; 4) 6anipulao de e'press#es algbricas, resoluo de integral
indefinida, etc5
/; >) *rogramao automtica) dada uma certa especificao, gerar um
programa eficiente5
/; ?) 6onitoramento de pacientes em um 3entro de 4ratamento 2ntensivo5
/;@) 2dentificao de tumores no crebro a partir da comparao de imagens
com padr#es conhecidos de anormalidade5
/; A) 7oteamento inteligente de mensagens.
78<8 P#5)#AMA9:5
8 tarefa de identificar o conhecimento necessrio para a descrio de um
conceito, organiz+lo e codific+lo de modo a ser entendido pela mquina damos o
nome de programao de computadores. Ao conhecimento codificado, produto
final da tarefa de programao d+se o nome de programa.
A programao de computadores uma atividade que compreende vrias
outras atividades, tais como) entendimento do problema a ser resolvido,
plane.amento de uma soluo, formalizao da soluo usando uma linguagem de
programao, verificao da conformidade da soluo obtida com o problema
proposto.
78=8 BI&).A)/M */ P#5)#AMA9:5
A descrio de conhecimento para um agente racional qualquer 9se.a uma
mquina ou um humano/ subentende a e'ist:ncia de padr#es segundo os quais o
agente possa interpretar o conhecimento informado. A esses padr#es, quando
rigorosamente elaborados, damos o nome de formalismo. Um formalismo
composto de dois aspectos) a sinta'e e a sem0ntica. A sinta'e permite ao agente
reconhecer quando uma ;seq<:ncia de smbolos; que lhe fornecida est de
acordo com as regras de escrita e, portanto representa um programa. A sem0ntica
permite que o agente atribua um significado ao conhecimento descrito pela
;seq<:ncia de smbolos;. *or e'emplo, quando um agente humano 9com
determinado grau de escolaridade/ encontra a seguinte seq<:ncia de smbolos =>,
?@ U =A, B, CA@, ele por certo reconhecer como uma e'presso algbrica escrita
>
corretamente e, se lembrar dos fundamentos da teoria dos con.untos, associar
esta cadeia como a descrio de um con.unto composto pela unio dos elementos
de dois con.untos menores.
$is aqui algumas observa#es importantes sobre a necessidade de
linguagens de programao)
Ainda no possvel usar linguagem natural para ensinar o
computador a realizar uma determinada tarefa. A linguagem natural,
to simples para os humanos, possui ambig<idades e redund0ncias
que a inviabilizam como veculo de comunicao com os
computadores.
A linguagem nativa dos computadores muito difcil de ser usada,
pois requer do programador a preocupao com muitos detalhes
especficos da mquina, tirando pois ateno do problema.
*ara facilitar a tarefa de programao foram inventadas as linguagens
de programao. $stas linguagens t:m por ob.etivo se colocarem
mais pr%'imo do lingua.ar dos problemas do que do computador em
si. *ara que o programa que escrevemos possa ser DentendidoE pelo
computador, e'istem programas especiais que os traduzem
9compiladores/ ou os que interpretam 9interpretadores/ para a
linguagem do computador.
*odemos fazer um paralelo com o que ocorre quando queremos nos
comunicar com uma pessoa de lngua estrangeira. *odemos escrever
uma carta em nossa lngua e pedir a algum que a traduza para a
lngua de nosso destinatrio ou se quisermos conversar
pessoalmente, podemos usar um intrprete.
7848 P#5P#I/*A*/S */ .M P#5)#AMA
Fazemos programas com a inteno de dotar uma mquina da capacidade de
resolver problemas. Neste sentido, um programa um produto bem definido, que
para ser usado precisa que se.am garantidas algumas propriedades. Aqui fazemos
refer:ncias a duas delas) a correo e o desempenho. A correo pode ser
entendida como a propriedade que assegura que o programa descreve
corretamente o conhecimento que tnhamos inteno de descrever. !
desempenho trata da propriedade que assegura que o programa usar de forma
apropriada o tempo e os recursos da mquina considerada. 3abe aqui alertar aos
principiantes que a tarefa de garantir que um programa foi desenvolvido
corretamente to comple'a quanto " pr%pria construo do programa em si.
Garantir que um programa funciona corretamente condio imprescindvel para
o seu uso e, portanto estaremos dando maior :nfase a esta propriedade.
78>8 PA#A*I)MAS */ BI&).A)/&S */ P#5)#AMA9:5
?
As regras que permitem a associao de significados "s ;seq<:ncias de smbolos;
obedecem a certos princpios. $'istem vrias manifesta#es destes princpios e a
cada uma delas denominamos de paradigma.
Um paradigma pode ser entendido informalmente como uma forma
especfica de se ;pensar; sobre programao. $'istem tr:s grandes grupos de
paradigmas para programao) o procedimental, o funcional e o l%gico. !s dois
(ltimos so freq<entemente referidos como sendo subparadigmas de um outro
mais geral, o paradigma declarativo. ! paradigma procedimental subentende a
organizao do conhecimento como uma seq<:ncia de tarefas para uma mquina
especfica. ! paradigma l%gico requer o conhecimento de um formalismo
matemtico denominado de l%gica matemtica. ! paradigma funcional baseia+se
no uso dos princpios das fun#es matemticas. &e uma forma geral, os
paradigmas declarativos enfatizam o aspecto correo e o procedimental os
aspectos de desempenho. He.am que falamos em ;enfatizam;, o que quer dizer
que apresentam facilidades para descrio e verificao da propriedade
considerada. $ntretanto, em qualquer caso, o programador dever sempre
garantir que os dois aspectos 9correo e desempenho/ se.am atendidos.
78?8 P#5)#AMA9:5 F.&CI5&AB
*ara os fins que aqui nos interessam neste primeiro momento, podemos entender
o computador, de uma forma simplificada, como uma mquina capaz de)
a/ avaliar e'press#es escritas segundo regras sintticas bem definidas, como
a das e'press#es aritmticas que to bem conhecemos 9e'. > I A + J/
obedecendo " sem0ntica das fun#es primitivas das quais ela dotada 9por
e'emplo) as fun#es aritmticas bsicas como somar, subtrair, multiplicar e
dividir/5
b/ aceitar a definio de novas fun#es e posteriormente consider+las na
avaliao de e'press#es submetidas " sua avaliao.
*or enquanto, denominaremos o computador de mquina funcional. A seguir
apresentamos um e'emplo de interao de um usurio com a nossa 6quina
Funcional.
usurio) > I A K 1
sistema) A,A
usurio) f ' L M 9' I L/ K 1
sistema) definio de , foi aceita
usurio) 9f > A/ I 9f CN ?N/
sistema) 1B
Na primeira interao podemos observar que o usurio descreveu uma
e'presso aritmtica e que o sistema avaliou e informou o resultado. Na segunda
interao o usurio descreve, atravs de uma equao, uma nova funo, que ele
A
denominou de , e que o sistema acatou a nova definio. Na terceira interao o
usurio solicita a avaliao de uma nova e'presso aritmtica usando o conceito
recentemente definido e que o sistema faz a avaliao usando corretamente o
novo conceito.
78@8 /CP#/SSD/S A#I$ME$ICAS
A nossa mquina funcional hipottica entende a sinta'e das e'press#es
aritmticas, com as quais todo aluno universitrio . bem familiarizado e capaz
de avali+las usando essas mesmas que regras que . conhecemos.
Sinta;e + 4odo operador aritmtico pode ser entendido, e aqui o ser, como
uma funo que possui dois par0metros. A notao usual para as opera#es
aritmtica a infi'ada, ou se.a, smbolo funcional colocado entre os dois
operandos. Nada impede de pensarmos nele escritos na forma prefi'ada, que a
notao usual para fun#es com n(mero de par0metros diferente de 1. *or
e'emplo, podemos escrever ;+ 3 2; para descrever a soma do n(mero > com o
n(mero 1. As fun#es definidas pelo programador devem ser escritas de forma
prefi'ada, como no e'emplo de interao acima apresentado. 3ombinando essas
duas formas, infi'ada e prefi'ada, podemos escrever e'press#es bastante
sofisticadas.
Avaliao + As e'press#es aritmticas, como sabemos, so avaliadas de
acordo com regras de avaliao bem definidas, efetuando as opera#es de acordo
com suas prioridades. *or e'emplo, na e'presso ;3 + 5 / 2; o primeiro operador a
ser avaliado ser o de diviso 9K/ e posteriormente o de adio. Oe dese.armos
mudar essa ordem, podemos usar par:nteses em qualquer quantidade, desde que
balanceados e em posi#es apropriadas. *or e'emplo, na e'presso ;(3 + 5) / 2;,
a utilizao de par:nteses determina que a sub+e'presso > I A ter prioridade na
avaliao.
78A8 F.&9D/S
*odemos entender o conceito de fun#es como uma associao entre elementos
de dois con.untos A e P de tal forma que para cada elemento de A e'iste apenas
um elemento de P associado. ! con.unto A conhecido como o domnio da
funo, ou ainda como o con.unto de entrada, e o con.unto P o contra+domnio
ou con.unto de sada. *ara ser mais preciso, podemos afirmar que uma funo f ,
que associa os elementos de um con.unto A aos elementos de um con.unto P,
um con.unto de pares ordenados onde o primeiro elemento do par pertence a A o
segundo a P. $'emplos)

a/ Oe.a a funo 4 que associa as vogais do alfabeto com os cinco primeiros
inteiros positivos.
4 M =9a,C/, 9e,1/, 9i,>/, 9o,?/, 9u,A/@
Q
b/ Oe.a a funo R, que associa a cada n(mero natural o seu quadrado.
R M =9N,N/, 9C,C/, 91,?/, 9>,B/, 9?,CQ/, ...@
*odemos observar que a funo 4 um con.unto finito e que a funo R
um con.unto infinito.
78738 */SC#I9D/S F.&CI5&AIS
*odemos descrever um con.unto, de duas formas) extensional, onde e'plicitamos
todos os elementos que so membros do con.unto, como no caso do con.unto 4
apresentado anteriormente5 ou na forma intencional, onde descrevemos um
critrio de pertin:ncia dos membros do con.unto. *or e'emplo, o con.unto R acima
apresentado poderia ser reescrito da seguinte forma)
F G HI;, JK L ; natural e J G ;8;M que pode ser lido da seguinte maneira)
Q o conjunto dos pares ordenados (x, y) tal que x um nmero
natural e y o produto de x por x
Ruando descrevemos uma funo para fins computacionais, estamos
interessados em e'plicitar como determinar o segundo elemento do par ordenado,
conhecido o primeiro elemento do par. $m outras palavras, como determinar L
conhecendo+se o valor de '. Normalmente dizemos que queremos determinar L
em funo de '. Nesta forma de descrio, omitimos a varivel L e e'plicitamos o
primeiro elemento que denominado ento de par0metro da funo. No caso
acima teramos ento)
F x G x 8 x
78778 Por Nue comear a a+rendizagem de +rogramao atravs do
+aradigma ,uncionalO
4endo em vista a prtica vigente de comear o ensino de programao utilizando
o paradigma procedimental, apresentamos a seguir alguns elementos que
baseiam nossa opo de comear o ensino de programao usando o paradigma
funcional.
C/ ! aluno de graduao em 3omputao tem de ? a A anos para
aprender todos os detalhes da rea de computao, portanto no se
.ustifica que tudo tenha que ser absorvido no primeiro semestre. !
curso introdut%rio apenas o primeiro passo e no visa formar
completamente um programador. $ste o momento de apresentar+
lhe os fundamentos e, alm disso, permitir que ele vislumbre a
variedade de problemas que podem ser solucionados como o apoio
do computador5
1/ ! paradigma procedimental requer que o aluno tenha um bom
entendimento dos princpios de funcionamento de um computador
real, pois eles se baseiam, como as mquinas reais, no conceito de
mudana de estados 9mquina de Hon Neumann/.
S
>/ ! paradigma l%gico, outro forte candidato, requer o conhecimento de
l%gica matemtica que o aluno ainda no domina adequadamente5
?/ ! paradigma funcional baseado num conhecimento que o aluno .
est familiarizado desde o ensino mdio 9fun#es, mapeamento
entre domnios/ o qual ainda e'plorado em outras disciplinas do
ciclo bsico, o que nos permite concentrar nossa ateno na
elaborao de solu#es e na descrio formal destas5
A/ ! elevado poder de e'presso das linguagens funcionais permite
que a abrang:ncia do uso do computador se.a percebida mais
rapidamente. $m outras palavras, podemos resolver problemas mais
comple'os . no primeiro curso5
Q/ ! poder computacional do paradigma funcional id:ntico ao dos
outros paradigmas. Apesar disso, ele ainda no usado nas
empresas, por vrios aspectos. &entre os quais podemos citar)
i/ No passado, programas escritos em linguagens funcionais
eram e'ecutados muito lentamente. Apesar disso no ser mais
verdadeiro, ficou a fama5
ii/ A cultura de linguagens procedimentais possui muitos adeptos
no mundo inteiro, o que, inevitavelmente, cria uma barreira "
introduo de um novo paradigma. Afinal, temos medo do
desconhecido e trememos quando temos que nos livrar de algo
que . sabemos5
iii/ T uma crena que linguagens funcionais so difceis de
aprender e s% servem para construir programas de intelig:ncia
artificial.
S/ A inefici:ncia das linguagens funcionais em comparao "s
procedimentais tem se reduzido atravs de alguns mecanismos tais
como) lazL evaluation, grafo de reduo, combinadores.
J/ *ara fazer um programa que ;funciona; 9faz alguma coisa, embora
no necessariamente o que dese.amos/ mais fcil faz:+lo no
paradigma procedimental. *ara fazer um programa que funciona
;corretamente; para resolver um determinado problema mais fcil
no paradigma funcional, pois esse paradigma descreve ;o que fazer;
e no ;como fazer;.
B/ As linguagens funcionais so geralmente utilizadas para
processamento simb%lico, ou se.a, soluo de problemas no
numricos. 9$'emplo) integrao simb%lica U integrao numrica/.
Atualmente constata+se um crescimento acentuado do uso deste tipo
de processamento.
CN/ A crescente difuso do uso do computador nas mais diversas reas
do conhecimento gera um crescimento na demanda de produo de
programas cada vez mais comple'os. !s defensores da
programao funcional acreditam que o uso deste paradigma se.a
J
uma boa resposta a este problema, visto que com linguagens
funcionais podemos nos concentrar mais na soluo do problema do
que nos detalhes de um computador especfico, o que aumenta a
produtividade.
CC/ Oe mais nada .ustificar o aprendizado de uma linguagem funcional
como primeira linguagem, resta a e'plicao didtica. $stamos
dando um primeiro passo no entendimento de programao como
um todo. -, portanto, importante que este passo se.a simplificado
atravs do apoio em uma ;mquina; . conhecida, como o caso
das fun#es.
C1/ Ainda um outro argumento) mesmo que tenhamos que usar
posteriormente uma outra linguagem para ter uma implementao
eficiente, podemos usar o paradigma funcional para formalizar a
soluo. Oendo assim, a verso em linguagem funcional poderia
servir como uma especificao do programa.
/;ercPciosQ
C. 3onceitue programao de computadores.
1. Ruais os principais paradigmas de programao e o que os diferenciam.
>. Faa uma descrio intencional da funo) F M =C,>,A,S,...@.
?, Faa uma listagem de outros e'emplos de programas de computador que so
usados ho.e em diferentes reas do conhecimento e por diferentes profissionais.
A. Apresente e'emplo de outras linguagens tcnicas usadas pelo ser humano para
descrever conhecimento.
Q. !s conceitos de correo e de desempenho, se aplicam a qualquer artefato.
$scolha > artefatos quaisquer e discuta os dois conceitos.
S. Apresente uma descrio informal da funo que con.uga os verbos regulares
da C
a
. con.ugao.
B
28 A Binguagem de Programao %asRell e o ambiente %.)S
2878 I&$#5*.9:5Q Neste curso usaremos o ambiente TUGO, no qual utilizada
uma implementao da linguagem de programao funcional TasVell. $ssa
linguagem por apresentar uma sinta'e simples e elegante, alm de oferecer
operadores bastante e'pressivos, tem sido usada com bons resultados para a
aprendizagem de fundamentos de programao.
*odemos usar o TUGO como uma calculadora qualquer, " qual submetemos
e'press#es que ela avalia e nos informa o valor resultante. He.amos por e'emplo
a interao a seguir.
O > I A W 1
C>
O 9> I A/ W 1
CQ
O
Nas e'press#es acima importante destacar o uso do smbolo W 9asterisco/
que empregado para representar a multiplicao. Alm desse, outros smbolos
usuais sero substitudos, como veremos logo mais. As opera#es aritmticas
so, como sabemos, fun#es. A notao utilizada em TasVell para as opera#es
aritmtica a usual, ou se.a, infi'ada 9o smbolo da operao fica entre os
operandos/. Uma outra forma que pode ser usada para escrever e'press#es
usando o operador de forma prefi'ada. *or e'emplo, di! "5 # , indica a diviso
inteira do n(mero CA 9dividendo/ pelo n(mero Q 9divisor/.
! smbolo de maior 9$/ usado pelo sistema para indicar que est preparado
para avaliar uma nova e'presso. Ap%s avaliar uma e'presso o TasVell informa o
resultado na linha seguinte e em seguida e'ibe uma nova interrogao, se
disponibilizando para uma nova avaliao. *odemos e'plicar o seu funcionamento
conforme o esquema da figura abai'o. $m outras palavras, o ambiente TUGO
estabelece uma repetio para leitura de uma e'presso, avaliao de uma
e'presso e e'ibio do resultado, conforme se ilustra no esquema a seguir..
*odemos usar o ambiente TUGO somente para isso, para escrever
e'press#es e solicitar ao sistema que as avalie. $ntretanto podemos ousar mais e
usar o ambiente para descrever novas fun#es a partir das fun#es . oferecidas
pelo ambiente. *odemos tambm utilizar nessas novas defini#es as pr%prias
defini#es que tivermos construdo anteriomente.
2828 */SC#I9:5 */ F.&9D/SQ A forma de descrever fun#es similar ao que
nos referimos anteriormente no captulo C, ou se.a, atravs de uma equao, onde
no lado esquerdo da igualdade damos um nome " funo e relacionamos os
par0metros considerados na sua definio. No lado direito escrevemos uma
e'presso utilizando outras fun#es, primitivas ou no. 2sto nos leva portanto a
tomar conhecimento que a linguagem possui fun#es primitivas que . a
acompanham e que portanto prescindem de definio.
*or e'emplo, para definir a funo que determina o espao percorrido por
um m%vel em movimento retilneo uniforme, conhecidos a sua velocidade e o
tempo decorrido, podemos escrever)
espaco ! t % ! & t
No esquema a seguir fazemos uma identificao didtica dos vrios
elementos da definio.! lado esquerdo da igualdade tambm chamado de
inteface ou assinatura da funo e o lado direito o corpo da definio.
espaco v t M v W t
nome da
funo
par0metros
e'presso aritmtica que define a
relao que h entre os par0metros
interface da funo corpo da definio
*ara alimentar o TUGO com novas defini#es devemos criar um arquivo em
disco no qual editaremos as defini#es dese.adas. 3ada arquivo pode ter uma ou
mais defini#es. Normalmente agrupamos em um mesmo arquivo as defini#es
relacionadas com a soluo de um problema especfico ou defini#es de prop%sito
C
C
geral. No .argo de programao com a linguagem TasVell, um con.unto de
defini#es denominado de script.
A alimentao de novas defini#es indicada ao sistema atravs de um
comando que usado no lugar de uma e'presso, quando o sistema e'ibe o seu
pedido de tarefa 9o smbolo de interrogao. *ara indicar que estaremos dando
um comando usamos o smbolo ; Q ; 9dois pontos/ seguido do nome do comando
9e'istem vrios/. *ara a tarefa que temos neste instante utilizamos o comando
load 9oportunamente veremos outros/.
*or e'emplo, podemos escrever um con.unto de defini#es em um arquivo
denominado p'(((")s. *ara alimentar este arquivo no ambiente TUGO podemos
escrever)
S Qload +,3378!s
A partir deste momento, todas as defini#es contidas no arquivo informado
estaro disponveis para uso. *odemos entender isso como fazer uma e'tenso
da mquina TasVell. Na figura 1.C apresentamos um esquema de utilizao do
ambionete TUGO e de um editor de te'tos para provimento de novas defini#es.
Hale aqui um pequeno lembrete, podemos estender a noo de fun#es para
incorporar tambm as chamadas fun#es constantes, ou se.a, aquelas que no
possuem domnio, apenas contradomnio. Na nomenclatura de defini#es dizemos
que temos defini#es paramtricas e defini#es no paramtricas.
*or e'emplo, podemos definir a constante pi, da seguinte maneira)
pi = 3.1416
$ditor
de te'to
Arquivo com
defini#es
2nterpretador
TUGO
programador
Figura 1.C X 2ntera#es do *rogramador com o Ambiente de
*rogramao
C
1
28<8 .M /C/MPB5Q 3onsidere que queremos descrever uma funo para
determinar as razes de uma equao do segundo grau.
Oabemos que pela nossa clssica f%rmula as razes so descritas
genericamente por)
A soluo, como sabemos, formada por um par de valores. *or enquanto
vamos descrever este fato por duas fun#es, uma para a primeira raiz e outra para
a segunda.
eq2g1 a b c = ((-b) + sqrt (b^2 - 4! " a " c )) # (2! " a)
Hamos discutir alguns detalhes desta codificao)
o termo *+ precisa ser codificado entre par:ntesis pois n(meros negativos
so obtidos por um operao unria que produz um n(mero negativo a partir de
um positivo5
o smbolo da raiz quadrada foi substitudo pela funo sqrt5
o numerador da frao precisa ser delitimado pelo uso de par:ntesis5
o denominador tambm precisa ser delimitado por par:ntesis5
o smbolo de multiplicao usual foi trocado pelo W 9asterisco/5
o smbolo de potenciao foi substitudo pelo Y 9circunfle'o/.
*odemos agora descrever a outra raiz de forma anloga)
eq2g2 a b c = ((-b) - sqrt (b^2 - 4! " a " c )) # (2! " a)
Histo que as duas possuem partes comuns, poderamos ter escrito
abstra#es au'iliares e produzir um con.unto de defini#es, tal como)
quad ' M x " x
raizdelta a b c M sqrt ( quad b - 4! " a " c )
dobro x = 2! " x
eq2g1 a b c = ((-b) + rai$delta a b c) # dobro a
eq2g2 a b c = ((-b) - rai$delta a b c) # dobro a

He.amos como ficaria uma interao com o TUGO, a partir de um arquivo de
defini#es denominado eN2g8gs)
% ,l eq2ggs
&eading script file 'eq2ggs'(
)as*ell session for(
C
>
standardprelude
eq2ggs
Z eq1gC 1.N A.N 1.N
+N.A
Z eq1g1 1.N A.N 1.N
+1.N
Z eq1gC >.N ?.N A.N
+rogram error( ,sqrt (-44!)-
*odemos observar que houve um problema com a avaliao da e'presso
eq2-" 3( .( 5(
/ste um erro sem0ntico, pro!ocado pela tentati!a de extrair a rai1
quadrada de um nmero ne-ati!o 2 'un34o que de'inimos portanto uma
'un34o parcial, ou seja, ela n4o est de'inida para todo o dom5nio dos
reais 6este caso o sistema apenas acusa o pro+lema ocorrido
28=8 */FI&I9D/S B5CAISQ As defini#es que discutimos anteriormente so
globais, no sentido de que esto acessveis ao uso direto do usurio e tambm
disponveis para uso em qualquer outra definio. *or e'emplo, se temos o scriptQ
quad ' M ' W '
hipo ' L M sqrt 9 quad ' I quad L/
*odemos utilizar a definio quad tanto e'ternamente pelo usurio quanto
internamente pela definio )ipo.
Oe no entanto dese.amos construir subdefini#es para uso em uma
definio especfica, podemos defini+las internamente, restringindo o seu conte'to
A maneira de introduzir defini#es locais utilizando a clusula 7)ere Hamos
modificar o script acima para que quad s% possa ser usado no interior de )ipo.
hipo ' L M sqrt 9 quad ' I quad L/
[here
quad ' M ' W '

As defini#es internas tambm no precisam ser paramtricas. He.a este
outro e'emplo.
hipo ' L M sqrt 9 VC I V1/
[here

VC M ' W '
V1 M L W L
C
?

Note que apesar de x e y no serem par0metros de 8" e 82 eles foram
utilizados em suas defini#es. 2sto possvel porque x e y t:m validade em todo o
lado direito da definio.
4emos que considerar ainda que nada impede que em uma definio local
tenhamos uma outra definio local e dentro desta outra, e assim sucessivamente.
hipo ' L M sqrt V
[here
V M quad ' I quad L
[here
quad ' M ' W '

2848 M5*/B5 */ A"ABIA9:5 */ /CP#/SSD/SQ Ruando o avaliador do
TUGO toma uma e'presso contendo apenas constantes e opera#es primitivas,
ele apenas efetua as opera#es obedecendo " prioridade dos operadores e
aquelas determinadas pelo uso de par:ntesis. *or e'emplo, para avaliar a
e'presso > I A K 1, primeiro realizada a diviso AK1, resultando em 1.A, o qual
adicionado ao >, finalmente obtendo A.A. *odemos entender isso como uma
seq<:ncia de redu#es de uma e'presso " outra mais simples, at que se atin.a
um termo irredutvel. He.a os e'emplos a seguir)
> I A K 1 > I 1.A A.A
9> I A/ K 1 J K 1 ?
> I A I 1 J I 1 CN
As setas 9/ so usadas para indicar um passo de reduo.
Ruando as e'press#es utilizam fun#es definidas pelo usurio, o processo
anlogo. 3ada refer:ncia " uma definio substituda por seu lado direito, at
que se atin.a uma e'presso bsica, e prossegue como no caso anterior. He.amos
os e'emplos abai'o, considerando a primeira definio de )ipo e de quad
apresentada anteriormente)

ordem e'presso
reduo
aplicada
C hipo > A I hipo ? ?
e'presso
inicial
1 sqrt 9 quad > I quad A/ I hipo ? ? def de hipo
> sqrt 9 > W > I quad A/ I hipo ? ?
def de
quad
? sqrt 9> W > I A W A/ I hipo ? ?
def de
quad
A sqrt 9> W > I A W A/ I sqrt 9quad ? I quad ?/ def de hipo
Q sqrt 9> W > I A W A/ I sqrt 9? W ? I quad ?/
def de
quad
S sqrt 9> W > I A W A/ I sqrt 9? W ? I ? W ?/ def de
C
A
quad
J sqrt 9B I A W A/ I sqrt 9? W ? I ? W ?/ W
B sqrt 9B I 1A/ I sqrt 9? W ? I ? W ?/ W
CN sqrt >? I sqrt 9? W ? I ? W ?/ I
CC A.J>NBA I sqrt 9? W ? I ? W ?/ sqrt
C1 A.J>NBA I sqrt 9CQ I ? W ?/ W
C> A.J>NBA I sqrt 9CQ I CQ/ W
C? A.J>NBA I sqrt 9>1/ I
CA A.J>NBA I A.QAQJA sqrt
CQ CC.?JSJ I

*ara uma realizao especfica da linguagem, isso no precisa acontecer
e'atamente assim. $ntretanto este modelo suficiente para nossos interesses. !
n(mero de redu#es necessrias para chegar " forma irredutvel de uma
e'presso, tambm denominada de forma can,nica ou ainda forma normal, pode
ser usado como critrio para discutir o desempenho da mesma.
$'erccios
C. $stabelea categorias para comparar duas defini#es5
1. Usando as categorias definidas no item C compare as duas defini#es
apresentadas para as razes de uma equao do segundo grau5
>. 3ompare usando as suas categorias, as tr:s defini#es apresentadas para
hipo5
?. Apresente uma e'plicao para o erro produzido pela avaliao da
e'presso eq2-" 3( .( 5(
A. Apresente uma seq<:ncia de redu#es para a e'presso)
eq2-" 2( 5( 2(
Q. Apresente um con.unto de defini#es para a funo total para a
determinao das razes de uma equao do segundo grau.
28>8 ASSI&A$.#A */ F.&9D/S / A &5$A9:5 C.##TQ &o estudo de
fun#es sabemos que toda funo possui um domnio e um contradomnio. !
domnio pode ser formado por zero ou mais con.untos. Ruando uma funo no
possui domnio dizemos que uma funo constante. *ara descrever este
conhecimento sobre domnio e contradomnio usado o conceito de DassinaturaE,
do ingl:s DsignatureE. *or e'emplo, na funo que determina a mdia aritmtica de
> n(meros reais, temos que o domnio formado pelo produto cartesiano R x R
X R e o contradomnio R.
A assinatura desta funo a seguinte)
ma3 :: R X R X R R
C
Q
$m TasVell poderamos ter a seguinte definio)
ma3 x y z = (x + y + z) / 3.
- usual tambm dizer R X R X R R o tipo da funo ma3.
*ara simplificar o trabalho com fun#es o matemtico TasVell 3urL criou uma
nova notao, que considera que qualquer funo tem sempre um (nico
par0metro de entrada. Oegundo ele, o resultado de aplicar uma funo sobre um
par0metro produz uma nova funo que pode ser aplicada a outro par0metro, e
assim sucessivamente. *or e'emplo, nesta notao, a funo ma3 teria a
seguinte assinatura)
ma3 :: R R R R
*odemos ler da seguinte maneira) ma3 uma funo que mapeia um numero real
em uma nova funo cu.a assinatura )
ma3 :: R R R.
A funo ma3 por sua vez mapeia um n(mero real em uma nova funo cu.a
assinatura )
ma3 :: R R.
A funo ma3 por sua vez mapeia um n(mero real em uma nova funo cu.a
assinatura )
ma3 :: R.
Rue uma funo constante.
$m captulos posteriores veremos as vantagens desta notao introduzida por
TasVell, conhecida por notao 3urrL. *or enquanto podemos afirmar que essa
facilidade vem do fato que nesta notao as fun#es possuem propriedades
equivalentes "s dos dados.
C
S
<8 A Arte de #esolver Problemas
<878 I&$#5*.9:5Q ! grande ob.etivo deste curso criar oportunidades para que
o estudante desenvolva suas habilidades como resolvedor de problemas. 6ais
especificamente estamos interessados na resoluo de problemas usando o
computador, entretanto, temos certeza, que as idias so gerais o suficiente para
a.udar a resolver qualquer problema.
$mbora muitas pessoas . tenham discutido sobre este assunto ao longo da
hist%ria, nosso principal referencial ser o professor George *olLa, que escreveu
um livro sobre este assunto, com o mesmo nome deste captulo, voltado para a
resoluo de problemas de matemtica do ensino fundamental. 4odos os alunos
deste curso tero grande proveito se lerem este livro.
As idias ali apresentadas com certeza se aplicam com muita propriedade "
resoluo de problemas com o computador. Na medida do possvel estaremos
apresentando aqui algumas adapta#es que nos parecem apropriadas neste
primeiro contato com a resoluo de problemas usando o computador.
<828 *ICAS I&ICIAIS: apresenta+se a seguir algumas orienta#es:
>.1.C. O% se aprende a resolver problemas atravs da e'peri:ncia. \ogo o
aluno que est interessado em aprender deve trabalhar, buscando resolver por si
mesmo, os problemas propostos antes de tentar o au'lio do professor ou de outro
colega5
>.1.1. A a.uda do professor no deve vir atravs da apresentao pura e
simples de uma soluo. A a.uda deve vir atravs do fornecimento de pistas que
a.udem o aluno a descobrir a soluo por si mesmo5
>.1.>. - muito importante no se conformar com uma (nica soluo. Ruanto
mais solu#es encontrar, mais hbil o estudante ficar, e alm disso, poder
comparar as vrias alternativas e escolher a que lhe parecer mais apropriada. A
escolha dever sempre ser baseada em critrios ob.etivos.
>.1.?. Na busca pela soluo de um problema, nossa ferramenta principal o
questionamento. &evemos buscar formular quest#es que nos a.udem a entender o
problema e a elaborar a soluo.
>.1.A. Aprenda desde cedo a buscar um aprimoramento da sua tcnica para
resolver problemas, crie uma sistematizao, evite chegar na frente de um
problema como se nunca tivesse resolvido qualquer outro problema. 3onstrua um
processo individual e v aperfeioando+o " cada vez que resolver um novo
problema.
<8< C5M5 #/S5B"/# .M P#5B/MAQ ! professor *olLa descreve a
resoluo de um problema como um processo comple'o que se divide em quatro
etapas, as quais apresentamos aqui, com alguma adaptao. Oegundo nos
recomenda *olLa, em qualquer destas etapas devemos ter em mente tr:s
quest#es sobre o andamento do nosso trabalho, que so) *or onde comear esta
etapa] ! que posso fazer com os elementos que disponho] Rual a vantagem de
proceder da forma escolhida]
C
J
/ta+a 7 - Com+reenso do Problema
- impossvel resolver um problema sobre o qual no tenhamos um
entendimento adequado. *ortanto, antes de correr atrs de uma soluo,
concentre+se um pouco em identificar os elementos do problema. Faa perguntas
tais como) Ruais so os dados de entrada] ! que dese.amos produzir como
resultado] Rual a relao que e'iste entre os dados de entrada e o resultado a ser
produzido] Ruais so as propriedades importantes que os dados de entrada
possuem]
/ta+a 2 - PlaneUamento
Nesta fase devemos nos envolver com a busca de uma soluo para o
problema proposto. *ode ser que . o tenhamos resolvido antes, para dados
ligeiramente modificados. Oe no o caso, pode ser que . tenhamos resolvido
um problema parecido. Rual a relao que e'iste entre este problema que temos e
um outro problema . conhecido] Oer que podemos quebrar o problema em
problemas menores] Oer que generalizando o problema no chegaremos a um
outro . conhecido] 3onhecemos um problema parecido, embora mais simples, o
qual quando generalizado se apro'ima do que temos]
/ta+a < - *esenvolvimento
$scolhida uma estratgia para atacar o problema, devemos ento caminhar
para a construo da soluo. Nesta fase, devemos considerar os elementos da
linguagem de programao que iremos usar, respeitando os elementos
disponibilizados pela linguagem, tais como tipos, formas de definio,
possibilidades de generalizao e uso de elementos anteriormente definidos. A
seguir, devemos codificar cada pedao da soluo, e garantir que cada um este.a
descrito de forma apropriada. $m outras palavras, no basta construir, temos que
ser capazes de verificar se o resultado de nossa construo est correto. 2sto
pode ser realizado pela identificao de inst0ncias tpicas, da determinao dos
valores esperados por estas, da submisso dessas inst0ncias ao avaliador e
finalmente, da comparao dos resultados esperados com os resultados
produzidos pela avaliao de nossas defini#es. Alm disso, devemos garantir
que a definio principal tambm est correta.
$m sntese, a fase de desenvolvimento compreende as seguintes subfases)
C. construo da soluo5
1. plane.amento do teste5
>. teste com o computador de mesa5
?. codificao da soluo5
A. teste com o uso do computador.
/ta+a = - Avaliao do Processo e seus resultados
! trabalho do resolvedor de problemas no pra quando uma soluo est
pronta. &evemos avaliar a qualidade da soluo, o processo que realizamos e
questionar as possibilidades de uso posterior da soluo obtida e tambm do
pr%prio mtodo utilizado. Novamente devemos fazer perguntas) $ste foi o melhor
caminho que poderia ter sido usado] Oer que desdobrando a soluo no
obtenho componentes que poderei usar mais facilmente no futuro] Oe esta
C
B
soluo for generalizada possvel reus+la mais facilmente em outras situa#es]
7egistre tudo, organize+se para a resoluo de outros problemas. Anote suas
decis#es, enriquea a sua biblioteca de solu#es e mtodos.
<8=8 .M P/F./&5 /C/MPB5Q
/nunciado) &ese.a+se escrever um programa que permita determinar a menor
quantidade de cdulas necessrias para pagar uma dada quantia em 7eais.
/ta+a 7 1 Com+reenso
Ruesto) Ruais os dados de entrada]
7esposta) A quantia a ser paga.
Ruesto) Rual o resultado a ser obtido]
7esposta) A menor quantidade de cdulas.
Ruesto) Rual a relao que e'iste entre a entrada e a sada]
7esposta) ! somat%rio dos valores de cada cdula utilizada deve ser igual "
quantia a ser paga.
Ruesto) $'iste algum elemento interno, ou se.a, uma dado implcito]
7esposta) Oim, os tipos de cdulas e'istentes.3onsidere que o 7eal possui
apenas as seguintes cdulas) C, A, CN, AN e CNN. - importante observar que
qualquer cdula um m(ltiplo de qualquer uma das menores.
/ta+a 2 - PlaneUamento
3onheo algum problema parecido] $'iste um problema mais simples]
*odemos entender como um problema mais simples um que busque
determinar quantas cdulas de um dado valor so necessrias para pagar a
quantia dese.ada. *or e'emplo, para pagar 7^ 1JB,NN poderamos usar 1JB
cdulas de 7^ C,NN. !u tambm poderamos usar A notas de 7^ AN,NN, mas
neste caso ficariam ainda faltando 7^ >B,NN. 3laro que no queremos que
falte nem que sobre e, alm disso, dese.amos que a quantidade se.a mnima.
*arece uma boa estratgia comear vendo o que d para pagar com a
maior cdula e determinar quando falta pagar. ! restante pode ser pago com
uma cdula menor, e por a afora. $'plorando a inst0ncia do problema .
mencionada, vamos fazer uma tabela com estes elementos.
$'presso para
determinar a
quantidade de cdulas
de um determinado
valor.
Ruantidade de
cdulas
Ruantia a *agar
1JB,NN
1JB K CNN 1 JB,NN
1
N
JBK AN C >B,NN
>BK CN > B,NN
BK A C ?,NN
?K C ? N,NN
$5$AB 77

/ta+a < - *esenvolvimento
Ooluo C + 3onsiderando a tabela acima descrita, codificando cada linha
como uma sube'presso da definio.
ncedulas q M 9div q CNN/ I
9div 9mod q CNN/ AN/ I
9div 9mod 9mod q CNN/ AN/ CN/ I
9div 9mod 9mod 9mod q CNN/ AN/ CN/ A/I
9div 9mod 9mod 9mod 9mod q CNN/ AN/ CN/ A/ C/
Ooluo 1 + 3onsiderando uma propriedade das cdulas, ou se.a, . que uma
cdula qualquer m(ltiplo das menores, a determinao do resto no precisa
considerar as cdulas maiores do que a cdula que estamos considerando em um
dado ponto.
ncedulas1 q M 9div q CNN/ I
9div 9mod q CNN/ AN/ I
9div 9mod q AN/ CN/ I
9div 9mod q CN/ A/I
9div 9mod q A/ C/
/ta+a = - Avaliao
A soluo dei'a de e'plicitar as abstra#es referentes " quantidade de
cdulas de um determinado valor, assim como o resto correspondente. *odemos
questionar, no seria melhor e'plicitar] Assim poderamos us+las de forma
independente e alm disso, a soluo fica mais clara e portanto inteligvel.
ncedulas q M nCNN q I nAN q I nCN q I nA q I nC q
nCNN q M div q CNN
rCNN q M mod q CNN
nAN q M div 9rCNN q/ AN
rAN q M mod 9rCNN q/ AN
nCN q M div 9rAN q/ CN
rCN q M mod 9rAN q/ CN
nA q M div 9rCN q/ A
rA q M mod 9rCN q/ A
nC q M div 9rCN q/ A
1
C
Oupondo que no queremos generalizar todas as fun#es menores ainda
poderamos escrever o programa usando defini#es locais.
ncedulas q M nCNN I nAN I nCN I nA I nC
[here

nCNN M div q CNN
rCNN M mod q CNN
nAN M div rCNN AN
rAN M mod rCNN AN
nCN M div rAN CN
rCN M mod rAN CN
nA M div rCN A
nC M mod rCN A

*odemos ainda considerar que se houver uma troca no sistema, de modo a
incluir uma nova cdula que no se.a m(ltiplo de seus valores menores. Oeria fcil
mudar o programa para contemplar a mudana nas leis do mundo do problema.
<848 P#5"E#I5SQ ! professor *olLa tambm nos sugere que a lembrana de
alguns provrbios pode a.udar o aprendiz 9e o resolvedor de problemas/ a
organizar o seu trabalho. &iz *olLa que, apesar dos provrbios no se
constiturem em fonte de sabedoria universalmente aplicvel, seria uma pena
desprezar a descrio pitoresca dos mtodos heursticos que apresentam.
Alguns so de ordem geral, tais como)
. fim indica aos meios
/eus mel0ores amigos so . que1 +or que1 .nde1 2uando e 3omo
pergunte . que1 pergunte +or que1 pergunte .nde1 pergunte 2uando e pergunte
3omo - e no pergunte a ningu4m quando precisar de consel0o
5o confie em coisa alguma1 mas s6 du7ide daquilo que merecer d87ida
.l0e em torno quando encontrar o primeiro cogumelo ou fi$er a primeira
descoberta9 ambos surgem em grupos

A seguir apresentamos uma lista deles, organizados pelas etapas "s quais
parecem mais relacionados.
/ta+a 7 Q Com+reenso do +roblema.
2uem entende mal1 mal responde
+ense no fim antes de comear
. tolo ol0a para o comeo1 o s:bio 7; o fim
1
1
. s:bio comea pelo fim1 o tolo termina no comeo
/ta+a 2 Q PlaneUamento da soluo8
< perse7erana 4 a me da boa sorte
5o se derruba um car7al0o com uma s6 mac0adada
/e no princ=pio no conseguir1 continue tentando
>xperimente todas as c0a7es do mol0o
?ele@a-se conforme o 7ento
Aaamos com pudermos se no pudermos fa$er como queremos
. s:bio muda de opinio1 o tolo nunca
Banten0a duas cordas para um arco
Aaa e refaa que o dia 4 bastante longo
. ob@eti7o da pescaria no 4 lanar o an$ol mas sim pegar o peixe
. s:bio cria mais oportunidades do que as encontra
. s:bio fa$ ferramentas daquilo que l0e cai Cs mos
Aique sempre de ol0o na grande ocasio
/ta+a <Q Construo da soluo.
.l0e antes de saltar
+ro7e antes de confiar
Dma demora prudente torna o camin0o seguro
2uem quiser na7egar sem risco1 no se faa ao mar
Aaa o que puder e espere pelo mel0or
E f:cil acreditar naquilo que se dese@a
Fegrau a degrau sobe-se a escada
. que o tolo fa$ no fim1 o s:bio fa$ no princ=pio
/ta+a =Q Avaliao da soluo.
5o pensa bem quem no repensa
E mais seguro ancorar com dois ferros
/;ercPcios
C/ 3ompare as duas defini#es para a funo que descreve o n(mero
mnimo de cdulas para pagar uma quantia q, ncedulas e ncedulas15
1/ &esenvolva a soluo para o problema da cdulas considerando o
fato de que o 7eal possui notas de 1 e notas de 1N. ! que muda]
>/ Apresente tr:s problemas semelhante ao das cdulas5
1
>
?/ &esenvolva uma soluo para o problema considerando que para
cada tipo de cdula e'iste um quantidade limitada 9maior ou igual a
zero/5
1
?
=8 AS$#A9:5, )/&/#ABIVA9:5, I&S$A&CIA9:5 / M5*.BA#IVA9:5
=878 I&$#5*.9:5: Na busca por resolver um problema podemos usar vrios
princpios, cada um evidentemente ter uma utilidade para a resoluo do
problema, ou para garantia de sua correo ou ainda para facilitar os usos
posteriores da soluo que obtivermos. Apresentamos a seguir alguns deles.
=828 AS$#A9:5Q Ruando escrevemos uma e'presso e no damos nome a
ela, o seu uso fica limitado "quele instante especfico. *or e'emplo, suponha que
dese.amos determinar a hipotenusa de um tri0ngulo ret0ngulo com catetos CN e ?.
3omo conhecemos o teorema de *itgoras 9a
1
M b
1
I c
1
/, podemos usar
diretamente nossa mquina funcional para avaliar a seguinte e'presso)

S sNrt II7383 W 7383KX I=83 W =83KK
CN.SSN>
S
A e'presso que codificamos serve apenas para esta vez. Oe em algum
outro instante precisarmos avalia+lateremos que codific+la novamente.
*ara evitar isso, que damos nomes "s nossas e'press#es, para que
possamos us+las repetidamente, apenas referenciando+as pelo seu nome. No
caso acima, poderamos escrever a definio)
!i+otenusa G sNrt II7383 W 7383KX I=83 W =83KK
&e posse dessa definio nossa mquina poder avaliar a e'presso
sempre que dela precisarmos., basta escreve+la)
S !i+otenusa
CN.SSN>
Hoc: pode agora estar se perguntando, porque no trocamos a definio
para usar diretamente o valor "(99(3]
!i+otenusa G "(99(3
Agindo assim a mquina no precisaria avaliar a e'presso sqrt (("(( &
"(()+ (.( & .()) a cada uso. *or outro lado no ficaria registrada a origem do
valor "(99(3., com o tempo perderamos esta informao. &e qualquer forma,
teramos criado uma abstrao " qual denominamos )ipotenusa.
!utra pergunta pode estar rondando a sua cabea, por que escrever uma
definio que sempre avaliada para o mesmo valor, por que no generaliza+la]
Pom, este foi apenas um recurso didtico para separar os dois conceitos, a
abstrao que acabamos de apresentar a generalizao que apresentaremos a
seguir. No entanto convm lembrar que algumas defini#es so realmente
constantes e que no so de grande utilidade, como o caso da seguinte definio)
1
A
pi M >.C?CQ
=8<8 )/&/#ABIVA9:5) Ruando uma abstrao se aplica a vrios valores
podemos generaliz+la. Assim, alm de us+la vrias vezes para os mesmos
valores, podemos tambm us+la para valores diferentes. $sta ultima alternativa
evidentemente facilita o seu reuso.
Hamos apresentar duas formas para fazer isso.
a/ $laborando a definio usando outras defini#es constantes. *or e'emplo,
no caso da definio acima para a hipotenusa, poderamos escrever as defini#es
a seguir)
b G 7383
c G =83
!i+otenusa G sNrt II b W bK X I c W cKK
Aqui, )ipo se aplica a dois valores quaisquer + e c, os quais so ob.etos de
outras defini#es.
b/Uma forma mais geral atravs do conceito de parametrizao. $sta
consiste em indicar no cabealho da definio 9lado esquerdo da igualdade/ quais
so os ob.etos da generalizao. *ara o e'emplo que estamos trabalhando,
podemos escrever)
!i+otenusa b c G sNrt II b W bK X I c W cKK
4emos ento descrito a funo paramtrica )ipotenusa cu.os par0metros
so + e c.
=8<87 I&S$A&CIA9:5Q A parametrizao permite que usemos a mesma definio
para diferentes inst0ncias do problema. *or e'emplo, suponha que dese.amos
determinar a hipotenusa de tr:s tri0ngulos ret0ngulos. ! primeiro com catetos CN e
?, o segundo com catetos >A e CJ e o terceiro com catetos B e C1. *odemos
instanciar a definio paramtrica para estabelecer a seguinte interao)
S !i+o 7383 =83
CN.SSN>
9A reductions, ?1 cells/
S !i+o <483 7@83
>B.>AS>
9A reductions, ?> cells/
S !i+o A83 7283
CA.N
9A reductions, >J cells/
S
1
Q
=8=8 M5*.BA#IVA9:5Q $m geral, nossos problemas no sero to simples e
diretos quanto o e'emplo acima. Ruando nos deparamos com problemas maiores,
um bom princpio )
:i!ida para 'acilitar a conquista
Pasicamente este princpio consiste em quebrar o problema inicial em
problemas menores, elaborar a soluo para cada um dos problemas menores e
depois combin+las para obter a soluo do problema inicial. A cada um dos
subproblemas encontrados podemos reaplicar o mesmo princpio. Oegundo *olLa,
esta uma heurstica muito importante " qual ele denomina de &ecomposio e
3ombinao. Antes de pensar em codificar a soluo em uma linguagem de
programao especfica, podemos represent+la atravs de um esquema grfico
denominado de estrutura modular do problema 9ve.a a representao para o
problema a seguir/.
=8>8 M5*.BA#IVA&*5: 3onsidere o problema de descrever rea da figura Fig
?.C abai'o.
Figura 4.1 Um polgono irregular para o qual desejamos
determinar a sua rea
3omo podemos concluir por uma inspeo da figura, no e'iste uma f%rmula
pronta para calcular sua rea. *recisamos dividir a figura em partes para as quais
conheamos uma maneira de calcular a rea e que, alm disso, conheamos as
dimens#es necessrias.
1
S
*odemos fazer vrias tentativas, como por e'emplo, as ilustradas nas figuras
Fig. ?.1 a, Fig. ?.1 b e Fig. ?.1 c.
a b c
Figura ?.1 X *ossveis subdivis#es do polgono
apresentado na Figura ?.C.

*odemos tentar descrever a rea das figuras menores em cada uma das
figuras apresentadas. Nas figuras ?.1. b e ?.1 c, parece que precisaremos
subdividir novamente. $m ?.1 b a casinha em verde pode ser transformada em um
ret0ngulo e um tri0ngulo. $m ?.1 c a casinha azul 9meia+gua/ que pode ser
dividida em um ret0ngulo e um tri0ngulo, como na Figura ?.>. $ a figura Fig. ? a,
que podemos dizer]
Figura 4.3 Subdiviso de uma sub!igura da Figura
4.3 "#
Hamos partir para a nossa soluo a partir da figura Fig. ?.1 c. *odemos
dizer que a rea total pode ser obtida pela soma das reas amarela, com rea
vermelha e mais a rea azul. A rea azul pode ser subdividida em azul+claro e
azul+escuro

rea total M rea amarela I rea vermelha I rea azul
rea azul M rea azulclaro I rea azulescuro

Ruando escolhemos as reas acima citadas, no foi por acaso. A escolha foi
baseada na simplicidade do subproblema. *odemos usar este conhecimento para
chegar a um outro. 4r:s das reas que precisamos calcular so de forma
1
J
retangular. !u se.a, so especializa#es de um conceito mais geral. A quarta
rea, tambm pode ser obtida pela especializao do conceito de tri0ngulo
ret0ngulo.
Hamos agora apro'imar nossas defini#es da linguagem de programao.
*ortanto podemos escrever)
aYretangulo ; J G ; W J
! tri0ngulo que temos ret0ngulo e podemos descrever sua rea por)
aYtYretangulo ; J G I; W JK Z 283
A determinao da rea vermelha nos traz uma pequena dificuldade, no
nos foi informado qual o comprimento da base do ret0ngulo. $ agora] !bservando
bem a figura podemos concluir que a base do ret0ngulo igual " hipotenusa do
tri0ngulo ret0ngulo de catetos a e d
*odemos escrever ento)
atotal a b c d e M a_retangulo a b I a_retangulo 9hipo a d/ e I a_azul a c d
a_azul ' L z M a_retangulo L z I a_t_retangulo ' L
hipo ' L M sqrt 9 ' W ' I L W L/
a_retangulo ' L M ' W L
a_t_retangulo ' L M 9' W L/ K 1.N

A estrutura da soluo de um problema obtida pela modularizao pode ser
representada por um diagrama denominado de rvore. *ara o problema acima
discutido a rvore da forma apresentada na Figura ?.A.
1
B
Figura ?.A X 7epresentao em rvore da estrutura modular do problema Dclculo
da rea do polgono irregular apresentado na Figura ?.CE.
=8?8 .M /C/MPB5 */$AB%A*5: $screva uma descrio funcional para o
volume de cada uma das peas apresentadas nas Fguras ?.Q e ?.S.
Figura 4.$ %e&a no. 1 Figuras 4.' %e&a no. (
Soluo 7) Hamos comear pela Figura ?.Q. Uma rpida anlise nos leva a
identificar duas partes. Na parte inferior temos um paraleleppedo, sobre o qual se
assenta um cilindro. Hamos supor que so macios. 3hamemos de a, b e c as
dimens#es do paraleleppedo, de r o raio da base do cilindro e de 0 a sua altura. !
volume total da pea pode ser determinado pela soma do volume das duas peas
menores. 3hamemos a funo de volfig?Q, e tentemos uma definio.

vol,ig=> a b c r h M 9a W b W c/ I 9>.C?CQ W r W r W h/
>
N
Hamos ento tratar da pea descrita na figura ?.S. Agora identificamos uma
pea apenas. Um paraleleppedo com um furo no centro. 3hamemos de a, b e c
as dimens#es do paraleleppedo, de r o raio do buraco. *ara descrever o volume
da pea devemos subtrair do volume do paraleleppedo o volume correspondente
ao buraco. 3hamemos a funo de volfig?S, e tentemos uma definio.
"ol,ig=? a b c r M 9a W b W c/ + 9>.C?CQ W r W r W c/
Soluo 2) A soluo C, apesar de resolver o problema, dei'a de contemplar
algumas prticas importantes. No tratamento da primeira pea 9Figura ?.Q/, apesar
de identificadas duas peas menores, estas abstra#es no foram descritas
separadamente. !u se.a, dei'amos de registrar formalmente a e'ist:ncia de duas
abstra#es e com isso no pudemos modularizar a descrio da funo principal.
*odemos tentar ento um outro caminho, contemplando as abstra#es para o
cilindro e para o paraleleppedo)
volcil r h M >.C?CQ W r W r W h
volpar a b c M a W b W c
Holfig?Q a b c r h M volpar a b c I volcil r h
Holtemos ento para a segunda pea 9Figura ?.S/, e ve.amos se podemos
identificar similaridades. Aqui s% temos uma pea, que como sabemos, guarda
uma relao com o paraleleppedo da primeira e s%. 3omo podemos encontrar
similaridades] Aprofundando melhor nossa anlise podemos lembrar que o furo
no paraleleppedo, na verdade corresponde a um cilindro que foi retirado. Assim
considerando, podemos ento concluir que o volume da figura ?.S pode ser obtido
pela diferena entre o volume de um paraleleppedo e de um cilindro. 3omo .
temos as defini#es para volume de cilindro e volume de paraleleppedo, s% nos
resta escrever a definio final do volume da figura ?.S)

vol,ig=? a b c r M volpar a b c + volcil r c
Analisando a soluo, podemos tirar algumas conclus#es)
a/ a soluo ficou mais clara,
b/ a soluo propiciou o reaproveitamento de defini#es.
c/ se precisarmos usar volume de cilindro e de paraleleppedo isoladamente
ou em outras combina#es, . as temos disponveis.
Considera[es com+lementares + assim como decidimos descrever
isoladamente o volume de dois s%lidos, poderamos ter feito o mesmo para as
figuras. As descri#es das reas de um ret0ngulo e de uma circunfer:ncia podem
ser dadas isoladamente por)

acir r M pi W r W r
>
C
aret a b M a W b
*odemos reescrever o volume do cilindro e do paraleleppedo da seguinte
maneira)
volcil r h M acir r W h
volpar a b c M aret a b W c
Soluo <) Oe aprofundarmos a anlise podemos observar que as duas
figuras podem ser abstradas como uma s%` ! cilindro que aparece na primeira,
como um volume que deve ser acrescentado pode ser entendido como o mesmo
cilindro que deve ser subtrado na segunda. Alm disso, podemos estender a
soluo para furos que no vazem a pea, pois a altura do cilindro pode ser
qualquer.

vol,ig a b c r h M volpar a b c I volcil r h
*odemos observar que esta a mesma definio apresentada anteriormente
para a figura ?.Q. ! que muda o uso. *ara calcular o volume da Figura ?.Q
usamos um ) positivo e para Figura ?.S um ) negativo.
Z volfig Q.N J.N 1.N 1.N A.N
CAJ.J>1
++ determinar o volume de uma inst0ncia da
figura Fig. C, com um cilindro de raio 1 e altura A.
Z volfig Q.N J.N 1.N 1.N 9+1.N/
SN.JQS>
++ determinar o volume de uma inst0ncia da
figura Fig. 1, vasada por um furo de raio 1.
++ neste caso fornecemos um valor negativo para
a altura do cilindro com o mesmo valor da altura
do paraleleppedo
Z volfig Q.N J.N 1.N 1.N 9+C.N/
J>.?>>Q
++ determinar o volume de uma inst0ncia da
figura Fig. 1, que tem um furo de raio 1 e
profundidade C.

/;ercPciosQ
C/ &iscuta o significado da e'presso vol,ig >83 @83 283 283 I-483K. !
que poderia ser feito para contornar este efeito indese.vel]
1/ 7esolva o problema da Figura ?.C usando a modularizao sugerida
pela figura ?.1 b.
>/ 7edesenhe a Figura ?.A 9rvore de modularizao/ para a soluo
apresentada ao e'erccio 1.
?/ Apresente > problemas similares para calculo de rea de polgono
irregular.
A/ Apresente > problemas similares para calculo de volume de ob.etos.
Q/ Apresente > problemas similares em outros domnios de
conhecimento.
>
1
48 $i+os de *ados &umricos
4878 I&$#5*.9:5Q
&enominamos de 4ipo de &ado a um con.unto de valores, munido de um con.unto
de opera#es sobre esses valores. *or e'emplo, podemos denominar de 4C ao
tipo de dados formado por um con.unto O de valores id:ntico aos n(meros
naturais 9 O M =N,C,1,>, ...a/ e munido das opera#es de adio 9a/ e multiplicao
9m/. 3ada operao possui uma tipo, indicando o domnio e o contradomnio. *or
e'emplo, para o tipo 4C, o domnio de a ; < ; e o contradomnio ; A notao
a seguir usualmente utilizada e em geral denominada de a DassinaturaE da
operao.
a QQ O U O O
m QQ O U O O
3omo visto no captulo 1, em TasVell escreveramos)
a QQ O O O
m QQ O O O
$m TasVell, conhecendo+se o tipo dos valores de uma e'presso podemos
determinar o tipo do valor que dela resultar, ou se.a, o seu contra+domnio. $m
linguagens de programao isto equivale a dizer que a linguagem 'ortemente
tipada. &izemos ainda que os tipos so elementares ou estruturados. !s
numricos so elementares, assim como tambm o so os tipos l%gico e os
caracteres. Neste captulo trataremos dos tipos numricos, os demais viro em
captulos posteriores.
!s n(meros formam um tipo de dados fundamental na computao. Aqui nos
interessa subdividi+los em inteiros e reais. Antes de irmos alm, importante que
se saiba que, sendo o computador composto de elementos finitos, algumas
adapta#es e simplifica#es precisam ser feitas para o tratamento de n(meros.
$m TUGO, quando estamos submetendo e'press#es para avaliao, podemos
dese.ar que o tipo do resultado se.a e'ibido. *ara que isso ocorra, podemos dar
um comando ao TUGO. *ara obtermos este comportamento do ambiente,
podemos usar o comando ,set, que ativa ou desativa par0metros do ambiente.
*ara ativiar um par0metro usamos uma letra correspondente ao par0metro,
precedido do smbolo DIE. *ara desativar usamos o smbolos D+D. *ara saber sobre
outros parametros, e'perimente submeter apenas o comando D,setE. A sequencia
de intera#es a seguir ilustra a ativao e desativao da e'ibio do tipo dos
resultados.
Z Qset Xt
Z 1Y1N
>
>
CN?JASQ QQ Integer
Z Qset -t
Z 1YCNN
C1QSQANQNN11J11B?NC?BQSN>1NA>SQ
4828 &\M/#5S I&$/I#5SQ
*ara trabalhar com n(meros inteiros, a lingugem TasVell prov: o tipo Integer, que
pode produzir n(meros que podem ter uma quantidade ilimitada de algarismos,
entretanto, como a mem%ria do computador finita, qualquer que se.a a mquina
real que estivermos usando, inevitavelmente esbarraremos em limites. Na
ilustrao a seguir podemos observar essa fle'ibilidade, quando obtemos o valor
para a e'presso 1
CNNN
, um n(mero de >N1 algarismos. 3laro, o limite pode estar
bem longe e podemos no atingi+lo em nossas aplica#es.
Z 1YCNNN
CNSCANJQNSCJQ1QS>1NB?J?1AN?BNQNNNCJCNAQC?N?JCCSNAA>>QNS??>SAN>JJ>S
N>ACNACC1?B>QC11?B>CBJ>SJJCAQBAJAJC1SAB?QS1BCSAA>C?QJ1ACJSC?A1JAQB
1>C?N?>ABJ?ASSAS?QBJAS?JN>B>?AQSSS?J1?1>NBJA?1CNS?QNANQ1>SCC?CJSSB
A?CJ1CA>N?Q?S?BJ>AJCB?C1QS>BJSQSAABCQAA?>B?QNSSNQ1BC?ASCCBQ?SSQJQA
?1CQSQQN?1BJ>CQA1Q1?>JQJ>S1NAQQJNQB>SQ
$'perimente com n(meros maiores` *or e'emplo, BBBB
BBBB
um n(mero que tem
por volta de ?N mil algarismos. - provida ainda uma representao de inteiros
mais restrita, denominada =nt. $sta verso trabalha com um intervalo de valores
fi'o e reduzido e tem como vantagem economizar mem%ria do computador e
tempo de processamento, usando caractersticas especficas do computador. *ara
que um n(mero se.a representado nesta verso, devemos indicar e'plicitamente,
como no e'emplo a seguir.
Z C1>?AQSJBNQQInt
C1>?AQSJBN QQ Int

Z C1>?AQSJBNCQQInt
*rogram error) arithmetic overflo[
! e'emplo a seguir ilustra a diferena entres as duas possibilidades.
Z CNJBBSBJSBJSNBSBJSB
CNJBBSBJSBJSNBSBJSB QQ Integer
Z CNJBBSBJSBJSNBSBJSBQQInt
*rogram error) arithmetic overflo[
>
?
! con.unto de opera#es associadas ao domnio pode variar, entretanto, em
geral so fornecidas as seguintes opera#es primitivas)
Nome &escrio $'emplos
I Adio
Z C> I CA I 1C I 1? I 1S I >C
C>C )) 2nteger
W 6ultiplicao
Z 1N W CN W BJ
CBQNN )) 2nteger
+ Oubtrao
Z C1>? + ?>1C
+>NJS )) 2nteger
div diviso inteira
Z div C1J>? CN
C1J> )) 2nteger
Y *ot:ncia
Z 1Y1N
CN?JASQ )) 2nteger
rem
descreve o resto da diviso
inteira entre dois inteiros
Z rem C1J>? CN
? )) 2nteger
Z rem 9C1J>? CN/
+? )) 2nteger
mod
&escreve o m%dulo da diviso
inteira entre dois inteiros
Z mod C1J>? CN
? )) 2nteger
Z mod 9+C1J>?/ CN
Q )) 2nteger
abs valor absoluto
Z abs C1>
C1> )) 2nteger
Z abs 9+C1>/
C1> )) 2nteger
signum
produz +C, N ou C, indicando
quando o n(mero negativo,
zero ou positivo
Z signum 9+>JJJJSQA1SJ1BSBJ/
+C )) 2nteger
Z signum N
N )) 2nteger
Z signum >
C )) 2nteger

Algumas observa#es so importantes)
a/ As opera#es podem ser combinadas para construir e'press#es mais
comple'as5
Z A I C1 W >
?C )) 2nteger
b/ As opera#es possuem preced:ncia, ou se.a, e'iste uma ordem em
que devem ser consideradas. No e'emplo anterior, a multiplicao 9W/
>
A
tem preced:ncia sobre a adio 9I/ e portanto realizada antes da
adio. $sta preced:ncia pode ser modificada pelo uso de par:ntesis.
Z 9A I C1/ W >
AC )) 2nteger
c/ A operao div 9diviso/ parcial, ou se.a, no se aplica quando o
denominador nulo. Ruando submetemos uma e'presso com esta
caracterstica, o TUGO no avalia a e'preso e sinaliza que h um
erro.
Z div >BJ N
Program errorQ divide bJ zero
48<8 &\M/#5S #/AISQ A denominao em TasVell para a adequao dos reais
aos computadores, denominada de >loat. *ara este tipo no falaremos de uma
lista de constantes. Ao invs disso falaremos aqui em magnitude e preciso de um
n(mero. 3omo na notao cientfica. A preciso nos diz quantos algarismos
significativos so usados e a magnitude nos diz qual o maior e'poente admitido.
*or e'emplo, uma determinada implementao pode utilizar Q algarismos
significativos. Nesta, o n(mero C1>?AQ.SJB seria representado pelo n(mero
C1>?AS.N, onde o Q foi arredondado para S.
A magnitude permite que n(meros bem pequenos e bem grandes se.am
representados. *or e'emplo, um n(mero muito grande como
BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.N poderia ser representado por C.NeI1B e um
n(mero bem pequeno como N.NNNNNNNNNNBBBBBBBBBBBBBBBBBBBBBBBBBBBB,
poderia ser representado por C.Ne+NCN.
Z N.C1>?AQSJBNC1>?AQSJBNC1>?AQSJBNC1>?AQSJBN
N.C1>?AQSJBNC1>?Q QQ *ouble
A representao cientfica utilizada quando necessrio)
Z C1>?AQSJBNC1>?AQSJBNC1>?AQSJ.B
C.1>?AQSJBNC1>?QeIN1S QQ *ouble
A implementao corrente usa por default um verso estendida
denominada D*oubleE. Oe dese.armos, podemos representar os n(meros usando
uma quantidade menor de algarismos significativos, para isso precisamos
e'plicitar que o n(mero considerado deve ser representado na modalidade
D>loat?.
Z N.C1>?AQSJBNC1>?AQSJBNC1>?AQSJBNC1>?AQSJBNQQFloat
N.C1>?AQJ QQ Float
! con.unto de opera#es aqui tambm pode variar, entretanto, em geral as
listadas no quadro abai'o so providas.
>
Q
&ome *escrio /;em+los
pi a constante >.C?CAB...
Z pi
>.C?CAB1QA>AJBSB )) &ouble
I Adio
Z 1.A I >.>1CQ I N.>JB?AJ
Q.1CCNAJ )) &ouble
W 6ultiplicao
Z >.1 W C.1> W N.1NJ
N.JCJQJJ )) &ouble
+ Oubtrao
Z >.?AQSJB + C.>???BBNJBJSS
1.CC11JBBCNC1> )) &ouble
K &iviso
Z B.>?ABJJ K 1>?AQB.>?
>.BJ?>CSJC?NJ?>Ce+NNA )) &ouble
Y
pot:ncia 9o e'poente tem que ser 2nt
e positivo/
Z C.A>1?YCN
SC.?N>JCSSBAQQA? )) &ouble
sin Oeno
Z sin pi
C.11?QNQ>A>J11>Je+NCQ )) &oubl
cos 3oseno
Z cos pi
+C.N )) &ouble
tan 4angente
Z tan 9 pi K ?.N/
C.N )) &ouble
sqrt raiz quadrada
Z sqrt J.A
1.BCA?SAB?S?11QA )) &ouble
log logaritmo na base e
Z log 1.SCJ1JCJ1J?ABNA
C.N )) &ouble
e'p pot:ncia na base e
Z e'p C.N
1.SCJ1JCJ1J?ABNA )) &ouble

&a mesma forma como ocorre nos n(meros inteiros, nos reais tambm
podemos combinar opera#es para construir opera#es mais comple'as. 4ambm
vale para os reais a preced:ncia de operadores, como nos inteiros podemos usar
par:ntesis para controlar a ordem em que as opera#es sero realizadas.
48=8 C5&"/#S:5 */ $IP5S: $m TasVell os inteiros so tratados como um
subcon.unto dos reais. Assim, quando temos n(meros reais misturados com
n(meros inteiros em uma mesma e'presso, os n(meros inteiros so
automaticamente tratados como reais.
Z > I A
J )) 2nteger
Z > I A.N
J.N )) &ouble
$'istem fun#es especficas para converso de tipos)
>
S
a/ a funo truncate converte um real ' para o menor inteiro menor ou igual '.
Z truncate pi
> )) 2nteger
b/ a funo round converte um real ' para o inteiro mais pr%'imo de ', ou se.a)
round ' M truncate 9' I N.A/
Z round pi
> )) 2nteger
Z round 9e'p C/
> )) 2nteger
4848 P#/C/*]&CIA *5S 5P/#A*5#/S: Ruando aparecem vrios operadores
.untos na mesma e'presso, certas regras de preced:ncia so estabelecidas para
resolver possveis ambig<idades. A ordem em que os operadores so
considerados a seguinte)
Cb/ di7, mod, abs, sqrt e qualquer outra funo
1b/ Y
>b/ W K
?b/ I, +
&a mesma forma que na matemtica usual podemos usar os par:ntesis para
forar uma ordem diferente de avaliao.
/;em+losQ
S 1 I > W A
CS
coment:rio( o operador " tem preced;ncia sobre o operador + +odemos escre7er
a expresso a seguir para denotar a seqG;ncia de a7aliaHes(
2 + I " J 2 + 1J 1K
S 91 I >/ W A
1A
>
J
coment:rio( a ordem de a7aliao foi alterada pelo uso dos par;ntesis <
seqG;ncia de a7aliao 4 portanto(
(2 + I) " J J " J 2J
S > W mod CN ? I A
CC
coment:rio( a primeira prioridade 4 para a7aliao do operador mod1 seguida da
a7aliao do operador " e finalmente do operador + +odemos escre7er a seguinte
seqG;ncia de a7aliao(
I " mod 1! 4 + J I " 2 + J L + J 11
S > Y mod CN ?
B
coment:rio ( < primeira a7aliao 4 do operador mod e em seguida 4 a7aliado o
operador ^ < seqG;ncia de a7aliao 4(
I ^ mod 1! 4 I ^ 2 M
S ? Y mod 9div 1N ?/ 1
?
coment:rio( < seqG;ncia de a7aliao 4(
4 ^ mod (di7 2! 4) 2 4 ^ mod J 2 4 ^ 1 1
48>8 5#*/M */ ASS5CIA9:5: Ruando h ocorr:ncia de operadores de mesma
preced:ncia leva+se em considerao a ordem de associao que pode ser "
direita ou " esquerda.
C. ! operador de subtrao faz associao " esquerda,
A + ? + 1 M 9A + ?/ + 1 e no A + 9 ? + 1/
1. c o operador de e'ponenciao faz associao " direita,
> Y ? Y A M > Y 9 ? Y A / e no 9 > Y ? / YA
>
B

! uso adequado das no#es de preced:ncia e associao serve tambm
para escrevermos e'press#es com economia de par:ntesis.
5bserva[esQ
C. ! operador unrio + deve ser sempre representado entre par:nteses
quando utilizado .unto com outro operador.
C. 9+ '/YL ou + 9'YL/ e nunca +'YL ou 'Y+L.
1. A e'ponenciao quando repetida em uma e'presso avaliada da direita
para a esquerda.
C. 1Y>Y> M 1Y9>Y>/.
>. !s demais operadores, na situao acima, so avaliados da esquerda para
a direita.
C. 1 + > + A M 91 + >/ + A
1. 1 I > I > M 91 I >/ I >
/;em+losQ
S> + S + 1
+ Q
S > W S I ?
1A
S > W 9 S I ?/
>>
S > Y 9 C I >/
JC
48>8 $IP5S */ &5"AS */FI&I9D/S: Ao definir novas fun#es, o fazemos
tomando por base os tipos de dados e'istentes na linguagem. ! corpo dessas
defini#es tem por base a composio das opera#es fornecidas por estes tipos
bsicos. Assim, o tipo do dado resultante da avaliao de uma aplicao desta
nova funo, pode ser antecipado por um analisador de tipos, antes mesmo de
avaliar a e'presso.
!bserve as duas defini#es a seguir)
media ' L M 9' I L/ K 1
mediad ' L M truncate 99' I L/ K 1/o tipo de dado resultante pela aplicao de
DmediaE real, uma vez que a operao DKE 9diviso/, s% se aplica a n(meros reais.
&a mesma forma, o tipo resultante pela aplicao da funo Dmedia@ A inteiro,
?
N
dado que a ultima operao a ser realizada, a DtruncateE, converte reais para
inteiros.
*odemos conferir isso nas submiss#es de avaliao a seguir)
Z media > ?
>.A )) &ouble
48>8 %I/#A#F.IA */ &\M/#5S: At agora dissemos que a linguagem TasVell
trabalha com dois tipos numricos, os reais e os inteiros. 2sto uma verdade
irrefutvel. Ao avaliar uma e'presso numrica o resultado ser sempre um
n(mero real ou um n(mero inteiro. $ntretanto, para facilitar a construo de um
sistema de tipos adequado para a avaliao do tipo de uma e'presso, antes
mesmo que ela se.a avaliada, tornou+se necessrio a criao de uma hierarquia
de tipos, conforme mostraremos agora.
Ao definir novas fun#es, o fazemos tomando por base os tipos de dados
e'istentes na linguagem. ! corpo dessas defini#es tem por base a composio
das opera#es fornecidas por estes tipos bsicos. Assim
Z media > ?
> )) 2nteger
?
C
S
/;ercPcios
Rual o tipo resultante da avaliao da definio)
mediade ' L M div 9' I L/ 1
! que ocorre na avaliao de uma e'presso que usa a definio)
mediade ' L M div 9' I L/ 1.N
?
1
>8 /CP#/SSD/S B^)ICAS / 5 $IP5 55B/A&
>878 I&$#5*.9:5Q Uma caracterstica fundamental dos agentes racionais a
capacidade de tomar decis#es adequadas considerando as condi#es
apresentadas pelo conte'to onde est imerso. Uma mquina que sabe apenas
fazer contas, ou se.a, manusear as opera#es aritmticas, ter sua utilidade
fortemente reduzida e, portanto no despertar tantos interesses prticos. !s
computadores que temos ho.e so passveis de serem programados para tomada
de deciso, ou se.a, possvel escolher entre 1 ou mais a#es, qual a que se
dese.a aplicar em um determinado instante. $m nosso paradigma de programao
precisamos de dois elementos fundamentais) um tipo de dados para representar a
satisfao ou no de uma condio e um mecanismo que use essas condi#es na
escolha de uma definio. Neste captulo discutiremos a natureza das proposi#es
l%gicas, sua aplicabilidade na resoluo de problemas e introduziremos um novo
tipo de dados, denominado de boolean. Oatisfazendo logo de sada a curiosidade
do leitor lembramos que o nome uma homenagem a George Poole que estudou
e formalizou as opera#es com estes tipos de valores.
>828 P#5P5SI9D/S B^)ICASQ 7evirando o ba( das coisas estudadas no ensino
fundamental, por certo encontraremos "s sentenas matemticas. \embraremos
ento que elas so afirma#es sobre entes matemticos, tais como os e'emplos a
seguir)
C. vinte e dois maior que cinco
1. dois mais tr:s igual a oito
>. todo n(mero primo impar
! conceito de proposio l%gica mais geral, aplicando+se "s mais diversas
situa#es do cotidiano, como nos e'emplo a seguir)
C. 6aria namorada de *edro
1. cos apai'onado por 6aria
>. To.e domingo
Analisando o significado da informao contida em uma proposio l%gica
podemos concluir que ela ser uma afirmao verdica, quando se referir a fatos
que realmente acontecem em um determinado mundo. Ruando isso no ocorre,
conclumos que elas so inverdicas. !bviamente que isto ir requerer que
possamos ter acesso ao mundo considerado para podermos avaliar uma dada
proposio.
Sentenas Fec!adasQ as sentenas acima possuem uma caracterstica
importante) todos os seus componentes esto devidamente e'plicitados.
&enominamos estas sentenas de sentenas fechadas. Uma sentena fechada
?
>
pode ser avaliada imediatamente, conferindo o que elas afirmam com o mundo
sobre o qual elas se referem.
Sentenas AbertasQ Um outro tipo de proposio importante so as sentenas
abertas. Nestas, alguns personagens no esto devidamente e'plicitados e,
portanto a sentena no pode ser avaliada. Ruando tratamos sentenas abertas,
antes necessrio instanci+las para algum valor. *or e'emplo, a sentena
matemtica,
x + 5 $ "(
nem sempre verdadeira, depende do valor que atribuirmos " varivel x. Ruando
atribumos valores "s variveis de uma sentena dizemos que estamos
instanciando a sentena.
No caso acima, podemos instanciar a sentena para os valores > e CN, entre
outros, obtendo as seguintes inst0ncias)
C. > I A Z CN
1. CN I A Z CN
Agora podemos avali+las e concluir que a segunda verdica e a primeira no.
! mesmo poderia ocorrer com afirma#es de outra natureza, como por e'emplo)
Oe substituirmos Bm certo cidad4o por Pill Gates, podemos concluir que a
sentena verdica. ! mesmo no se pode concluir se a substituirmos pelo nome
de in(meras pessoas que arrancam os cabelos todos os dias, pre.udicados que
ficam com o mau funcionamento do citado programa.
Sentenas Com+ostasQ ! discurso do cotidiano e at o discurso matemtico,
pode ser escrito como uma lista de proposi#es simples. 3omo por e'emplo)
C. To.e domingo
1. Aos domingos tem futebol
>. Ruando meu time .oga, eu assisto
Nem sempre isto dese.vel ou suficiente. *ara resolver a questo, podemos
contar com as sentenas compostas. 3omo por e'emplo))
a/ Nr;s 4 menor que cinco e o quatro tamb4m9
b/ Fomingo irei ao futebol ou escre7erei notas de aula9
c/ >speranto no 4 uma linguagem de programao
!bservamos ento, o surgimento de tr:s palavras para criar essas sentenas e
que essas palavras 9 e, ou, n4o/ no se referem a coisas, propriedades ou
?
?
fen,menos de um determinado universo. $las so denominadas de palavras
l%gicas, visto que a sua funo na linguagem possibilitar a articulao entre as
proposi#es do discurso.
A composio de uma proposio pode envolver vrias palavras l%gicas, como
nos e'emplos a seguir)
C. :ois menor que trCs e maior que um mas n4o maior que a soma de
trCs com doisD
1. Earia -osta de Fedro e de Goana mas n4o -osta de 2ntonio
Avaliao de Sentenas Com+ostasQ *ara avaliar sentenas simples, vimos que
bastava inspecionar o mundo ao qual ela se refere e verificar se a situao
e'pressa pela sentena ocorre ou no. $ como proceder para as sentenas
compostas] Um caminho que parece confivel apoiar essa avaliao no papel
representado por cada uma das palavras l%gicas.
Assim, quando ao considerarmos a proposio)
Hoje 'ui ao cinema e ao teatro,
s% poderemos dizer que ela verdica se tanto a proposio Hoje 'ui ao cinema
quanto a proposio Hoje 'ui ao teatro forem avaliadas como verdicas.
*ara a proposio composta
Earia 'oi a missa ou ao cinema1
devemos consider+la como verdica se uma das duas proposi#es)
" Earia 'oi a missa
1. Earia 'oi ao cinema
forem avaliadas como verdica. $ se as duas forem avaliadas como verdicas] No
discurso cotidiano tendemos a pensar nesta situao como inverdica visto que
queramos uma ou outra. A linguagem natural no estabelece se devemos ou no
e'plicitar que no estamos falando do caso em que ambas podem ser
constatadas. *odemos assumir, portanto, que a nossa sentena composta usando
ou ser avaliada como verdica quando pelo menos uma das duas proposi#es
que a comp#e for avaliada com verdica.
No caso da sentena composta usando a palavra l%gica n4o, como em
Hoje n4o c)o!eu
diremos que ela ser avaliada como verdica quando a proposio Hoje c)o!eu
no puder ser constatada e como inverdica no caso oposto.
?
A
>8<8 5 $IP5 */ *A*5S 55B/A&Q *odemos agora discutir sobre a natureza do
valor resultante da avaliao de uma sentena. A avaliao de natureza
funcional, ou se.a, dada uma sentena s ela ser mapeada em um de dois valores
distintos. $nto, o contradomnio de uma avaliao um con.unto com apenas
dois valores, um para associar com avalia#es verdicas e outras com as
inverdicas. *odemos escolher um nome para esses valores. Tistoricamente, as
linguagens de programao os tem denominado de Irue e >alse. ! primeiro para
associar com as proposi#es que podem ser constatadas no mundo considerado e
a segunda com as no constatveis.
! tratamento das proposi#es compostas pode tambm receber um
tratamento formal. 3ada uma das palavras l%gicas associamos uma funo
matemtica cu.o domnio e contradomnio ser o con.unto que acabamos de
definir com as constantes Irue e >alse.
aval )) fsentenaZ =4rue, False@
$m Tugs nossos operadores so representados por)

Palavra
l_gica
SPmbolo em
%ugs
e gg
ou hh
no not
Hamos ento formalizar a avaliao de sentenas compostas.
Oe.am sC e s1 duas proposi#es l%gicas,
C. ! valor l%gico da sentena s" JJ s2 Irue se e somente se o valor l%gico
de s" Irue e o valor l%gico de s2 Irue e >alse em caso contrrio.
1. ! valor l%gico da sentena s" KK s2 >alse se e somente se o valor l%gico
de s" >alse e o valor l%gico de s2 >alse e Irue em caso contrrio.
>. ! valor l%gico da sentena not s" Irue se e somente se o valor l%gico de
s" False e ) False em "aso "ontrrio
?
Q
$abela "erdadeQ $stas defini#es tambm podem ser representadas atravs de
uma enumerao de suas associa#es, formando o que se costuma chamar de
Ia+elas Lerdade as quais apresentamos a seguir.
s7 s2 s7 `` s2
4rue 4rue 4rue
4rue False False
False 4rue False
False False False
s7 s2 s7 LL s2
4rue 4rue 4rue
4rue False 4rue
False 4rue 4rue
False False False
s7 not s7
4rue False
False 4rue
>8=8 5P/#A*5#/S #/BACI5&AISQ Ruando falamos de proposi#es l%gicas no
discurso matemtico, ou se.a, sentenas matemticas, usamos termos tais como)
Dmenor do queE, Dmenor ou igualE, DdiferenteE, entre outros. $stes termos so
fundamentais para a nossa inteno de prover os computadores com a
capacidade de deciso. &enominamos estes elementos de operadores
relacionais, pois estabelecem uma relao de comparao entre valores de um
mesmo domnio. ! contradomnio deles do tipo Poolean. A tabela a seguir
apresenta esses operadores, seus significados e e'emplos de uso.

o+erador
si-ni'icado
exemplo
resultado
MM igualdade 91 I >/ MM 9J X >/ 4rue
KM &iferena A KM 9? W 1 +>/ False
f 6enor 91 I >/ f Q 4rue
fM 6enor ou igual 91 W >/ fM Q 4rue
Z 6aior 9? I 1/ Z 91 W >/ False
ZM 6aior ou igual 9J X > W 1/ ZM 9CA div >/ False
*odemos usar estes operadores para construir novas defini#es ou
simplesmente, em uma sesso de Tugs para solicitar a avaliao de uma
e'presso, como apresentado nos e'emplos a seguir.

?
S
> 5 > 4
True :: Bool
> 4 /= (5 + 3)
True :: Bool
> (mod 5 2) == (rem 5 2)
True :: Bool
> (mod (-5) 2) == (rem (-5) 2)
False :: Bool
> (di 5 2) != "ru#$a"e(5.% / 2.%)
True :: Bool

>848 /CP#/SSD/S / */FI&I9D/SQ Agora que temos um novo tipo de dados, ou
se.a, um par composto de constantes e fun#es, podemos p,+lo a nosso servio,
escrevendo e'press#es, de forma to natural quanto aquela que usamos para
escrever e'press#es aritmticas. Usando essas e'press#es podemos ento
construir defini#es cu.o tipo resultante se.a booleano. !s ingredientes bsicos
para construir essas e'press#es so os operadores relacionais.
/;+ress[es sim+les Q *or e'emplo, para construir uma definio que avalie
se um n(mero par, podemos usar a seguinte definio)

&ar x = (mod x 2) == %
He.amos alguns e'emplos ilustrados abai'o)

> &ar 5
False
> &ar '4(
True
> &ar %
True
> &ar ("ru#$a"e ((5 + 2) / 2))
False
?
J
!utros e'emplos de defini#es)
Herificar se a m(ltiplo
de +
mul"i&lo a ) = (mod a )) == %
Herificar se a divisor
de +
diisor a ) = mul"i&lo ) a
Herificar se uma
dist0ncia d igual "
diagonal de um
quadrado de lado a
dia* d a = (a + s,r" 2.%) == d
Herificar se um n(mero
um quadrado perfeito
,uad& # = (s,r" #)-2 == #
Herificar se dois
n(meros a e + so
termos consecutivos de
uma *.A. de razo r
s&a a ) r = (a + r) == )
/;+ress[es com+ostas Q *odemos usar agora os operadores l%gicos para
construir e'press#es compostas. 3omo nos e'emplos a seguir)
Herificar se >
n(meros esto em
ordem decrescente
ord$ a ) $ = (a > )) .. () > $)
Herificar se um
n(mero x est no
intervalo fechado
definido por a e +
&er" x a ) = (x >= a) .. (x != ))
ou
&er" x a ) = #o" ((x ! a) // (x > )))
Herificar se um
determinado ponto do
espao cartesiano
est no primeiro
quadrante
&,uad x y = (x > %) .. (y > %)
Herificar se > n(meros
a, + e c, so lados de
um tri0ngulo ret0ngulo
"re" a ) $ = ((a-2 + )-2) = = $-2) //
((a-2 + $-2) = = )-2) //
(()-2 + $-2) = =a-2)
Ruando nossas e'press#es possuem mais de um operador l%gico devemos
observar a preced:ncia de um sobre o outro. *or e'emplo, na e'presso)
P || Q && R
onde *, R e 7 so e'press#es l%gicas, o operador gg ser avaliado primeiro
pois tem preced:ncia sobre o hh, portanto a e'presso ser avaliada para 4rue se
* for avaliado para 4rue ou se a sub+e'presso 9R gg 7/ for avaliada para 4rue.
?
B
*odemos modificar esta ordem utilizando par:ntesis como nas e'press#es
aritmticas. A e'presso acima poderia ser reescrita como)
(P || Q) && R
$ agora, para que ela se.a avaliada para verdadeira preciso que 7 se.a
avaliada para verdadeira.
He.amos mais um e'emplo de definio)
Herificar se ' est fora
do intervalo definido por
a e b e a e b esto em
ordem no decrescente
f ' a b M 99' fMa/ hh 9' ZM b// gg 9a fM b/
Herificar se ' menor
que a ou se ' maior
que b e a e b esto em
ordem no decrescente
g ' a b M 9' fMa/ hh 9' ZM b/ gg 9a fM b/
>8>8 #/S5B"/&*5 .M P#5B/MAQ &ese.amos verificar se um determinado
ponto do espao cartesiano est dentro ou fora de um ret0ngulo paralelo aos
ei'os, conhecidos o ponto, o canto superior esquerdo e o canto inferior direito do
ret0ngulo.
/ta+a 7 i$ntendendo o problemaa ! ponto pode estar em qualquer
quadrante] $ o ret0ngulo, pode estar em qualquer quadrante] Pasta ter os dois
cantos para definir o ret0ngulo] $m que ordem sero informados os cantos]
3omo se descreve um canto] Um ponto que este.a sobre um dos lados, est
dentro ou fora do ret0ngulo]
Hamos assumir ento as seguintes decis#es) discutiremos inicialmente
apenas sobre pontos e ret0ngulos localizados no primeiro quadrante. A ordem em
que os dados sero informados ser) primeiro o ponto, depois o canto superior
esquerdo e por ultimo o canto inferior direito. *ara cada ponto sero informadas as
duas coordenadas, primeiro a abscissa e depois a ordenada. !s pontos na borda
so considerados pertencentes ao ret0ngulo.
/ta+a 2 i*lane.ando a Ooluoa) 3onheo algum problema parecido] *osso
decompor este problema em problemas mais simples] Oei resolver um problema
mais geral em que este um caso particular]
Pom, . nos envolvemos com o problema para verificar se um ponto estava
num intervalo linear, este tambm se refere a intervalo. Herificar se um ponto
pertence a uma regio qualquer do espao n+dimensional mais geral, se eu
conhecesse uma definio para este problema geral, bastaria instanci+la. Oer
que posso decompor o problema na verificao de dois espaos lineares, um
definido pelos lados paralelos ao ei'o das ordenadas e outro paralelo ao ei'o das
abscissas] Oe afirmativo, como combino as duas solu#es]
A
N
*ara que um ponto este.a dentro do ret0ngulo necessrio que sua
ordenada este.a entre as ordenadas dos dois cantos. Oabemos tambm que a
abscissa precisa estar entre as abscissas dos dois cantos. 2sso basta] *ara
combinar as solu#es percebemos que suficiente que as duas primeiras este.am
satisfeitas.
/ta+a < i3onstruindo a Ooluoa 3onstruindo a soluo + Anteriormente .
elaboramos a definio de pertin:ncia a um intervalo linear, vamos us+la aqui.
pert ' a b M 9'ZMa/ gg 9' fM b/ pertin:ncia linear
pertsup ' L 'C LC '1 L1 M 9pert ' 'C '1/ gg 9pert L L1 LC/
pertin:ncia de
superfcie
$ o teste, para que valores interessam testar]
/ta+a ? iAnalisando a Ooluoa) $'istem outras maneiras de resolver o
problema] $sta soluo se aplica as outras dimens#es]
A
C
?8 *e,ini[es Condicionais
?878 I&$#5*.9:5: Oabemos de nosso conhecimento matemtico que algumas
fun#es no so contnuas em um domnio e que, portanto, possuem vrias
defini#es.
$m muitos casos, o domnio & de uma funo est dividido em regi#es
dis.untas que se complementam e, para cada uma dessas regi#es, e'iste uma
e'presso que define o seu mapeamento no contra+domnio. *odemos
representar esta situao pela figura abai'o)

/;em+lo 7 + 3onsidere a funo que determina o valor da passagem area
de um adulto, para um determinado trecho, por e'emplo, Hit%ria+6anaus,
considerando a sua idade. *essoas com idade a partir de QN anos possuem um
desconto de ?Nj do valor. 3onsidere ainda que a passagem para o trecho
considerado custa 7^ QNN,NN.
4emos aqui duas formas de calcular o valor da passagem de uma pessoa,
dividindo o domnio em dois subcon.untos. ! dos adultos com menos de QN e o
dos demais.
*odemos definir as duas fun#es)
&ass' = 0%%
&ass2 = &ass' + %.0
*ara usar uma das defini#es, temos que e'plicitamente escolher a que se
aplica ao nosso caso.
/;em+lo 2 + 3onsidere a funo que associa com um determinado
rendimento o 2mposto de 7enda a ser pago. At um determinado valor, o
A
1
contribuinte no paga imposto, e a partir de ento o rendimento dividido em
fai'as 9intervalos/, aos quais se aplicam diferentes ta'as. Ouponha a tabela
hipottica abai'o.

Fai;a alPNuota *esconto
inferior ou igual a CN.JNN N N
entre CN.JNC e 1N.NNN CN CNNN
entre 1N.NNC e >N.NNN 1N CANN
acima de >N.NNN 1A CJNN

*ara descrever as vrias defini#es e os correspondentes subdomnios,
poderamos escrever separadamente cada definio, construindo portanto vrias
fun#es, e dei'ar que o usurio escolha qual usar. 3laro que isto traria muitos
inconvenientes pois estaramos dei'ando uma escolha mec0nica na mo do
usurio, que alm de sobrecarreg+lo com tarefas desnecessrias, ainda estaria
e'pondo+o ao erro por desateno. 6as vamos l construir as fun#es
independentes.
ir' s = %
ir2 s = s + %.' - '%%%
ir3 s = s + %.2 - '5%%
ir4 s = s + %.25 - '(%%
Agora, para us+las, o usurio pega o seu salrio, olha a tabela e seleciona
qual funo aplicar.
A escolha de qual definio usar para uma dada situao, em si, um tipo
de computao. *odemos descrever essa computao com e'press#es
condicionais, vamos dei'ar que o computador escolha. &escrevemos cada
subdomnio com a respectiva funo aplicvel e dei'emos que ele escolha a
definio a aplicar, dependendo do valor fornecido. He.amos ento como isso
pode ser feito nas se#es subsequentes.
?828 A /S$#.$.#A IFQ Uma e'presso condicional construda com i' possui a
seguinte sinta'e)
i, fe'presso l%gicaZ t!en fe'presso CZ else fe'presso 1Z
onde)
A
>

fe'presso l%gicaZ
Uma e'presso descrevendo uma condio a ser
satisfeita, envolvendo operadores relacionais e
operadores l%gicos.
fe'pressoCZ e
fe'presso1Z
C. $'press#es descrevendo um valor a ser produzido
como resposta " entrada fornecida e, como a
e'presso total tem que ser de um (nico tipo, as
duas e'press#es devem ser do mesmo tipo.
1. 3ada uma destas e'press#es pode ser inclusive
uma outra condicional, dentro da qual pode haver
outras e assim sucessivamente.
>. Ruando a fe'presso l%gicaZ avaliada para
Irue o valor resultante ser o que for obtido pela
avaliao da fe'presso CZ caso contrrio ser o
obtido pela avaliao da fe'presso 1Z

*ara a funo que calcula o valor da passagem area podemos ento construir a
seguinte definio)
&ass x = if x ! 0% then 0%% else 30%
6rvore de deciso) *odemos representar as e'press#es condicionais atravs de
uma notao grfica denominada de rvore de deciso. - importante considerar
que este tipo de representao uma ferramenta importantssima para
estruturarmos a soluo de problemas que requerem e'press#es condicionais.

/;em+lo < X &efinir a funo que determina o valor absoluto de um
n(mero. Oabemos que esta funo se define em dois subdomnios)
subdomPnio e;+resso
' f N + '
' ZM N '
A
?
3omo s% temos duas possibilidades, podemos codificar da seguinte maneira)
absoluto ' M i, ' f N t!en +' else '
*ara concluir esta apresentao voltemos ao nosso e'emplo 1 que definie a
funo para calculo do 2mposto de 7enda. ! domnio neste caso deve ser
quebrado em quatro subdomnios e para cada um deles construiremos uma
e'presso.
domPnio ,uno
s k CNJNN irC s
pert s CNJNC 1NNNN ir1 s
pert s 1NNNC >NNNN ir> s
s Z >NNNN ir? s
*ara codificar precisaremos ir quebrando sucessivamente o domnio da
funo. *rimeiro dividimos entre o primeiro intervalo e o resto, depois dividimos o
resto entre o segundo intervalo e o resto e assim sucessivamente.
A codificao final pode ser)

ir s = if s != '%(%%
then ir'
else if &er" s '%(%% 2%%%%
then ir2
else if &er" s 2%%%' 3%%%%
then ir3
else ir4
where
ir' = %
ir2 = s + %.' - '%%%
ir3 = s + %.2 - '5%%
ir4 = s + %.25 - '(%%
&er" x a ) = x>=a .. x!=)
?8287 .SA&*5 5 IF
/C/MPB5 7Q 3onsidere um mapeamento de valores numricos onde o domnio
se divide em ? regi#es, cada uma das quais possui diferentes formas de
mapeamento. As regi#es so apresentadas na figura abai'o, numeradas da
A
A
esquerda para direita. !bserve ainda que as e'tremidades so abertas. 3onsidere
ainda a seguinte tabela de associa#es)


regio ma+eamento deseUado
regio C o dobro de '
regio 1 o sucessor de '
regio > o quadrado de '
regio ? o simtrico do quadrado de '

*odemos analisar as regi#es atravs do seguinte diagrama)
C a 3
C a -74
C S 73
$rue
$rue
$rue
False
False
False
A
Q
! que nos levar " seguinte definio)
1 x = if x ! %
then i1 x ! (-'5)
then 2 + x
else x + '
else if x ! '%
then x -2
else - (x - 2)
$'emplo 1Q &ados > n(meros inteiros distintos, determinar o maior deles.
*odemos e'plorar uma soluo da seguinte maneira. 3onsidere um
ret0ngulo e divida+o horizontalmente em 1 partes, a parte de cima representa as
situa#es onde a Z b e a de bai'o aquelas onde b Z a. &ivida agora o ret0ngulo
verticalmente, em cada uma das regi#es anteriores surgiro 1 metades. Na de
cima, representamos agora a relao entre a e c. Na de bai'o, a relao entre b e
c.

$'plorando as rela#es entre os
n(meros
7epresentando as rela#es atravs de
uma rvore de deciso
4raduzindo a rvore de deciso para Tugs, chegamos " seguinte definio)
maior a ) $ = if a > )
then if a > $
then a
else $
else if ) > $
then )
else $
A
S
?8< */FI&I9D/S P#5$/)I*AS Iguarded commandsKQ A estrutura IF foi
apresentada por primeiro por quest#es hist%ricas, por tratar+se de uma forma
pioneira de escrever defini#es condicionais. $ntretanto, algumas vezes podemos
lanar mo de estruturas mais simples e mais legveis.
As defini#es protegidas, tambm conhecidas por Dguarded commandsE permitem
que se escreva para uma mesma funo, vrias defini#es, cada uma delas
protegida por uma e'presso l%gica.
!#ome da 1u#23o> !&ar4me"ros> / !&ro"e23o '> = !de1i#i23o '>
/ !&ro"e23o 2> = !de1i#i23o 2>
/ !&ro"e23o 3> = !de1i#i23o 3>
. . .
/ !&ro"e23o #> = !de1i#i23o #>
565 / o"7er8ise = !de1i#i23o # + '> 59:
A (ltima clausula da definio opcional, por este motivo est apresentada dentro
de colchetes.
He.amos como podemos reescrever a definio da nossa funo DirE para clculo
do imposto de renda.
ir; s / s!='%(%% = ir'
/ &er" s '%(%% 2%%%% = ir2
/ &er" s 2%%%' 3%%%% = ir3
/o"7er8ise = ir4
87ere
ir' = %
ir2 = s + %.' - '%%%
ir3 = s + %.2 - '5%%
ir4 = s + %.25 - '(%%
/;ercPcios
78 7eescreva, usando defini#es protegidas. a definio da funo que
determina o maior de > n(meros inteiros fornecidos.

A
J
@8 5 $/S$/ */ P#5)#AMAS
@878 I&$#5*.9:5Q No basta desenvolver um programa para resolver um dado
problema. - preciso garantir que a soluo este.a correta. 6uitos erros podem
ocorrer durante o desenvolvimento de um programa e, portanto temos que garantir
que o programa que ir ser e'ecutado est livre de todos eles. Ao conceber a
soluo podemos nos equivocar e escolher caminhos errados, precisamos
eliminar esses equvocos. Ao codificarmos a nossa soluo podemos cometer
outros erros ao no traduzirmos corretamente nossa inteno. $sses erros podem
ocorrer por um mau entendimento dos elementos da linguagem ou at mesmo por
descuido, o certo que eles ocorrem. Uma estratgia muito (til, mas no infalvel,
o teste de programa.
$m sua ess:ncia, o teste de programa consiste em submeter um programa
ao e'erccio de algumas inst0ncias do problema e comparar os resultados
esperados com os resultados obtidos.
@828 5 P#5C/SS5 */ $/S$/Q $m primeiro lugar devemos escolher as
inst0ncias apropriadas, no basta escolh:+las aleatoriamente. A seguir devemos
determinar, sem o uso do programa, qual o valor que deveria resultar quando o
programa for alimentado com essas inst0ncias. ! passo seguinte consiste em
submeter cada inst0ncia ao programa e anotar o resultado produzido por ele.
Finalmente devemos comparar cada valor esperado com o valor produzido e
descrever qual o tipo de ocorr:ncia.
.m e;em+lo) 3onsidere o problema de identificar se um dado ponto est
ou no localizado no primeiro quadrante do espao cartesiano. 3onsidere ainda
que concebemos a seguinte definio)

primquad ' L M 9' ZM N/ gg 9L ZM N/
*recisamos agora verificar se ela atende nossa inteno. *ara tanto
devemos escolher algumas inst0ncias, prever o resultado esperado e em seguida
submeter ao TUGO, para ver o que acontece.
Rue pares de valores deveremos escolher] Pom, vamos escolher uns
pares usando a seguinte estratgia) um par onde ' maior que L, outro onde L
se.a maior que ' e um terceiro em que os dois se.am iguais. Gerando uma planilha
como apresentada a seguir.
A
B

; J
resultado
es+erado
resultado
obtido
diagn_stico
+A +1 False
+1 +A False
A A 4rue
*odemos agora submeter as inst0ncias " avaliao do sistema, obtendo a
seguinte interao)
] primquad 9+A/ 9+1/
False
] primquad 9+1/ 9+A/
False
] primquad A A
$rue
]
*odemos agora completar o preenchimento de nossa planilha, obtendo a tabela a
seguir)

; J
resultado
es+erado
resultado
obtido
diagn_stico
+A +1 False False sucesso
+1 +A False False sucesso
A A 4rue 4rue sucesso
Herificando as diversas linhas da coluna D&iagn%sticoE, parece que nosso
programa est correto. He.a que ele passou com sucesso em todos os testes`
Rue pena que no se.a verdade. Apesar de passar em todos os testes a
que foi submetido, ele no funciona corretamente. 4udo que podemos afirmar
neste instante que para os valores usados, o programa funciona corretamente. $
para os outros valores, ser que funciona corretamente]
!utros valores] Ruais]
@8<8 PBA&5 */ $/S$/Q *ara escolher os valores que usaremos, antes de mais
nada devemos identificar as classes de valores que sero relevantes para o teste,
em um segundo instante podemos ento escolher os representantes destas
classes. Ruando temos um par0metro, os possveis valores a serem usados so
todas as constantes do domnio. *ara o caso de um par0metro do tipo int, e'istem
QAA>Q valores diferentes. 4estar nosso programa para todos esses valores
implicaria em determinar a mesma quantidade de resultados esperados e em
Q
N
seguida digitar e submeter esta mesma quantidade de inst0ncias do problema
para o sistema e ainda depois conferir um a um os resultado obtidos com os
esperados. $nfim, um trabalho imenso. 2magine agora se fossem dois
par0metros] A quantidade de pares seria da ordem de ?.1B?BS ' CNYNB 9algo da
ordem de quatro bilh#es/. $ para > par0metros] $ para n par0metros] N(meros
cada vez mais enormes. *or este caminho, testar programas seria invivel.
Felizmente no precisamos de todos eles, basta identificar as classes
distintas que importam para o problema, ou se.a, as classes de equival:ncia
relevantes. 2sto pode ser obtido analisando o enunciado estendido do problema.
No caso de nosso e'emplo anterior, analisando melhor a definio,
podemos identificar que por definio espao cartesiano se divide em quatro
regi#es. A primeira, onde ambos as coordenadas so positivas, denominamos de
primeiro quadrante. A segunda, onde a coordenada ' negativa e a L positiva,
denominamos de segundo quadrante. ! terceiro quadrante o espao onde
ambas as coordenadas so negativas. Ainda temos o quarto quadrante onde a
coordenada ' positiva e a L negativa. $ os pontos que ficam em um dos ei'os
ou na interseo destes, qual a classificao que eles t:m] Pom, podemos
convencionar que no esto em nenhum dos ? quadrantes descritos. 7esumindo,
nosso plano de teste deve contemplar estas situa#es, conforme ilustra+se na
tabela a seguir.
; J Nuadrante
positivo positivo primeiro
negativo positivo segundo
negativo negativo terceiro
negativo positivo quarto
nulo
qualquer
no nulo
ei'o das ordenadas
qualquer
no nulo
nulo ei'o das abscessos
nulo nulo origem

- bom observar ainda que este plano pode e deve ser preparado antes
mesmo de elaborar o programa, para faz:+lo, precisamos apenas da especificao
detalhada. Alm disso, este plano no precisa ser feito pelo programador
responsvel pela elaborao da soluo, qualquer outro programador, de posse
do enunciado detalhado, pode se encarregar da tarefa. $ste tipo de plano serve
para alimentar o teste denominado de caixa preta. $sta denominao se deve ao
fato de no ser necessrio conhecermos a estrutura da soluo para elaborar o
plano. Um outro aspecto positivo da elaborao do plano o mais cedo possvel
que contribu para um melhor entendimento do problema.
Q
C
Holtando ao nosso e'emplo, podemos agora elaborar a nossa planilha de
teste considerando as classes de equival:ncia a serem definidas. Uma questo
que surge como escolhemos o representante de uma classe] $'istem melhores
e piores] No nosso caso, como pode ser qualquer valor positivo ou negativo,
podemos escolher valores de um dgito apenas, no mnimo escreveremos e
digitaremos menos.
; J
resultado
es+erado
resultado
obtido
diagn_stico
1 > 4rue
+1 > False
+1 +> False
1 +> False
N > False
N +> False
1 N False
+1 N False
N N False
@8=8 #/ABIVA&*5 5 $/S$/Q He.amos agora o resultado de nossa interao com
o TUGO.
] primquad 1 >
$rue
] primquad 9+1/ >
False
] primquad 9+1/ 9+>/
False
] primquad 1 9+>/
False O
primquad N 9+>/
False
] primquad N >
$rue
] primquad N 9+>/
False
] primquad 1 N
$rue
] primquad 9+1/ N
False
] primquad N N
$rue
]

Q
1
Holtemos agora para nossa planilha e vamos preench:+la na coluna de resultado
obtido e diagn%stico.
; J
resultado
es+erado
resultado
obtido
diagn_stico
1 > 4rue 4rue sucesso
+1 > False False sucesso
+1 +> False False sucesso
1 +> False False sucesso
N > False 4rue falha
N +> False False sucesso
1 N False 4rue falha
+1 N False False sucesso
N N False 4rue falha
J.A. &epuraoQ Uma vez testado o programa e identificado que ocorreram
inst0ncias para as quais a nossa definio no est fazendo a associao correta,
ou se.a, o valor obtido diferente do esperado, devemos passar a uma nova fase.
&epurar um programa um processo que consiste em buscar uma e'plicao
para os motivos da falha e posteriormente corrigi+la. !bviamente isto tambm no
um processo determinante e nem possumos uma f%rmula mgica. Ao longo de
nossa formao de programadores iremos aos poucos incorporando heursticas
que facilitem esta tarefa. *or enquanto muito cedo para falarmos mais do
assunto e vamos concluir com um fechamento do problema anterior. Ap%s concluir
as modifica#es devemos testar o programa novamente.
*e+urando nossa soluo + *odemos concluir por simples inspeo da
nossa (ltima planilha 9aquela com todas as colunas preenchidas/ que nossa
soluo est incorreta. Uma interpretao dos resultados nos leva " hip%tese de
que a nossa soluo considera que quando o ponto se localiza na origem ou em
um dos ei'os positivos, a nossa definio est considerando que eles esto no
primeiro quadrante.
*asso seguinte, verificar se de fato nossa definio incorre neste erro. $m
caso afirmativo, corrigi+la e a seguir resubmet:+la aos testes.
!bservando a nossa definio inicial, podemos concluir que de fato nossa
hip%tese se confirma.
primquad ' L M 9' ZM N/ gg 9L ZM N/

*odemos ento modific+la para obter uma nova definio, que esperamos
que este.a correta.
Q
>
primquad ' L M 9' Z N/ gg 9L Z N/

Agora submet:+la novamente ao teste e ver o que acontece`
@8>8 .MA Sb&$/S/ *5 P#5C/SS5Q ! processo , como vimos, repetitivo e s%
se encerra quando no identificarmos mais erros. ! diagrama ilustra o processo
como um todo.
Bas lembre-se1 isto ainda no garante que seu programa
este@a 1!!O corretoP 2uando no identificamos erro1 apenas
podemos concluir que para as instQncias que usamos o nosso
programa apresenta os resultados esperados

Q
?
A8 #/S5B"/&*5 P#5B/MAS - 5S M5"IM/&$5S *5 CA"AB5
A878 I&$#5*.9:5Q 3onsidere o .ogo de 'adrez, onde peas so movimentadas
em um tabuleiro dividido em J linhas e oito colunas. 3onsidere ainda os
movimentos do cavalo, a partir de uma dada posio, conforme diagrama a seguir,
onde cada possvel movimento designado por mi8 No esquema, o cavalo
localizado na posio 9A, ?/ pode fazer oito movimentos, onde o primeiro deles,
m", levaria o cavalo para a posio 9S,A/.
J m> m> m> m> m> m> m> 6>
S
Q m> m1
A m? mC
? C
> mA mJ
1 mQ mS
C
C 1 > ? A Q S J
A828 P#5B/MA 7Q $screva uma funo que determina se, a partir de uma dada
posio, o cavalo pode ou no realizar o primeiro movimento. Hamos cham+la de
pmo!, e denominar seus par0metros 9a posio corrente/, de x e y. $is alguns
e'emplos de uso de nossa funo e os valores esperados)
instcncia resultado
pmov A ? 4rue
pmov J C False
pmov C C 4rue
pmov C J False
B.1.C. Ooluo + A O!\Ulm! *!&$ O$7 $N3!N47A&A A47AH-O &A
3!NO47Ulm! &$ U6A $U*7$OOm! P!!\$ANA RU$ AHA\2$ O$ A N!HA
*!O2lm!, !U O$cA, ARU$\A $6 RU$ ! 3AHA\! O$72A *!O232!NA&!
*$\! *726$27! 6!H26$N4!, $O4n &$N47! &! 4APU\$27!. 3!6! !
3AHA\!, N! *726$27! 6!H26$N4!, AN&A &UAO 3AOAO *A7A &27$24A $
U6A *A7A 326A, PAO4A H$72F23A7 O$ AO 3!!7&$NA&AO &A N!HA
*!O2lm! Nm! U\47A*AOOA6 A !24AHA F2\$27A 9\2NTA !U 3!\UNA/.
3odificando em TUGO, temos ento)
pmov ' L M 9' I 1 fM J / gg 9L I C fM J/
Q
A

B.1.1. 4$O4AN&! A O!\Ulm! + 3omo . discutimos anteriormente, para
verificar a correo de nossa soluo, devemos submet:+la a um teste. *ara tanto
devemos escolher as classes de equival:ncias relevantes e, a partir delas,
produzir a nossa planilha de teste. !lhando para a especificao do problema,
podemos identificar ? con.untos de valores que se equivalem para os fins do
nosso programa, como podemos observar na figura abai'o)
J
S
Q
A
?
>
1
C
C 1 > ? A Q S J
B.1.>. $stendendo o *roblema + *odemos fazer o mesmo para todos os
demais movimentos, obtendo com isso as seguintes defini#es)
pmov ' L M 9' I 1 fM J / gg 9L I C fM J/
smov ' L M 9' I C fM J / gg 9L I 1 fM J/
tmov ' L M 9' + C ZM C / gg 9L I 1 fM J/
qmov ' L M 9' + 1 ZM C / gg 9L I C fM J/
qtmov ' L M 9' + 1 ZMC / gg 9L + C ZM C/
s'mov ' L M 9' + C ZM C / gg 9L + 1 ZM C/
stmov ' L M 9' I C fM J / gg 9L + 1 ZM C/
omov ' L M 9' I 1 fM J / gg 9L + C ZM C/
B.1.?. 2dentificando Abstra#es + *odemos agora indagar, olhando para as
oito defini#es, sobre a ocorr:ncia de algum conceito geral que permeie todas
elas. *oderamos tambm ter feito isso antes. 3omo no o fizemos, faamo+lo
agora. *odemos observar que todas elas avaliam duas e'press#es e que ambas
testam fronteiras que podem ser margem direita, margem esquerda, margem
superior ou margem inferior. *odemos observar ainda, que o par margem direita e
margem superior testam o mesmo valor J, assim como ocorre com as duas outras,
que testam o valor C. 3om isso podemos definir duas novas fun#es, ' e -, para
testar estes limites. Agora, as nossas defini#es anteriores podem ser reescritas,
usando as duas abstra#es identificadas.
pmov ' L M f 9' I 1 / gg f9 L I C/
smov ' L M f 9' I C/ gg f 9L I 1/
tmov ' L M g 9' + C/ gg f 9L I 1/
Q
Q
qmov ' L M g 9' + 1/ gg f 9L I C/
qtmov ' L M g 9' + 1/ gg g 9L X C/
s'mov ' L M g 9' + C/ gg g 9L X 1/
stmov ' L M f 9' I C / gg g 9L X 1/
omov ' L M f 9' I 1/ gg g 9L X C/
f [ M [ fM J
g [ M [ ZM C
B.1.A. Anlise da Ooluo + ! que ser que ganhamos com esta nova forma
de descrever a nossa soluo] *odemos indicar pelo menos tr:s indcios de
vantagem na nova soluo)
C. 3lareza + Na medida em que agora est e'plicitado, que todas as oito
fun#es para verificar os movimentos possuem estrutura semelhante e que
todas esto usando fun#es para verificar a ultrapassagem das bordas5
1. 6anuteno + Oe nosso tabuleiro mudasse, ou se.a, passasse a ter B linhas
por nove colunas, bastaria alterar a funo ' e tudo estaria modificado, ao
invs de termos que alterar as oito defini#es.
>. 7euso + As duas fun#es que testam as bordas poderiam ser usadas para
construir fun#es para avaliar o movimento de outras peas do .ogo de
'adrez.
A8<8 P#5B/MA 2Q Oabemos que para cada posio alguns movimentos podem
ser realizados e outros no. 3omo ordenamos os movimentos no sentido anti+
horrio, gostaramos de obter, para uma dada posio, dos movimentos que
podem ser realizados, aquele que possui o menor ndice. He.amos o esquema
abai'o.

J m= m7 m< m> C7
S C< mA
Q m4 m@ mQ
A m> m?
?
> m2 m<
1 m7 m=
C C= C2
C 1 > ? A Q S J
*odemos observar que o cavalo 3C s% pode fazer os movimentos mA e mQ
e que o de menor ndice mA. c o cavalo 31 s% pode fazer os movimentos m> e
m? e que o de menor ndice o m>. $nquanto isso o cavalo 3> pode fazer os
Q
S
movimentos mC, m?, mA, mQ, mS e mJ. *ara este caso o movimento de menor
ndice o mC.
Hamos chamar esta funo de qualmo! e, como no problema anterior, os
par0metros sero as coordenadas da posio atual do cavalo. $is alguns
e'emplos de uso de nossa funo)
2nst0ncia resultado
qualmov J C >
qualmov J J A
qualmov > S C
qualmov C C C
B.>.C. O!\Ulm! + Pem, como . sabemos, para verificar se um dado
movimento mi possvel, basta arran.ar um meio de sair verificando um+a+um os
movimentos, a partir do primeiro 9mC/ e encontrar o primeiro que pode ser
realizado. Ruando isso ocorrer podemos fornecer como resposta o seu ndice.
*odemos construir para isso uma rvore de deciso. Na raiz da rvore estar a
pergunta
M poss5!el reali1ar o mo!imento m"MN
$m caso afirmativo 9brao esquerdo da rvore/, mapeamos no valor C e em
caso negativo 9brao direito/, o que devemos fazer] Pom, a podemos comear
uma nova rvore 9na verdade uma sub+rvore/, cu.a raiz ser)
M poss5!el reali1ar o mo!imento m2MN
$ da prosseguimos at que todos os movimentos ha.am sido considerados.
A rvore resultante ser)
Q
J
B.>.1. 3!&2F23AN&! A O!\Ulm! + Hamos ento e'plorar os recursos da
linguagem para transformar nosso plano em um programa que de fato possa ser
;entendido; pelo nosso sistema de programao 9TUGO/. 3omo podemos
observar temos aqui o caso de uma funo que no contnua para o domnio do
problema. *elo que sabemos at ento, no d para e'pressar a soluo como
uma (nica e'presso simples. 7esta+nos o recurso das e'press#es condicionais.
*ara verificar se um dado movimento satisfeito podemos usar as fun#es que
construmos anteriormente e com isso obtemos a seguinte definio)
qualmov ' L M i, pmov ' L t!en 7
else i, smov ' L t!en 2
else i, tmov ' L t!en <
else i, qmov ' L t!en =
else i, qtmov ' L t!en 4
else i, s'mov ' L t!en >
else i, stmov ' L t!en ?
else i, omov ' L t!en @
else 3
B.>.>. Anlise da Ooluo + $m primeiro lugar, inclumos a resposta igual a
zero 9N/ quando o movimento mJ, o (ltimo a ser avaliado, resulta em fracasso.
*ara que serve isso] Acontece que se a posio de entrada no for vlida, ou
se.a, uma ou ambas as coordenadas no pertencerem ao intervalo iC, Ja, nenhum
movimento seria vlido e se no providenciarmos uma resposta alternativa, nossa
funo seria parcial. 6as isto resolve de fato nosso problema] ! que ocorreria se
a posio de entrada fosse 9N, N/] Pom, nossa funo determinaria que o primeiro
movimento poderia ser realizado e isto no verdade. A inveno de um resultado
e'tra para indicar que no h soluo possvel, transformando uma funo parcial
em uma funo total, parece ser boa, mas como foi feita no resolveu. $m geral o
melhor nestas situa#es preceder toda e qualquer tentativa de determinar a
soluo adequada, por uma avaliao da validade dos dados de entrada. Neste
Q
B
caso, bastaria verificar se os dois esto no intervalo iC, Ja. Hamos construir aqui
uma funo que avalia a pertin:ncia de um valor a um intervalo numrico,
conforme definio a seguir)
pert ' a b M 9' ZM a/ gg 9'fMb/
$speculando um pouco mais sobre a nossa soluo, podemos observar
que o movimento mO, .amais ocorrer` Analisando os possveis movimentos
chegaremos " concluso de que para nenhuma posio, o oitavo o (nico
movimento possvel. Ougerimos fortemente que o leitor prove este teorema.
*ortanto a soluo final pode ser)
qualmov ' L M i, not 9pert ' C J/
LL not 9pert L C J/ t!en 3
else i, pmov ' L t!en 7
else i, smov ' L t!en 2
else i, tmov ' L t!en <
else i, qmov ' L t!en =
else i, qtmov ' L t!en 4
else i, s'mov ' L t!en >
else ?
A8=8 #/"ISI$A&*5 5 P#5B/MA 7Q !bservando a soluo encontrada para o
problema C, constatamos que embora a noo de movimento do cavalo se.a
(nica, quem precisar saber se um dado movimento vlido, precisar conhecer o
nome das oito fun#es. $mbora se.a cedo para falarmos de interface homem+
mquina, . d para dizer que estamos sobrecarregando nosso usurio ao darmos
oito nomes para coisas to parecidas. Oer que temos como construir uma s%
funo para tratar o problema] Hamos reproduzir aqui a interface das oito)
+mov ' L
smov ' L
tmov ' L
Nmov ' L
Ntmov ' L
s;mov ' L
stmov ' L
omov ' L

*ropositadamente escrevemos o nome delas com um pedao em vermelho
e outro em preto. Oeria alguma homenagem " algum time que tem essas cores]
S
N
Na verdade estamos interessados em destacar que a pequena diferena nos
nomes sugere que temos uma mesma funo e que e'iste um par0metro oculto.
Rue tal e'plicit+lo] *odemos agora ter uma funo com > par0metros, sendo o
primeiro deles para indicar o n(mero do movimento que nos interessa. A interface
agora seria)
mov m ; J
Agora, por e'emplo, para solicitar a avaliao do stimo movimento para um
cavalo em 9>, ?/, escrevemos)
O mov ? < =
4rue
]
6uito bem, e como codificaremos isso]
B.?.C. O!\Ulm! + *recisamos encampar em nossa soluo o fato de que a
nossa funo possui diferentes formas de avaliao, para diferentes valores do
domnio, algo parecido com a soluo do problema 1, ou se.a, a nossa funo no
continua e portanto temos que selecionar qual a definio apropriada para um
determinado valor de m. &evemos construir uma rvore de deciso. Aqui
dei'amos esta tarefa a cargo do leitor e passamos direto " codificao conforme
apresentamos a seguir)
mo m x y = if #o" (&er" m ' () then
False
else if m == 1 then &mo
else if m == 2 then smo
else if m == 3 then "mo
else if m == 4 then ,mo
else if m == 5 then ,"mo
else if m == 6 then sxmo
else if m == 7 then s"mo
else omo
where

&mo = ...
smo = ...
"mo = ...
...
B.?.1. Anlise da soluo + Ao contrrio da soluo do problema 1, onde
necessariamente a validade dos movimentos tinha que ser verificada do primeiro
para o (ltimo, pois nos interessava saber qual o primeiro possvel de ser realizado,
o leitor pode observar que esta ordem aqui no necessria. 4anto faz se
perguntamos primeiro se mMS ou se mM>. Oer que podemos tirar algum proveito
disso] Alertamos o iniciante, que devemos sempre identificar propriedades
S
C
internas do problema e e'plor+las adequadamente. Rual a influ:ncia desta ordem
na efici:ncia da avaliao de uma e'presso submetida ao TUGO] *ara
responder, basta lembrar que as condi#es so avaliadas seq<encialmente. *or
e'emplo, se mMJ, teremos que avaliar J condi#es, se mMC faremos 1 avalia#es
e se m est fora do domnio faremos uma avaliao. !u se.a, no pior caso
faremos J avalia#es e no melhor caso uma 9C/. $m mdia, ao longo do uso da
funo, assumindo uma distribuio uniforme dos valores de m, faremos ?
avalia#es. $ se o intervalo fosse de CNN elementos distintos, quantas avalia#es
de condi#es faramos em mdia] Oer possvel elaborar solu#es onde este
n(mero de avalia#es se.a menor]
A resposta sim` c que a ordem das avalia#es no importa, podemos
buscar uma ordem mais conveniente para reduzir o n(mero de avalia#es por
cada inst0ncia avaliada.
A idia geral para estes casos obtida a partir de um conceito de vasta
utilidade na 3omputao. Falamos de r!ore +inria e o leitor por certo ouvir
falar muito dela ao longo da vida enquanto profissional da rea.
! caminho consiste em dividir intervalo considerado ao meio e fazer a
primeira pergunta, por e'emplo, mfM?] &ividindo em 1 o intervalo de
compara#es, para cada um destes podemos novamente dividir ao meio, at que
no mais tenhamos o que dividir, como ilustramos no diagrama a seguir, onde
cada linha representa um passo da diviso dos intervalos.
a7 7 2 < = 4 > ? @ S@
a7 7 2 < = 4 > ? @ S@
a7 7 2 < = 4 > ? @ S@

Rue tambm podemos representar por)

S
1
A codificao ficar ento)
mo m x y = i1 #o" (&er" m ' ()
"7e# False
else i1 m != 4
"7e# i1 m!= 2
"7e# i1 m== '
"7e# &mo
else smo
else i1 m==3
"7e# "mo
else ,mo
else i1 m!= 0
"7e# i1 m==5
"7e# ,"mo
else sxmo
else i1 m == <
"7e# s"mo
else omo
87ere
&mo = ...
smo = ...
"mo = ...
...

Oe fizermos uma anlise das possibilidades veremos que para qualquer
valor de m o n(mero m'imo de avalia#es que faremos ser sempre igual a
quatro` $ se fosse CNN valores para m, qual seria o n(mero m'imo de
compara#es] $ para CNNN] $ CNNNNNN]
! n(mero de compara#es, seguindo este esquema, apro'imadamente
igual ao logaritmo do n(mero de valores na base 1. *ortanto para CNN teramos S,
para CNNN teramos CN e para um milho teramos 1N. He.a que bem inferior ao
que obtemos com o esquema anterior, tambm denominado de linear. 3onfira a
comparao na tabela abai'o.
n(mero de
valores
esNuema linear
9n(mero mdio/
esNuema binrio
9n(mero m'imo/
J J ?
CNN AN S
CNNN ANN CN
CNNNNNN ANNNNN 1N
S
>
738 $.PBAS
73878 I&$#5*.9:5Q At ento trabalhamos com valores elementares. !u se.a,
valores at,micos, indivisveis a nvel das opera#es de seu tipo de dados. *or
e'emplo, Irue, 523, O23., so valores elementares dos tipos Poolean, 2nteger e
Float, respectivamente. No podemos, por e'emplo, nos referir, dentro da
linguagem, ao primeiro algarismo do valor 523. &izemos que esses so tipos
primitivos da linguagem. Alm desses tr:s, o Tugs prov: ainda o tipo c)ar. !
elenco de tipos primitivos de uma linguagem pode ser entendido como o alicerce
da linguagem para a descrio de valores mais comple'os, que so denominados
genericamente de !alores estruturados.
!s problemas que pretendemos resolver esto em universos mais ricos em
abstra#es do que esse das linguagens. *ara descrever esses mundos,
precisamos usar abstra#es apropriadas para simplificar nosso discurso. *or
e'emplo, quando quero saber onde algum mora, eu pergunto) Rual o seu
endere3o] Ruando quero saber quando um amigo nasceu, eu pergunto) Rual a
data do seu nascimento] $ quando quero saber para onde algum vai deslocar o
cavalo no .ogo de 'adrez, eu pergunto) Rual a nova posi34o] !s nomes
endereo, data e posio designam valores estruturados. Uma data tem tr:s
partes) dia, m:s e ano. Um endereo pode ter quatro) rua, n(mero, complemento
e bairro. c a posio no tabuleiro tem duas partes, linha e coluna.
*ara possibilitar a descrio de valores dessa natureza, o Tugs disp#e de
um construtor denominado tupla. *odemos definir uma tupla como um agregado
de dados, que possui quantidade pr+estabelecida de componentes 9dois ou
mais/, e onde cada componente da tupla pode ser de um tipo diferente 9primitivo
ou no/.
73828 */FI&I9:5 *5 C5&C/I$5Q A representao de uma tupla feita com a
seguinte sinta'e)
It7, t2, t<, 888, tnK
!nde cada ti um termo da tupla.
Oe Ii o tipo de ti, ento o universo de uma tupla dado por)
II % I" x I2 x x In
Oabendo+se que os con.untos bases dos tipos Ii so ordenados, tambm os
elementos de II o sero.
S
?
$'emplos de 4uplas)
Inteno #e+resentao
C uma data 9CA, NA, 1NNN/
1
uma posio no
tabuleiro de 'adrez
9>, J/
> uma pessoa
9;6aria Aparecida;, ;solteira;,
9>, N1, CBSN//
? um ponto no espao 9>.N, A.1, >?.A/
A uma carta de baralho 9S, ;espada;/
Q 94rue, >/
S 9False, div A 1/
J
9'KMN gg L KM N,
I' Z L, i' 'WL /% N
t)en i' ' Z L
t)en div ' L
else div L '
else NK/
B 9', L, ' I L/
738<8 C5MP5&*5 $.PBASQ !s e'emplos apresentados . parecem suficientes
para que tenhamos entendido como descrever um valor do tipo tupla. Hamos
ento apenas comentar sobre os e'emplos e ilustrar o uso de tuplas nas
defini#es.
Uma tupla um valor composto. 2sto significa que devemos colocar entre
par:ntesis e separados por vrgulas os componentes deste valor. 3ada
componente um valor, descrito diretamente ou atravs de e'press#es
envolvendo operadores. Nos e'emplos de C a S, todos eles usam constantes. !
e'emplo S apresenta um dos valores descrito por uma e'presso. No e'emplo >,
um dos termos uma outra tupla. Rualquer termo pode ser uma tupla. Um valor
pode tambm ser paramtrico, como no e'emplo B, onde temos uma tupla de >
termos, todos eles paramtricos, mas o terceiro depende dos dois primeiros.
*odemos dizer que esta tupla descreve todas as triplas onde o terceiro termo
pode ser obtido pela soma dos dois primeiros. No e'emplo J podemos observar o
uso de e'press#es condicionais. !bserva+se a tambm a descrio de um termo
do tipo boolean, atravs de uma e'presso relacional combinada com operadores
l%gicos.
He.amos agora alguns e'emplos de uso de tuplas na descrio de valores.
/;em+lo 7) &ese.amos definir uma funo, para que dados 1 valores, se.a
produzido uma tripla onde os dois primeiros termos so id:nticos aos elementos
fornecidos, em ordem inversa, e o terceiro termo se.a igual " soma dos dois.
S
A

"ri&la= a ) = ( )> a> a + ) )
/;em+lo 2Q Hamos definir uma funo que produza o quociente e o resto da
diviso inteira de dois n(meros.
di?#" a ) = ( ,> r)
87ere
, = di a )
r = rem a )
/;em+lo <Q Holtemos " definio das razes de uma equao do 1o. grau.
Himos anteriormente que como eram duas, precisvamos definir tambm duas
fun#es. Agora podemos agrup+las em uma (nica definio)
re2* a ) $ = ( x'> x2)
87ere
x' = ((-)) + e)/ du&lo@
x2 = ((-)) - e)/ du&lo@
e = s,r" ()-2 - 4.%+a+$)
du&lo@ = 2.% + a
S
Q
/;em+lo =Q Holtemos aos movimentos do cavalo no .ogo de 'adrez. Hamos
definir uma funo que produza a nova posio, usando o primeiro movimento
vlido segundo o que se discutiu em 7esolvendo *roblemas + !s 6ovimentos do
3avalo.

,Aos x y = i1 1 x2 .. 1 y'
"7e# (x2>y')
else i1 1 x' .. 1 y2
"7e# (x'>y2)
else i1 * x'e .. 1 y2
"7e# (x'e>y2)
else i1 * x2e .. 1 y'
"7e# (x2e>y')
else i1 * x2e .. * y'e
"7e# (x2e>y'e)
else i1 * x'e .. * y2e
"7e# (x'e>y2e)
else i1 1 x' .. 1 y2e
"7e# (x'>y2e)
else (%>%)
87ere
x' = x + '
x2 = x + 2
y' = y + '
y2 = y + 2
x'e = x - '
x2e = x - 2
y'e = y - '
y2e = y - 2
1 8 = 8 != (
* 8 = 8 >= '
Rual o valor de q*os C B ] ! que h de errado] 7eescreva q*os de forma
a contornar o problema encontrado.
738=8 S/B/CI5&A&*5 $/#M5S */ .MA $.PBAQ Assim com precisamos
compor uma tupla na descrio dos mapeamentos de uma funo, tambm
precisamos decomp,+la. Ruando uma funo possui tuplas como par0metros,
para usar seus termos necessrio que se possa referenci+los..
2lustraremos aqui vrias formas, utilizando a definio que soluciona o
seguinte problema)
:esejamos determinar a dist0ncia entre dois pontos no plano
C. Utilizando a clusula 7)ere )
dis" &' &2 = s,r" (dx-2 + dy-2)
87ere
dx = x' - x2
dy = y' - y2
(x'>y') = &'
(x2>y2) = &2
S
S
!bserve a eleg0ncia da definio da tupla 9'C, LC/`
*or anlise da definio, sabemos que o tipo de pC e p1 tupla de 1 termos.
Ruando submetemos a avaliao de uma inst0ncia, o sistema casa pC com um
par de valores e a partir da pode determinar o valor de cada termo de nossa tupla
9'C, LC/.
? dist (.!." (5.!5."
-- o sis"ema $asa &' $om (%.%>%.%)
-- e &2 $om (5.%>5.%)
-- lo*o x'=%.%> y'=%.%> x2=5.% e y2=5.%
7.717
1. 3onstruindo fun#es seletoras )
&rim (x>y) = x
se* (x>y) = y
dis" &' &2 = s,r" (dx-2 + dy-2)
87ere
dx = &rim &' - &rim &2
dy = se* &' - se* &2
3om esta abordagem, podemos generalizar e construir fun#es seletoras
para tuplas com uma quantidade de termos qualquer. - importante destacar que
tuplas com quantidade diferente de termos precisam ter o seu pr%prio elenco de
fun#es seletoras.
$m particular, para o caso acima, onde o n(mero de termos 1, o pr%prio
TUGO . possui as fun#es seletoras, fst 9primeiro/ e snd 9segundo/. *oderamos
t:+las usado diretamente, mas preferimos ilustrar como se constr%i. *odemos
reescrever a soluo usando+as.
dis" &' &2 = s,r" (dx-2 + dy-2)
87ere
dx = 1s" &' - 1s" &2
dy = s#d &' - s#d &2
>. $'plicitando os componentes)
dis" (x'>y') (x2>y2) = s,r" (dx-2 + dy-2)
87ere
dx = x' - x2
dy = y' - y2
S
J
778 "ABI*A9:5 */ *A*5S
77878 I&$#5*.9:5Q 3omo sabemos, toda funo tem um domnio e um
contradomnio. $m Tugs, quando tentamos avaliar uma inst0ncia de uma
definio, usando valores fora desse domnio, podemos receber como resposta
mensagens nem sempre esclarecedoras. Ruando se trata do usurio de nosso
programa, esta situao se mostra mais indese.vel ainda. Aqueles que
constroem a definio podem discernir com mais facilidade a natureza dos
problemas que ocorrem durante o seu desenvolvimento. ! mesmo no se pode
esperar de algum que no tem conhecimento dos elementos internos de nossas
defini#es.
4ipicamente os erros sero de duas naturezas. *ode ser que o tipo da
inst0ncia este.a correto mas nossa definio use alguma funo primitiva que no
se aplica ao valor da inst0ncia. *or e'emplo, se temos a definio)

1 x y z = di x y + z
e se a submetemos a uma inst0ncia onde y % (, teremos como resultado algo da
seguinte natureza)
B 1 5 % 3
Aro*ram error: C5 DdiD %E
B
Um outro tipo de problema ocorre quando o tipo de algum par0metro da
nossa inst0ncia no casa com o tipo inferido pelo Tugs. *or e'emplo, se usamos
um valor do tipo >loat para y, obtemos)
B 1 5 '.% 3
FGGHG: Ty&e error i#
a&&li$a"io#
+++ ex&ressio# : 1 5 '.% 3
+++ "erm : '.%
+++ "y&e : Floa"
+++ does #o" ma"$7 : ?#"
B
Nesta seo trataremos do primeiro caso, dei'ando o segundo para outra
oportunidade.
S
B
77828 CA#AC$/#IVA&*5 A SI$.A9:5 - Holtemos " definio anteriormente
apresentada)

1 x y z = di x y + z
Neste caso, o tipo inferido pela linguagem para os dois primeiros par0metros
o tipo =nte-er, visto que o operador di! s% se aplica a valores deste tipo.
*ortanto o universo ser formado por todos os possveis ternos de valores onde
os dois primeiros so do tipo =nte-er e o (ltimo, do tipo obtido pela unio dos tipos
>loat e =nte-er 3hamemo+lo de I. $ntretanto, o domnio de nossa funo no
e'atamente o con.unto de constantes de I, posto que a funo no est definida
para as constantes de I cu.o segundo elemento nulo.
&ese.amos construir uma funo que se.a uma e'tenso da funo original e
ao mesmo tempo lhe sirva como uma casca de proteo contra as viola#es de
domnio. *recisamos escolher um contradomnio da funo estendida 9'x/. Um
candidato natural o contradomnio da funo original 9'/.
$ a imagem de nossa funo, o que podemos dizer dela] Oer que ela
igual ao contradomnio] !u ser que temos um subcon.unto para o qual no
e'ista um mapeamento]
778<8 CAS5 )/#AB IIMA)/M I*]&$ICA A5 C5&$#A*5Mb&I5KQ No caso
geral, podemos encontrar duas situa#es) ou o contradomnio id:ntico "
imagem, ou a determinao dos elementos que no pertencem " imagem pode
no ser fcil. 3om isto no dispomos de valores no contradomnio que possam ser
utilizados para mapearmos os valores que violam o domnio de f. Neste caso
podemos estender o contradomnio 93&/ de tal modo que o novo escolhido
incorpore um valor que ser a imagem da e'tenso de f.
Uma soluo geral bastante conveniente construir um novo contradomnio
9N3&/ para f' 9e'tenso de f/, formado por pares onde o primeiro elemento do
tipo boolean e o segundo do contradomnio de f. 4emos ento a seguinte
estrutura)
J
N
NCD(fx) = (boolean, CD(f))
*ara valores de x no domnio de ', teremos)
fx x = (True, fx )
*ara os valores de x fora do domnio teremos)
fx x = (False, k )
onde 8 um valor qualquer pertencente ao contradomnio de '.
*ara o nosso e'emplo inicial teramos ento)
fx x y z = i1 invalido x y z
"7e# (False,0)
else (#r$e! f x y z)
87ere
i#alido x y z = ...
f x y z = di x y + z
- como se estivssemos criando uma casca protetora para a '
778=8 F.&9D/S F./ AP#/S/&$AM P#5B/MAS /M "6#I5S
PA#dM/$#5SQ Ruando uma funo possui vrios par0metros, pode ocorrer que
mais de um deles d:em origem " questo que aqui levantamos. Ruando isso
ocorre, pode ser relevante caracterizar a situao apropriadamente. Neste caso
podemos usar um con.unto de constantes mais variado do que as constantes
booleanas, permitindo que possamos associar com cada erro uma constante
diferente.
*odemos tomar como e'emplo o problema do movimento dos cavalos no
.ogo de 'adrez, especificamente a soluo genrica que produzimos com a funo
mo! m x y
onde m o n(mero do movimento, x a linha atual e y a coluna atual.
!s tr:s par0metros so vlidos apenas para o intervalo iC, Ja. *ortanto mo!
no est definida para os valores pertencentes ao subcon.unto do universo
formado por todas as triplas onde pelo menos um dos elementos no pertence ao
intervalo iC, Ja. *or outro lado, o contradomnio con.unto booleano e portanto s%
possui 1 constantes, e ambas . esto comprometidas. Oe quisermos distinguir os
> tipos de viola#es do domnio 9movimento invlido, posio invlida, ambos
invlidos/ precisaremos usar um con.unto com pelo menos ? constantes.
J
C
*odemos ento definir a funo Dmov'E da seguinte forma)

m%&' m x y = i1 #o" alidom
"7e# i1 #o" alido&
"7e# (3> False)
else ('> False)
else i1 #o" alido&
"7e# (2> False)
else (%> m%& m x y)
77848 CAS5 PA#$IC.BA# IIMA)/M *IF/#/&$/ *5 C5&$#A*5Mb&I5KQ
Ouponha que e'iste pelo menos um elemento 8 que no pertence " imagem, ou
se.a, a imagem est contida no contradomnio. *odemos construir uma e'tenso
de ' de tal forma que os elementos que no pertenam ao domnio se.am
mapeados neste 8 e os demais se.am mapeados diretamente pela ' . Ruando
e'iste tal 8, nosso problema est resolvido. Pasta que o usurio saiba que,
quando a avaliao resultar em 8, significa que a funo no se aplica para aquela
inst0ncia.
Holtemos " funo , introduzida anteriormente. *odemos, usando a proposta
desta seo reescrever a sua definio, da seguinte forma)

fx x y z = i1 invalido x y z
"7e# k
else f x y z
87ere
I = ...
i#alido x y z = ...
f x y z = di x y + z
2nfelizmente, para esse caso, o 8 no e'iste 9prove`/.
Holtemos ao movimento do cavalo. Nesse caso, especificamente, porque o
contradomnio original o con.unto booleano, poderamos ter tomado outro
caminho. *oderamos usar n(meros negativos para indicar os > tipos de violao
do domnio, o ( para representar >alse e o " para representar Irue, eliminando
com isso a necessidade de termos um novo domnio formado por pares. He.amos
como fica esta definio)

m%&' m x y = i1 #o" alidom
"7e# i1 #o" alido&
"7e# (-3)
else (-')
else i1 #o" alido&
"7e# (-2)
else i1 m%& m x y "7e# ' else %
J
1
778>8 .M /C/MPB5 - #AIV/S */ .MA /F.A9:5 *5 258 )#A.Q Holtemos ao
problema de determinar as razes de uma equao do segundo grau. c sabemos
que elas so duas e que podemos fazer uma (nica funo para descrev:+las,
usando tupla.
Oabemos ainda que o universo definido pelos tipos dos > par0metros 9a, b,
c/, maior que o domnio da funo. !u se.a, a funo no est definida para
inst0ncias de a, b e c, onde se verifica a seguinte desigualdade)
() - 2) + (4 + a + $) ! %
*recisamos, portanto de uma funo estendida.
re2*x a ) $ = (#o" (del"a ! %)! i1
del"a ! %
"7e#
(%>%)
else
(x'> x2)"
87ere
del"a = () - 2) +
(4 + a + $)
x' = ((-)) +
s,r" del"a) / (2 + a)
x2 = ((-)) -
s,r" del"a) / (2 + a)
!u, de outra forma)
re2*x a ) $ = i1 del"a ! %
"7e# (False> (%> %))
else (True> (x'> x2))
87ere
del"a = () - 2) +
(4 + a + $)
x' = ((-)) +
s,r" del"a) / (2 + a)
x2 = ((-)) -
s,r" del"a) / (2 + a)
778?8 /;ercPcios
C. $'plique por que no e'iste o valor V que ap%ie a definio da funo f'5
1. cpo.po.
>. *o.po.
?. *o.poi.
J
>
728 BIS$AS
72878 I&$#5*.9:5Q A maioria dos itens de informao de nosso interesse esto
agrupados, dando origem a um conceito muito importante para a resoluo de
problemas, o agrupamento. Freq<entemente estamos interessados em manipular
esses agrupamentos para e'trair informa#es, definir novos itens ou avaliar
propriedades desses agrupamentos.
4ratamos anteriormente das tuplas, que so agrupamentos de tamanho
predefinido e heterog:neo, ou se.a, cada elemento que participa do agrupamento
pode ser de um tipo diferente. Agora estamos interessados em e'plorar um outro
tipo de agregao, as listas. $ste novo tipo, em TUGO, caracteriza+se por agregar
quantidades variveis de elementos desde que todos eles se.am de um mesmo
tipo.
Hivemos cercados de listas. $las esto em qualquer lugar onde precisamos
registrar e processar dados. He.amos alguns e'emplos)
C. \ista de n(meros pares5
1. \ista dos livros lidos por uma pessoa5
>. \ista dos amigos que aniversariam em um dado m:s5
?. \ista dos presidentes corruptos5
A. \ista dos vereadores decentes5
Q. \ista das farmcias enganadoras5
S. \ista das disciplinas que . cursei5
J. \ista dos \ugares que visitei5
B. \ista dos n(meros feios5
CN. \ista dos n(meros primos5
CC. \ista das posi#es para as quais um cavalo pode se deslocar5
C1. \ista das palavras de um te'to5
C>. \ista dos bug provocados pelo oindo[s5
C?. \ista dos pr:mios Nobel ganhos pelo Pertrand 7ussel.5
CA. \ista dos ttulos conquistados pelo Nacional Futebol 3lube5
CQ. \istas dos funVs compostos pelo Noel 7osa.
&estas, algumas so vazias, outras so finitas e algumas infinitas.
72828 C5&C/I$5S 6SIC5S ) Uma lista uma seq<:ncia de zero ou mais
elementos de um mesmo tipo.
$ntende+se por seq<:ncia uma quantidade qualquer de itens dispostos
linearmente.
*odemos representar uma lista pela enumerao dos seus elementos,
separados por vrgulas e cercados por colchetes.
i e", e2, .., ene
J
?
*or e'emplo)
C. i a
1. iC,>,A,S,Ba
>. idad, ded, did, dod, duda
?. i911,N?,CANN/, 9NS,NB,CJ11/, 9>C,N>,CBQ?/a
A. iiC,1,A,CNa, iC,CCa, iC,1,>,?,Q,C1a, iC,C>a, iC,1,S,C?a, iC,>,A,CAaa
- importante ressaltar que em uma lista podemos falar do primeiro elemento,
do quinto, do ensino, ou do (ltimo. !u se.a, h uma correspond:ncia direta entre
os n(meros naturais e a posio dos elementos de uma lista.
$ste (ltimo fato nos lembra de um equvoco freq<ente, que queremos
esclarecer de sada. A ordem que se adota em listas, por ser baseada nos
n(meros naturais, comea do zero. !u se.a, o primeiro elemento de uma lista tem
o n(mero de ordem igual a zero.
*or e'emplo, na relao acima apresentada, a primeira lista vazia. Na lista
do item ? o elemento de ordem C a tupla 9NS, NB,CJ11/ e na lista do item A, o
elemento de ordem zero 9N/ a lista iC,1,A,CNa.
Ruanto ao tipo, podemos dizer que a segunda lista uma lista de n(meros, a
terceira uma lista de caracteres, a quarta uma lista de triplas de n(meros e a
quinta uma lista de listas de n(meros. Rual ser o tipo da primeira lista]
Uma lista vazia de natureza polim%rfica, isto , seu tipo depende do
conte'to em que se.a utilizada, como veremos em momento oportuno.
728<8 F5#MAS AB$/#&A$I"AS PA#A */FI&I9:5 */ BIS$ASQ Alm da forma
bsica, acima apresentada, tambm conhecida como enumerao, onde
e'plicitamos todos os elementos, dispomos ainda das seguintes maneiras)
definio por intervalo, definio por progresso aritmtica e definio por
compreenso. As duas primeiras formas apresentamos a seguir a terceira
posteriormente.
*e,inio +or Intervalo
&e uma forma geral, podemos definir uma lista e'plicitando os limites inferior
e superior de um con.unto conhecido, onde e'iste uma relao de ordem entre os
elementos, no seguinte formato)
fflimite inferiorZ 88 flimite superiorZe
J
A
$'emplos) abai'o listamos algumas submiss#es de listas definidas por intervalo e
as correspondentes respostas do sistema TUGO.
1 (rel$de> 6'..59
6'>2>3>4>59
2 (rel$de> 6-2..29
6-2>-'>%>'>29
3 (rel$de> 6'%..59
69
4 (rel$de> 6-5.%..5.%9
6-5.%>-4.%>-3.%>-2.%>-'.%>%.%>'.%>2.%>3.%>4.%>5.%9
5 (rel$de> 6-'..-59
FGGHG: J#de1i#ed aria)le K..-K
6 (rel$de> 6-'..(-5)9
69
7 (rel$de> 6'.0..'%.%9
6'.0>2.0>3.0>4.0>5.0>0.0><.0>(.0>L.09
) (rel$de> 6'.5..'%.%9
6'.5>2.5>3.5>4.5>5.5>0.5><.5>(.5>L.5>'%.59
*odemos observar aqui algumas aparentes surpresas) na definio ? podemos
observar que o TUGO considera sempre o intervalo de uma unidade entre os
elementos da lista definida. Na definio A, temos uma questo de ambig<idade, N
sinal de menos logo ap%s os dois pontos no entendido e o sistema sinaliza
erro. A definio Q contorna essa dificuldade. &ei'o ao leitor buscar e'plicao
para o que ocorre com as defini#es S e J.
*e,inio +or Progresso Aritmtica
*odemos definir qualquer progresso aritmtica por uma lista utilizando a seguinte
notao)
ffCo. termoZ, f1o. termoZ 88 flimite superiorZe
$'emplos) observemos as defini#es a seguir e as respectivas respostas do
sistema TUGO. *odemos perceber que dependendo do segundo termo da
definio o sistema interpreta a *.A. como crescente ou decrescente.
1 (rel$de> 6'>2..09
6'>2>3>4>5>09
2 (rel$de> 6-5>2..59
6-5>29
3 (rel$de> 6-5>2..'59
6-5>2>L9
4 (rel$de> 6-5>2..'09
6-5>2>L>'09
5 (rel$de> 6'>'.' .. 29
6'.%>'.'>'.2>'.3>'.4>'.5>'.0>'.<>'.(>'.L>2.%9
6 (rel$de> 60>5..%9
60>5>4>3>2>'>%9
7 (rel$de> 65>0..59
J
Q
659
) (rel$de> 63><..'9
69
728=8 5P/#A9D/S 6SICAS : As listas, como . dissemos, so elementos da
linguagem que podemos utilizar para descrever valores estruturados. 3omo nos
demais tipos da linguagem, valores descritos por listas podem e devem ser
usados na descrio de novos valores atravs da utilizao de opera#es
definidas sobre eles. A seguir so apresentadas algumas dessas opera#es.
elem Q avalia se um determinado elemento membro de uma lista.
elem felementoZ flistaZ
/;em+losQ
Mai#> elem 5 6-5..'59
True
Mai#> elem (-'%) 6-5..'59
False
Mai#> elem 2% 6-5..'59
False
Mai#> elem '5 6-5..'59
True
lengt! Q descreve o tamanho de uma lista.
lengt! flistaZ
/;em+losQ
(rel$de>le#*"7 6'..'%%9
'%%
(252( redu$"io#s> 3442 $ells)
(rel$de>le#*"7 6'..'%%9 + le#*"7 6'..'%%9
2%%
(5%5% redu$"io#s> 0(<3 $ells)
(rel$de> a + a 87ere a = le#*"7 6'..'%%9
2%%
(253% redu$"io#s> 3442 $ells)
inde;ao Q podemos descrever como um novo valor, cada termo de uma
lista. *ara tanto basta indicarmos a posio do elemento dentro da lista,
considerando que o primeiro elemento tem a ordem zero.
flistaZggfndiceZ
/;em+losQ
J
S
1 (rel$de> 63>4>0><4>459**%
3
2 (rel$de> 63>4>0><4>459**4
45
3 (rel$de> 6'>5..2%9**3
'3
4 (rel$de> 666'9>62>3>4999**%**'**2
4
5 (rel$de> 63>4>0><4>459**3
<4
6 (rel$de> 63>4>0><4>459**3 + 62>39**%
<0
7 (rel$de> 63>4>0><4>459**(%+')
4
) (rel$de> 63>4>0><4>459**(i+N) 87ere i=3O N=%
<4
+ (rel$de> 6(4><0>23>'24><03>239**(6%>'>2>39**2)
23
1 (rel$de> 6'>5..2%9PP5
Aro*ram error: Arelude.PP: i#dex "oo lar*e
concat Q descreve uma nova lista obtida pela concatenao de uma lista de
listas.
concat *lista de listas+
/;em+losQ
1 (rel$de>,%n,at 66'..59>6'>'%..'%%9>6L99
6'>2>3>4>5>'>'%>'L>2(>3<>40>55>04><3>(2>L'>'%%>L9
(4<3 redu$"io#s> <4< $ells)
2 (rel$de>,%n,at 66'99
6'9
(25 redu$"io#s> 35 $ells)
3 (rel$de> len-th (,%n,at 66'..59>6'>'%..'%%9>6L99)
'(
(45' redu$"io#s> 03( $ells)
4 (rel$de> ,%n,at 66len-th 6'%>(<..5%%99> 6len-th
6'%>(<>5%%999
6<>39
(22( redu$"io#s> 3%L $ells)
5 (rel$de> len-th (,%n,at 66len-th 6'%>(<..5%%99>
6len-th 6'%>(<>5%%999)
2
(3% redu$"io#s> 35 $ells)
*ode tambm ser usado com a sinta'e infi'ada usando o operador XX
/;em+losQ
J
J
1 (rel$de> 6'9 ++ 6'9
6'>'9
(33 redu$"io#s> 4( $ells)
2 (rel$de> 6'9 ++ 69
6'9
(23 redu$"io#s> 33 $ells)
3 (rel$de> 6 9 ++ 6 9
FGGHG: Qa##o" 1i#d Ks7o8K 1u#$"io# 1or:
+++ Fx&ressio# : 69 ++ 69
+++ H1 "y&e : 6a9
4 (rel$de> 6'..59 ++ 6'>'%..'%%9 ++ 6L9
6'>2>3>4>5>'>'%>'L>2(>3<>40>55>04><3>(2>L'>'%%>L9
(40< redu$"io#s> <3( $ells)
construtor Q descreve uma nova lista onde o primeiro termo um dado
elemento e os demais so os componentes de uma lista tambm dada..
felementoZ Q flistaZ
/;em+losQ
1 (rel$de> 3: 64>5>09
63>4>5>09
2 (rel$de> 639:664>5>099
6639>64>5>099
3 (rel$de> 63: 64>5>099
663>4>5>099
4 (rel$de> 63: 64>5>099PP%
63>4>5>09
5 (rel$de> 63: 64>5>099PP%PP3
0
!ead Q descreve o primeiro elemento de uma lista..
tail Q descreve uma sublista contendo todos os elementos, e'ceto o primeiro
elemento de uma lista dada.

4eorema importante)
!ead ;s Q Itail ;sK G ;s

last Q descreve o (ltimo elemento de uma lista..
init Q descreve uma sublista contendo todos os elementos, e'ceto o (ltimo
elemento de uma lista dada.
J
B

$eorema im+ortanteQ
init xs ++ [last xs] = xs
2mportante) As fun#es head, last, init e tail no possuem em seu domnio a
lista vazia. *ortanto ela no deve ser inst0ncia de avaliao para qualquer uma
delas.
felementoZ Q flistaZ
/;em+losQ
1 .$-s> 7ead 6'>2>3>4>5>09
'
2 .$-s> "ail 6'>2>3>4>5>09
62>3>4>5>09
3 .$-s> "ail 6'>2>3>4>5>09
62>3>4>5>09
4 .$-s> las" 6'>2>3>4>5>09
0
5 .$-s> i#i" 6'>2>3>4>5>09
6'>2>3>4>59
6 .$-s> x == (7ead x : "ail x) 87ere x = 6'%..'59
True
7 .$-s> i#i" 6'%..'59 ++ "ail 6'%..'59
6'%>''>'2>'3>'4>''>'2>'3>'4>'59
72848 */FI&I9:5 P5# C5MP#//&S:5Q Uma lista pode ser descrita
atravs da enumerao de seus elementos, como . vimos atravs de vrios
e'emplos. $sta forma tambm denominada de definio por e'tenso, visto que
todos os componentes precisam ser e'plicitados.
*odemos tambm descrever listas atravs das condi#es que um elemento
deve satisfazer para pertencer a ela. $m outras palavras, queremos descrever
uma lista atravs de uma inteno. $sta forma anloga " que . conhecemos
para descrio de con.untos. *or e'emplo, usual escrever a notao abai'o para
descrever o con.unto formado pelo quadrado dos n(meros naturais menores que
CN.
P G H Nuadrado de ; L ; natural e menor Nue 73M
ou ainda mais formalmente,
P G H ;
2
L ; +ertence a & e ; a73M
*odemos observar, no lado direito da definio, que ela formada por duas
partes. A primeira uma e'presso que descreve os elementos, usando para isso
B
N
termos variveis que satisfazem condi#es de pertin:ncia estabelecidas pela
segunda parte.
e'presso 'Y1
varivel '
pertin:ncia ' pertence a N e ' fCN
$m nosso caso, no estamos interessados em descrever con.untos e sim
listas. $ isso tem algumas implica#es prticas. *or e'emplo, em um con.unto a
ordem dos elementos irrelevante, para listas no. - bom lembrar ainda que em
uma lista, o mesmo valor pode ocorrer varias vezes, em diferentes posi#es.
A sinta'e que usaremos a seguinte)
f fe'pressoZ L fpertin:nciaZ e
!nde)
ae;+ressoS + e'press#es usuais em Tugs para definio de valores, inclusive
condicionais.
a+ertin0nciaS + descrio dos elementos a serem considerados para avaliao da
fe'pressoZ
A pertin:ncia formada por uma seq<:ncia de qualificadores de dois tipos
de constru#es) os geradores e os predicativos. !s geradores descrevem uma
lista de onde se originam os elementos a serem considerados, usando a sinta'e)

/term%> /0 /lista>
*or e'emplo, ve.amos a descrio da lista dos quadrados dos n(meros
menores que A.
Arelude> 6x-2/ x!-6%..499
6%>'>4>L>'09
!s predicativos so e'press#es descrevendo valores booleanos, envolvendo
termos . definidos anteriormente 9inclusive por geradores/.
He.amos o e'emplo a seguir, onde descrevemos uma sublista de n(meros
mpares, tendo como origem de gerao uma lista definida por uma *rogresso
Aritmtica.
Arelude> 1' 2 '/011!4..13!%dd '3
6'><>'3>'L>25>3'>3<>43>4L>55>0'>0<><3><L>(5>L'>L<9
- importante destacar que as e'press#es de pertin:ncia so avaliadas da
esquerda para direita.
B
C
*or e'emplo, se na e'presso acima, primeiro colocssemos a e'presso
booleana ;odd ';, o sistema acusaria um erro, visto que ao tentar a avaliar ;odd ';,
a varivel ;'; ainda no estaria definida.
Arelude> 1' 2 %dd '! '/011!4..133
FGGHG: J#de1i#ed aria)le KxK
2sto s% ocorre porque o sistema usa uma ordem pr+definida`
He.amos como usar este novo conceito na escrita de novos scripts. A seguir
apresentamos a definio de tr:s novas fun#es. A primeira, sl+ares, define uma
sublista formada pelos quadrados dos elementos pares de uma lista dada. A
segunda, lmenor, define uma sublista formada pelos elementos de uma dada
lista, que so menores que um elemento fornecido. A terceira, +maioresR, ilustra
o uso da clusula i,-t!en-else para a gerao de elementos de uma lista.
-- Rada uma lis"a ;xs; de1i#a uma su)lis"a 1ormada
-- &elo ,uadrado dos eleme#"os ,ue s3o &ares
--
slpares 's = 1'42 2 '/0 's! e&en '3
Mai#> :l &re&aralis"a."x"
Geadi#* 1ile K&re&aralis"a."x"K:
Su*s sessio# 1or:
F:TSJU=L(Tli)TArelude.7s
&re&aralis"a."x"
Mai#> slpares 11!4..53
6'0>'%%>250>4(4><(4>''50>'0%%>2''09
Mai#> slpares 134!67!++!23!12!3!67!++3
6''50>'449
--
-- Re"ermi#ar a su)lis"a de eleme#"os me#ores ,ue ;x;
-- em uma lis"a ;xs
--
lmen%r ' 's = 1 5 2 5 /0's! 5 / '3
...
Mai#> lmen%r 45 11!5!6!)6!34!76!12!34!)6!++3
6'>5>0>34>'2>349
Mai#> lmen%r 1 11!5!6!)6!34!76!12!34!)6!++3
69
B
1
Mai#> lmen%r 1 11!5!6!)6!34!76!12!34!)6!++3
6'>5>0>(0>34><0>'2>34>(0>LL9
--
-- Re"ermi#ar a lis"a de eleme#"os *erados $o#di$io#alme#"e
a uma
-- $o#s"a#"e dada I.
pmen%res6 6 's = 1 if ' > 6 then '2 else ' 7 2 2 ' /0's3
...
Mai#> pmen%res6 3 11!5!6!)6!34!76!12!34!)6!++3
6'>25>30>((>30><(>'44>30>((>'%'9
Ruando mais de um gerador utilizado, devemos levar em conta que para
cada elemento do gerador mais a esquerda sero gerados todos os elementos
dos geradores subseq<entes. He.amos o e'emplo a seguir onde se descreve uma
lista de pontos do plano cartesiano, localizados no primeiro quadrante e delimitado
pelas ordenadas > e A.

--
-- Re"ermi#ar a lis"a dos &o#"os do &la#o de#"ro da
-- re*iao de1i#ida &ela ori*em> a $orde#ada (eixo y)
-- 5 e a a)s$issa (eixo x) 3.
--
p%nt%s = 1 ('!5" 2 ' /0 1..33! 5 /0 1..533
...
Mai#> p%nt%s
1(%>%)>(%>')>(%>2)>(%>3)>(%>4)>(%>5)>
('>%)>('>')>('>2)>('>3)>('>4)>('>5)>
(2>%)>(2>')>(2>2)>(2>3)>(2>4)>(2>5)>
(3>%)>(3>')>(3>2)>(3>3)>(3>4)>(3>5)3
$ntre dois geradores podemos usar predicativos, como se observa no
e'emplo a seguir.
B
>
--
-- Re"ermi#ar a lis"a dos &o#"os do &la#o de#"ro da
-- re*iao de1i#ida &ela ori*em> a $orde#ada (eixo y)
-- 5 e a a)s$issa (eixo x) 3. Qo#sidere a&e#as os
-- &o#"os o#de x V im&ar e y &ar.
--
p%nt%s1 = 1 ('!5" 2 ' /0 1..33! %dd '! 5 /0 1..53! e&en 5 3
...
Mai#> p%nt%s1
6('>%)>('>2)>('>4)>(3>%)>(3>2)>(3>4)9
728>8 */FI&I9:5 P5# C5MP#//&S:5 - /CPB5#A&*5 */$AB%/SQ Hamos
e'plorar um problema onde e'ista mais riqueza de detalhes quanto ao uso de
predicativos.
&eterminar os pares de valores, onde)
o primeiro m(ltiplo do segundo5
o primeiro dado pelos elementos impares de uma *.A de primeiro
termo igual a C, a razo igual > e o ultimo termo menor ou igual a
CNN5
o segundo termo dado pelos elementos de uma *.A de primeiro
termo igual a C, a razo igual ? e o ultimo termo menor ou igual a AN5
um dos dois diferente da unidade5
os dois termos so diferentes.
--
-- @ 1u#23o &aresF> "raduz li"eralme#"e o e#u#$iado.
-- @s A.@.;s s3o realizadas dire"ame#"e &elo me$a#ismo
-- &ara de1i#i23o de A.@. em)u"ido #a li#*ua*em.
-- Hs &redi$a"ios 1oram i#seridos #a &osi23o em ,ue
-- suas ariWeis NW es"3o i#s"a#$iadas.
--
pares81 = 1 ('!5" 2 ' /0 11!4..13!
%dd '!
5 /0 11!5..53!
('9=1 22 59= 1"!
'9=5!
m%d ' 5 == 3
...
Mai#> pares81
1(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>
(43>')>(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>
(<L>')>((5>')> ((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')3
He.amos algumas observa#es sobre a soluo acima apresentada)
B
?
o predicado odd poderia ser colocado em qualquer lugar mais a frente,
entretanto o desempenho cairia, visto que iramos produzir valores
desnecessrios para ;L;5
a e'presso I;ZG7 LL JZG 7K desnecessria visto que s% ser falsa quando
ambos, ' e L, forem iguais a C, mas nesse caso eles sero iguais e portanto
falsificariam a e'presso a seguir ;ZGJ5
podemos reescrever a e'presso ; a- f7,=88733e de tal maneira que gere
apenas valores impares e assim descartar a e'presso odd ;. *ara tanto
basta mudar a *.A. para f7,?88733eh
pode+se observar que os valores de J que interessam so sempre menores
que os de ; 9 . que J divisor de ;/. *ortanto, a segunda *.A poderia ser
substituda por f7,488I;-7Ke. Acontece que agora poderemos geram valores
para J maiores que AN e isto no interessa. ! que fazer] Rue tal substitu+
la por)
f7, 488Ii, ; a 43 t!en I;-7K else 43Ke
$is ento uma nova verso para nossa funo)
pares82 = 1 ('!5" 2 ' /0 11!7..13!
5 /0 11!5..(if ' / 5
then ('01"
else 5"3!
'9=5!
m%d ' 5 == 3
*odemos agora refletir sobre uma possvel generalizao para a nossa
funo, considerando+se duas listas quaisquer. Neste caso, o esforo realizado
para melhorar o desempenho seria em vo porque no conhecemos a priori a
natureza das duas listas. Nossa funo poderia ser)
pares83 's 5s = 1 ('!5" 2 ' /0 's!
%dd '!
5 /0 5s!
'9=5!
m%d ' 5 == 3
Apenas a e'presso I;ZG7 LL JZG 7K poderia ser eliminada. ! ob.etivo de
nossa verso original poderia ser obtido pelo uso da nova funo aplicada "s listas
especficas. 3onforme se observa a seguir)
Mai#> pares83 11!4..13 11!5..53
6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')>
(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')>
((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9
(16)7) red$,ti%ns! 23++2 ,ells"

B
A
Agora podemos ainda inspecionar o que de fato acontece com o
desempenho das tr:s vers#es.

Mai#> pares81
6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')>
(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')>
((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9
(22)+4 red$,ti%ns! 3221 ,ells"
Mai#> pares82
6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')>
(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')>
((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9
(15124 red$,ti%ns! 2214 ,ells"

3oloquemos os valores obtidos em uma tabela.
verso redu!es c"lulas
#ares$% ((,-4 3((1.
#ares$& 1/1(4 ((.14
#ares$' 1$,', (3--(
Aqui podemos constatar que a verso pares$>, bastante similar a pares$C, a
menos da generalizao, possui efici:ncia bem superior. \embre+se que a (nica
diferena a eliminao da comparao dos dois termos com o valor C.
*ara ver o que est acontecendo, vamos construir ainda uma outra verso,
similar a pares$C, eliminando a comparao citada e descrevendo as *.A.ds fora
dos geradores, assimilando+se assim " verso pares$>. He.a que com isso a nova
verso, que obtivemos partindo de pares$C, possui efici:ncia similar a pares$>.
3onfirma+se ento a observao de que a definio de listas dentro dos geradores
produz perdas.

pares84 = 1 ('!5" 2 ' /0 's!
%dd '!
5 /0 5s!
'9=5!
m%d ' 5 == 3
where
's = 11!4..13
5s = 11!5..53
...
mai#> pares84
6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')>
(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')>
((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9
(16)7) red$,ti%ns! 23++2 ,ells"
B
Q
728?8 5P/#A9D/S PA#A */$/#MI&A# S.BIS$ASQ $'istem algumas
opera#es predefinidas no TUGO para descrevermos sublistas de uma lista dada.
Nada que no possa ser feito com o que . apresentamos at aqui. $ntretanto o
seu uso pode a.udar na prtica do reuso e contribuir bastante para a clareza de
um programa.
)ru+o I - Considerando um taman!o es+eci,icado
taRe R ;s + define uma lista com os V primeiros elementos de uma lista 's.
dro+ R ;s + define uma lista com os elementos de 's, a partir do elemento
seguinte aos V primeiros.
He.amos a ilustrao a seguir.
Arelude> ta6e 3 6%..'%9
1!1!23
('50 redu$"io#s> 22' $ells)
Arelude> dr%p 3 6%..'%9
13!4!5!6!7!)!+!13
(35( redu$"io#s> 5'3 $ells)
Arelude> 1's**i 2 i /01..(6 0 1"33
where 's = 1..13: 6 = 3
1!1!23
(24L redu$"io#s> 330 $ells)
Arelude> 1's**i 2 i /016..len-th 's 0 133
where 's = 1..13: 6 = 3
13!4!5!6!7!)!+!13
('5L' redu$"io#s> 2%<2 $ells)
Arelude> (ta6e 3 11..13 77 dr%p 3 11..13" == 11..13
#r$e
(05( redu$"io#s> L(% $ells)
Na verdade podemos escrever uma descrio geral para taVe e drop usando
listas por compreenso. Alm disso, sabemos que a concatenao de taVe e drop
para um certo V, aplicado " uma lista 's, igual " pr%pria lista.
"aIe I xs = 6xsPPi / i !-6%..(I - ')99
dro& I xs = 1's**i 2 i /016..len-th 's 0 133
ale o se*ui#"e "eorema:
TaIe I xs ++ dro& I xs = xs
)ru+o II - Considerando a satis,ao de um +redicado pred8 "ale lembrar Nue
um +redicado uma ,uno cuUo valor resultante do ti+o boolean8
B
S
taRei!ile +red ;s + define uma lista com os primeiros elementos de uma lista 's
satisfazendo o predicado pred.
dro+i!ile +red ;s + define uma lista com os elementos de 's, a partir do primeiro
elemento que no satisfaz o predicado pred.
He.amos a ilustrao a seguir.
Arelude> "aIeX7ile ee# 6'..'%9
69
Arelude> "aIeX7ile odd 6'..'%9
6'9
Arelude> dro&X7ile odd 6'..'%9
62>3>4>5>0><>(>L>'%9
Arelude> dro&X7ile ee# 6'..'%9
6'>2>3>4>5>0><>(>L>'%9
Arelude> "aIeX7ile (!5) 6'..'%9
6'>2>3>49
Arelude> dro&X7ile (!5) 6'..'%9
65>0><>(>L>'%9
Arelude> "aIeX7ile (!5) 6'..'%9 ++
dro&X7ile (!5) 6'..'%9 == 6'..'%9
True

/;ercPciosQ
jUoU
Iono+i
5iUoi+
'oiU
5ioi
IoUo
B
J
7<8 #esolvendo Problemas com Bistas
Neste captulos desenvolveremos a soluo para alguns problemas mais
comple'os. A inteno apresentar o uso de estratgias de prop%sito geral que
podem ser (teis na resoluo de novos problemas. &iscutimos tambm algumas
quest#es relativas ao desempenho das solu#es.
7<87 P#5B/MA 7 Q :ada uma lista, determine o seu maior elemento
3omecemos por definir, usando a linguagem de con.untos, quem este
elemento.
&izemos que V o maior elemento de um con.unto 3, se e somente se, o
subcon.unto de 3 formado por todos os elementos maiores que V vazio.
$m linguagem de lista isto equivale a dizer que se 3 uma lista, a sublista
de 3 formada pelos caras de 3 maiores que V vazia.
He.amos como fica a codificao em TasVell.
--
-- de1i#i#do uma 1u#23o &ara de"ermi#ar> em uma lis"a>
-- a su)lis"a dos eleme#"os maiores ,ue um dado x
--
maiores x xs = 6 y / y !- xs> y > x9
--
--
-- Fm lis"as> &odemos "er eleme#"os re&e"idos> e em &ar"i$ular
-- &odemos "er Wrios exem&lares do maior eleme#"o.
-- Q7amemos esses $aras de os Kmaiorais da lis"aK.
-- Yamos $o#s"ruir uma 1u#23o &ara des$reZ-los.
--
maiorais xs = 6 I / I !- xs> maiores I xs == 69 9
--
-- Qomo eles s3o "odos idZ#"i$os &odemos "omar o &rimeiro deles
-- $omo solu23o de #osso &ro)lema.
--
maximo xs = 7ead (maiorais xs)
--
7<82 P#5B/MA 2Q :ada uma lista, !eri'ique se ela n4o decrescente
3omo aquecimento, vamos considerar listas de n(meros e a noo usual de
ordem no decrescente. Nosso problema )
Antes de programar, vamos resgatar a definio de seq<:ncias no
decrescentes.

:e'ini34o , Uma seq<:ncia O est em ordem no decrescente se e somente
se qualquer um de seus elementos menor ou igual aos seus sucessores. $m
B
B
outras palavras, podemos dizer que a coleo de elementos de O que so maiores
que seus sucessores vazia.

--
-- lis"a dos maiores ,ue os su$essores
--
lms' xs = 6 xsPPi / i !-6%..le#*"7 xs - 29>
N !-6i+'..le#*"7 xs - '9>
xsPPi > xsPPN9
--
-- a se,[Z#$ia es"W orde#ada se a lis"a dos eleme#"os
-- ,ue s3o maiores ,ue al*um su$essor V azia
--
ord' xs = (lms' xs) == 69
...
Mai#> %rd1 11..13
True
('%(%' redu$"io#s> '3(L' $ells)
Mai#> %rd1 11!+..13
False
(4%5 redu$"io#s> 5<' $ells)
7<8<8 *ISC.$I&*5 /FICI]&CIAQ !bservando a avaliao da funo ord7,
apresentada na seo anterior, para uma lista . ordenada, a lista
iC,1,>,?,A,Q,S,J,B,CNa, constatamos um n(mero muito grande de redu#es.
3onvm questionar os motivos.
Mai#> %rd1 11..13
True
('%(%' redu$"io#s> '3(L' $ells)
Mai#> %rd1 11!+..13
False
(4%5 redu$"io#s> 5<' $ells)
$m geral os motivos para um bai'o desempenho so de duas naturezas)
e'plorao inadequada das propriedades do problema e escolha inadequada dos
mecanismos da linguagem. A seguir fazemos uma pequena e'plorao desses
dois aspectos.
7<8<878 /CPB5#A&*5 P#5P#I/*A*/S *5 P#5B/MA - Analisando a nossa
definio anterior constatamos que ela diz mais do que precisamos. $la avalia
cada elemento com respeito a todos sucessores. Na verdade, nossa definio
pode ser melhorada. Pasta saber que cada elemento tem que ser menor ou igual
ao seu sucessor imediato. Hamos reescrever a nossa definio)
:e'ini34o , Uma seq<:ncia O est em ordem no decrescente se e somente
se qualquer um de seus elementos menor ou igual ao seu sucessor imediato.
$m outras palavras, podemos dizer que a coleo de elementos de O que so
maiores que seus sucessores imediatos vazia.
C
NN

He.amos ento a implementao em TasVell e sua aplicao "s mesmas
inst0ncias do problema)
--
-- lis"a dos eleme#"os maiores ,ue o su$essor imedia"o
--
lms2 xs = 6 xsPPi / i !-6%..le#*"7 xs - 29>
xsPPi > xsPP(i+')9
--
ord2 xs = (lms2 xs) == 69
...
Mai#> %rd2 11..13
True
(2230 redu$"io#s> 2((5 $ells)
Mai#> %rd2 11!+..13
False
(3'4 redu$"io#s> 44L $ells)
*odemos observar uma queda no n(mero de reduHes da ordem de SBj```
*ara o pior caso, ou se.a, quando todos os elementos satisfazem a propriedade
estabelecida. No melhor caso, onde o primeiro . no satisfaz a propriedade, a
queda foi da ordem de 11j. Na utilizao de clulas, os ganhos foram da mesma
ordem.
7<8<828 /CPB5#A&*5 5S M/CA&ISM5S *A BI&).A)/M - Uma outra
investida que podemos fazer com respeito ao uso adequado dos mecanismos da
linguagem. As solu#es acima apresentadas processam as listas atravs de
ndices, ou se.a, fazem um acesso aleat%rio aos elementos da lista. 3omo . foi
discutido, o acesso seq<encial possui realizao mais eficiente.
--
-- Aara ma#usear os &ares de adNa$e#"es> ao
-- i#Vs de usar \#di$es> usemos a 1u#23o ;ip
-- a&li$ada a um &ar de lis"as $o#s"ru\das $om )ase em 's
-- a)lis"a 1ormada &elos eleme#"os de xs> ex$e"o o ]l"imo>
-- ,ue &ode ser o)"ida $om a 1u#23o initO
-- ))lis"a 1ormada &elos eleme#"os de xs> ex$e"o o &rimeiro>
-- ,ue &ode ser o)"ida $om a 1u#23o tail.
-- Qom isso o)"emos uma lis"a 1ormada &elos &ares adNa$e#"es.
--
ad<a,entes 's = ;ip (init 's" (tail 's"
...
Mai#> ad<a,entes 11..13
6('>2)>(2>3)>(3>4)>(4>5)>(5>0)>(0><)>(<>()>((>L)>(L>'%)9
(4'4 redu$"io#s> (22 $ells)
Mai#> ad<a,entes 11!+..13
6('%>L)>(L>()>((><)>(<>0)>(0>5)>(5>4)>(4>3)>(3>2)>(2>')9
(304 redu$"io#s> 00< $ells)
--
--
C
NC
-- @ #oa 1u#23o &ara de1i#ir lis"a dos maiores
-- ,ue os su$essores. @*ora "ra)al7aremos $om os &ares
--
lms3 &s = 6 (x>y) / (x>y) !- &s> x>y9
--
-- @ #oa ers3o de ;ord;
--
ord3 xs = lms3 (adNa$e#"es xs) == 69
...
Mai#> %rd3 11..13
True
(3'3 redu$"io#s> 4(3 $ells)
Mai#> %rd3 11!+..13
False
((2 redu$"io#s> '45 $ells)
! ganho obtido para a inst0ncia considerada foi de JQj no n(mero de
redu#es e de J>j no n(mero de clulas utilizadas, com respeito " segunda
definio.
/;ercPcios
C. \VnVhn
1. \VnlV
>. \VhlV
?. llhnlVhlV.pq.oi[eh.
A. !ihophp
C
N1
7=8 Paradigma A+licativo
7=878 I&$#5*.9:5Q A descrio de fun#es, como acontece com outras formas
de representao de conhecimento, admite vrios estilos. &ependendo do
problema que estamos tratando, um estilo pode ser mais conveniente que outros.
*odemos dizer que influi muito na escolha, o quanto dese.amos ou necessitamos,
falar sobre como computar uma soluo. A descrio de solu#es tem um
espectro de operacionalidade que vai do declarativo at o procedural, em outras
palavras, do Nue dese.amos computar ao como queremos computar..
Uma situao que ocorre com freq<:ncia na descrio de fun#es a
necessidade de aplicar uma funo, de forma cumulativa, " uma coleo de
elementos. $m outras palavras, dese.amos generalizar uma operao para que
seu uso se estenda a todos os elementos de uma lista. 3hamemos este estilo de
paradigma aplicativo.
*or e'emplo, suponha que dese.amos obter a soma de todos os elementos
de uma lista. A operao adi34o IXK segundo sabemos, de natureza binria, ou
se.a, opera sobre dois elementos produzindo um terceiro. *ara operar sobre todos
os elementos de uma lista de forma a obter a soma total, podemos oper+los dois
a dois, obtendo com isso resultados intermedirios, que por sua vez podero ser
novamente operados e assim sucessivamente at que se obtenha o resultado
final. !bservemos o processo para uma inst0ncia)
P+ter a soma dos elementos da lista Q5, R, 3, O, "5, "#S
*odemos tomar os pares de elementos, primeiro com segundo, terceiro
com quarto e assim sucessivamente.
e;+resso nova e;+resso reduo
X iA, B, >, J, CA, CQa X iC?, >, J, CA, CQa
A I B M C?
X iC?, >, J, CA, CQa X iC?, CC, CA, CQa
> I J M CC
X iC?, CC, CA, CQa X iC?, CC, >Ca
CA I CQ M >C
X iC?, CC, >Ca X i1A, >Ca
C? I CC M 1A
X i1A, >Ca X iAQa
1A I >C M AQ
X iAQa
AQ
A escolha dos pares, no caso da adio, no importa. As redu#es poderiam
ser aplicadas em qualquer ordem, visto que a operao adio comutativa. Oe,
pode ser qualquer uma, ento podemos estabelecer uma ordem, como por
C
N>
e'emplo, da esquerda para a direita, usando em cada nova reduo o elemento
resultante da reduo anterior.

/;+resso nova e;+resso #eduo
X iA, B, >, J, CA, CQa X iC?, >, J, CA, CQa
A I B M C?
X iC?, >, J, CA, CQa X iCS, J, CA, CQa
C? I > M CS
X iCS, J, CA, CQa X i1A, CA, CQa
CS I J M 1A
X i1A, CA, CQa X i?N, CQa
1A I CA M ?N
X i?N, CQa X iAQa
?N I CQ M AQ
X iAQa
AQ
$m HBT; e'iste um operador que permite a descrio de computa#es
desta natureza. $ste operador denomina+se 'oldl. A sua utilizao requer ainda
que se.a indicado um !alor especial para a operao considerada. $ste elemento
tomado como ponto de partida para as redu#es, ou se.a, a primeira aplicao
da operao sobre o !alor especial e o primeiro elemento da lista.
$is a sinta'e)
,oldl foperaoZ fvalor especialZ flistaZ
A ordem estabelecida para as redu#es semelhante " ilustrao acima, ou
se.a, caminha+se da esquerda para direita, usando o resultado da reduo anterior
para a nova reduo.
e;+resso nova e;+resso
'oldl op !e i'N, 'C, '1,...,'na op i9op ve 'N/, 'C, '1,...,'na
op i9op 9op ve 'N/ 'C/, '1,...,'na op iop99op 9op ve 'N/ 'C/ '1/,...,'na
op iop9op99op 9op ve 'N/ 'C/ '1/... 'n/a op9op99op 9op ve 'N/ 'C/ '1/... 'n/
6erece aqui um destaque, foldl na verdade um funo, com > parametros,
sendo que um deles uma outra funo. &izemos neste caso que foldl uma
funo de segunda ordem.
! tipo da operao tem que ser)

C
N?
/alfa> 0> /=eta> 0> /=eta>
o#de :
!al1a> &ode ser do mesmo "i&o de !)e"a>O
!)e"a> "em ,ue ser do "i&o dos $om&o#e#"es
da lis"aO
o alor es&e$ial V do "i&o !al1a>
He.amos ento a definio do operador sum disponvel no TUGO e cu.o
ob.etivo a descrio da soma dos elementos de uma lista.

s$m xs = f%ldl (+) % xs
5SQ
C. !s operadores infi'ados so indicados entre par:ntesis.
1. ! valor especial o zero, visto que no dese.amos que o valor
especial modifique o resultado da soma de todos os elementos.
$ntretanto, ele .oga um papel muito especial quando a lista for vazia.
&relude> s$m 69
%
>. $m e'emplos futuros veremos outros usos para o valor especial.
7=828 AB).MAS 5P/#A9D/S IMP5#$A&$/SQ Assim como a somat%ria,
e'istem outras opera#es importantes, de grande utilidade, que podem ser obtidas
pelas seguintes equa#es usando 'oldl
00
00 &rodu"o
-- alor es&e$ial = '
00
pr%d$,t xs = f%ldl (+) 1 xs
--
-- $o#Nu#23o
-- alor es&e$ial = True
00
and xs = f%ldl (..) #r$e xs
--
-- disNu#23o
-- alor es&e$ial = False
00
%r xs = f%ldl (//) >alse xs
/;em+lo 37) Usando DproductE para descrever o fatorial de um n(mero
C
NA
Oabemos que) . fatorial de um n8mero natural n%! 4 igual
ao produto de todos os n8meros naturais de 1 at4 n
00
00 de1i#i23o de 1a"orial
00
fat # = pr%d$,t 11..n3
...
? fat 5
'2%
? fat
'
? fat 1
'
/;em+lo 32) *odemos usar a dis.uno 9or/ generalizada para definir uma
funo que avalia se em uma dada lista de n(meros pelo menos um deles
impar.
00
00 &elo me#os um im&ar
00
$m?mpar xs = %r 1odd x 2 x !- xs3
...
B $m?mpar 62>2>2>2>2>2>2>29
False
B $m?mpar 62>2>2>'>2>2>2>29
True
B $m?mpar 69
False

7=8<8 5 M/&5# /B/M/&$5 */ .MA BIS$AQ $stamos interessados em obter
uma funo que associe uma lista 's com o elemento de 's que se.a o menor de
todos.
Anteriormente . apresentamos uma verso para a funo que descreve o
maior elemento de uma lista, que bastante similar a esta. Na oportunidade
e'ploramos uma propriedade que o elemento maior de todos deve satisfazer. No
caso do menor elemento, podemos e'plorar uma propriedade anloga.
>m uma lista xs1 di$emos que * 4 o menor elemento de xs1 se e somente se
a sublista de xs formada por elementos menores que * 4 7a$ia
C
NQ
--
-- ^me#ores^ des$ree os eleme#"os me#ores ,ue um
-- dado x em uma lis"a xs
--
men%res x xs = 6 y / y !- xs> y ! x9
-- ^mi#imo^ des$ree a su)lis"a de xs dos eleme#"os
-- ,ue #3o &ossuem me#ores ,ue eles em xs
--
minim%s xs = 6 I / I !- xs> me#ores I xs == 69 9
--
-- Qomo eles s3o "odos idZ#"i$os &odemos "omar o
-- &rimeiro deles
-- $omo solu23o de #osso &ro)lema.
--
men%r@ xs = 7ead (me#ores xs)
Hamos e'plorar agora o problema a partir da generalizao da operao
menor8 $m sua forma bsica, a funo menor associa dois n(meros quaisquer
com o menor entre eles. *recisamos identificar um elemento que no interfira no
resultado para fazer o papel de !alor especial. *ara a operao menor podemos
observar que este papel pode ser desempenhado por qualquer um dos elementos
da lista, visto que o menor entre dois valores id:nticos o pr%prio valor. 3omo
pode ser qualquer um, podemos escolher o primeiro elemento de 's 9head/.
--
-- me#or de dois
--
men%r x y = if x ! y then x else y
--
-- me#or da lis"a
--
men%r@ xs = f%ldl me#or (7ead xs)xs
...
B men%r@ 65>5>4>4>4>0>0>0>3>3>3>''>'>%9
%
((4 redu$"io#s> '5< $ells)
B men%r@ 659
5
(5 redu$"io#s> '3 $ells)
B men%r@ 6 9
FGGHG: J#resoled oerloadi#*
+++ "y&e : Hrd a => a
+++ "ra#sla"io# : me#or_ 69
*odemos observar aqui que a funo menorB parcial pois no se aplica a
lista vazia.
7=8=8 I&S/#9:5 5#*/&A*A / 5#*/&A9:5 */ .MA BIS$AQ A ordenao de
dados uma das opera#es mais realizadas em computao. &iariamente, em
todos os computadores do mundo, faz+se uso intensivo dela. $ste assunto muito
especial e por isso mesmo profundamente estudado. 3abe+nos aqui fazer uma
C
NS
breve passagem pelo assunto, sem, contudo nos aprofundarmos nas quest#es de
efici:ncia, que central no seu estudo.
Oer que podemos usar o conceito de generalizao de uma operao para
descrever a ordenao de uma lista] Rue operao seria essa]
7=8=878 I&S/#9:5 /M BIS$A 5#*/&A*A - Hamos comear discutindo
uma outra questo mais simples) dada uma lista, com seus elementos . dispostos
em ordem no decrescente, como descrever uma lista na mesma ordem,
acrescida de um elemento tambm fornecido]
*odemos observar que se a lista 's est em ordem no decrescente, com
respeito ao elemento ' 9dado/, podemos descrev:+la atravs de dois segmentos)
xs % Umenores que x$ ++ Umaiores ou i-uais a x$
*ara acrescentar ' a 's, basta concatenar ' entre os dois segmentos,
obtendo a nova lista Ls, assim)
ys % Umenores que x em xs$ ++ f;e ++ Umaiores ou i-uais a x em xs$
--
-- i#ser23o orde#ada
--
--
ins%rd xs x = ta6eAhile (! x) xs
++ 6x9
++ dr%pAhile (! x) xs
...
Mai#> i#sord 69 '%
6'%9
(2< redu$"io#s> 4L $ells)
Mai#> i#sord 6'%9 2%
6'%>2%9
(54 redu$"io#s> (4 $ells)
Mai#> i#sord 6'%>2%9 3%
6'%>2%>3%9
(<L redu$"io#s> ''L $ells)
Mai#> i#sord 6'%>2%>3%9 5
65>'%>2%>3%9
(<' redu$"io#s> ''% $ells)
Mai#> i#sord 65>'%>2%>3%9 25
65>'%>2%>25>3%9
('20 redu$"io#s> '(3 $ells)
7=8=828 5rdenao + A aplicao sucessiva de insord, conforme ilustrada
acima, nos d uma pista para nossa generalizao. *odemos pegar cada
elemento da lista a ser ordenada e inseri+lo em ordem em uma outra lista que ser
C
NJ
paulatinamente construda, . ordenada. Hamos seguir o e'emplo acima, onde
dese.amos ordenar a lista iCN,1N,>N,A,1Aa)

lista +arcial
novo
elemento
reduo
ia CN iCNa
iCNa 1N iCN,1Na
iCN,1Na >N iCN,1N,>Na
iCN,1N,>Na A iA, CN, 1N, >Na
iA, CN, 1N, >Na 1A iA, CN, 1N, 1A, >Na
! ponto de partida, neste caso, a lista vazia. Hamos tomar ento a lista
vazia como o valor especial. He.amos como fica ento nossa definio para
ordenao de listas.
--
-- orde#a23o
--
%rdena xs = f%ldl i#sord 69 xs
...
Mai#> %rdena 6'%>2%>3%>5>259
65>'%>2%>25>3%9
(22% redu$"io#s> 344 $ells)
Mai#> %rdena 6'..'%9
6'>2>3>4>5>0><>(>L>'%9
('%55 redu$"io#s> '5%5 $ells)
Mai#> %rdena 6'%>L..'9
6'>2>3>4>5>0><>(>L>'%9
(44( redu$"io#s> <'2 $ells)

7=848 I&"/#S:5 */ .MA BIS$AQ &ada uma lista 's, dese.amos descrever a lista
formada pelos elementos de 's tomados em ordem inversa.
*ara resolver o problema precisamos inventar uma funo bsica passvel de
generalizao.
Hamos comear descrevendo a funo insAntes8
C
NB
--
-- ?#sere um eleme#"o a#"es do &rimeiro eleme#"o
-- de uma dada lis"a. Fu#23o similar ao o&erador
-- (:) ex$e"o &ela ordem i#er"ida dos &ar4me"ros
--
insBntes xs x = x : xs
...
Mai#> insBntes 6'..59 %
6%>'>2>3>4>59
('<' redu$"io#s> 255 $ells)
Mai#> insBntes 69 %
6%9
(22 redu$"io#s> 2L $ells)
4entemos agora a generalizao. A inteno incluir cada elemento da lista
's que dese.amos inverter, antes do primeiro elemento de uma lista que iremos
construindo gradativamente. ! !alor especial ser a lista vazia. He.amos um
e'emplo onde inverteremos a lista iN, C, 1, >, ?a
lista +arcial
novo
elemento
reduo
ia N iNa
iNa C iC, Na
C, Na 1 i1, C, Na
i1, C, Na > i>, 1, C, Na
i>, 1, C, Na ? i?, >, 1, C, Na
Hamos ento usar o operador foldl para construir a generalizao dese.ada)
-- i#ersao
--
in&erte xs = f%ldl i#s@#"es 69 xs
...
Mai#> in&erte 6%..49
64>3>2>'>%9
('<2 redu$"io#s> 25L $ells)
Mai#> in&erte 64>3..49
649
(<4 redu$"io#s> ''% $ells)
...
Mai#> re&erse 64>3..49
649
(<4 redu$"io#s> ''' $ells)
Mai#> re&erse 6%..49
64>3>2>'>%9
('<' redu$"io#s> 25< $ells)
C
CN
!bserve a similaridade entre o desempenho da funo reverse, pr+definida,
com o desempenho da inverte que acabamos de definir.

7=8>8 I&$/#CABA9:5 */ BIS$ASQ &adas duas lista 's e Ls, ambas em
ordem no decrescente, dese.amos descrever uma nova lista em ordem no
decrescente, formada por todos os elementos das duas listas.
Um processo bastante conhecido, chamado de +alance line, consiste em ir
transferindo para a nova lista, os elementos de uma das listas de entrada,
enquanto estes forem menores que os da outra. Ruando a condio no mais
satisfeita, fazemos o mesmo para a outra lista.
*or e'emplo, vamos intercalar as listas i1, ?, Q, Ja e iC, >, Aa. He.amos o
desenrolar do processo.
lista +arcial
Andamento
em ;s
Andamento
em Js
#eduo
ia i1, ?, Q, Ja iC, >, Aa iCa
iCa i1, ?, Q, Ja i>, Aa iC, 1a
iC, 1a i ?, Q, Ja i>, Aa iC, 1, >a
iC, 1, >a i ?, Q, Ja iAa iC, 1, >, ?a
iC, 1, >, ?a iQ, Ja iAa iC, 1, >, ?, Aa
iC, 1, >, ?, Aa iQ, Ja ia iC, 1, >, ?, A, Qa
iC, 1, >, ?, A, Qa i Ja ia iC, 1, >, ?, A, Q, Ja
iC, 1, >, ?, A, Q, Ja ia ia
Hamos precisar aqui de uma bela engenharia para a construo da funo a
generalizar. &esta vez, nossa entrada formada por duas listas e como sabemos
o operador ,oldl, a cada vez, processa um elemento de uma determinada lista.
2sto nos leva a ter que inventar tambm a lista a ser processada.
A funo bsica pode ser inventada a partir da descrio de um passo do
processo que denominamos de +alance line. $m cada passo temos como entrada
uma lista parcialmente construda e duas listas parcialmente processadas. 3omo
sada teremos mais um passo de construo da lista resultante e o andamento no
processamento de uma das listas. Na lista em construo devemos inserir o
menor entre os cabeas 9head/ das duas listas. Aquela que tiver o menor cabea
dar origem a uma nova lista, da qual foi e'cludo o primeiro elemento, ou se.a,
ser id:ntica ao resto 9tail/ da lista escolhida.

C
CC
--
-- Res$ri23o de um &asso do Bala#$e _i#e.
-- ') `ua#do uma das duas lis"as 1or azia a
-- ou"ras V dire"ame#"e $o#$a"e#ada #o 1i#al
-- da lis"a em $o#s"ru23o.
--
pass%C@ (xs>ys>zs) = i1 (ys == 69)
"7e# (69>69>zs++xs)
else i1 (xs == 69)
"7e# (69>69>zs++ys)
else i1 (7ead xs != 7ead ys)
"7e# ("ail xs>ys>zs++67ead xs9)
else (xs> "ail ys>zs++67ead ys9)
...
... a&li$a23o su$essia da 1u#23o pass%C@ a i#"er$ala23o
... das lis"as a$ima &ro&os"as
...
Mai#> pass%C@ (62>4>0>(9>6'>3>59>69)
(62>4>0>(9>63>59>6'9)
('2' redu$"io#s> 2'L $ells)
Mai#> pass%C@ (62>4>0>(9>63>59>6'9)
(64>0>(9>63>59>6'>29)
('22 redu$"io#s> 222 $ells)
Mai#> pass%C@ (64>0>(9>63>59>6'>29)
(64>0>(9>659>6'>2>39)
('23 redu$"io#s> 225 $ells)
Mai#> pass%C@ (64>0>(9>659>6'>2>39)
(60>(9>659>6'>2>3>49)
('24 redu$"io#s> 22( $ells)
Mai#> pass%C@ (60>(9>659>6'>2>3>49)
(60>(9>69>6'>2>3>4>59)
('2( redu$"io#s> 23L $ells)
Mai#> pass%C@ (60>(9>69>6'>2>3>4>59)
(69>69>6'>2>3>4>5>0>(9)
(''0 redu$"io#s> 223 $ells)
...
Mai#> pass%C@ (6'..59>69>69)
(69>69>6'>2>3>4>59)
('L% redu$"io#s> 32L $ells)
Mai#> pass%C@ (69>6'..59>69)
(69>69>6'>2>3>4>59)
('L3 redu$"io#s> 33L $ells)
Mai#> pass%C@ (6'..39>64..59>69)
(62>39>64>59>6'9)
(2'L redu$"io#s> 3<' $ells)
A generalizao, de forma que possamos aplicar a funo gradativamente,
de tal forma que todo o processo se complete, requer a inveno de uma lista
sobre a qual ocorra a repetio. ! n(mero de aplica#es sucessivas ser no
m'imo igual " soma dos comprimentos das listas a serem intercaladas. *odemos
ento definir a aplicao sobre a lista dos n(meros de C at a soma dos
tamanhos.
C
C1
--
-- Fu#23o &ara ?#"er$alar duas lis"as orde#adas
-- ') a 1u#23o &assoB_ V re&e"idame#"e a&li$ada> so)re
-- o resul"ado o)"ido #o &asso a#"eriorO
-- 2) a 1u#23o &assoB_ V )i#Wria> $omo exi*ido &or 1oldlO
-- 3) a a&li$a23o su$essia V $o#"rolada &elo $om&rime#"o
-- da lis"a resul"a#"eO
-- 4) o resul"ado 1i#al V o)"ido &ela sele23o do "er$eiro
-- eleme#"o da "ri&la a"raVs da &rimi"ia K"7d3K
--
=a@ine xs ys = "7rd3 ()a_i#e3 xs ys)
--
thrd3 (x>y>z) = z
--
=a@ine3 xs ys = 1oldl &assoB_ (xs>ys>69) 6'.."r9
87ere
"r = (le#*"7 xs)+(le#*"7 ys)
--
-- Res$ri23o de um &asso do Bala#$e _i#e.
-- ') `ua#do uma das duas lis"as 1or azia a
-- ou"ras V dire"ame#"e $o#$a"e#ada #o 1i#al
-- da lis"a em $o#s"ru23o.
-- 2) H &ar4me"ro I V a&e#as &ara es"a)ele$er o "i&o
-- )i#Wrio exi*ido &or 1oldl
--
pass%C@ (xs>ys>zs) I = i1 (ys == 69)
"7e# (69>69>zs++xs)
else i1 (xs == 69)
"7e# (69>69>zs++ys)
else i1 (7ead xs != 7ead ys)
"7e# ("ail xs>ys>zs++67ead xs9)
else (xs> "ail ys>zs++67ead ys9)
...
Mai#> thrd3 ('%>2%>3%)
3%
('' redu$"io#s> '2 $ells)
Mai#> =a@ine3 6'..39 64..09
(69>69>6'>2>3>4>5>09)
(5'4 redu$"io#s> (L0 $ells)
Mai#> =a@ine 6'..39 64..09
6'>2>3>4>5>09
(4(5 redu$"io#s> <(4 $ells)
Mai#> =a@ine 6'..59 63..<9
6'>2>3>3>4>4>5>5>0><9
((%< redu$"io#s> '320 $ells)
Mai#> =a@ine 62> 4> 0> (9 6'> 3> 59
6'>2>3>4>5>0>(9
(425 redu$"io#s> 0L0 $ells)
$'erccios)
C. OdVnfvlnlc
1. Fsponmposfdnponsdf
>. psnmfdponmposds
C
C>
748 Processamento de Cadeias de Caracteres 1 +rimeiros +assos
74878 I&$#5*.9:5Q Alm de n(meros, nosso mundo povoado por te'tos.
3ada vez mais se torna presente o uso de computadores para nos au'iliar na
tarefa de armazenar, recuperar e processar documentos. Neste captulo estamos
interessados em fazer uma breve introduo ao uso de computadores nessas
tarefas.
! ponto de partida o tipo caracter 9chr/, que nos permite representar te'tos
na mem%ria 9principal e secundria/ dos computadores. Heremos tambm como
agrup+los para compor palavras, frases e por fim documentos.
74828 5 $IP5 C%A#) ! tipo char formado por um con.unto de smbolos. Um
outro nome usado para esta coleo alfabeto, ou se.a, o con.unto de tomos que
serviro de base para a construo de cadeias comple'as, inclusive os te'tos
usuais. $ntre os smbolos citados podemos destacar tr:s agrupamentos
relevantes, tais como)
C. As letras mai(sculas do alfabeto5
1. As letras min(sculas do alfabeto5
>. !s algarismos arbicos5
$stes tr:s agrupamentos gozam de uma propriedade muito importante.
&entro deles os smbolos possuem uma relao de ordem, de tal forma que
podemos usar a noo usual de ordenao para letras e algarismos.
Alm destes, podemos citar ainda os sinais de pontuao e alguns smbolos
com fun#es especiais, como, por e'emplo, indicador de final de linha de te'to. !s
smbolos so sempre apresentados em TUGO entre aspas simples, para que
possam ser diferenciados dos nomes de par0metros, fun#es e outros. *or
e'emplo, a letra a deve ser denotada por VaV
A definio a seguir a.uda a esclarecer esta necessidade.
f a = (a, 'a')
Aqui usamos a letra DaE tr:s vezes. A primeira, da esquerda para direita,
nomeia um par0metro da funo DfE. Na segunda ocorr:ncia, utilizamos o
parametro da funo para se constituir do primeiro elemento de uma tupla. c a
terceira ocorr:ncia se refere " constante DaE.
He.amos as respostas do sistema para diferentes usos da funo ,
1 Dain> 1 3
(3>;a;)
C
C?
2 Dain> 1 5
(5>;a;)
3 Dain> 1 a
FGGHG - J#de1i#ed aria)le KaK
4 Dain> 1 ;a;
(;a;>;a;)
5 Dain> 1 ;aa;
FGGHG - ?m&ro&erly "ermi#a"ed $7ara$"er $o#s"a#"
6 Dain> 1 ;);
(;);>;a;)
7 Dain> 1 a 87ere a=;a;
(;a;>;a;)
Nas situa#es C, 1, e Q, o parametro a instanciado para os valores >, A e rbe ,
resultando nos pares 9>, rae/, 9A,eae/ e 9qb, rae/. Na situao ?, o par0metro a
instanciado para a constante rae, produzindo o par 9rae, rae/. Na situao >, o uso de
a est incorreto, pois como no est entre as aspas simples, interpretado como
um par0metro, que no est instanciado quando deveria estar. Na situao S, ao
contrrio da situao >, o valor de a instanciado atravs da clusula k!ere e a
situao fica similar " situao ?.
A coleo total dos smbolos de nosso alfabeto forma uma seq<:ncia de tal
forma que podemos fazer o mapeamento entre a subseq<:ncia de n(meros
naturais, de zero 9N/ a 1AA e a seq<:ncia de smbolos.
&uas fun#es bsicas permitem que se faa a converso entre as duas
seq<:ncias)
C. A funo c)r associa um n(mero natural no intervalo iN,1AAa com o caracter
correspondente. *or e'emplo, c)r Q? M dsd e c)r >J M dgd.
1. A funo ord faz o mapeamento inverso, ou se.a, associa um smbolo com
o n(mero natural correspondente. *or e'emplo, ord d]d M Q> e ord djd M >S.
A tabela a seguir apresenta alguns dos agrupamentos importantes.
Algarismos
Betras
Mai(sculas
Betras
Min(sculas

C
CA
3(
33
34
3/
3$
3'
3,
3-
4.
41
4(
43
44
4/
4$
4'
4,
4-
/.
/1
/(
/3
/4
//
/$
/'
/,
/-
$.
$1
$(
$3
$4
$/
$$
$'
$,
$-
'.
'1
'(
'3
'4
'/
'$
''
',
'-
,.
,1
,(
,3
,4
,/
,$
,'
,,
,-
-.
-1
-(
-3
-4
-/
-$
-'
-,
--
1..
1.1
1.(
1.3
1.(
1./
1.$
1.'
1.,
1.-
11.
111
11(
113
114
11/
11$
11'
11,
11-
1(.
1(1
1((
1(3
1(4
1(/
1($
Alm das opera#es ord e c!r, podemos contar com os operadores
relacionais que foram apresentados no 3aptulo Q. &a mesma forma que e'istem
os operadores para comparao de n(meros, e'istem os operadores relacionais
que comparam dois smbolos, como no e'emplo)
Arelude> ;$; > ;7;
False
! significado de uma operao relacional sobre characteres determinado
com base na ordem destes com respeito " tabela apresentada para codificao
desses smbolos. Assim, podemos dizer que)
Oe ' e L so do tipo caractere, ; S J se e somente se ord ; S ord J
*odemos agora construir algumas defini#es interessantes, conforme se
apresenta nos quadros a seguir.)
C
CQ
--
-- &erifi,a se $m dad% sEm=%l% F letra
--
le"ra x = (maius$ula x) // (mi#us$ula x)
--
maius$ula x = &er"e#$e x (;@;>;b;)
mi#us$ula x = &er"e#$e x (;a;>;z;)
&er"e#$e x (a>)) = (x >= a) .. (x != ))
--
-- eri1i$a se um s\m)olo V um al*arismo
--
al*arismo x = &er"e#$e x (;%;>;L;)
--
-- @sso$ia uma le"ra mi#us$ula $om a sua
-- $orres&o#de#"e maius$ula e ma#"Vm o
-- s\m)olo 1or#e$ido #os demais $asos
--
$a&s x = i1 mi#us$ula x
"7e# $7r (ord x - 32)
else x
--
-- Re"ermi#a a &osi23o rela"ia de uma le"ra
-- de#"ro do al1a)e"o> o#de as mai]s$ulas e
-- mi#]s$ulas &ossuem a mesma &osi23o.
-- Hu"ros s\m)olos deem ser asso$iados ao
-- alor % (zero)
--
ord@l1a x = i1 le"ra x
"7e# ord ($a&s x) - 04
else %
$is a aplicao em algumas inst0ncias)

$is mais
alguns
e'emplos
de fun#es
com o tipo
char.
--
C
CS
-- eri1i$a se um s\m)olo V uma le"ra o*al
--
&%-al x = le"ra x .. o$orre ($a&s x) o*ais
87ere
o*ais = 6;@;>;F;>;?;>;H;>;J;9
--
%,%rre x xs = or 6x == y / y!- xs9
--
-- eri1i$a se um s\m)olo V uma le"ra
-- $o#soa#"e
--
,%ns%ante x = le"ra x .. (#o" (o*al x))
--
--
-- Res$ree uma lis"a de &ares o#de o &rimeiro "ermo
-- V um #]mero e#"re % e 255 e o se*u#do o $ara$"er
-- $orres&o#de#"e. H i#"eralo deseNado V i#1ormado
-- &or um &ar de alores #o i#"eralo % a 255.
--
ta=GrdHhr (i>1) = 6(x> $7r x) / x !- 6i..199
He.amos alguns e'emplos de uso das defini#es acima apresentadas)
Mai#> ta=GrdHhr (05><%)
6(05>;@;)>(00>;B;)>(0<>;Q;)>(0(>;R;)>(0L>;F;)>(<%>;F;)9
(35< redu$"io#s> 0%4 $ells)
Mai#> ta=GrdHhr (L<>'%2)
6(L<>;a;)>(L(>;);)>(LL>;$;)>('%%>;d;)>('%'>;e;)>('%2>;1;)9
(35< redu$"io#s> 0%< $ells)
Mai#> ta=GrdHhr (45>5%)
6(45>;-;)>(40>;.;)>(4<>;/;)>(4(>;%;)>(4L>;';)>(5%>;2;)9
(35< redu$"io#s> 0%4 $ells)
748<8 5 $IP5 S$#I&)Q *odemos agrupar tomos do tipo caracter 9char/ para
formar o que denominamos de cadeia de caracteres, usualmente chamadas de
;palavra;. ! mecanismo para agregar o construtor da lista. *odemos por
e'emplo, escrever em TUGO a lista idcd,did,ddd,dad,dnd,did,dada para representar a palavra
cidadania
Assim procedendo podemos escrever qualquer te'to, uma vez que um te'to
no nada mais nada menos que uma longa cadeia de smbolos envolvendo
letras e sinais de pontuao. A separao de palavras obtida pelo uso de um
caracter especial, denominado de espa3o, que tem representao interna igual a
>1. *or e'emplo, para representar a e'presso ;Hamos nessa`;, usamos a lista)
fl"l,lal,lml,lol,lsl,l l,lnl,lel,lsl,lsl,lal,lgle8
C
CJ
Uma boa notcia que o TUGO nos proporciona uma maneira mais amistosa
para tratar com lista de caracteres. $m TUGO podemos representar uma lista de
caracteres, envolvendo a cadeia por aspas duplas, o que por certo, alm de mais
elegante e legvel, no poupa trabalho. *or e'emplo, a cadeia acima representada
por ser tambm escrita na seguinte forma)
m"amos nessagm
8 uma lista de caracteres o TUGO associa um tipo sin,nimo, denominado
strin-. Assim, as duas representa#es acima so id:nticas, conforme podemos
observar na avaliao abai'o)

Arelude> KYamos #essaPK == 6;Y;>;a;>;m;>;o;>;s;>; ;>;#;>;e;>;s;>;s;>;a;>;P;9
True
(04 redu$"io#s> '%2 $ells)
Um bom lembrete que, cadeias de caracteres so definidas como listas, e
como tais, podemos usar sobre elas todas as opera#es que sabemos at agora
sobre listas.
*or e'emplo, podemos construir uma funo para contar a quantidade de
vogais e'istente em uma cadeia.

$o#"aYo*ais xs = le#*"7 o*ais
87ere
o*ais = 6x / x !-xs> o*al x9
...
Mai#> $o#"aYo*ais KYamos #essaPK
4
(L00 redu$"io#s> '3(3 $ells)

748=8 F.&9D/S 6SICAS PA#A 5 $IP5 S$#I&)Q Uma cadeia de caracteres,
por ser uma lista, herda todas as opera#es que . apresentamos para as listas.
Alm dessas, podemos contar ainda com algumas opera#es que apresentamos a
seguir)
kords 's + Associa uma cadeia de caracteres com a lista de pala7ras nela
contida. $ntende+se por pala7ra um agrupamento de smbolos diferentes do
smbolo espa3o IM MK

Arelude> w%rds K=e "emos ,ue a&re#der a 1azer> amos
a&re#der 1aze#doPK
6K=eK>K"emosK>K,ueK>Ka&re#derK>KaK>K1azer>K>
KamosK>Ka&re#derK>K1aze#doPK9
(2%'3 redu$"io#s> 3%3( $ells)
C
CB
*odemos observar que os smbolos usuais de separao 9por e'emplo, ;,; e
;g; so considerados como parte das pala7ras. Hamos agora construir uma funo
que considere os smbolos usuais de separao, alm do espao.
--
-- @ 1u#23o pala&ras
--
pala&ras xs = 6 "aIeX7ile le"ra x / x !- 8ords xs9
--
--
--
...
Mai#> pala&ras K=e "emos ,ue a&re#der a 1azer> amos a&re#der 1aze#doPK
6K=eK>K"emosK>K,ueK>Ka&re#derK>KaK>K1azerK>KamosK>Ka&re#derK>K1aze#doK9
(3(0L redu$"io#s> 5444 $ells)
Mai#> pala&ras KNose'23 maria450 Noa#aPPPK
6KNoseK>KmariaK>KNoa#aK9
('445 redu$"io#s> 2%(' $ells)
Mai#> w%rds KNose'23 maria450 Noa#aPPPK
6KNose'23K>Kmaria450K>KNoa#aPPPK9
(L5' redu$"io#s> '423 $ells)

&e fato, a funo +alavras trata a questo a que nos prop(nhamos,
abandonar os smbolos de pontuao. Acontece que ela abandona muito mais que
isso, como podemos ver no e'emplo, onde a cadeia ;.oseC1>; perde o seu sufi'o
numrico, tornando+se apenas ;.ose;.
Hamos construir uma nova funo ento onde isso possa ser resgatado.

--
-- @ 1u#23o pala&ras1
--
pala&ras1 xs = 6 "aIeX7ile al1a x / x !- 8ords xs9
87ere al1a x = le"ra x // al*arismo x
--
--
--
...
Mai#> pala&ras1 Kx'23 y450 auxPPPK
6Kx'23K>Ky450K>KauxK9
Pom, parece que agora temos uma soluo adequada.
C
1N
/;ercPcios
jUbRU
jUn
5no
5noi
C
1C
7>8 5 PA#A*I)MA #/C.#SI"5
7>878 I&$#5*.9:5Q 3omo . falamos anteriormente, e'istem vrias maneiras de
definir um conceito. A essas maneiras convencionamos chamar de paradigmas.
Aqui trataremos de mais um destes, o paradigma recursivo. &izer que trataremos
de mais um simplificar as coisas, na verdade este paradigma um dos mais
ricos e importantes para a descrio de computa#es. ! domnio deste paradigma
de fundamental import0ncia para todo aquele que dese.a ser um expert em
*rogramao de 3omputadores enquanto ci:ncia e tecnologia.
&e uma maneira simplificada podemos dizer que o n(cleo deste paradigma
consiste em descrever um conceito de forma recursiva. 2sto equivale a dizer que
definiremos um conceito usando o pr%prio conceito. Apesar de disto parecer muito
intrigante, no se assuste, aos poucos, quando esboarmos melhor a idia ela se
mostrar precisa, simples e poderosa.
Hamos pensar num conceito bem corriqueiro. Rue tal definirmos o conceito
escada.
3omo podemos descrever escada usando a pr%pria escada] A resposta
bem simples)
Bma escada i-ual a um de-rau se-uido de uma escada IFigura 7487K8
Fcil no ] Oer que isto basta] !nde est o truque] *arece que estamos
andando em crculo, no mesmo] *ara entender melhor vamos discutir a seguir
alguns elementos necessrios para a utilizao correta da recurso na definio
de novas fun#es.
7>828 */SC#I9:5 #/C.#SI"A */ .M C5&C/I$5 FAMIBIA#Q Antes de
avanar em nossa discusso vamos apresentar mais um e'emplo. &esta vez
degrau
escada
escada
Figura CA.C X Uma escada
C
11
usaremos um que bastante familiar para alunos de ci:ncias e'atas. $stamos
falando da descrio do fatorial de um n(mero. c vimos neste curso uma forma
de descrever este conceito dentro do TUGO quando estudamos o paradigma
aplicativo. Na oportunidade usamos a seguinte descrio)
. fatorial de um n8mero natural n % ! 4 igual
ao produto de todos os n8meros naturais de 1 at4 n
!u ainda em notao mais formal)
n ( = % x & x ' x ))) x n
$m TUGO, como . vimos, teremos a seguinte definio)
00
00 de1i#i23o (a&li$a"ia) de 1a"orial
00
fat # = pr%d$,t 11..n3
...
? fat 5
'2%
? fat
'
? fat 1
'
T uma outra forma de definir, tambm familiar aos alunos do primeiro ano
universitrio)
. Aatorial de um n8mero natural n 4 igual ao produto deste n8mero pelo fatorial
de seu antecessor
Novamente, sendo mais formal, podemos escrever)
n ( = n x (n * %) (
$ em TUGO, como ficaria] Rue tal a definio a seguir]
00
00 de1i#i23o re$ursia de 1a"orial
00
fat # = n I fat (n 0 1"
Hamos e'ercitar a definio)
C
1>
Mai#> fat 5
(23L0< redu$"io#s> 4<L55 $ells)
8RRGR: H%ntr%l sta,6 %&erfl%w
Pom, parece que houve um pequeno problema com nossa definio. A
avaliao de ,at 4 produziu uma situao de erro. Hamos dei'ar para entender
este erro melhor para depois. *or enquanto . podemos adiantar que ele foi
provocado por um pequeno esquecimento de nossa parte.
Na verdade a nossa definio recursiva para fatorial estava incompleta. $sta
que e'ibimos s% se aplica aos naturais maiores que zero. A definio do fatorial de
zero no recursiva, ela independente)
P 'atorial de 1ero i-ual a "
4emos ento duas defini#es para fatorial e precisamos integr+las. He.amos
uma tentativa)
. Aatorial de um n8mero natural n 4(
C. igual a 1 se n=!9
2 igual ao produto deste n8mero pelo fatorial de
seu antecessor1 se n % !
Hamos ver como essa integrao pode ser feita em TUGO. *odemos de
imediato observar que trata+se de uma definio condicional e logo nos vem a
lembrana de que nossa linguagem possui um mecanismo, as e'press#es
condicionais.
00
00 de1i#i23o re$ursia de 1a"orial
00 (corrigida)
00
1a" # = i1 #==%
"7e# '
else # + 1a" (# - ')
Hamos submeter algumas situa#es para o TUGO)
Mai#> fat 5
'2%
(<L redu$"io#s> '24 $ells)
Mai#> fat 2
2432L%2%%('<004%%%%
(25( redu$"io#s> 400 $ells)
Mai#> fat
'
('( redu$"io#s> '( $ells)
C
1?
*elo visto agora deu tudo certo.
7>8<8 /B/M/&$5S */ .MA */SC#I9:5 #/C.#SI"AQ $m uma descrio
recursiva devemos ter em conta certo elementos importantes. - fundamental que
todos eles se.am contemplados para que nossas descri#es este.am corretas. !
e'emplo anteriormente apresentado suficiente para ilustrar todos eles. Hamos
ento discuti+los)
*e,inio geral ) 4oda definio recursiva tem duas partes, uma delas se
aplica a um valor qualquer do domnio do problema, denominamos de geral. $sta
tem uma caracterstica muito importante, o conceito que est sendo definido deve
ser utilizado. *or e'emplo, para definir fatorial de n, usamos o fatorial do
antecessor de n. !bserve aqui, entretanto que o mesmo conceito foi utilizado, mas
no para o mesmo valor. Aplicamos o conceito a um valor mais simples, neste
caso o antecessor de n.
*e,inio inde+endente Q A outra parte da definio destinada ao
tratamento de um valor to simples que a sua definio possa ser dada de forma
independente. $ste elemento tambm conhecido como base da recurso. No
caso do fatorial, o valor considerado o zero.
5bteno de valores mais sim+les Q *ara aplicar o conceito a um valor
mais simples precisamos de uma funo que faa este papel. No caso do fatorial,
usamos a subtrao de n por C, obtendo assim o antecessor de n. $m cada caso,
dependendo do domnio do problema e do problema em si, precisaremos
encontrar a funo apropriada.
Funo au;iliar Q Na definio geral, para obter um valor usando o valor
considerado e o valor definido recursivamente, em geral faz+se necessrio o uso
de uma funo au'iliar. Algumas vezes esta funo pode ser originada a partir de
um conceito aplicvel a dois elementos e que dese.amos estender aos elementos
de uma lista. Um e'emplo o caso da somat%ria dos elementos de uma lista,
como veremos adiante. No caso do fatorial esta funo a multiplicao.
)arantia de atingir o valor inde+endente Q - fundamental que a aplicao
sucessiva da funo que obtm valores mais simples garanta a determinao do
valor mais simples. $ste valor tambm denominado de base da recurso. *or
e'emplo, no caso do fatorial, sabemos que aplicando a subtrao sucessivas
vezes produziremos a seq<:ncia)
n, In-7K, In-2K, 888 3
/sta condi34o 'undamental para -arantir que ao
a!aliarmos uma express4o atin-iremos a +ase da recurs4o
Holtemos " definio do fatorial para destacarmos os elementos acima
citados, como podemos observar no quadro esquemtico a seguir)
C
1A
7>8=8 A"ABIA&*5 /CP#/SSD/SQ A esta altura dos acontecimentos a
curiosidade sobre como avaliar e'press#es usando conceitos definidos
recursivamente . deve estar bastante aguada. No vamos, portanto retardar
mais essa discusso. Apresentamos a seguir um modelo bastante simples para
que possamos entender como avaliar e'press#es que usam conceitos definidos
recursivamente. Novamente no precisaremos entender do funcionamento interno
de um computador nem da maneira como uma determinada implementao de
TUGO foi realizada. Pasta+nos o conceito de reduo que . apresentamos
anteriormente.
7elembremos o conceito de reduo. ! avaliador deve realizar uma
seq<:ncia de passos substituindo uma e'presso por sua definio, at que se
atin.a as defini#es primitivas e os valores possam ser computados diretamente.
Hamos aplicar ento este processo para realizar a avaliao da e'presso
'at 5
+asso #eduo 'usti,icativa
C
1Q
N,at 4 e'presso proposta
C4 W ,at =
substituindo fat por sua definio
geral
14WI= W ,at <K 2dem
>4WI=W I< W ,at 2K/ 2dem
?4WI=WI<WI2 W ,at 7KK/ 2dem
A4WI=WI<WI2WI7 W ,at 3K 2dem
Q4WI=WI<WI2WI7 W 7KKKK usando a definio especfica
S4WI=WI<WI2W7KKK usando a primitiva de multiplicao
J4WI=WI<W2K 2dem
B4WI=W>K 2dem
CN4 W 2= 2dem
CC723 2dem
Ourpreso9a/] Oimples, no] - assim mesmo, bem simples. A cada passo
vamos substituindo uma e'presso por outra at que nada mais possa ser
substitudo. ! resultado surgir naturalmente. 6ais tarde voltaremos ao assunto.
7>848 #/C.#S:5 /M BIS$ASQ A esta altura deste curso . estamos certos que
o uso de lista indispensvel para escrever programas interessantes. $m vista
disso, nada mais %bvio que perguntar sobre o uso de recurso em listas. Heremos
que o uso de defini#es recursivas em listas produz descri#es simples, precisas e
elegantes.
c est na hora de alertar que os valores sobre os quais aplicamos os
conceitos que queremos definir recursivamente possuem uma caracterstica
importantssima, eles em si so recursivos.
*or e'emplo, qualquer valor pertencente aos naturais pode ser descrito a
partir da e'ist:ncia do zero e da funo sucessor 9suc/. He.amos como podemos
obter o valor A)
5 % suc(suc(suc(suc(suc ()))))
As listas so valores recursivos. *odemos descrever uma lista da seguinte
maneira)
Uma lista )
C. a lista vazia5
1. um elemento seguido de uma lista
C
1S
$sta natureza recursiva das listas nos oferece uma oportunidade para, com
certa facilidade, escrever defini#es recursivas. A tcnica consiste basicamente
em)
C. !bter a definio geral) isto consiste em identificar uma
operao binria simples que possa ser aplicada a dois
valores. ! primeiro deles o +rimeiro 9!ead/ da lista e o
outro um valor obtido pela aplicao do conceito em
definio ao resto 9tail/ da lista5
1. !bter a definio independente, que se aplicar " base da
recurso. $sta, em geral, a lista !a1ia5
>. Garantir que a aplicao sucessiva do tail levar " base da
recurso.
Na Figura CA.1 ilustramos o processo recursivo de obter listas cada vez
menores, atravs da aplicao da funo tail. Ao final do processo obteremos a
lista vazia 9i a/.
/;em+lo 37 + &escrever o somat%rio dos elementos de uma lista.
Soluo - *odemos pensar da seguinte maneira) o somat%rio dos
elementos de uma lista igual " soma do primeiro elemento da lista como o
somat%rio do resto da lista. Alm disso, o somat%rio dos elementos de uma lista
vazia igual a zero.
f;
o
, ;
7
, ;
2
, ;
<
, ;
=
888 ;
n-7
e
;
o
f;
7
, ;
2
, ;
<
, ;
=
888 ;
n-7
e
tail
;
7
f;
2
, ;
<
, ;
=
888 ;
n-7
e
;
2
f;
<
, ;
=
888 ;
n-7
e
;
<
f;
=
888 ;
n-7
e
;
=
f888 ;
n-7
e
;
n-7
f e

888
Figura 7482 1 com+onentes recursivos de uma lista
!ead
C
1J
He.amos ento a codificao)
00
00 de1i#i23o re$ursia da soma"cria dos
-- eleme#"os de uma lis"a
00
s%mat 's = if n$ll 's
then
else head 's 7 s%mat (tail 's"
A seguir alguns e'emplos de uso)
Mai#> soma" 64>5>2><>L9
2<
(52 redu$"io#s> 0% $ells)
Mai#> soma" 6'..'%9
55
(2<5 redu$"io#s> 42' $ells)
Mai#> soma" 6'%%%>LLLL..'9
%
(45 redu$"io#s> 0( $ells)
Mai#> soma" 6'%%%>LLL..'9
5%%5%%
('(%5' redu$"io#s> 25'2' $ells)
/;em+lo 32 + &escrever a funo que determina o elemento de valor
m'imo uma lista de n(meros.
Soluo) ! m'imo de uma lista o maior entre o primeiro elemento da lista
e o m'imo aplicado ao resto da lista. Uma lista que tem apenas um elemento tem
como valor m'imo o pr%prio elemento 9Figura CA.>/.
;
o
X somat f;
7
, ;
2
, ;
<
, ;
=
888 ;
n-7
e
C
3
X ;
7
X somat f;
2
, ;
<
, ;
=
888 ;
n-7
e
888
C
3
X ;
7
X ;
2
X somat f;
<
, ;
=
888 ;
n-7
e
C
3
X ;
7
X ;
2
X ;
<
X somat f;
=
888 ;
n-7
e
C
3
X ;
7
X ;
2
X ;
<
X somat f;
=
888 ;
n-7
e
C
3
X ;
7
X ;
2
X ;
<
X ;
=
X somat f888 ;
n-7
e
C
3
X ;
7
X ;
2
X ;
<
X ;
=
X 888 X ;
n-7
X somat f e
somat f;
o
, ;
7
, ;
2
, ;
<
, ;
=
888 ;
n-7
e
Figura CA.1 X desenvolvimento da computao de
somat%rio dos elementos de uma lista
C
3
X ;
7
X ;
2
X ;
<
X ;
=
X 888 X ;
n-7
X 3
C
1B
A definio recursiva apresentada a seguir)
00
00 de1i#i23o re$ursia do mWximo de uma lis"a
00
ma'im% 's = if n$ll (tail 's"
then head 's
else mai%r (head 's" (ma'im% (tail 's""
00
mai%r ' 5 = if ' > 5 then ' else 5
$ vamos acompanhar agora algumas submiss#es)
Mai#> ma'im% 14!6!7!)+!32!45!+)!65!313
L(
('20 redu$"io#s> '5% $ells)
Mai#> ma'im% (11..1377115!14..13"
'5%%
(3'4'L redu$"io#s> 4450< $ells)
Mai#> ma'im% 11!(1 0 6" .. 13 where 6 = )
'%%
(L' redu$"io#s> '25 $ells)
$ agora uma surpresa.
Mai#> ma'im% 1 3
FGGHG: J#resoled oerloadi#*
+++ Ty&e : Hrd a => a
+++ Fx&ressio# : maximo 69
Hoc: consegue e'plicar]
/;em+lo 3< + &escrever a funo que verifica se um dado valor ocorre em
uma lista tambm dada.
ma'imo i'
o
, '
C
, '
1
, '
>
, '
?
... '
n+C
a
maior9 '
o
, ma'imo i'
C
, '
1
, '
>
, '
?
... '
n+C
a /
maior9 '
o
, maior9'
C
, ma'imo i'
1
, '
>
, '
?
... '
n+C
a// //
maior9 '
o
, maior9'
C
, maior9'
1,
ma'imo i'
>
, '
?
... '
n+C
a ///
maior9 '
o
, maior9'
C
, maior9'
1,
maior9'
>,
ma'imo i'
?
... '
n+C
a ////
maior9 '
o
, maior9'
C
, maior9'
1,
maior9'
>,
maior9'
?
, ... ma'imoi'
n+1
, '
n+C
a/////
maior9 '
o
, maior9'
C
, maior9'
1,
maior9'
>,
maior9'
?
, ... maior9'
n+1 ,
ma'imoi '
n+C
a/////
maior9 '
o
, maior9'
C
, maior9'
1,
maior9'
>,
maior9'
?
, ... maior9'
n+1 ,
'
n+C
//////
Figura CA.> X desenvolvimento da computao do elemento m'imo de
uma lista
C
>N
Soluo ) *odemos pensar da seguinte maneira) Um dado elemento V
ocorre em uma lista se ele igual ao primeiro elemento da lista ou se ele ocorre
no resto da lista. $m uma lista vazia no ocorrem elementos quaisquer 9Figura
CA.?/.
He.amos ento a codificao)
00
00 des$ree a o$orrZ#$ia de dado I em uma lis"a xs
00
%,%rre 6 's = if n$ll 's
then >alse
else (6==head('s"" 22 %,%rre 6 (tail 's"
$ algumas submiss#es)
Mai#> %,%rre 5 6(>05>40>23>LL>359
False
(<' redu$"io#s> ''' $ells)
Mai#> %,%rre 5 6(>05>40>5>23>LL>359
True
(4< redu$"io#s> 5( $ells)
Mai#> %,%rre 5 6 9
False
('0 redu$"io#s> 3% $ells)
ocorre V i'
o
, '
C
, '
1
, '
>
, '
?
... '
n+C
a
V M '
o
h ocorre V i'
C
, '
1
, '
>
, '
?
... '
n+C
a
V M '
o
h 9V M '
C
h ocorre V i'
1
, '
>
, '
?
... '
n+C
a/
V M '
o
h 9V M '
C
h 9 V M '
1
h ocorre V i'
>
, '
?
... '
n+C
a//
V M '
o
h 9V M '
C
h 9 V M '
1
h 9V M '
>
h ocorre V i'
?
... '
n+C
a///
V M '
o
h 9V M '
C
h 9 V M '
1
h 9V M '
>
h 9V M '
?
/ hh ocorre V i... '
n+C
a////
...
V M '
o
h 9V M '
C
h 9 V M '
1
h 9V M '
>
h 9V M '
?
/ h ... ocorre V i'
n+C
a/////
V M '
o
h 9V M '
C
h 9 V M '
1
h 9V M '
>
h 9V M '
?
/ h ... h 9V M '
n+C
/h ocorre V i a/////
Figura CA.? X desenvolvimento da computao da ocorr:ncia de
um elemento em uma lista
C
>C
/;em+lo 3= + &escrever a funo que obtm de uma lista 's a sublista
formada pelos elementos que so menores que um dado V )
Soluo ) *recisamos descrever uma nova lista, vamos denomin+la de
menores, em funo de 's e de V. Ruem ser esta nova lista] Oe o primeiro
elemento de 's for menor que V, ento ele participar da nova lista, que pode ser
descrita como sendo formada pelo primeiro elemento de 's seguido dos menores
que V no resto de 's. Oe por outro lado o primeiro no menor que V, podemos
dizer que a lista resultante obtida pela aplicao de menores ao resto da lista.
Novamente a base da recurso definida pela lista vazia, visto que em uma lista
vazia no ocorrem elementos menores que qualquer V.
A codificao apresentada a seguir)
00
-- de1i#e a lis"a de me#ores ,ue um dado eleme#"o em
-- uma lis"a dada
00
men%res 6 's = if n$ll 's
then 's
else if head 's / 6
then head 's : men%res 6 (tail 's"
else men%res 6 (tail 's"
&esta podemos obter as seguintes avalia#es)
Mai#> men%res 23 6(>05>40>5>23>LL>359
6(>59
('22 redu$"io#s> '(( $ells)
Mai#> men%res 40 6(>05>40>5>23>LL>359
6(>5>23>359
('35 redu$"io#s> '<5 $ells)
Mai#> men%res 5 69
69
('< redu$"io#s> 24 $ells)
7>8>8 /CPB5#A&*5 #/.S5Q Oegundo o *rofessor George *olLa, ap%s concluir
a soluo de um problema, devemos levantar questionamentos a respeito das
possibilidades de generalizao da soluo obtida. &entro deste esprito, vamos
e'plorar um pouco a soluo obtida para o problema descrito a seguir.
/;em+lo 4 ISub-lista de n(meros +aresK ) &ada uma lista 's, dese.amos
descrever uma sublista de 's formada apenas pelos n(meros pares e'istentes em
's.
Soluo) &evemos considerar, como no problema de encontrar a sublista
dos menores 9$'emplo ?/, a e'ist:ncia de suas situa#es)
C
>1
C. ! primeiro elemento da lista um n(mero par, neste caso a sublista
resultante dada pela .uno do primeiro com a sublista de pares e'istente
no resto da lista.
1. ! primeiro no par. Neste caso a sublista de pares em 's obtida pela
seleo dos elementos pares do resto de 's.
3oncluindo, tomemos como base da recurso a lista vazia, que obviamente
no contm qualquer n(mero.
$is a soluo em TUGO)

00
00 su)lis"a de #]meros &ares
00
slpares 's = if n$ll 's
then 's
else if e&en (head 's"
then head 's : slpares (tail 's"
else slpares (tail 's"
$ a avaliao de algumas inst0ncias)
Mai#> slpares 6'..'%9
12!4!6!)!13
(322 redu$"io#s> 43( $ells)
Mai#> slpares 6'>3..'%%9
13
(L02 redu$"io#s> ''(3 $ells)
Hamos agora, seguindo as orienta#es do mestre *olLa, buscar
oportunidades de generalizao para esta funo. *odemos fazer algumas
perguntas do tipo)
C. 3omo faria uma funo para determinar a sublista dos n(meros
mpares a partir de uma dada lista]
1. $ se quisssemos a sublista dos primos]
>. $ que tal a sublista dos m(ltiplos de cinco]

Uma breve inspeo na soluo acima nos levaria a entender que a (nica
diferena entre as novas fun#es e a que . temos a funo que verifica se o
primeiro elemento satisfaz uma propriedade, no caso presente a de ser um
n(mero par 9even/, conforme destacamos a seguir)

C
>>
00
00 su)lis"a de #]meros &ares
00
slpares 's = if n$ll 's
then 's
else if e&en (head 's"
then head 's : slpares (tail 's"
else slpares (tail 's"
00
00 su)lis"a de #]meros im&ares
00
slimpar 's = if n$ll 's
then 's
else if %dd (head 's"
then head 's : slimpar (tail 's"
else slimpar (tail 's"
00
00 su)lis"a de #]meros &rimos
00
slprim% 's = if n$ll 's
then 's
else if prim% (head 's"
then head 's : slprim% (tail 's"
else slprim% (tail 's"
2sto nos sugere que a funo avaliadora pode ser um par0metro. *ois bem,
troquemos ento o nome da funo por um nome mais geral e adicionemos " sua
interface mais uma par0metro. $ste par0metro, como sabemos, dever ser do
tipo)

alfa 0> C%%lean
He.amos ento o resultado da codificao, onde a propriedade a ser
avaliada se converte em um par0metro)
00
00 su)lis"a de eleme#"os de xs ,ue sa"is1azem
00 a &ro&riedade pr%p
00
s$=lista pr%p 's = if n$ll 's
then 's
else if pr%p (head 's"
then head 's : s$=lista pr%p (tail 's"
else s$=lista pr%p (tail 's"
He.amos ento algumas aplica#es na nossa funo genrica para
determinar sublistas)
C
>?
Mai#> su)lis"a e&en 6'..'%9
62>4>0>(>'%9
Mai#> su)lis"a %dd 6'..'%9
6'>3>5><>L9
Mai#> su)lis"a (/5" 6'..'%9
6'>2>3>49
Mai#> su)lis"a (>=5" 6'..'%9
65>0><>(>L>'%9
!bserve que a funo que havamos anteriormente definido para determinar
os elementos menores que um certo valor V, da mesma forma que a funo para
determinar os maiores que V, est contemplada com a nossa generalizao. As
duas (ltimas avalia#es no quadro acima ilustram a determinao da sublista dos
valores menores que A e a dos maiores ou iguais a A.
/;ercPciosQ
&escreva fun#es em TUGO que utilizem recurso para resolver os problemas
abai'o.
C. !bter a interseo de duas listas 's e Ls.
1. &adas duas strings 's e Ls, verificar se 's prefi'o de Ls.
>. &adas duas strings 's e Ls, verificar se 's sufi'o de Ls.
?. &adas duas strings 's e Ls, verificar se 's sublista de Ls.
A. inverter uma lista 's5
Q. &efinir a funo tohile, que tenha o mesmo comportamento que a funo
taVeohile.
S. &efinir a funo dohile, que tenha o mesmo comportamento que a funo
dropohile.
J. verificar se uma string um palndrome 9a string a mesma quando lida da
esquerda para a direita ou da direita para a esquerda/.
B. Herifique se uma string uma palavra. &efina uma palavra como formada
apenas por letras.
CN. verificar se os elementos de uma lista so distintos.
CC. determinar a posio de um elemento ' em uma lista 's, se ele ocorre na
lista.
C1. descrever a lista das palavras que e'istem no te'to, dado um te'to.
C>. &adas duas listas 's e Ls, ordenadas em ordem crescente, obter a lista
ordenada resultante da intercalao de 's e Ls.
C?. calcular a combinao de uma lista 's, p a p.
C
>A
CS. !7&$NAlm! 7$3U7O2HA &$ &A&!O, A\GUNO *7!P\$6AO
3!77$\A4!O $ A\GU6AO 4-3N23AO &$ *7!*tO24! G$7A\
7?87 1 I&$#5*.9:5Q Holtemos ento ao problema de ordenar os elementos de
uma lista, para o qual . discutimos uma soluo no paradigma aplicativo.
:ada uma lista xs desejamos descre!er sua ordena34o
Hamos comear propondo e resolvendo um problema mais simples.
Insero ordenada) &ada uma lista ordenada 's e um elemento V
dese.amos descrever uma lista a partir de 's, na qual este.a includo o valor V,
com a condio de que a nova lista tambm este.a ordenada.
Soluo ) Holtemos a nossa estratgia para obter solu#es recursivas. Aqui
tambm temos dois casos)
C. ! valor V menor que o primeiro da lista 's, neste caso a lista resultante
descrita pela .uno de V com a lista 's5
1. ! valor V maior ou igual ao primeiro elemento da lista 's, neste caso a
lista resultante descrita pela .uno do primeiro da lista 's com a lista
obtida pela insero ordenada de V no resto da lista 's.
A codificao pode ser realizada da seguinte forma)
--
-- i#ser23o orde#ada de um alor I em uma
-- lis"a orde#ada (#3o de$res$e#"e)
--
i#sord I xs = i1 #ull xs
"7e# 6I9
else i1 I ! 7ead xs
"7e# I : xs
else 7ead xs : (i#sord I ("ail xs))
V f '
N
V
)
Us
3aso contrrio '
N )
insord V

Us
insord R Cs G
Figura CS.C X insero ordenada de um
elemento V em uma lista Us
C
>Q
$ a seguir algumas aplica#es da soluo)
Mai#> ins%rd 5 6%>2..'%9
1!2!4!5!6!)!13
(23% redu$"io#s> 4%< $ells)
Mai#> ins%rd 5 6'%>'5..5%9
15!1!15!2!25!3!35!4!45!53
(24( redu$"io#s> 3<L $ells)
Mai#> ins%rd 5 6-'%>'5..%9
101!53
(L2 redu$"io#s> '35 $ells)
Mai#> ins%rd 5 6-'%>-5..%9
101!05!!53
('54 redu$"io#s> 22% $ells)
Mai#> ins%rd 5 69
153
(23 redu$"io#s> 32 $ells)
Agora . podemos voltar ao nosso problema inicial de ordenao de listas.
Hamos em busca de uma primeira soluo)
Soluo Q A ordenao no decrescente de uma lista 's qualquer igual "
insero ordenada do primeiro da lista na ordenao do resto da lista.
--
-- orde#a23o de uma lis"a
--
orde#a xs = i1 #ull xs
"7e# xs
else i#sord (7ead xs) (orde#a ("ail xs))
He.amos a aplicao da soluo " algumas inst0ncias)
Mai#> %rdena 63> 4> 5%>3%>2%>34>'59
13!4!15!2!3!34!53
(24' redu$"io#s> 33% $ells)
Mai#> %rdena 6'%%>L3..5%9
151!5)!65!72!7+!)6!+3!13
(50( redu$"io#s> <(% $ells)
C
>S
7?82 *I"IS:5 / C5&F.IS$A I.MA $EC&ICA P5*/#5SAKQ Alguns problemas
possuem solu#es mais facilmente descritas, algumas at mais eficientes, quando
quebramos o problema em partes menores, descrevemos a soluo de cada parte
e depois combinamos as solu#es parciais para obter a soluo completa. $ste
mtodo denominado de ;diviso e conquista;. Pasicamente buscamos encontrar
inst0ncias do problema onde a soluo se.a imediata. . Nesta seo veremos
alguns e'emplos desta abordagem. ! primeiro deles, a pesquisa binria, trata da
busca de um elemento em uma lista ordenada. !s outros dois, mergesort e
quicVsort, apresentam solu#es alternativas para a ordenao de uma lista.
7?82878 P/SF.ISA I&6#IA - Holtemos a um problema . apresentado
anteriormente, verificao da ocorr:ncia de um elemento a uma lista. Oegundo a
definio que apresentamos para a funo ocorre, apresentada no e'emplo > do
3aptulo CQ. *odemos constatar que para avaliar e'press#es onde o elemento
procurado no ocorre na lista, o avaliador de e'press#es precisar fazer uma
quantidade de compara#es igual ao comprimento da lista considerada. Na mdia
de um con.unto de avalia#es, considerando as avalia#es de e'press#es em que
o elemento procurado est na lista, e que a cada vez estaremos procurando por
um elemento distinto, teremos um n(mero mdio de compara#es da ordem de
9n Z 2/. Oe n for muito grande ficaremos assustados com o n(mero de
compara#es. *or e'emplo, para uma lista de CNNNNNN 9um milho/ de elementos,
em mdia teremos que fazer ANN mil compara#es.
Oe pudermos garantir que a lista est ordenada, ento podemos fazer uso de
uma estratgia . discutida anteriormente para reduzir este n(mero. $stamos
falando da rvore binria de pesquisa. A estratgia que usaremos consiste em, a
cada passo de reduo, abandonarmos metade da lista considerada a partir da
comparao de V com o elemento que se encontra na metade da lista. Oe o
elemento buscado 9V/ for igual ao elemento central, ento o processo de avaliao
est encerrado. Ruando isto no ocorre, devemos ento escolher em qual lista
devemos procur+lo. Ruando ele menor que o elemento central devemos busc+
lo na sublista que antecede o central, caso contrrio devemos busc+lo na sublista
dos seus sucessores. Novamente a base da recurso determinada pela lista
vazia.
Nesta abordagem, a cada escolha abandonamos metade da lista restante.
&esta forma, o n(mero de compara#es dado pelo tamanho da seq<:ncia)

n+%, n+&, n+,, ))) , n+n
*ara simplificar a anlise podemos escolher um n que se.a pot:ncia de 1.
Neste caso podemos assegurar que o comprimento da seq<:ncia dado por)

-o. n na base &
C
>J
Holtando ento ao n(mero de compara#es necessrias para localizar um
elemento, podemos constatar que em uma lista com C milho de elementos, ao
invs das ANN mil compara#es da soluo anterior, precisaremos no pior caso, de
apenas 1N compara#es. 2sso mesmo, apenas 1N.
Hamos ento " codificao em TUGO)

--
-- &es,uisa )i#Wria
--
&es,)i# I xs = i1 #ull xs
"7e# False
else i1 I == &io"
"7e# True
else i1 I ! &io"
"7e# &es,)i# I me#ores
else &es,)i# I maiores
87ere
& = di (le#*"7 xs) 2
me#ores = "aIe & xs
maiores = "ail (dro& & xs)
&io" = 7ead (dro& & xs)
$ a seguir, a avaliao de algumas inst0ncias)
Mai#> %,%rre '%23 6%..'%239
True
(245L2 redu$"io#s> 32<L< $ells)
Mai#> pesJ=in '%23 6%..'%239
True
(<'503 redu$"io#s> L2%0% $ells)
7?8282 M/#)/S5#$ - $'istem outras maneiras de se descrever a ordenao de
uma lista. Uma delas, denominada mer-esort, se baseia na intercalao de duas
listas . ordenadas. 3omecemos ento por discutir a intercalao que, em si
mesmo, . representa uma ferramenta intelectual bastante interessante.
IntercalaoQ Antes de ver o mergesort podemos apresentar uma verso
recursiva para a intercalao de duas listas em ordem no decrescente.
Soluo) A intercalao de duas listas ordenadas xs e ys pode ser descrita
atravs de dois casos)
C. se o primeiro elemento de xs menor que o primeiro elemento de
ys ento a intercalao dada pela .uno do primeiro elemento de
xs com a intercalao do resto de xs com ys5
1. caso contrrio, a intercalao descrita pela .uno do primeiro
elemento de ys com a intercalao do resto de ys com xs5
C
>B
A codificao resultante pode ser observada a seguir)
--
-- ?#"er$ala duas lis"as em ordem #3o de$res$e#"e
--
i#"er$ala xs ys = i1 (#ull xs) // (#ull ys)
"7e# xs ++ ys
else i1 7ead xs != 7ead ys
"7e# 7ead xs : i#"er$ala ("ail xs) ys
else 7ead ys : i#"er$ala xs ("ail ys)
$ a seguir, algumas submiss#es e avalia#es do TUGO)
Mai#> inter,ala 6'>3..'%9 6%>2..'%9
1!1!2!3!4!5!6!7!)!+!13
Mai#> inter,ala 6%>2..'%9 6'>3..'%9
1!1!2!3!4!5!6!7!)!+!13
Mai#> inter,ala 6%>2..'%9 69
6%>2>4>0>(>'%9
Mai#> inter,ala 69 69
FGGHG: J#resoled oerloadi#*
+++ Ty&e : Hrd a => 6a9
+++ Fx&ressio# : i#"er$ala 69 69
Mai#> inter,ala 69 6%>2..'%9
1!2!4!6!)!13
Mai#> inter,ala 6%>2..'%9 6%>2..'%9
1!!2!2!4!4!6!6!)!)!1!13
Mai#> inter,ala 6L><..'9 6'%>(..'9
1+!7!5!3!1!1!)!6!4!23
(o ,ue 7oue ,ue #3o 1i$ou orde#adaB)
Holtemos ao mergesort, ou, em bom portugu:s, ordenao por intercalao.
Soluo ) A ordenao de uma lista por mergesort igual " intercalao do
mergesort da primeira metade da lista com o mergesort da segunda metade. $sta
soluo e'plora a noo de rvore binria. Neste caso, a lista original dividida
em 1 partes, cada uma delas em outras duas e assim sucessivamente at que
esta quebra no se.a mais possvel. A figura Fig. CS.C ilustra o processamento da
ordenao de uma lista.

C
?N
He.amos ento como fica a codificao em TUGO.
--
-- orde#a uma lis"a &ela i#"er$ala23o da orde#a23o de
-- suas duas me"ades
--
mer*esor" xs = i1 #ull ("ail xs)
"7e# xs
else i#"er$ala (mer*esor" m) (mer*esor" #)
87ere
m = "aIe I xs
# = dro& I xs
I = di (le#*"7 xs) 2
C
?C
Mai#> mer-es%rt 6'..'%9
6'>2>3>4>5>0><>(>L>'%9
('5L3 redu$"io#s> 2'(5 $ells)
Mai#> mer-es%rt 6'%>L..'9
6'>2>3>4>5>0><>(>L>'%9
('04' redu$"io#s> 2230 $ells)
7?828<8 F.ICjS5#$ - $'iste uma maneira muito famosa de resolver o
mesmo problema de ordenao, usando ainda a noo de diviso e conquista,
muito parecida com o mergesort. 2mplementa#es desta soluo reduzem
sensivelmente o n(mero de compara#es necessrias e so, portanto muito
utilizadas.
Soluo ) Na verso usando o mergesort dividamos a inst0ncia original
e'atamente ao meio. Nesta vamos dividir tambm em duas, mas com seguinte
critrio) a primeira com os elementos menores que um elemento qualquer da lista
e a segunda com os elementos maiores ou iguais a ele. $ste elemento
denominado pi!ot e e'istem vrias formas de escolh:+lo. A melhor escolha
aquela que produzir as sublistas com comprimentos bem pr%'imos, o que
repercutir no desempenho da avaliao. Aqui nos limitaremos a escolher como
pivot o primeiro elemento da lista. Assim sendo, ap%s obter a ordenao das duas
listas, basta .untar a ordenao da primeira, com o pivot e finalmente com a
ordenao da segunda. A figura Fig. B.1 ilustra a aplicao do quicVsort a uma
inst0ncia do problema.
C
?1
$ a seguir ve.amos a codificao.
,ui$Isor" xs = i1 (#ull xs) // (#ull ("ail xs))
"7e# xs
else ,ui$Isor" (su)lis"a (! &io") ("ail xs))
++ 6&io"9
++ ,ui$Isor" (su)lis"a (>= &io") ("ail xs))
87ere
&io" = 7ead xs
3onvidamos o leitor a apreciar e discutir a eleg0ncia, a compacidade e a
clareza da descrio do quicVsort.
C
?>
He.amos a avaliao de algumas inst0ncias)
Mai#> J$i,6s%rt 64>5>0><>(>3>2>'9
6'>2>3>4>5>0><>(9
(5L5 redu$"io#s> <55 $ells)
Mai#> J$i,6s%rt 6'..'%9
6'>2>3>4>5>0><>(>L>'%9
('530 redu$"io#s> '((' $ells)
Mai#> J$i,6s%rt 6'%>L..'9
6'>2>3>4>5>0><>(>L>'%9
('54' redu$"io#s> 'L52 $ells)
Mai#> mer-es%rt 6'%>L..'9
6'>2>3>4>5>0><>(>L>'%9
('04< redu$"io#s> 22(3 $ells)
Mai#> mer-es%rt 's == J$i,6s%rt 's 87ere xs = 6'..'%9
True
(2(%5 redu$"io#s> 3503 $ells)
Mai#> mer-es%rt 62>'4>'0>23>2L>35>4<>0(><%>L%9
62>'4>'0>23>2L>35>4<>0(><%>L%9
('4'4 redu$"io#s> 'L22 $ells)
Mai#> J$i,6s%rt 62>'4>'0>23>2L>35>4<>0(><%>L%9
62>'4>'0>23>2L>35>4<>0(><%>L%9
('35< redu$"io#s> '0'( $ells)
Mai#> %rdena 62>'4>'0>23>2L>35>4<>0(><%>L%9
62>'4>'0>23>2L>35>4<>0(><%>L%9
(230 redu$"io#s> 330 $ells)
7?8<8 P#5C/SSAM/&$5 */ CA*/IAS */ CA#AC$/#/SQ As cadeias de
caracteres, como . vimos, tambm so listas, portanto o uso de recurso com
cadeias segue as mesma recomenda#es. *ara ilustrar vamos apresentar alguns
e'emplos.
/;em+lo 37 + i*alndromoa &ada uma cadeia de caracteres verifique se
um palndromo. Oegundo o dicionrio, um palndromo uma frase ou palavra, que
no importando o sentido que se l:, significa a mesma coisa. *or e'emplo,
;Oocorram+me subi no unibus em 6arrocos;. He.am que a quantidade de
espaos, os separadores e os trminos de palavra no so considerados. Aqui
vamos tratar a questo de forma simplificada, os separadores sero tratados como
caracteres comuns.
Soluo Q Neste caso, importante observar que podemos olhar a cadeia
como sendo formada por pares de valores eq<idistantes dos e'tremos. Um cadeia
palndromo se os seus e'tremos so iguais e o meio da lista um palndromo. A
base da recurso so as cadeias vazias ou aquelas com apenas um elemento.
C
??
Figura CS.C X desenvolvimento da computao da funo
palndromo
He.amos ento a codificao em TUGO e a avaliao para algumas
inst0ncias.

$ agora uma avaliao de algumas listas candidatas a palndromo)
--
-- Yeri1i$a se uma se#"e#2a V Aal\#dromo
--
--
&ali#dromo xs = i1 #ull xs // #ull ("ail xs)
"7e# True
else (7ead xs == las" xs) ..
&ali#dromo (meio xs)
87ere
meio xs = i#i" ("ail xs)
Oeguindo nosso padro de apreentao,ve.amos como ficam algumas
avalia#es)
Mai#> palindr%m% Kso$orrammesu)i#oo#i)usemmarro$osK
#r$e
(0(< redu$"io#s> 0L( $ells)
Mai#> palindr%m% Kso$orram-me su)i #o o#i)us em marro$osK
>alse
((L' redu$"io#s> L%< $ells)
Mai#> palindr%m% KamaK
#r$e
(3' redu$"io#s> 43 $ells)
Mai#> palindr%m% K&a&a*aioK
>alse
(2L redu$"io#s> 45 $ells)
Mai#> palindr%m% KararaK
#r$e
(4L redu$"io#s> 0' $ells)
'
N
M

'
n+C
g palndromo i'
C
, '
1
, '
>
, '
?
, '
A
, ..., a
'
N
M

g 9'
C M
'
n+C
g

palndromo i '
1
, '
>
, '
?
, '
A
, ..., a /
'
N
M

g 9'
C M
'
n+C
g

9 U
1
M U
n+1
g palndromo i'
>
, '
?
, '
A
, ..., a //
palndromo i'
N
, '
C
, '
1
, '
>
, '
?
, '
A
, ..., '
n+C
a
C
?A
/;em+lo 32 + i*refi'oa &adas duas cadeias de caracteres verifique se a
primeira id:ntica " subcadeia formada pelos primeiros caracteres da segunda.
*or e'emplo, ;aba; prefi'o da cadeia ;abaca'i; e ;pre; prefi'o de ;prefi'o;.
Soluo Q &e imediato podemos dizer que uma cadeia 's prefi'o de uma
cadeia Ls quando)
i/ o primeiro elemento de 's igual ao primeiro elemento de Ls e5
ii/ o restante de 's prefi'o do restante de Ls.
iii/
Ruanto " base da recurso, temos que considerar duas situa#es)
i/ A primeira tem como base que a cadeia vazia prefi'o de qualquer
outra cadeia5
ii/ A segunda leva em conta que nenhuma cadeia pode ser prefi'o de uma
cadeia vazia 9e'ceto a cadeia vazia/.
He.amos como fica em TasVell)
--
-- Yeri1i$a se uma $adeia xs V &re1ixo
-- de uma se*u#da (ys)
--
&re1ixo xs ys = i1 #ull xs
"7e# True
else i1 #ull ys
"7e# False
else (7ead xs == 7ead ys) ..
&re1ixo ("ail xs) ("ail ys)
As avalia#es de e'press#es a seguir nos permitem observar o
funcionamento de nossa descrio)
Mai#> prefi'% Ka)aK Ka)a$adra)aK
True
Mai#> prefi'% KK Ka)a$adra)aK
True
Mai#> prefi'o K&reK K&re1ixoK
True
Mai#> prefi'% K&re1ixoK K&reK
False
Mai#> prefi'% K&re1ixoK KK
False

C
?Q
/;em+lo 3< + i3asamento de *adroa Herificar se uma cadeia satisfaz um
determinado padro um processamento muito (til e constantemente realizado na
prtica da computao. Aqui nos ateremos a uma forma simplificada deste
problema que consiste em verificar se uma cadeia su+cadeia de outra.
Soluo Q Uma rpida inspeo nos leva " constatao de que o problema
anterior parecido com este, e'ceto pelo fato de que a primeira cadeia pode
ocorrer em qualquer lugar da segunda. *odemos dizer ento que a primeira
cadeia ocorre na segunda se ela um prefi'o da primeira ou se ela ocorre no
resto da segunda.
He.amos como fica em TUGO)
--
-- Yeri1i$a se uma $adeia xs V su)$adeia
-- de uma ou"ra (ys)
--
su)$adeia xs ys = i1 #ull ys // #ull ("ail ys)
"7e# False
else &re1ixo xs ys // su)$adeia xs ("ail ys)
A avaliao das e'press#es a seguir a.uda no entendimento)
Mai#> s$=,adeia KK K&re1a$ioK
#r$e
Mai#> s$=,adeia K&reK K&re1a$ioK
#r$e
Mai#> s$=,adeia K$ioK K&re1a$ioK
#r$e
Mai#> s$=,adeia Ke1aK K&re1a$ioK
#r$e
Mai#> s$=,adeia Ka$idoK K&re1a$ioK
>alse
Mai#> s$=,adeia Ke1aK KK
>alse
/;ercPciosQ
i/ conoihoi
ii/ 2onoihno
iii/ Noinboiho
iv/ !iohoi
v/ !ihnoih.o
vi/ !inoih.po
C
?S
7@8 /C/#CbCI5S C5MPB/M/&$A#/S
Apresentamos a seguir alguns e'erccios que visam suprir material para o leitor
que dese.ar praticar um pouco mais com a programao atravs de descri#es
funcionais.
*ara cada um dos problemas a seguir d: uma descrio funcional na linguagem
TasVell.
Ougerimos que o leitor edite as defini#es em um arquivo de scripts e use essas
defini#es em alguns e'emplos para certificar+se se suas defini#es esto
corretas. *ara cada funo elabore uma planilha de teste, indicando os valores
para os quais as mesmas sero avaliadas e quais os resultados esperados, insira
a planilha como comentrio, conforme se ilustra a seguir.
/;em+lo Q
*escrio do +roblemaQ &ados dois n(meros a e b mapeie+os no maior deles.
SoluoQ
-- de1 : ma&eia dois #]meros a e ) #o maior deles
-- "es"e : maior 3 4 ==> 4O maior 4 3 ==> 4O maior 3 3 ==> 3
maior a ) = if a > ) then a else )
7@87 )ru+o I 1 Problemas )erais
C. &ados quatro n(meros pC, p1, p> e p?, mapeie+os na sua soma se a diviso
desta soma por A e'ata e em zero caso contrrio.
1. &ado um n(mero inteiro, verifique se ele pertence ao intervalo 9N,CNN/ e
divisvel por > e por A.
>. ! operador hh 9!U inclusivo/, provido pelo Tugs, mapeia dois valores
booleanos a e b em $rue quando pelo menos um deles $rue e em False
caso contrrio. $screva uma funo que denominaremos de oux 9!U
e'clusivo/ que se assemelha ao !U inclusivo mas que mapeia em >alse
quando ambos valores so Irue.
?. &ados > valores a, b e c determine a mdia aritmtica dos valores e'tremos.
] media CN >A ?
CB.A
] media AN CN J
1B
C
?J
A. &ados tr:s n(meros inteiros distintos, calcule o quadrado do sucessor do maior
n(mero.
Q. &ados > pontos pC, p1 e p>, do plano cartesiano, determine se eles formam
um tri0ngulo, e se for o caso,determine sua rea.
S. A empresa \ucro3erto decidiu dar aos seus funcionrios um abono de Natal. A
gratificao ser baseada em dois critrios) o n(mero de horas e'tras
trabalhadas e o n(mero de horas que o empregado faltou ao trabalho. !
critrio estabelecido para calcular o pr:mio ) subtrair dois t:ros das horas
que o empregado faltou de suas horas e'tras, obtendo um valor que determina
o n(mero de pontos do funcionrio. A distribuio do pr:mio feita de acordo
com a tabela abai'o.
Pontos 5btidos
Pr0mio em #n
de a
?C ... ANN,NN
>C ?N ?NN,NN
1C >N >NN,NN
CC 1N 1NN,NN
C CN CNN,NN
J. 3onsidere dois pontos pC e p1 no plano cartesiano. $stamos interessados em
identificar as seguintes rela#es entre eles)
i. por pC e p1 podemos traar uma reta paralela ao ei'o horizontal5
ii. por pC e p1 podemos traar uma reta paralela ao ei'o vertical5
iii. pC e p1 esto no mesmo quadrante5
iv. pC e p1 esto em quadrantes diferentes5
v. pC e p1 esto em quadrantes opostos 9C e > ou 1 e ?/5
vi. pC e p1 esto em quadrantes ad.acentes 9C+1, 1+>, >+?, C+?/5
B. &ados dois pontos no plano cartesiano, eles podem ser id:nticos, podem
determinar uma reta paralela a um dos dois ei'os, ou determinar uma reta que
corta os dois ei'os. &etermine qual o caso em que dois dados pontos se
enquadram e, se ocorre o terceiro, qual a rea do tri0ngulo determinado pela
reta e os ei'os.
CN. &ados um segmento de reta r, atravs de dois pontos, a e b, localizados no
primeiro quadrante, e um ponto p qualquer, determine se p pertence ao
segmento, ou se p pertence ao prolongamento de r, ou ainda se p est acima
da reta ou se p est abai'o.
C
?B
CC. &ados o canto superior esquerdo e o canto inferior direito de um ret0ngulo 7,
paralelo aos ei'os, determine quantos quadrantes so cobertos por ele.
C1. &ados dois ret0ngulos, paralelos aos ei'os, determine se h ou no interseo
entre eles. &etermine ainda, se for o caso, a rea de interseo entre dois
ret0ngulos.
C>. 3onsidere um ret0ngulo definido por seus cantos superior esquerdo e inferior
direito. *odemos traar um losango a partir de pontos localizados no ponto
mdio de cada um de seus lados. &efinimos com isso seis regi#es.
i. fora do ret0ngulo5
ii. o tri0ngulo superior esquerdo5
iii. o tri0ngulo superior direito5
iv. o tri0ngulo inferior direito5
v. o tri0ngulo inferior esquerdo5
vi. o interior do losango.
vii. &ado um ponto p, determine a sua localizao.
viii.
C?. &ados > n(meros, determine se com os tr:s eu posso formar uma progresso
aitimtica 9*A/, onde dois deles quaisquer so termos consecutivos e um
terceiro a razo.
CA. &ados > n(meros, determine se com os tr:s eu posso formar uma progresso
gepmtrica 9*G/, onde dois deles quaisquer so termos consecutivos e um
terceiro a razo.
CQ. 3onsidere que o preo de uma passagem de avio em um trecho, pode variar
dependendo da idade do passageiro. *essoas com QN ou mais anos de idade
pagam apenas QNj do preo total. 3rianas at CN anos, pagam ANj e beb:s
9abai'o de 1 anos/ pagam apenas CNj. $screva uma definio que tenha
como entrada o valor nominal da passagem e a idade do passageiro e produz
o valor a ser pago.
CS. &ados dois n(meros inteiros, considere que eles possuem no m'imo A
algarismos. &etermine em que quantidade de algarismos na mesma posio
eles so iguais.
]qalg C1> C1?
1
]qalg C1>? ?>1C
N
C
AN
CJ. &ados dois pontos p e q, no plano cartesiano, tome a origem dos ei'os como o
ei'o dos ponteiros de um rel%gio anal%gico, p como a posio da e'tremidade
do ponteiro maior e q como a do ponteiro menor. &etermine a quantidade total
de minutos decorridos desde o incio do dia.
CB. &ados tr:s n(meros a, b, c. &etermine quais das seguintes rela#es eles
mant:m entre si) a/ os tr:s so diferentes5 b/ apenas dois so iguais5 c/ os tr:s
so iguais.
1N. 3onsidere que um dado n(mero inteiro est armazenando um valor ! escrito
na base octal. *ede+se) a/ verifique se realmente o n(mero dado est na base
J5 b/ determine qual o valor deste n(mero na base decimal.
1C. 3onsidere um tabuleiro de 'adrez de dimens#es infinitas, considere ainda que
a numerao das casas dada por um par de n(meros inteiros. Oabemos que
o cavalo possui oito movimentos conforme a figura >.
m< M< m2
m= m7
C
m4 m@
m> m?
$screva uma funo para determinar a nova posio obtida pela aplicao de
cada movimento " posio U. ! resultado dever ser produzido com um n(mero
de 1 casas.
7@82 )ru+o 2 1 )eomtricos I
&ado um ponto *9',L/ do plano cartesiano, defina fun#es que descrevam a sua
pertin:ncia nas situa#es abai'o especificadas)
C. Um ret0ngulo 9com lados paralelos aos ei'os cartesianos/ dado pelas
coordenadas do canto superior esquerdo e do canto inferior direito, como
mostrado na figura.
C
AC
1. Um losango , com os seus ei'os paralelos aos ei'os cartesianos, dado pelas
coordenadas do vrtice esquerdo e do vrtice superior, como mostrado na
figura.
>. Um crculo dado pelo seu centro 3 e seu raio r.
?. A regio 7C 9regio cinza/, do ret0ngulo dado pelas coordenadas do canto
superior esquerdo e do canto inferior direito, como mostrado na figura abai'o)
A. A regio 71 do losango 9regio cinza/, sendo dados os pontos $ e & do
ret0ngulo e sabendo+se que o crculo tangente aos lados do losango.
C
A1
7@8< )ru+o < 1 )eomtricos II
7esolva os problemas abai'o priorizando o uso de modularizao. *rocure
tambm utilizar quando for adequado, o conceito de definio local atravs da
clusula R0ere.
C. 3onsidere a figura e descreva uma funo para calcular cada uma das reas
da regi#es 7C, 71 e 7>. A funo tem como par0metros as coordenadas dos
pontos * 9'C, LC/ e R 9'1,L1/. !bserve que o ponto R o centro do crculo,
que a altura do tri0ngulo is%sceles igual ao raio do crculo e que um dos
lados do tri0ngulo paralelo ao ei'o dos '.
1. &ada uma reta descrita por dois pontos * 9'C, LC/ e R 9'1,L1/, escreva uma
funo que determine o valor da coordenada no ei'o dos L a partir de uma
coordenada fornecida no ei'o dos '.
coordL 'C '1 LC L1 ' M ...
>. 3onsidere a figura 1 e descreva uma funo para determinar cada uma das
reas das regi#es 7C, 71 e 7>. A funo tem como par0metros as
coordenadas dos pontos * e R. !bserve que um dos lados do tri0ngulo
is%sceles coincide com o ei'o dos ' e que um dos seus vrtices a origem.
!bserve ainda que os lados do ret0ngulo so paralelos aos ei'os.
v
'C '1
U

1
LC
L1
*
R
7C 7C
7>
71
C
A>
?. 3onsidere um pea de altura h cu.a base e o topo so he'gonos de lado l.
3onsidere ainda que esta pea possui um furo cilndrico de raio r com centro
no ei'o. &escreva uma funo para determinar o volume da pea.
A. 3onsidere uma pea cilndrica com raio r e altura h. 3onsidere ainda que esta
pea possui um furo em forma he'agonal de lado l, com centro no ei'o da
pea. &escreva uma funo para determinar o volume da pea.
LC
L1
'C '1 U
v
C
7>
7C
71
C
A?
Q. 3onsidera a figura abai'o, onde est representada a regio 7 correspondente
a interseo de dois crculos de mesmo raio r. $screva uma funo para
calcular a rea dessa regio, sabendo+se que dado o 0ngulo do setor do
crculo determinado pelos pontos de interseo das duas circunfer:ncias.
S. &escreva uma funo que calcule a rea 9representada pela cor cinza/ de uma
flor formada por quatro crculos de mesmo raio r, cu.os centros so os vrtices
de um quadrado, conforme ilustrado na figura a seguir. ! miolo da flor um
crculo DocoE de raio rC.
7@8= )ru+o I" - )eomtricos <
C/ *roblemas de pertin:ncia de um ponto * 9',L/ nas regi#es hachuradas,
utilizando e'press#es l%gicas.
a/ &escrio da regio hachurada) o centro C Ic7, c2K e o raio r do crculo
maior so dados. 3onsidera+se tambm que os raios dos crculos inscritos
so rZ< e 2rZ<.
#
r
C
AA
b/ &escrio da regio hachurada) se.a / I;7, J7K o vrtice superior esquerdo
de um quadrado de lado a paralelo aos ei'os cartesianos. 3onsidere que as
ptalas da flor so formadas por semi+crculos de raio aZ2 e centros no
ponto mdio de cada lado do quadrado e que o miolo formado por dois
crculos de raios aZ= e aZ@.
c/ &escrio da regio hachurada) o centro C Ic7, c2K e o raio r do crculo
maior so dados. 3onsidera+se tambm que os raios dos crculos inscritos
so rZ2 e rZ=.
/ a
a/2
a/.
a/O
C
AQ
1/ *roblemas de mapeamento de um ponto * 9',L/ em sua regio de pertin:ncia,
utilizando descri#es condicionais, de forma adequada.
a/ Oe.am / I;7, J7K e S I;2, J2K os vrtices esquerdo e superior,
respectivamente, de um losango cu.os ei'os so paralelos aos ei'os
cartesianos. 3onsidere as regi#es descritas abai'o)
b/ Oo dados os pontos $ 9'C, LC/ e & 9'1, L1/ e sabe+se que o raio dos semi+
crculos e'termos igual " 9LC + L1 / K1.
regio 7) regi#es hachuradas, e'ternas ao
losango, no
crculo superior
regio 2 ) regi#es hachuradas, interna ao
losango, no
crculo superior
regio < ) no losango e fora dos ciculos
regio =) regi#es hachuradas, e'ternas ao
losango, no
crculo inferior
regio 4 ) regi#es hachuradas, interna ao
losango, no
C
AS
7A8 APBICA9D/S
Neste captulo apresentamos uma srie temtica de e'erccios, buscando dar ao
leitor uma viso mais ampla das possibilidades de uso da programao funcional.
A inteno apresentar vrios conte'tos onde precisamos programar
computadores. $m todos, o conte'to descrito e vrios e'erccios so
apresentados. Aos professores e estudantes, sugerimos que o conte'to sirva de
prete'to para a formulao e resoluo de novos e'erccios. 3omeamos pelo
*omin_ ar, onde, buscamos na ludicidade do .ogo, apresentar as
necessidades de manipular informao. Na seq<:ncia apresentamos uma srie de
problemas considerando as necessidades de informao de um anco de
Sangue, o manuseio de mensagens de um Correio /letronico, a organizao de
uma Bista de Com+ras, um sistema de Passagens Areas, )er0ncia
Acad0mica, Ag0ncia de $urismo e e'erccios sobre /s+etculos $eatrais.
7A87 5 *5MI&^ A#EQ ! domin% de n(meros uma coleo de pedras, utilizado
na maioria das vezes como um e'celente passatempo. &as tantas formas de
utilizar o domin%, destacamos uma, utilizada no Amazonas, principalmente em
6anaus, mas tambm em muitas praias pelo mundo afora onde e'istirem
amazonenses, em particular nas praias de Fortaleza. !s Amazonenses costumam
cham+la de Ddomin% bar;, em homenagem a uma tribo que habitava a regio
onde foi fundada a cidade de 6anaus. A maioria dos e'erccios deste captulo
foram desenvolvidos em 6anaus, no final da dcada de JN. &e l pra c, vrios
outros foram acrescentados, mas a lista como um todo permanece indita.
A inteno desta seo apresentar alguns poucos e'erccios resolvidos e propor
outros. A idia no desenvolver o .ogo e sim, inspirar+se em situa#es do .ogo
para propor e'erccios interessantes e desafiadores. &ei'amos o desenvolvimento
do .ogo completo como sugesto para o trabalho em grupos. Ao final do captulo
discutiremos um pouco sobre a programao do .ogo.
PreliminaresQ ! material do .ogo um con.unto formado por 1J ;peas;, cada
uma delas com duas ;pontas;. 3ada ;ponta; representa um valor de N 9zero/ a
seis 9Q/, perfazendo portanto S valores diferentes. 3ada valor possui um nome
pr%prio) o wero chama+se ;branco;, o um chama+se ;s;, o dois o ;duque;, o tr:s
chama+se ;terno;, o quatro a ;quadra;, o cinco a ;quina; e o seis denomina+se
;sena;. ! nome de uma ;pedra; dado pelo nome de suas ;pontas;, por e'emplo,
;quina e terno;, o nome da ;pedra; que possui em uma ponta o valor A e na
outra o valor >. As pedras que possuem o mesmo valor nas duas pontas so
denominadas de ;carroa;. *ara cada tipo de valor e'istem S pedras, por e'emplo,
para o ;terno; teremos) terno e branco, terno e s, terno e duque, carroa de
terno, quadra e terno, quina e terno, sena e terno. ! .ogo , em geral, disputado
por duplas, ganhando a que fizer o maior numero de pontos, a partir de um
mnimo pr+estabelecido. A seguir apresentamos em detalhes os vrios
elementos do .ogo.
C
AJ
Peas do 'ogoQ !s elementos do .ogo so 91J/ vinte e oito peas, cada uma com
duas pontas, na qual marcado um valor que varia de N a Q. *ara .ogar, as
;pedras; so embaralhadas e escolhidas pelos .ogadores. A cada .ogador cabem
S pedras. 3om o desenrolar do .ogo a quantidade de pedras vai sendo decrescida,
at que, eventualmente chegue em zero.
Partici+antesQ duas duplas 9eventualmente pode ser .ogado individualmente, com
1, > ou ? .ogadores/.
5bUetivoQ atingir um total mnimo de 1NN pontos. Hence o .ogo a dupla que ao final
de uma rodada tiver o maior n(mero de pontos.
*incmicaQ o .ogo se desenvolve em uma quantidade qualquer de eventos
menores denominados de rodada. A figura CJ.C ilustra um instante de .ogo.
#odadaQ em uma rodada, um ap%s o outro, no sentido horrio, os .ogadores vo
fazendo suas .ogadas, combinando suas pedras de domin% com a DfiguraE que .
est formada na mesa de .ogo.
Figura CJ.C X um instante do .ogo de domin%, com quatro pontas abertas)
terno, "s, duque e quadra.
C
AB
PontuaoQ e'istem ? formas para obter pontos)
C. &urante o .ogo, a figura formada na mesa possui C 9quando e'iste apenas
uma pea assentada/, 1, > ou ? pontas. n soma dos valores dessas pontas
denomina+se de) Dos pontos da mesaE. Ruando essa soma produz um
m(ltiplo de A, o .ogador que sentou a (ltima pedra pode requerer que eles
se.am anotados em favor de sua dupla. He.a que s% o .ogador que sentou a
pedra pode reivindicar os pontos e isto tem que ocorrer antes que o
pr%'imo .ogador sente a sua pedra5
1. Ruando um .ogador no possui pedra para colocar na mesa 9ou se.a, uma
que combine com uma das pontas/, ele passa a vez, e a dupla adversria
ganha CN pontos. Oe um .ogador percebe que com a colocao de sua
pea ele conseguir fazer com que todos os demais passem, inclusive o
seu parceiro, ele pode anunciar que deu um passe geral e com isso ganhar
de b,nus AN pontos.
>. Ruando um .ogador descarta sua (ltima pea em uma rodada diz+se que
ele DbateuE, e, portanto ganhou a rodada. 3om isso ele ganha de b,nus CN
pontos e mais o m(ltiplo de A ligeiramente inferior " soma dos valores
constantes nas peas que sobraram nas mos dos adversrios 9garagem/.
Oe a batida for feita com uma carroa, o b,nus de 1N pontos.
?. Ruando ocorre uma situao onde nenhum dos .ogadores consegue .ogar,
embora este.am com peas na mo, diz+se que o .ogo est fechado. Neste
caso ganha a rodada a dupla cu.a soma dos valores das peas for o menor.
A soma das peas da dupla adversria computada em seu favor, como no
caso >.
Posio dos 'ogadoresQ !s membros de cada dupla so colocados em posi#es
alternadas, de forma que as .ogadas 9colocao de peas/ se.a feita de forma
alternada entre as duplas adversrias. *or e'emplo, em um .ogo presencial,
podemos usar, como suporte para colocao das peas, uma mesa de quatro
lugares, ficando os parceiros sentados frente+a+frente.
*istribuio das PeasQ a distribuio das 1J peas entre os ? .ogadores deve
ser feita de forma aleat%ria. Na prtica, em um .ogo com peas fsicas, viram+se as
peas de cara para bai'o e mistura as peas com as mos. 3ada .ogador vai
retirando as suas pr%prias peas.
Fuem comea uma rodadaQ Uma rodada sempre iniciada com a colocao de
uma DcarroaE. Na primeira rodada do .ogo, a carroa a ser utilizada de sena 9Q/,
cabendo pois ao .ogador que a tirou comear o .ogo. As rodadas seguintes so
iniciadas pelo .ogador que bateu a rodada anterior, com a carroa que ele preferir.
Oe ele no possui carroa, ele passa e o .ogador seguinte 9da dupla adversria/
inicia o .ogo, se este tambm no possuir, passa a frente.
.ma 'ogadaQ $stando na sua vez de .ogar, o .ogador deve escolher uma das
pedras de sua mo, e coloca+la na mesa de .ogo, combinando com alguma das
pontas abertas. A escolha da pea a ser .ogada deve contribuir para o ob.etivo da
dupla que ganhar o .ogo, isso significa, em linhas gerais, escolher uma pedra
C
QN
que me permita fazer o maior n(mero de pontos e, quando isso no for possvel,
escolher uma pedra que reduza o n(mero de pontos que os adversrios possam
fazer com base em minha .ogada. T, entretanto algumas nuances a serem
consideradas)
Ruando eu .ogo fazendo pontos devo buscar ma'imizar meus pontos e
minimizar os que o .ogador adversrio possa fazer a partir da minha .ogada5
Oe o .ogo estiver pr%'imo do trmino, e a dupla adversria ameaa
completar os 1NN pontos, pode ser dese.vel adiar o trmino, no fazendo
os pontos. *or e'emplo, suponha que a dupla adversria tem CJA pontos e
a minha C>N. Oe eu tiver uma pea na mo que faz 1A pontos, mas se
possvel ao adversrio possuir uma pea que lhe permita fazer CA pontos,
eu posso escolher outra pea, dei'ando assim de obter os 1A pontos5
Ruem abre uma rodada, bater a rodada a menos que passe. 4endo em
vista que ao ganhar uma rodada, h b,nus para a dupla, posso dei'ar de
marcar ponto visando vencer a rodada5
2dem para tentar evitar que a dupla adversria ganhe a rodada 9quando
foro a passada de um adversrio que comeou a rodada, a batida passa
para o meu parceiro/.
Um passe geral d um b,nus de AN pontos, isso pode me levar a busc+los,
desde que as condi#es do .ogo, definidas pelas peas de minha mo,
combinadas com o que . foi .ogado, se mostrem propcias.
/;ercPciosQ A seguir apresentamos alguns e'erccios, baseados no domin%. *ara
fins didticos separamos em grupos.
)ru+o I
C. $screva a funo pedrap que associe um par a $rue se e somente se 9sss/
o par uma representao vlida para uma ;pedra; e False caso contrrio.
/;em+los de usoQ
C. pedrap 91, S/ MMZ False
1. pedrap 99+>/, ?/ MMZ False
>. pedrap 9>,?/ MMZ $rue
SoluoQ
pedrap 9',L/ M validap ' `` validap L
validap ' M elem ' iN..Qa
1. $screva a funo mao+ que associe uma lista de pares de inteiros a $rue
sss a lista uma representao vlida para a ;mo; de um .ogador e False
caso contrrio.
C
QC
/;em+los de usoQ
C. maop i a $rue
1. maop i99+>/, ?/a False
>. maop i9>,?/a $rue
?. maop i 9C,1/, 9C,A/, 91,N/, 91,?/, 9>,>/, 9C,C/, 9N,N/, 9?,N/a False
SoluoQ
maop i a M $rue
maop 9')'s/ M 9length 's fM Q/ `` pedrap ' `` maop 's
>. $screva a funo carroca+ que associe um par a $rue sss o par uma
;carroa; e False caso contrrio.
?. $screva a funo temYcarrocaY+ que associe uma ;mo; a $rue sss a
mo possuir pelo menos uma carroa e False caso contrrio.
A. $screva a funo temYcarrocas que associe a uma ;mo; a lista das
;carroas; nela contida.
)ru+o II
$m vrios momentos do .ogo faz+se necessrio saber a quantidade de pontos
associado " uma coleo de pedras. $m particular, no final do .ogo, quem
;sentou; a sua (ltima pedra faz .us " ;garagem; que determinada a partir dos
pontos que restaram na9s/ mo9s/ dos adversrios.
Q. $screva a funo pontos que associe uma lista de ;pedras; a soma dos
pontos das pedras nela contidos. !nde os pontos de uma pedra a soma
de suas pontas.
SoluoQ
pontos i a M N
pontos 9')'s/ M ponto ' I pontos 's
k!ere
ponto 9',L/ M ' I L
S. $screva a funo -ara-em que associe uma lista de ;pedras; ao maior
m(ltiplo de A 9cinco/, menor ou igual " soma dos pontos nela contidos.
J. $screva a funo pedraWi-ualWp que associe dois pares de inteiros a $rue
sss representam a mesma pedra e False caso contrrio. - bom lembrar
que a ordem das pontas irrelevante, assim 91,?/ e 9?,1/ representam a
mesma pedra.
C
Q1
B. $screva a funo ocorreWpedraWp que associe uma ;pedra; e uma ;mo; a
$rue sss a ;pedra; ocorre na ;mo; e False caso contrrio.
CN. $screva a funo ocorreW!alorWp que associe um valor vlido para ;ponta;
e uma ;mo; e produza $rue sss o valor ocorre em alguma pedra da mo e
False caso contrrio.
CC. $screva a funo ocorreWpedra que associe a um valor e uma ;mo;, uma
lista contendo as pedras da ;mo; que possuem o valor dado.
C1. $screva a funo pedraWmaior que associe uma ;mo; a pedra de maior
valor na ;mo; dada. Uma pedra pC maior que uma outra p1 sss a soma
das pontas de pC for maior que a soma das pontas de p1.
C>. $screva a funo ocorreW!alorWq que associe um valor e uma ;mo; e
produza o n(mero de pedras na mo que possuem o valor dado.
C?. $screva a funo ocorreWcarrocaWq queassocie uma mo " quantidade de
carroas nela e'istentes.
CA. $screva a funo tiraWmaior que associe uma mo a uma lista similar "
;mo; de onde foi e'trada a pedra de maior ponto.
CQ. $screva a funo tiraWmaiorW! que associe um valor e uma ;mo; " lista
similar " ;mo; de onde se e'traiu a pedra de maior pontos de um
determinado valor para ponta.
)ru+o III
! .ogo se desenvolve pela colocao, pelo cogador da vez, de uma pedra que
combine com alguma das ;pontas; da ;mesa;. Num momento genrico do .ogo
temos quatro pontas disponveis para e'ecuo de uma .ogada. Uma ponta pode
ser simples ou uma carroa. As carroas so dispostas de tal forma que todos os
seus pontos este.am para ;fora;.
3hamaremos ;mesa; " lista de pontas disponveis para .ogada. *ontas simples
sero representadas por listas de um elemento e carroas por uma lista com dois
elementos id:nticos. *or e'emplo, a ;mesa; ilustrada na Figura CJ.1
representada pela qudrupla 9 iA,Aa, iAa, iNa,i?a /.
Uma ponta ainda no aberta representada por lista vazia. &izemos que h
marcao de pontos em uma mesa quando a soma das pontas um m(ltiplo de A.
!s pontos a serem marcados a soma das pontas, com as carroas contando em
C
Q>
dobro.
CS. $screva a funo mesap que associe uma qudrupla de listas a $rue sss a
qudrupla for uma descrio vlida de ;mesa;.
SoluoQ
mesap 9pC,p1,p>,p?/ M vponta pC `` vponta p1 ``
vponta p> `` vponta p?
k!ere
vponta 9')L)'s/ M if not 9null 's/
t!en False
else validap ' gg vponta 9L)'s/
vponta 9' )i a / M validap '
validap ' M elem ' iN..Qa
CJ. $screva a funo carrocaWmWp que associe uma mesa a $rue sss pelo
menos uma das pontas for carroa.
CB. $screva a funo pontosWmarcados que associe uma mesa ao o n(mero
de pontos a serem marcados se a soma das pontas for m(ltiplo de cinco e
zero em caso contrrio.
Figura CJ.1 X desenvolvimento do .ogo, no instante em que temos nas
pontas e'ternas, uma carroa de quina, uma quina, branco e quadra.
C
Q?
1N. $screva a funo podeWjo-asWp que associe uma ;pedra; e uma ;mesa; a
$rue sss a pedra possui uma ponta que combina com pelo menos uma das
pontas da mesa.
1C. $screva a funo marcaWpontoWp que tenha como entrada uma ;pedra; e
uma ;mesa; e produza $rue sss a pedra pode ser .ogada fazendo pontos
em uma das pontas da mesa. \embre+se que as carroas devem ser
contadas pelas duas pontas da pedra.
11. $screva a funo maiorWponto que tenha associa uma pedra e uma mesa
ao n(mero da ;ponta; da mesa onde pode ser marcado o maior valor de
ponto que ser marcado pela pedra. 3onsidere que a em uma ;mesa; as
pontas so numeradas a partir de zero, da esquerda para a direita.
1>. $screva a funo jo-aWpedra que associe uma ;pedra;, uma ;mesa; e um
n(mero de ;ponta; da mesa a uma nova mesa obtida ao se .ogar a ;pedra;
na ;ponta; indicada.
1?. $screva a funo jo-ap que associe uma ;mo; e uma ;mesa; e produza
$rue sss e'iste pelo menos uma pedra na mo que possa ser .ogada em
pelo menos uma ponta da mesa. 3aso contrrio produza False.
1A. $screva a funo .ogada que associe uma ;mo; e uma mesa ao n(mero
da pedra na mo e n(mero da ponta na mesa onde pode ser feita a .ogada
que marque mais ponto. 3onsidere inclusive .ogada onde no h marcao
de ponto.
1Q. $screva a funo faz_.ogada que associe uma ;mo; e uma ;mesa; e
produza uma nova ;mesa; obtida por se .ogar marcando o maior n(mero de
pontos possvel
7A82 anco de SangueQ para facilitar o atendimento da demanda por transfus#es
de sangue o sistema de sa(de criou os chamados Pancos de Oangue. 3omo
sabemos, cada transfuso s% pode ser realizada usando tipos de sangue
apropriados. A adequao de um determinado tipo de sangue baseada em
estudos cientficos que identificou quatro tipos sang<neos, denominados de 2, X,
2X e P. !utros estudos identificaram ainda a e'ist:ncia do chamado fator 7T que
pode ser positivo 9I/ ou negativo 9+/, assim o sangue de qualquer indivduo
classificado de acordo com esses dois atributos. *or e'emplo, dizemos que fulano
possui sangue tipo ! e fator 7T positivo, e abreviamos para 5X. $m um dado
Panco de Oangue, diariamente, so feitas doa#es por pessoas de diferentes tipos
sang<neos, para as quais feito um registro contendo o n(mero da carteira de
identidade do doador 97G/, o se'o 9O/, a data da doao 9&&/, a data de
nascimento 9&N/, o tipo sang<neo 94O/, o fator 7T 97T/ e a quantidade doada
9R&/ 91AN ou ANN ml/. ! sangue doado guardado em recipientes com uma
capacidade fi'a 91AN ml/. 4ambm, diariamente so feitas requisi#es pelos
hospitais 9T/, cada requisio indica as caractersticas do sangue 9tipo e fator 7T/
e a quantidade solicitada 9RO/. Oabemos que homens e mulheres possuem
intervalos de tempo diferentes para fazer doa#es. *ara homens o intervalo
mnimo de 1 9dois/ meses e para mulheres de > 9tr:s/. A idade m'ima para
doadores QN anos.
C
QA
Oe.am as seguintes estruturas
&oao 97G, O, &&, &N, 4O, 7T, R&/
7equisio 9T, 4O, 7T, RO/
/;ercPciosQ $screva programas em TUGO para resolver os seguintes problemas)
C. &ada uma lista de doa#es, obtenha a quantidade total de sangue doado por
tipo sang<neo e fator 7T. ! resultado ser uma tupla 9um item para cada
combinao de tipo sang<neo com fator 7T/ com triplas e'plicitando o tipo
sang<neo, o fator 7T e a quantidade total. Ruando no houver doao de
uma dado par tipo+fator deve ser indicado o valor zero. *or e'emplo)
I IpAq, pXq, 3K, 888 Ip5q,qXq, 4433K 888K
1. *ara uma dada lista de doa#es, determine a lista dos dias de um dado m:s
onde as doa#es foram menores que a mdia mensal.
>. &ada uma lista de doa#es e a data atual, determine a lista de doadores que .
esto aptos a fazerem novas doa#es.
?. &ada a lista de doadores e o m:s, determinar o n(mero de doadores que esto
aptos a doar sangue naquele m:s. 9$ssa e a questo > parecem anlogas,
no]/
A. &etermine a relao de doadores que fazem doa#es com o maior ndice de
regularidade. ! ndice de regularidade dado pela n(mero de vezes que o
intervalo entre as doa#es coincidem, dividido pelo n(mero de doa#es menos
um.
Q. &ada a lista de doadores, verificar o tipo sang<neo que mais comumente
doado.
S. &ada a lista de doadores e o ano, determine o m:s em que houve mais
doa#es naquele ano.
J. &ada a lista de requisi#es de um determinado hospital, determinar a lista de
tipos sang<neos com os respectivos fatores 7T, que possuem seus pedidos
atendidos pelo banco de sangue.
B. &eterminar, para um dado hospital em um determinado ano, a demanda
mensal de sangue, por tipo sang<neo e fator 7T.
CN. &eterminar a lista de doadores que no esto mais aptos a fazer doa#es,
considerando a data atual.
CC. 3onsidere o estoque atual do banco de sangue, determinado pela funo
estoque 9prob C/, e uma lista com vrias requisi#es. \eve em conta que o
C
QQ
estoque pode ser insuficiente para atender completamente todos os pedidos.
&etermine o estoque atualizado ap%s o atendimento dos pedidos e produza
uma lista das requisi#es atendidas, constando a quantidade que foi de fato
fornecida.
C1. No problema CC, considere que voc: dese.a atender cada hospital solicitante,
de forma proporcional ao seu pedido, considerando os pedidos de cada tipo
sang<neo separadamente. *or e'emplo, suponha que) o total de pedidos de
sangue !I de C1.NNN ml, que o hospital DhCE solicitou >.NNN ml de sangue
!I e que no estoque J.NNN ml. *odemos observar que o pedido para o sangue
!I do hospital DhCE representa 1A j do total. Neste caso o hospital DhCE ser
atendido com 1A j de J.NNN ml que representa 1.NNN ml. *roduza uma lista
como os pedidos atendidos e outra com os pedidos pendentes.
C>. 3onsidere a poltica de atendimento do problema C1 mas leve em conta que
um dado pedido deve ser atendido completamente. 3onsidere o e'emplo do
problema anterior, e suponha que os pedidos do hospital rhCe para o sangue
!I so ?, 9DhCE, !, I, C.ANN/, 9DhCE, !, I, C.NNN/ e 9DhCE, !, I, 1AN/ e 9DhCE, !,
I, ANN/. Neste caso, considerando que os pedidos esto em ordem de
prioridade, seriam atendidos os pedidos 9DhCE, !, I, C.ANN/ e 9DhCE, !, I, 1AN/.
C?. 6odifique a poltica de atendimento do problema C? para que o atendimento
se.a tal que o hospital DhCE use da melhor forma possvel a proporcionalidade
que lhe cabe. No caso do e'emplo apresentado no problema C?, o pedido de
1AN ml seria descartado visto que atendendo o pedido de ANN ml o hospital rhCE
estar usando melhor a parte que lhe cabe. 9escolher a combinao mais
apropriada/
7A8< Correio /letronicoQ 3onsidere um sistema de mensagens eletr,nicas. Uma
mensagem pode ser descrita por uma tupla contendo o remetente, o destinatrio,
a data de envio, o assunto e o corpo da mensagem. 6ensagens podem ser
acumuladas em listas para posterior acesso. *ara facilitar o acesso podemos
construir ndices baseados nos dados contidos na mensagem. *or e'emplo,
podemos ter um ndice baseado no remetente para facilitar o acesso a todas as
mensagens de um dado remetente. 3onsidere as seguintes estruturas)
mensagem 9remetente, destinatrio, data, assunto, corpo/
ndice i 9argumentoC,iordem na lista de mensagensa/, 9argumento1, ia/, ...a
/;ercPciosQ $labore programas em TUGO, usando recurso, para atender aos
seguintes problemas. A interface 9nome e par0metros/ das fun#es dado em
cada uma das quest#es.
C. 9inde'a msgs/ &ada uma lista de mensagens, produza o ndice das
mensagens por remetente. Um ndice ter a seguinte estrutura) i 9remetenteC,
lista de ocorr:ncias/, 9remetente1, lista de ocorr:ncias/, ...a onde lista de
C
QS
ocorr:ncias formada pela posio na lista de mensagens onde o remetente
ocorre.
*or e'emplo)
i 9D.osesinf.ufes.brE, iC, 1>a/, 9Dmariasinf.ufes.brE, iCN, 1N, ANa/, ...a
1. 9consulta r p/ 3onsidere definidos um ndice por remetente, um ndice por
palavras constantes no assunto das mensagens e uma lista de mensagens.
&ados um remetente 9r/ e uma palavra9p/, obtenha a lista de mensagens
enviadas por r onde a palavra p ocorre no assunto.
remetentes M i9DremetenteCE, i...a/,9Dremetente1E, i...a/, ... a
palav_assunto M i 9DpalavraCE. i...a/,9Dpalavra1E. i...a/, ... a
mensagens M i mensagem11 mensagem21 mensagemI1 a
>. 9msg*mes a r msgs/ &ado um ano 9a/, um remetente 9r/ e uma lista de
mensagens 9msgs/, verificar a quantidade mensagens enviadas por r em cada
m:s.
?. 9busca p ind msgs/ 3onsidere um ndice construdo na forma de lista 9indb/. !
primeiro elemento um par com uma palavra 9p/ e a lista de mensagens
9msgs/ onde p ocorre, o segundo elemento uma lista no mesmo formato de
indb, para as palavras menores que p e o terceiro para as palavras maiores
que p
ndice M i 9palavraC, i...a/, ndice para palavras menores que p, ndice para
palavras maiores que pa
Ruando no houver palavras menores ou maiores que uma dada palavra, o
ndice igual a uma lista vazia.
&ada uma palavra p, o ndice 9indb/ e a lista de mensagens 9msgs/, descreva
a lista mensagens onde p ocorre, usando o ndice dado.
48 9palav*assunto msgs/ 3onsidere definida uma lista de palavras irrelevantes
9lis/. &ada uma lista de mensagens 9msgs/ produza um ndice com as palavras
distintas que ocorrem nos assuntos das mensagens e no ocorrem em lis.
*ara cada palavra deve ser produzido tambm a lista das posi#es na lista de
mensagens 9msgs/ onde ela ocorre.
lis M i DpalavraCE, Dpalavra1E. ... a
Q. 9releva msgs li lf/ &ada uma lista de mensagens podemos obter uma lista de
palavras relevantes. &efine+se como palavra relevante em uma lista
mensagens 9msgs/ aquelas cu.a freq<:ncia satisfazem um intervalo para o
qual so dados um limite superior 9ls/ e um limite inferior 9li/.
C
QJ
?8 9constante msgs a/ &ada uma lista de mensagens 9msgs/, determinar a lista
de remetentes que enviaram pelo menos uma mensagem para cada m:s de
um dado ano a.
@8 9freq&ata msgs m/ *ara uma dada lista de mensagens dese.amos obter a
quantidade de mensagens para cada dia de um dado m:s m.
B. 9identico indbC indb1/ &ados dois ndices no formato de rvore binria de
pesquisa dese.amos verificar se so id:nticos. &izemos que dois ndices so
id:nticos quando a palavras e as listas de ocorr:ncia coincidem e os
subndices das palavras menores e o das palavras maiores respectivamente
so id:nticos.
ndice M 9 9palavraC, i...a/,
ndice para palavras menores que p, ndice para palavras maiores que p/
CN. 9palav!rd indb/ &ado um ndice no formato de rvore binria de pesquisa
produza uma lista das palavras nele contidas de tal forma que as palavras se
apresentem em ordem alfabtica crescente.
CC. 9resgate indb/ &ado um ndice no formato de rvore binria de pesquisa
produza uma lista das palavras que ocorrem em cada mensagem. A lista
resultante ter o seguinte formato)
i ipalavras da mensagem de ordem Na, ipalavras da mensagem de ordem C a, ... a
C1. 9balance arbinpq/ Uma rvore binria de pesquisa est balanceada se e
somente se a quantidade 9qC/ de elementos no subindice das palavras
menores difere da quantidade 9q1/ de elementos no subindice das palavras
maiores de no m'imo um 9C/ e qC maior ou igual a q1.
q2 + 1 %= q1 %= q2
7<8 9ins!rd indb msg/ &ados um ndice 9indb/ no formato de rvore binria de
pesquisa e uma mensagem 9msg/, descreva a nova rvore obtida pela
insero das palavras das mensagem 9msg/, e'ceto as irrelevantes.
7=8 9perfil msg diret fga/ Um diret%rio uma lista de assuntos, cada um dos
quais associado a uma coleo de palavras. &ada uma mensagem e um
diret%rio podemos atribuir " mensagem um perfil que uma lista de valores
indicando o grau de apro'imao 9ga/ dela com cada assunto. ! ga de uma
mensagem com respeito a um assunto pode ser obtido com base na
freq<:ncia com que as palavras a ele associadas ocorrem na mensagem.
C
QB
3onsidere que a funo que calcula o ga fornecida e opera sobre uma lista
de inteiros.
3onsidere os seguintes formatos)
&iret%rio S (Tassunto1U1 Spala7ra11 pala7ra21 V)1 (Tassunto2U1 Spala7ra11 pala7ra21 V)1 V
*erfil S (Tassunto1U1 ga1)1 (Tassunto2U1ga2)1 V

7A8= Bista de Com+rasQ *ara realizar um determinado pro.eto necessitamos
adquirir certos componentes eletr,nicos. No mercado de componentes e'istem
vrios fornecedores que vendem seus produtos com preos diferenciados. A
escolha da melhor alternativa para satisfao de nossas compras depende de
vrios fatores, dos quais o melhor preo um dos mais importantes.
3onsidere as seguintes defini#es)
4abela de
*reo
Uma lista contendo todos os preos dos componentes comercializados por um
determinado revendedor. 3ada elemento da lista um par no formato
9material, preo/.
$'emplo)
i9DpotenciometroE, 1.AN/, 9Dresistor+CNNVE, N.>N/, 9Dcapacitor+CNmFE,N.AN/, 9Dindutor+
CN7E,>.NN/a
*edido de
3ompra
Uma lista contendo todos os materiais necessrios para um determinado pro.eto,
com suas respectivas quantidades. 3ada elemento da lista um par no formato
9material, quantidade/.
$'emplo) i9DtransformadorE, AN/, 9Dfonte &3E, CN/, 9Dresistor+1NNVE,CNN/a
\ista de
7evendedores
Uma lista contendo a tabela de preos de todos os revendedores, no formato)
i 9revendedorC, itabela de preoa /, ...a

Exerccios: Elabore programas em HUGS, usando recurso, para
atender aos seguintes problemas. O nome das funes dado em cada
uma das questes.
C. 9custo/ &ado o resultado da pesquisa de preos de um pedido de compra,
para um certo fornecedor, no formato i 9materialC, qtde, preo/, 9material1,
qtde, preo/, ... a, queremos obter o custo total da compra se optarmos por
esse fornecedor.
1. 9fornece/ &ado um pedido de compra e a tabela de preos de um determinado
revendedor, obtenha a lista dos materiais que ele pode fornecer.
>. 9subpro.eto/ 3onsidere os pedidos de compra para dois pro.etos 9pC e p1/.
$ventualmente alguns itens do pedido do pro.eto pC podem ocorrer no pedido
de p1, possivelmente com quantidades distintas. &izemos que um pro.eto pC
subpro.eto de p1 se cada componente de pC tambm componente de p1 em
quantidade id:ntica ou inferior.
?. 9lfornecedor/ &ado um pedido de compra e a lista de revendedores, descrever
a lista de fornecedores para cada componente, com seus respectivos preos,
no formato
i9materialC,irevC, rev1,...a /, 9material1, i...a/, ...a
C
SN
7A84 Passagens areasQ 3onsidere que vrias companhias areas brasileiras
oferecem v,os dirios para vrias regi#es do mundo. &evido a competitividade do
mercado, vrias so as ofertas promocionais de v,os nacionais e internacionais.
3ada v,o identificado pela companhia area, o n(mero do v,o, a rota, a tarifa
em reais e a data de partida. A rota descrita por uma lista onde o primeiro
elemento corresponde " origem, o (ltimo elemento corresponde ao destino e os
outros elementos correspondem "s escalas do v,o. *ara escolher e reservar um
determinado v,o, um passageiro deve fornecer as seguintes informa#es) a
origem, o destino e a data de partida dese.ados. Um v,o atende a um pedido de
reserva se, para a data de partida dese.ada, a origem requisitada coincide com a
origem definida na rota do v,o e o destino requisitado coincide com alguma escala
ou com o destino da rota do v,o. A tarifa a mesma, da origem para qualquer
escala ou destino da rota. 3onsidere as seguintes defini#es)
v,o 3onsiste em uma tupla definida com os seguintes componentes)
9fcompanhia areaZ, fn
o
Z, frotaZ, ftarifaZ, fpartidaZ/
$'emplo)
9DHA72GE,?JN,iDrioE,EsalvadorE,Emacei%Ea,?>N,9NB,NS,1NNC//
*edido de
reserva
Uma tupla definida com os seguintes componentes)
9forigemZ, fdestinoZ, fpartidaZ/
$'emplo) 9DrioE, DsalvadorE, 9NB,NS,1NNC//
!bs)
3ompanhia area, origem e destino so do tipo string, rota uma lista
de strings, nx e tarifa so n(meros e partida uma tripla de n(meros.

/;ercPciosQ $labore programas em TUGO para resolver os problemas propostos.
! nome das fun#es assim como seus par0metros so dados para cada uma das
quest#es. $scolha duas quest#es para resolver utilizando descrio por listas e
duas utilizando recurso.
C. Ivoos lv +rK &ada uma lista de v,os e um pedido de reserva, descreva a lista
de companhias areas que atendem ao pedido de reserva.
1. Imtari,a lv +rK 3onsiderando a funo descrita na questo anterior, das
companhias areas que atendem a um determinado pedido de reserva, obter
aquela que oferece a menor tarifa.
>. I+artidas dt ds lvK &ados uma data e um destino, obter o n(mero de partidas
para aquele destino, naquela data.
?. Ivsescalas lv dtK &ada a lista de v,os, descrever a lista de v,os sem escalas,
atravs do n(mero do v,o. A resposta deve ser no formato)
Q nY do !Zo,S
C
SC
7A8> )er0ncia Acad0micaQ 3onsidere a ger:ncia acad:mica dos cursos de
graduao de uma universidade. As disciplinas cursadas por um aluno so
registradas em seu hist%rico. ! registro deve conter o c%digo da disciplina, o ano e
o semestre em que foi cursada e a nota obtida. Oemestralmente o aluno deve
requerer matrcula em novas disciplinas. ! pedido de matrcula realizado atravs
da apresentao das disciplinas dese.adas pelo aluno. Um dos critrios para
conseguir se matricular em uma disciplina que o aluno tenha cumprido, com
aprovao, os pr+requisitos da disciplina. Um aluno aprovado em uma disciplina
se obtiver mdia superior ou igual a A 9cinco/. 3ada curso possui uma grade
curricular que relaciona cada disciplina do curso com seus respectivos pr+
requisitos.
3onsidere as seguintes defini#es)
Histrico Escolar Um par contendo o cdigo de matrcula do aluno e a lista de
disciplinas cursadas. !ada disciplina cursada representada por
uma tripla com o cdigo da disciplina, o ano e o semestre que ela
foi cursada e a nota obtida.
"ormato# $matrcula, % $disciplina, $ano, semestre&, nota&, ... '& onde
matrcula ( $ano, curso, n)mero*dentifica+o*ndi,idual&
!adastro de
-isciplinas
Uma lista contendo, para cada disciplina, um par com o cdigo da
disciplina e a quantidade de crditos.
Grade !urricular Um par com o cdigo do curso e uma lista de pares onde cada par
representa uma disciplina $cdigo& e uma lista dos seus pr.
requisitos.
"ormato# $curso, %$disciplina, %disciplina, disciplina,...'&, ...'&
/edido de matrculaUm par com o cdigo do aluno e uma lista contendo o cdigo das
disciplinas nas quais o aluno dese0a se matricular.
"ormato# $matrcula, %pedido1, pedido2, ...'&
Oferta Uma lista contendo as turmas a serem ofertadas, com seus 3or4rios
e limite de ,agas.
"ormato# %$disciplina, turma, quantidade5de5,agas, 3or4rio&,...'
onde
3or4rio ( %$dia5da semana, 3ora5inicial, 3ora5final&, ...'
6ista de disciplinas
de um curso,
apresentadas por
perodo
Um par contendo o cdigo do curso e uma lista de pares, onde cada
par representa um perodo do curso e uma lista das disciplinas do
perodo.
"ormato# $curso, %$perodo, %disciplina, disciplina,...'&
Tist%rico
$scolar
Um par contendo o c%digo de matrcula do aluno e a lista de
disciplinas cursadas. 3ada disciplina cursada representada
por uma tripla com o c%digo da disciplina, o ano e o semestre
que ela foi cursada e a nota obtida.
Formato) 9matrcula, i 9disciplina, 9ano, semestre/, nota/, ... a/
onde
matrcula M 9ano, curso, registro/
3adastro de
&isciplinas
Uma lista contendo, para cada disciplina, um par com o c%digo
da disciplina e a quantidade de crditos.
Grade
3urricular
Um par com o c%digo do curso e uma lista de pares onde cada
par representa uma disciplina 9c%digo/ e uma lista dos seus pr+
C
S1
requisitos.
Formato) 9curso, i9disciplina, idisciplina, disciplina,...a/, ...a/
\ista de
disciplinas de
um curso,
apresentadas
por perodo
Um par contendo o c%digo do curso e uma lista de pares, onde
cada par representa um perodo do curso e uma lista das
disciplinas do perodo.
Formato) 9curso, i9perodo, idisciplina, disciplina,...a/
/;ercPciosQ $screva fun#es em Tugs para resolver os problemas propostos
abai'o, usando os nomes indicados em negrito. 7 pala,ra semestre, nestes
problemas, representa um elemento do tipo $ano,s&, onde s ( 1 ou s ( 2.
'. IcredseK &ado um hist%rico, o cadastro de disciplinas e um semestre,
descrever o total de crditos cumpridos no semestre.
2. IncredK &ado um hist%rico e o cadastro de disciplinas, descrever a quantidade
de crditos cumpridos por semestre.
3. IdncursadasK &ado um hist%rico e uma lista com as disciplinas por perodo,
descrever a lista das disciplinas no cursadas ainda pelo aluno, dos perodos
. cumpridos. $sta lista deve ter o seguinte formato) i9perodo,idisciplina,..a/,
9perodo,idisciplina,...a/,...a
4. Ima;credK &ada uma lista de hist%ricos, identificar a lista de alunos que
possuem o maior n(mero de crditos cumpridos.
5. Icontere+K &ado um hist%rico, contar o n(mero de reprova#es.
0. IUubilaK Herificar se um determinado aluno se encontra em situao de
.ubilamento 9possui tr:s reprova#es em uma mesma disciplina/.
<. IabandonoK Herificar se o aluno dei'ou de cursar disciplinas em algum
semestre.
(. IdividaK !bter a lista das disciplinas que foram cursadas por um dado aluno,
nas quais ele ainda no obteve aprovao.
L. Ire+rovaK !bter uma lista de reprova#es por perodo, para um dado aluno.
'%. IcrendK ! coeficiente de rendimento 937/ de um dado aluno
determinado pela mdia ponderada das notas obtidas, tendo como peso, o
n(mero de crditos das disciplinas. &etermine o 37 de um dado aluno.
''. Isem+rereNK !bter uma lista das disciplinas de um dado curso, que no
possuem pr+requisito.
'2. Icum+rereNK &ada uma disciplina, verificar se o aluno cumpriu seus
pr+requisitos.
'3. IdividasK !bter para um dado aluno, a lista de disciplinas que ele ainda
no cursou, com respeito a uma dada grade curricular.
'4. IsugestaoK !bter para um dado aluno, a lista de disciplinas que ele est
apto a cursar, com respeito a uma dada grade curricular.
C
S>
'5. Ilcum+rereNK !bter uma lista de pedidos de disciplinas para as quais os
pr+requisitos foram cumpridos.
'0. IldiscsolK &ada uma lista com os pedidos de todos os alunos, obtenha
uma lista das disciplinas solicitadas, sem repetio.
'<. IsolYdisci+linasYordK !bter a lista de alunos que solicitaram uma dada
disciplina, com seus respectivos coeficientes de rendimentos. A lista de alunos
deve estar em ordem crescente por coeficiente de rendimento. A lista
resultante deve ter o seguinte formato)
i9alunoC, coeficiente_de_rendimentoC/,9aluno1, coeficiente_de_rendimento1/, ...a
7A8? Ag0ncia de $urismoQ Uma ag:ncia de turismo possui o mapa atualizado de
reservas dos hotis de uma determinada regio. *ara cada hotel, todas as
informa#es pertinentes aos tipos de quarto oferecidos so registrados no mapa.
$ste mapa representado por uma lista de tuplas, seguindo o seguinte formato)
i9nomeY!otel, i9ti+oYNuarto, valorYdiria, situao/, ...a /, ...a onde
nomeY!otel do tipo string5
ti+oYNuarto uma string5
valorYdiria um n(mero real positivo5
situao) n(mero inteiro positivo que indica a quantidade de quartos
livres do tipo indicado.
*ara o melhor entendimento da representao da lista de hotis no hugs,
considere o seguinte e'emplo)
lhoteis M i9;peterle;, i9;simples;, AN.N, A/,9;duplo;, SA.J, CN/, 9;lu'o;, CCN.N, 1/a /,
9;ibis;, i9;simples;, ?A.N, >/,9;duplo;, QA.A, CA/, 9;lu'o;, BA.N, >/a /,
9;novotel;, i9;simples;, QA.Q, CN/,9;duplo;, BN.A, 1N/, 9;lu'o;, CAN.N, CN/a /a
/;ercPciosQ 3onsiderando o formato desta lista de hotis apresentada acima,
resolva o seguinte problema, descrevendo fun#es em TUGO.
C. &ados um tipo de quarto e a lista de hotis, apresente a lista com o nome do
hotel ou com os nomes dos hotis que possuem a oferta mais barata para
aquele tipo de quarto.
1. Avalie a funo definida no problema C para os par0metros adequados,
considerando a lista de hotis como a dada acima.
7A8@ /s+etculos $eatraisQ Hrios espetculos esto sendo apresentados em um
grande teatro da cidade. *ara cada um dos espetculos, registra+se o mapa de
C
S?
ocupao da platia, conforme as vendas dos ingressos. A platia est
representada por m filas numeradas de 1 a m, sendo que cada fila contm n
cadeiras tambm numeradas de 1 a n 3onsidere a seguinte representao para
os dados)
Lugar na platia (fila, cadeira), onde fila representada por um inteiro de 1 a m e
cadeira, por um inteiro de 1 a n.
Platia Lista de duplas (lugar, situao) sendo que a situao : 1 para
indicar lugar ocupado e 0 para indicar lugar vago.
Teatro Lista de duplas (espetculo, platia) onde espetculo representado
por um inteiro de 1 a p.
/;ercPciosQ $screva um script em TUGO, com fun#es que resolvam os
problemas abai'o. Nomes para cada uma das fun#es so sugeridos ao final do
enunciado de cada problema.
A. &ada uma platia pls, descreva a quantidade total de lugares ocupados
9total!cup/.
Q. &ado um lugar lg e uma platia pls, verifique se o lugar lg est livre 9esta\ivre/.
S. &ado um lugar lg e uma platia pls, verifique se e'iste algum vizinho lateral de
lg que est livre 9vizinho\ivre/.
J. &ada uma fila fl e uma platia pls, descreva a lista de cadeiras livres da fila fl
9cadeiras\ivresFila/.
B. &ada uma platia pls, descreva a lista de cadeiras livres para cada fila
9lug\ivresFila/
CN. &ada uma platia pls, descreva a9s/ lista9s/ com o maior n(mero de cadeiras
livres 9fila6a'\ivre/.
CC. &ado um teatro trs e um espetculo ep, descreva a sua platia 9plateia$sp/.
C1. &ado um teatro trs, um espetculo ep e uma fila fl, descreva a lista de cadeiras
livres da fila fl 9cadeiras\ivresFila$sp/.
C
SA
238 /&$#A*A / SAI*A */ *A*5S
2387 I&$#5*.9:5Q
!s programas que apresentamos e propusemos at ento, se basearam em um
padro especfico de interao entre o usurio e o sistema. ! interpretador TUGO
est constantemente solicitando uma e'presso, que em seguida avaliada por
ele e o resultado apresentado ao usurio. He.amos o modelo ilustrado na figura
1N.C. A avalio de uma e'presso leva em conta as defini#es disponveis em
bibliotecas e as construdas pelos programadores.
Algumas vezes entretanto este modelo de interao no adequado tendo
em vista que o programa do usurio no pode tomar a deciso de pedir ou no um
dado ao usurio. 4udo tem que ser informado antecipadamente.
/;em+lo 7Q &ese.amos fazer um programa que intera.a com o usurio para
que ele tente descobrir um n(mero oculto. A interao do programa s% deve
continuar enquanto o .ogador no descobrir o n(mero oculto. $ ve.a, no d para
antecipar antes e codificar isto em uma e'presso. A Figura 1N.1 mostra um
esquema da interao necessria. ! programa pode comear pedindo um valor
ao usurio. Oe o usurio fornece um valor id:ntico ao valor oculto, o programa
e'ibe a mensagem anunciando que o .ogador venceu e encerra o .ogo. 3aso
contrrio o programa solicita um novo palpite.
usurio
Inter+retado
r %.)S
e;+resso
resultado
Figura 1N.C X 6odelo de 2nterao usurio+interpretador TUGO
scri+ts
C
SQ
Nestes casos, no queremos descrever mapeamentos entre con.unto de
valores e sim seq<:ncia de a#es. - o contato das fun#es com o mundo. Ainda
podemos usar fun#es para determinar valores, mas quando precisamos, temos
que estabelecer uma seq<:ncia de a#es a serem e'ecutadas. Agora o que nos
interessa definir programas, atravs de seq<:ncias de a#es.
He.amos uma soluo para o .oguinho acima introduzido)
sim
no
rFornea outro valors
valor
r'ogo encerrados
"alor ,ornecido
G
&(mero oculto
O
Figura 1N.1 X 2ntera#es para descobrir um n(mero
oculto
C
SS
No*o' = do
&u"="r_# K>>1or#e2a um #]mero e#"re % e '%K
alor !- *e"_i#e
i1 alor == K5K
"7e# do &u"="r_# Ka$er"ou - &ara)V#sPK
else do &u"="r_# Kerrou - "e#"e ou"ra ezPK
No*o'
C
SJ
$ algumas intera#es)
Mai#> No*o'
>>1or#e2a um #]mero e#"re % e '%
3
errou - "e#"e ou"ra ezP
>>1or#e2a um #]mero e#"re % e '%
4
errou - "e#"e ou"ra ezP
>>1or#e2a um #]mero e#"re % e '%
2
errou - "e#"e ou"ra ezP
>>1or#e2a um #]mero e#"re % e '%
5
a$er"ou - &ara)V#sP
Hamos agora dissecar o programa)
C. *ara estabelecer contato com o mundo precisamos de uma ao para
leitura e outra para e'ibio de resultado. Aqui a leitura realizada
atravs da primitiva getBine. *ara e'ibir resultados fazemos uso da
primitiva +utStrBn. $nquanto getBine no precisa de um par0metro,
visto que uma ao que sempre buscar na interao obter um valor, a
+utStr necessita de um valor para ser e'ibido5
1. ! programa Uogo7 no precisa de par0metro para realizar sua atividade,
dado que tudo ser solicitado diretamente dentro do corpo do programa,
na medida do necessrio5
>. *ara informar que o que estamos definindo uma seq<:ncia de a#es e
no uma descrio funcional, introduzida a partcula do, que pode ser
traduzida pelo imperativo ,aag
?. *ara que um valor obtido pelo comando de leitura getBine, se torne
disponvel para uso do programa precisamos internaliz+lo atravs do uso
da primitiva representada pelo smbolo DE5
alor *e"_i#e
A. *ara indicar que dese.amos continuar e'ecutando o programa podemos
fazer uma chamada a ele mesmo, como o fizemos em)
else d% p$tKtr@n Kerrou - "e#"e ou"ra ezPK
<%-%1
C
SB
C
JN

You might also like