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:
- singleton variables
- barra virada
Todas as questões
Perde 0,5 pontos:
- faltou colchete
- ressatisfação não falha, cláusulas redundantes
- sintaxe
- ordem errada em argumentos
- ordem errada de metas em corpo de regra
- erro nas chamadas recursivas
- faltou argumento extra para usar como acumulador
- X is X ...
- usou is em contexto não aritmético
- variável não instanciada à direita de is
- is usado para expressões não aritméticas
- trocou + por -
Perde a questão toda:
- escreveu código cheio de erros, que não da' pra entender
Questão 1 (superset)
Perde 0,5 pontos:
- vazia não contém vazia
- decompôs demais primeiro argumento
- =:= para não número
- is ao contrário
Perde 1,0 ponto:
- outras listas não contém vazia
- recursão no primeiro argumento
Questão 2 (verif: X/2 ou 3X+1)
Perde 0,5 pontos:
- esqueceu funtor =
- não pára no 1
- errou caso base
- verificador não atribui
- verif pulou dois na recursão
- usou T em vez de cabeça de T
- metas faltantes no corpo de uma regra
- variáveis espúrias/erradas
- não verifica paridade
- Y^2 em lugar de 2*Y
- mod em lugar de /
Perde 1,0 ponto:
- errou caso par
- errou caso ímpar
Questão 3 (somaimpar)
Perde 0,5 pontos:
- errou caso base
- não fez caso par
- deixou escorregar para argumentos negativos
- aplicou mod sem ter certeza que era inteiro
- 0 em lugar de 1
- não usou is para calcular
- somou duas vezes algum termo
- falha para 0 < X < 1
- falha para 1 < X < 2
- usou ceiling em lugar de floor
Perde 1,0 ponto:
- não contemplou números fracionários
Questão 4 (potência complexo)
Perde 0,5 pontos:
- errou caso base
- não fez expoente zero
- confundiu c(A,B) com [A|B]
- confundiu c(1,0) com 1
- erro em fórmula para produto de complexos
Outros critérios:
MC336 Home
© 2011 João Meidanis