MC336 - Prova Prolog

Enunciado distribuído na sala.

Gabarito:

(1)

superset(_, [ ]).
superset(A, [H|T]) :- member(H, A), !, superset(A, T).

O corte é necessário para evitar ressatisfação em perguntas como ?- superset([a,b,a], [a,b]).

(2)

verif([1]) :- !.
verif([A, B|C]) :- 0 is A mod 2, B is A / 2, verif([B|C]).
verif([A, B|C]) :- 1 is A mod 2, B is 3 * A + 1, verif([B|C]).

O corte não é necessário se este predicado for usado somente para verificação, mas é bom para o caso de querermos utilizá-lo para construção, por exemplo, com uma pergunta da forma ?- verif([17|X]).

(3)

somaimpar(X, S) :- somaux(1, X, S).

% somaux(A, B, S) soma em S todos os impares entre A e B, inclusive; o
% predicado só funciona se A eh um numero impar.

somaux(A, B, 0) :- A > B.
somaux(A, B, S) :- A =< B, A2 is A + 2, somaux(A2, B, S1), S is S1 + A.

Através de um predicado auxiliar pode-se evitar o uso de floor e mod.

(4)

pot(_, 0, c(1,0)).
pot(c(A, B), N, P) :-
    N > 0,
    N1 is N - 1,
    pot(c(A, B), N1, P1),
    mult(c(A, B), P1, P).

mult(c(A, B), c(C, D), c(R, I)) :- R is A*C - B*D, I is A*D + B*C.

Observe o caso base: N = 0. E oberve o resultado de um complexo elevado a zero: c(1, 0), e não simplesmente 1.

Critérios de correção

Descuidos perdoados:

Todas as questões

Perde 0,5 pontos:

Perde a questão toda:

Questão 1 (superset)

Perde 0,5 pontos:

Perde 1,0 ponto:

Questão 2 (verif: X/2 ou 3X+1)

Perde 0,5 pontos:

Perde 1,0 ponto:

Questão 3 (somaimpar)

Perde 0,5 pontos:

Perde 1,0 ponto:

Questão 4 (potência complexo)

Perde 0,5 pontos:

Outros critérios:


MC336 Home

© 2011 João Meidanis