Haskell - Ajuda [Urgente]

kripton2007

Power Member
Estou com dúvidas na resolução desta ficha... dá para dar uma ajudinha?


--Para representar a informação sobre arvores genealogicas vamos usar os seguintes tipos:

data Pessoa = P String ArvG --nome e genealogia
data ArvG = Orfao --ambos os pais desconhecidos
|SoPai Pessoa
|SoMae Pessoa
|PaeMae Pessoa Pessoa



--Para simplificar vamos assumir que os nomes que aparecem são unicos, isto é, se aparecerem nomes repetidos referem-se à mesma pessoa.

--1.Defina a função avos::Pessoa->[String] que, calcula os nomes dos avós de uma pessoa.



--2. A árvore genealogica de uma pessoa permite apenas consultar os antecedentes de um dado individuo. Para consultar os seus descendentes
--precisamos de ter uma lista de árvores destas.
--Defina então uma função netos::String->[Pessoas]->[String] que, dada uma lista de pessoas e um nome determine os netos dessa pessoa (aqueles cujos avós são a pessoa dada).



--3.Finalmente, defina uma função primos::String->[Pessoas]->[String] que calcule os primos de uma dada pessoa (duas pessoas são primas se têm um avô em comum).


Cumps
 
1 - Para os avós o melhor é definir 2 funções auxiliares: uma que te dê o nome de uma pessoa e outra que te dê uma lista dos pais de uma pessoa. De seguida, para saber os avós, apenas precisas de invocar a função que te dá os pais, sobre os pais da pessoa parâmetro.
2 - Para os netos, apenas precisas de ver se o nome da pessoa passada por parâmetro (o avô) pertence à lista de avós de cada elemento da lista de Pessoas. Se sim, então basta-te colocar o nome dessa pessoa na lista final.
3 - Para os primos, o melhor será ter 2 funções auxiliares: uma que, dado 2 listas de avós, te diz se há algum elemento da primeira que existe na 2ª. A outra função seria para, dado uma pessoa e uma lista de pessoas, saberes se a 1ª pessoa tem um avô em comum com alguma das pessoas da lista. Se sim, então é porque são primos, logo podes juntar essa pessoa da lista à lista final. Por fim terias a função "primos" onde te basta comparar a string com o nome da pessoa na lista e, se for igual, invocas a função auxiliar que te retorna os primos dessa pessoa sobre a cauda da lista, usando a função que te dá o nome da pessoa para colocar na lista final.
 
Back
Topo