MC600 - Segundo semestre de 2003 - LISTA 10 ------------------------------------------- 1. Considere o predicado abaixo: sibling(X,Y) :- mother(M,X), mother(M,Y), father(F,X), father(F,Y), X\=Y. Numa execução normal, é possível que o programa tente encontrar outros pares de pais para X, o que é uma perda de tempo, uma vez que cada pessoa só tem um casal de pais (biológicos). Como poderíamos reescrever o predicado de modo a garantir que sempre será avaliado apenas um par de pais para X? Resposta: sibling (X,Y):- X \= Y, mother(M,X),!, father(F,X),!, mother(M,Y), father(F,Y). 2. Considere a definição abaixo: member(X,[X|_]) :- !. member(X,[_|Y]) :- member(X,Y). Diga qual será a resposta à pergunta ?- member(X,[a,b,c]), member(X,[c,b]). E se removermos o corte da definição? A resposta mudaria? Resposta: A definicao do enunciado com o corte(!), resulta na resposta NO. Se removermos o corte, teremos o seguinte como resposta: X = b ; X = c ; NO. Defina predicados que implementem as seguintes operações sobre conjuntos. (Conjuntos são representados por listas) 3. Insere um elemento numa lista (se ele já não estiver) Resposta: insere(X, [], [X]). insere(X, [H|T], [H|HT]) :- X \= H, insere(X, T, HT). Desta forma, se X estiver na lista, o predicado falha. Ao adicionarmos a clausula insere(X, [X|T], [X|T]). obtemos um comportamento diferente: se X estiver na lista, o predicado retornara' a propria lista. 4. Faz a união de duas listas. Resposta: uniao([],L,L). uniao([H|T],L,U):-insere(H,L,L2),uniao(T,L2,U). 5. Verifica se uma lista é subconjunto de outra.