Você está na página 1de 2

re sp on dPa li nd rom es : : S t r i n g > S t r i n g

re sp on dPa li nd rom es =
u n l i n e s . map (\ xs > i f i s P a l i n d r o m e xs
then palindrome
e l s e nao palindrome ) . l i n e s

o Funcional
Programaca
Lista de Exerccios 04

11. Considere o seguinte programa:


import C o n t r o l . Monad
main = do
n < getLine
v < forM [ 1 . . read n ] (\ a > do
v a l o r < getLine
return v a l o r )
putStrLn (show v )

Prof. Wladimir Ara


ujo Tavares
Entrada e Sada

Entrada:

1. Escreva um programa em Haskell que solicita ao usu


ario para digitar uma frase, le
a frase (uma linha) da entrada padr
ao e testa se a string lida e uma palndrome,
exibindo uma mensagem apropriada.
2. Faca um programa que leia um n
umero n e imprime n!.
3. Faca um programa que leia um n
umero n e imprime simse o n
umero e primo, caso
contr
ario, imprime nao.
4. Escreva um programa que solicita ao usu
ario tres n
umeros em ponto flutuante, le
os n
umeros, e calcula e exibe o produto dos n
umeros.
5. Escreva um programa em Haskell que solicita ao usu
ario uma temperatura na
escala Fahrenheit, le esta temperatura, converte-a para a escala Celsius, e exibe
o celsius :: Double -
o resultado. Para fazer a convers
ao, defina uma funca
Double que recebe a temperatura na escala Fahrenheit e resulta na temperatura
o para a convers
correspondente na escala Celsius. Use a seguinte equaca
ao:

4
1
2
3
4
Sada:
[ 1 , 2 , 3 , 4 ]
Modifique o programa para imprimir o somat
orio dos valores digitados.
Tautologia
import Data . L i s t

5
C = (F 32)
9

(1)

data Prop =
Const Bool
| Var Char
| Neg Prop
| Conj Prop Prop
| D i s j Prop Prop
| Impl Prop Prop

onde F e a temperatura na escala Fahrenheit e C e a temperatura na escala


o celsius na definica
o de main. A digitaca
o da temperatura
Celsius. Use a funca
em Fahrenheit deve ser feita na mesma linha onde e exibida a mensagem que a
solicita.
6. A prefeitura de Quixad
a abriu uma linha de credito para os funcion
arios
o n
estatut
arios. O valor m
aximo da prestaca
ao poder
a ultrapassar 30% do sal
ario
bruto. Fazer um programa que permita entrar com o sal
ario bruto e o valor da
o, e informar se o emprestimo pode ou n
prestaca
ao ser concedido.
7. Considere o seguinte programa:

type I n t e r p r e t a c a o = [ ( Char , Bool ) ]


valor
valor
valor
valor
valor
valor
valor

module Main where


main
= do {
t e s t s < getLine ;
c o n t e n t s < getContents ;
putStrLn $ show $ta ke ( read t e s t s ) ( l i n e s c o n t e n t s )
}

> Bool
p)
&& v a l o r i q
| | valor i q
<= v a l o r i q

primeiro (a , b) = a
segundo ( a , b ) = b

Modifique o programa para que ele leia um n


umero natural n, e ent
ao leia outros n
n
umeros e calcule e exiba a soma destes n
umeros.
8. Escreva um programa completo que reproduza a funcionalidade do utilit
ario wc de
Unix: ler um arquivo de texto da entrada-padr
ao e imprimir o n
umero de linhas,
n
umero de palavras.

busca : : Eq c => c > [ ( c , v ) ] > v


busca c [ ] = e r r o r I n t e r p r e t a c a o i n s u f i c i e n t e
busca c ( x : xs ) = i f c == ( p r i m e i r o x ) then segundo x
e l s e busca c xs
variaveis
variaveis
variaveis
variaveis
variaveis
variaveis
variaveis

module Main where


main = do

