MC336 - Prova Prolog

Enunciado distribuído na sala.

Gabarito

Questão 1

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ável X não pode ser igual às constantes aviao, trem e barco 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ável N tem valor 1 após a primeira meta ser satisfeita, e o valor 1 não é igual ao valor da expressão N + 1 calculado pelo operador is, que é 2.
?- N = 1, N is M + 1.
ERROR
A expressão M + 1 não pode ser calculada pelo operador is, pois a variável M não tem valor no momento do cálculo, causando erro.

Questão 2

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).

Questão 3

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).

Questão 4

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).

Critérios de correção

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:

Critérios de cima para baixo:

Critérios de baixo para cima:

A seguir, critérios específicos para cada questão. Nas questões de código, são todos critérios de cima para baixo.

Questão 1

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).

Questão 2

Questão 3

Questão 4


MC336 Home

© 2013 João Meidanis