Enunciado distribuído na sala.
Abaixo as perguntas Prolog e, em azul ou vermelho, as respostas do sistema, com justificativa para as falsas.
?- X = Meio_de_transporte, [X,X,X] = [aviao,trem,barco].
false
A variávelX
não pode ser igual às constantesaviao
,trem
ebarco
simultaneamente.
?- f(X, a(b,Y)) = f(Z, a(Z,c)).
X = b, Y = c, Z = b
Esta deu certo.
?- M = 1, N = 1 + M.
M = 1, N = 1 + 1
Esta deu certo. Note que a operação '+' não é realizada, pois temos '=' e não is
.
?- N = 1, N is N + 1.
false
A variávelN
tem valor 1 após a primeira meta ser satisfeita, e o valor 1 não é igual ao valor da expressãoN + 1
calculado pelo operadoris
, que é 2.
?- N = 1, N is M + 1.
ERROR
A expressãoM + 1
não pode ser calculada pelo operadoris
, pois a variávelM
não tem valor no momento do cálculo, causando erro.
conta(_,[],0). conta(A,[A|R],N) :- conta(A,R,N1), N is N1 + 1. conta(A,[B|R],N) :- B \= A, conta(A,R,N).
intercala(X,Y,Z) :- sorted(X), sorted(Y), intercaux(X,Y,Z). sorted([]). sorted([_]). sorted([A|[B|R]]) :- A =< B, sorted([B|R]). intercaux([],A,A) :- !. intercaux(A,[],A). intercaux([A|B],[C|D],[A|R]) :- A =< C, intercaux(B,[C|D],R). intercaux([A|B],[C|D],[C|R]) :- A > C, intercaux([A|B],D,R).
compostos(N,L) :- compaux([], 2, [], N, L). compaux(_, T, C, N, C) :- T > N. compaux(P, T, C, N, R) :- T =< N, divide(P, T), !, T1 is T + 1, compaux(P, T1, [T|C], N, R). compaux(P, T, C, N, R) :- T =< N, T1 is T + 1, compaux([T|P], T1, C, N, R). divide([A|_], T) :- 0 is T mod A, !. divide([_|R], T) :- divide(R, T).
Exceto pela Questão 1, que não envolvia escrever código Prolog, o critério de correção começou por decidir como seria a pontuação: de cima para baixo ou de baixo para cima. Se a resposta estava bem escrita, com sintaxe Prolog correta, resolução do problema pedido (e não de outro) e com comprimento proporcional à complexidade da questão, então a correção procedeu de cima para baixo, ou seja, parte-se do valor integral e vão sendo subtraidas frações de pontos para cada defeito encontrado.
Por outro lado, se a resposta estava mal escrita, com sintaxe errada, resolvendo o problema errado ou incompleta, então a correção procedeu de baixo para cima: parte-se de zero e vão sendo adicionadas frações de pontos a cada indício de conhecimento importante encontrado. Embora em geral a correção de cima para baixo resulte em notas maiores numa questão, é possível ter exceções a esta tendência.
Nas questões de escrita de código Prolog, os seguintes critérios foram universalmente aplicados:
is
para argumentos não-numéricos: -0,2primo
num lugar e is_primo
em outro): perdoado se estava claro a que se referiam os nomesN > 3
, ou só para inteiros, etc.): perdoado se funcionava para suficientes valoresappend
: perdoadoA seguir, critérios específicos para cada questão. Nas questões de código, são todos critérios de cima para baixo.
Cada item valeu 0,5. Em geral, cada resposta foi classificada como correta (0,5), semi-correta (0,3 ou 0,2), ou errada (0,0). Duas respostas semi-corretas equivaleram a uma correta (0,5).
/+
em lugar de \+
: perdoado© 2013 João Meidanis