: : I n t e r p r e t a c a o > Prop
( Const b ) = b
i ( Var x ) = busca x i
i ( Neg p ) = not ( v a l o r i
i ( Conj p q ) = v a l o r i p
i ( Disj p q) = valor i p
i ( Impl p q ) = v a l o r i p

c o n t e n t s < getContents ;

o lines, words:
Use a funca
lines quebra uma string em uma lista de strings usando o caractere new line
como separador.

: : Prop > [ Char ]


( Const x ) = [ ]
( Var x )
= [x]
( Neg p )
= variaveis p
( Conj p q ) = nub ( v a r i a v e i s p ++ v a r i a v e i s q )
( D i s j p q ) = nub ( v a r i a v e i s p ++ v a r i a v e i s q )
( Impl p q ) = nub ( v a r i a v e i s p ++ v a r i a v e i s q )

b i t s : : I n t > [ [ Bool ] ]
b i t s 0 = [ [] ]
b i t s n = [ x : xs | x < [ True , F a l s e ] , xs < b i t s ( n1)]

words quebra uma string em uma lista de palavras usando o caractere espaco
como separador
Exemplo:

i n t e r p r e t a c o e s : : Prop > [ I n t e r p r e t a c a o ]
i n t e r p r e t a c o e s p = [ z i p v a r b | b < b i t s ( length v a r ) ]
where v a r = ( v a r i a v e i s p )

aslfjasfl
salfsa
asflsafsa aslfsaf
alsfhsa aslfjas a s l f j a f l k

t a u t o l o g i a : : Prop > Bool


t a u t o l o g i a p = and [ v a l o r i p | i < i n t e r p r e t a c o e s p ]

Sada:

o recursiva da funca
o dual :: Prop -> Prop que obtem
12. Escreva uma definica
o, i.e. a proposica
o que resulta de substituir todas as
o dual duma proposica
es por disjunco
es (e vice-versa) e as constantes True por False (e viceversa);
conjunco
es s
as vari
aveis e negaco
ao inalteradas. Exemplos:

linhas : 4
palavras : 7
o interact :: (String -> String) -> IO () e muito utilizada para
9. A funca
construir programas com entrada e sada simples. Considere o seguinte programa:

dual ( Neg ( Var a ) )


= Neg ( Var a )
dual ( D i s j ( Var x ) ( Neg ( Var x ) ) )
= Conj ( Var x ) ( Neg ( Var x ) )
dual ( Conj ( Var a ) ( D i s j ( Var b ) ( Const F a l s e ) ) )
= D i s j ( Var a ) ( Conj ( Var b ) ( Const True ) )

module Main where


main = do
i n t e r a c t (show . length . l i n e s )
O programa acima imprime o n
umero de linhas do arquivo de entrada.
Faca um programa completo que le linhas de texto da entrada-padr
ao e imprime
o interact.
cada linha invertida usando a funca

o contar :: Prop -> [(Char, Int)] cujo resultado e uma


13. Escreva uma funca
es entre cada vari
lista de associaco
avel e o n
umero de vezes que ocorre na
o.
proposica

es lines, unlines, map reverse.


Dica: Use as funco
10. Faca um programa que le uma linha de um arquivo de texto da entrada-padr
ao e
o interact.
diga se a palavra e palindrome ou n
ao usando a funca

Exemplo: contar (Conj (Var a) (Disj (Var b) (Var a)) = [(a,


2), (b, 1)]
(a ordem dos pares no resultado n
ao e importante).

o
Dica: Use a seguinte funca

o duma funca
o showProp ::
14. Escreva uma definica
o em texto;
converter uma proposica

remover x (No y esq V a z i a ) um d e s c e n d e n t e

Prop -> String para

Alguns exemplos:
> showProp ( Neg ( Var a ) )
( a )
> showProp ( D i s j ( Var a ) ( Conj ( Var a ) ( Var b ) ) )
( a | | ( a && b ) )
> showProp ( Impl ( Var a ) ( Impl ( Neg ( Var a ) ) ( Const F a l s e ) )
( a > ( ( a ) > F ) )
o da funca
o satisfaz :: Prop -> Bool que verifica se uma
15. Escreva uma definica
o e satisfazvel, isto e, se existe uma atribuica
o de valores a
`s vari
proposica
aveis que
a torna verdadeira.
o da funca
o equiv :: Prop -> Prop -> Bool que verifica
16. Escreva uma definica
es s
se duas proposico
ao equivalentes, isto e, tomam o mesmo valor de verdade para
es de vari
todas as atribuico
aveis.

remover x (No y esq d i r ) d o i s d e s c e n d e n t e s


| x<y =
| x>y =
| x==y =
rvore tem dois descendentes, substitua x pelo menor valor da a
rvore
Se a a
rvore direita.
da direita e depois remova o menor valor da a
o recursiva para listar os elementos de uma a
rvore de
(i) Escreva uma funca
pesquisa em ordem decrescente.
l i s t a r : : Ord a => Arv a > [ a ]
l i s t a r Vazia
=
l i s t a r (No x esq d i r ) =
Multiconjuntos
o em Haskell dum tipo de dados para multiconjuntos (i.e.
18. Considere a definica
es sem ordem mas com repetico
es) representado como a
rvore de pesquisa:
coleco

Sugest
ao: p e q s
ao equivalentes se e s
o se Conj (Impl p q) (Impl q p) for uma
tautologia.
rvore de Pesquisa
A
es recursivas para uma a
rvore bin
17. Complete as seguintes definico
aria:

data MConj a = Vazio | No a Int (MConj a) (MConj a)


es); para
Cada n
o contem um valor e a sua multiplicidade (i.e. o n
umero de repetico
rvore deve estar ordenada pelos valores.
facilitar a pesquisa, a a

data Arv a = V a z i a | No a ( Arv a ) ( Arv a )

Por exemplo:
o recursiva para calcular o n
rvore.
(a) Escreva uma funca
umero de n
os de uma a

No A 2 Vazio (No B 1 Vazio Vazio)


representa o multi-conjunto {A, A, B} com dois carateres A e um B.

tamanho : : Arv a > I n t


tamanho V a z i a
=
tamanho (No x esq d i r ) =

o recursiva da funca
o ocorre :: Ord a => a ->
(a) Escreva uma definica
MConj a -> Int que procura o n
umero de ocorrencias de um valor num
multi-conjunto; o resultado deve ser 0 se o valor n
ao pertencer ao multiconjunto.

o recursiva para calcular a altura de uma a


rvore.
(b) Escreva uma funca
a l t u r a : : Arv a > I n t
a l t u r a Vazia
=
a l t u r a (No x esq d i r ) =

o recursiva da funca
o inserir :: Ord a => a ->
(b) Escreva uma definica
MConj a -> MConj a que insere um valor num multi-conjunto mantendo a
rvore de pesquisa ordenada.
a
o recursiva da funca
o listar ::
(c) Escreva uma definica
para listar os elementos de um multi-conjunto.

o recursiva para soma todos os valores de uma a


rvore
(c) Escreva uma funca
bin
aria de n
umeros

MConj a -> [a]

o recursiva da funca
o tamanho :: MConj a -> Int
(d) Escreva uma definica
para calcular o n
umero de elementos de um multiconjunto.

sumArv : : Num a => Arv a > a


sumArv V a z i a
=
sumArv (No x esq d i r ) =

o recursiva da funca
o sumMConj :: MConj a ->
(e) Escreva uma definica
Int para calcular o somat
orio de todos os elementos de um multiconjunto.

o recursiva nivel :: Int -> Arv a -> [a] tal que


(d) Escreva uma definica
rvore no nvel n, isto e, a uma
nivel n arv e a lista ordenada dos valores da a
altura n (considerando que a raiz tem altura 0).

es
Relaco
o de uma relaca
o bin
19. Considere a representaca
aria nos inteiros como uma lista de
pares.

n i v e l : : I n t > Arv a > [ a ]


Vazia
=
nivel
n i v e l 0 (No x esq d i r ) =
n i v e l n (No x esq d i r ) =

type Rel = [(Int , Int)]


o reflexiva :: [Int]->Rel -> Bool que verifique se
(a) Escreva uma funca
o R em A e reflexiva (R e reflexiva se e s
uma relaca
o se x A, (x, x) R)
Exemplos:

o da funca
o de ordem superior mapArv :: (a -> b)
(e) Escreva uma definica
o f a cada valor
-> Arv a -> Arv b tal que mapArv f t aplica uma funca
rvore t. a
rvore t.
duma a

r e f l e x i v a [ 1 , 2 , 3 ] [ ( 1 , 1 ) , ( 2 , 2 ) , ( 1 , 2 ) , ( 3 , 3 ) ] = True
r e f l e x i v a [1 ,2 ,3] [(1 , 2) , (2 , 3)] = False

mapArv : : ( a > b ) > Arv a > Arv b


mapArv f V a z i a
=
mapArv f (No x esq d i r ) =

o simetrica :: Rel -> Bool que verifique se uma


(b) Escreva uma funca
o e transitiva (R e transitiva se e s
relaca
o se (x, y) R (y, x) R
para todos x, y).
Exemplos:

o da funca
o reflect :: Arv a -> Arv a que
(f) Escreva uma definica
rvore. Exemplo:
recursivamente troca os lados esquerdos e direitos de uma a

s i m e t r i c a [ ( 1 , 3 ) , ( 3 , 1 ) , ( 2 , 2 ) ] = True
s i m e t r i c a [(1 , 2) , (2 , 3)] = False
o transitiva :: Rel -> Bool que verifique se uma
(c) Escreva uma funca
o e transitiva (R e transitiva se e s
relaca
o se (x, y) R (y, z) R
(x, z) R para todos x, y, z).
Exemplos:
t r a n s i t i v a [ ( 1 , 3 ) , ( 1 , 2 ) , ( 2 , 3 ) ] = True
t r a n s i t i v a [(1 , 2) , (2 , 3)] = False

o da funca
o que insere um valor numa a
rvore de
(g) Escreva uma definica
o da
pesquisa ordenada. Deve manter invariante a propriedade ordenaca
rvore e n
rvore.
a
ao inserir outra c
opia do valor se este j
a ocorrer na a

Grafos
o de um grafo dirigido de vertices inteiros como um par
20. Considere a representaca
ordenado uma lista de vertices e uma lista de arestas (isto e, pares ordenados de
vertices).

i n s e r i r : : Ord a => a > Arv a > Arv a


i n s e r i r x Vazia =
i n s e r i r x (No y esq d i r )
| x<y =
| x>y =
| otherwise =

type V e r t = I n t
type Grafo = ( [ V e r t ] , [ ( V e r t , V e r t ) ] )
o caminho :: Grafo -> [Vert] -> Bool tal que caminho g xs e
Escreva uma funca
True se xs e uma lista de vertices que representa um caminho no grafo (isto e, se
cada dois vertices consecutivos correspondem a uma aresta) e False, caso contr
ario.

o da funca
o que remove um valor numa a
rvore de
(h) Escreva uma definica
o da
pesquisa ordenada. Deve manter invariante a propriedade ordenaca
rvore.
a

Exemplos:
m a i s e s q : : Arv a > a
m a i s e s q (No x V a z i a ) = x
m a i s e s q (No
esq ) = m a i s e s q esq

G = ([1 ,2 ,3] , [(1 , 2) , (2 , 1) , (2 , 3)])


caminho G [ 1 , 2 , 1 , 2 , 3] = True
caminho G [ 1 , 2 , 1 , 3] = F a l s e

remover : : Ord a => a > Arv a > Arv a


remover x V a z i a = V a z i a n
ao o c o r r e
remover x (No y V a z i a d i r ) um d e s c e n d e n t e