% Prova de prolog 
%
% Solucao
%
% Questao 1:

% depois(data1,data2) data2 e' depois de data1

depois(data(_,A1),data(_,A2)) :- A2 > A1.
depois(data(D1,A),data(D2,A)) :- D2 > D1.

bigamo(X) :- casou(X,Y,D1),
             casou(X,Z,D2),
	     ( separou(X,Y,D3) -> depois(D2,D3) ),
	     ( faleceu(Y,D4) ->   depois(D2,D4) ).


erro :- casou(X,Y,D1), (faleceu(X,D2);faleceu(Y,D2)), depois (D2,D1).
erro :- separou(X,Y,D1), (faleceu(X,D2);faleceu(Y,D2)), depois (D2,D1).


arrependidos(X,Y) :- separou(X,Y,data(D1,A)),
	casou(X,Y,data(D2,A)), D2 > D1.


%
% questao 2
%

pfmax(nil,0).

pfmax(ar(_,L),M) :- prof(L,N), M is N+1.

% prof e' um predicado auxiliar que calcula a maior profundidade de 
%      uma lista de arvores
prof([],0).
prof([A|B],M) :- pfmax(A,X),
	prof(B,Y),
	(X > Y -> M = X ; M = Y).


% questao 2'
% 
% o pedicado prof pode ser substituido, com certa confusao, pelo proprio
% pfmax

pfmax([],0).

% para uma so arvore
pfmax(ar(_,L),M) :- pfmax(L,N), M is N+1. 

% para uma lista de arvores
pfmax([A|B],M):- pfmax(A,X),
	pfmax(B,Y),
	(X > Y -> M = X ; M = Y).


%
%  questao 3
%

% fora(reg, ra) e' verdadeiro se o aluno caiu fora do curso e ra e' seu RA.

fora(xx(RA,nil,nil,nil),RA).
fora(xx(RA,_,nil,nil),RA).
fora(xx(RA,A,B,nil),RA) :- A + B < 5.


abandonou([],[]).
abandonou([A|B],X) :- fora(A,RA) -> abandonou(B,Y), X = [RA|Y]
                                 ;  abandonou(B,X). 

