Exercício do Exame de Recorrência de 1997: Problema

Escreva em Prolog cláusulas adequadas (podendo recorrer, se necessário a predicados pré-definidos) para definir:

a)
O predicado profundidade( E,L,N ) que, dado um elemento E e uma lista L que pode conter elementos que são novamente listas, determina a profundidade N da primeira ocorrência desse elemento na lista (supõe-se que o nível da lista mais externa é 1). Exemplo:
         ? profundidade(7,[3,[5,7],[4,[7,0]]],N).
         N = 2
b)
O predicado dobra( L,LL ), sendo L e LL listas, em que LL contém todos os elementos de L duplicados. Por exemplo:
         ?- dobra([1,2,3],[1,1,2,2,3,3])
         yes
c)
O predicado separa( L1,(Ln,Ll) ) que recebe como entrada uma lista L1 formada por números e letras, contendo eventualmente repetições, e devolve como saída um par em que o primeiro elemento Ln é a lista apenas dos números e o segundo elemento Ll é a lista apenas das letras. No resultado não podem aparecer repetições, podendo recorrer a predicados de Prolog pré-definidos. Exemplo:
         ?- separa([b,d,2,a,5,b],R).
         R = ([2,5],[d,a,b])
         ?- separa([4,d,5,4,q],R).
         R = ([5,4],[d,q])



(c) Delfim F. Marado Torres
1999-04-13