Você está na página 1de 1

o Funcional

Programaca
Revis
ao

Num sistema mais complexo, um objeto pode ser substitudo por um sub-mobile, tal
como mostrado na figura a seguir. Neste caso, n
ao e t
ao simples para verificar se um
mobile est
a em equilbrio por isso precisamos de voce para escrever um programa
que, recebe um mobile como entrada, verifica se o m
ovel est
a em equilbrio ou n
ao.

Prof. Wladimir Ara


ujo Tavares
IO Haskell
o putStrLn :: String -> IO() recebe uma string e retorna uma aca
o
1. A funca
o de I/O e algo que, quando realizado, resulta em uma aca
o com
de I/O. Uma aca
efeito colateral (que pode ser ler ou escrever alguma coisa no dipositivo padr
ao de
entrada) e que pode conter algum tipo de valor de retorno. Mostra uma string no
terminal n
ao precisa retorna nem um valor com significado ent
ao o valor () deve
ser usado.
o putStrLn pode ser definido em termos de putChar usando combinadores
A funca
da seguinte maneira:
putstrln []
= putChar \ n
p u t s t r l n ( c : c s ) = putChar c >> p u t s t r l n c s

data Mobile = Haste Mobile I n t Mobile I n t | O bjeto I n t

o de putStrLn :: IO () em termos de putChar usando a


Escreva uma definica
o do.
notaca
o getLine :: IO String, que le uma linha do dipositivo de entrada padr
2. A funca
ao ate
que um caractere
o getLine pode ser definido em termos de getChar
n seja encontrado. A funca
usando combinadores da seguinte maneira:

m1
m2
m3
m4
m5

g e t l i n e = getChar >>=
(\ c > i f c == \ n then return
e l s e g e t l i n e >>= \ l > return ( c : l ) )

=
=
=
=
=

Haste
Haste
Haste
Haste
Haste

( O b j e t o 1) 6 ( O b j e t o 3) 2
( O b j e t o 2) 4 ( O b j e t o 4) 2
( O b j e t o 1) 1 ( O b j e t o 1) 1
(m3) 3 (m2) 1
(m4) 2 (m1) 6

o peso::
(a) Escreva uma funca
o peso sustentado por ele.

Mobile -> Int que dado um Mobile retorna

o equilibrio:: Mobile -> Int que dado um Mobile


(b) Escreva uma funca
retorna True, se todo o sistema est
a em equilbrio,caso contr
ario, retorna
False.

o de getLine :: IO String em termos de getChar usando a


Escreva uma definica
o do.
notaca
o repeat:: (a -> IO Bool) -> IO a -> IO [a] tal que
3. Defina uma funca
o a repetidamente, acumulando os resultados em uma lista,
repeat p a realize a aca
enquanto o teste p retornar um valor verdadeiro para esse resultado.

o em Haskell dum tipo de dados para multiconjuntos (i.e.


4. Considere a definica
es sem ordem mas com repetico
es) representado como a
rvore de pesquisa:
coleco
data MConj a = Vazio | No a Int (MConj a) (MConj a)

Defina getString em termos de repeat e getChar.


es accumulate::[IO a] -> IO[a], que realiza uma lista
4. Escreva duas definico
es, acumulando o resultado dessas aco
es em uma lista uma usando
de aco
o do.
combinadores e a outra usando a notaca
es de sequencia::[IO a] -> IO(), que realiza a lista de
5. Escreva duas definico
es mas descarta os resultados uma usando combinadores e a outra usando a
aco
o do.
notaca
o de sequencia para definir uma outra vers
6. Use a definica
ao de putStrLn :: IO
() usando map, putChar e sequencia.

es);
Cada n
o contem um valor e a sua multiplicidade (i.e. o n
umero de repetico
rvore deve estar ordenada pelos valores. Por exemplo:
para facilitar a pesquisa, a a
No A 2 Vazio (No B 1 Vazio Vazio) representa o multi-conjunto {A, A, B}
com dois caracteres A e um B.
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 da funca
o inserir :: Ord a => a ->
(b) Escreva uma definica
MConj a -> MConj a que insere um valor num multiconjunto mantendo a
rvore de pesquisa ordenada.
a

Tipos de Dados
o de pontos no plano pelo par das suas coordenadas
1. Considere uma representaca
cartesianas: type Ponto = (Float, Float)

5. Vamos representar pontos de um plano cartesiano com duas coordernadas e regi


oes
es, usando os seguintes tipos:
desse plano como funco

o da funca
opque calcula a dist
(a) Escreva uma definica
ancia euclidiana entre
dois pontos (x1 , y1 ) e (x2 , y2 ): (x1 x2 )2 + (y1 y2 )2 .
dist :: Ponto -> Ponto -> Float

data Ponto = P t F l o a t F l o a t
type Regiao = Ponto > Bool
Se r representa uma regi
ao do plano, ent
ao um ponto p est
a nessa regi
ao do plano
se r p e igual a True.

(b) Considere agora um percurso dado como uma lista de pontos consecutivos.
o comprimento :: [Ponto] -> Float que calcule o
Escreva uma funca
comprimento total dum percurso (isto e, a soma das dist
ancias entre pontos
consecutivos). Pode usar recurs
ao ou listas em compreens
ao e deve usar
o dist da alnea anterior para calcular as dist
o
a funca
ancias. Tenha atenca
de tratar corretamente os percursos degenerados (vazios ou com apenas um
ponto).

es
(a) Defina
funco
retang::Ponto->Ponto->Regiao
e
circ::Ponto->Raio->Regiao tais que:
retang p q retorne (a regi
ao que representa) o ret
angulo tal que p e o ponto
` esquerda e mais baixo, e q o ponto mais a
` direta e mais alto.
mais a
circ p r retorne o crculo de raio r e centro p.
es.
Lembre-se: regi
oes s
ao representadas por funco

es l
2. Considere um tipo de dados em Haskell para representar proposico
ogicas.
data Prop = Var Char
| Neg Prop
| Conj Prop Prop
| D i s j Prop Prop

es
(b) Defina
funco
uniao::Regiao->Regiao->Regiao,
interseccao::Regiao->Regiao->Regiao
e
complemento::Regiao->Regiao tais que p est
a em uniao r r se e
somente se p est
a na uniao das regi
oes r e r, e analogamente para
o e complemento.
intersecca

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


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

o de um grafo com vertices inteiros como um par ordenado


6. Considere a representaca
uma lista de vertices e uma lista de arestas (isto e, pares ordenados de vertices).

Exemplo:

type V e r t = I n t
type Grafo = ( [ V e r t ] , [ ( V e r t , V e r t ) ] )

contar (Conj (Var a) (Disj (Var b) (Var a)) = [(a, 2); (b,
1)] (a ordem dos pares no resultado n
ao e importante).
3. Um mobile e uma estrutura constituda por uma haste, a partir da qual objetos
ponderados ou outras hastes s
ao penduradas.

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.

uma haste suspensa por uma corda, com


A figura abaixo ilustra um mobile. E
objetos pendurados de cada lado. Tambem pode ser visto como uma especie de
alavanca com o ponto de apoio sendo o ponto em que a haste est
a suspensa pela
corda. Pelo princpio da alavanca, sabemos que equilibrar um m
ovel temos que o
produto do peso dos objetos pela dist
ancia ao ponto de apoio devem ser iguais, ou
seja, W l Dl = W r Dr onde Dl e a dist
ancia da esquerda, Dr e a dist
ancia da
direita, WL e o peso da esquerda e Wr e o peso da direita.

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

Você também pode gostar