Criada: 2014-07-27 Modificada: 2014-10-26
Enunciado distribuído na sala.
Ao clicar no título da questão, você terá acesso a um arquivo prolog com as definições abaixo, que pode ser usado para teste.
%%% vogais(N) é satisfeito quando N é o número de vogais na linha a ser lida vogais(N) :- vog_mais(0, N). %%% vog_mais(A, N) é satifeito quando N é igual a A mais o número de vogais na linha a ser lida vog_mais(A, N) :- get_char(C), ajusta(C, A, N). %%% ajusta(C, A, N) é satisfeito quando N é igual a A mais o número de vogais na linha a ser lida mais 1, se C for vogal ajusta('\n', A, A) :- !. ajusta(C, A, N) :- vogal(C), !, A1 is A + 1, vog_mais(A1, N). ajusta(_, A, N) :- vog_mais(A, N). %%% vogal(C) é satisfeito quando o caractere C é vogal vogal(C) :- member(C, ['a','e','i','o','u','A','E','I','O','U']).
%%% conta(L, D, F) recebe L e instancia D e F com o número de posições em L dentro e fora da pista, respectivamente; %%% supõe que exista predicado dentro(P) que informa se uma posição P está dentro ou fora conta([], 0, 0). conta([P|R], D, F) :- dentro(P), !, conta(R, D1, F), D is D1 + 1. conta([P|R], D, F) :- conta(R, D, F1), F is F1 + 1.
%%% duas pessoas são parentes consanguíneos quando têm pelo menos um ancestral em comum. consang(C, D) :- ancestral(C, A), ancestral(D, A). %%% ancestral(C,A) é satisfeito quando A é um ancestral de C (incluindo o próprio C). ancestral(C, C). ancestral(C, A) :- f(C, P), ancestral(P, A).
%%% perfeito(N) eh satisfeito quando N eh um numero perfeito %%% (isto eh, N eh igual aa soma de seus divisores menores que ele proprio) perfeito(N) :- soma_div(N, N). %%% soma_div(N, S) eh satisfeito quando S eh a soma dos divisores de N menores que ele proprio soma_div(N, S) :- N1 is N - 1, soma_div_ateh(N, N1, S). %%% soma_div_ateh(N, L, S) eh satisfeito quando S eh a soma dos dividores de N ateh L %%% (ou seja, dividores menores ou iguais a L) soma_div_ateh(_, 0, 0) :- !. soma_div_ateh(N, L, S) :- L1 is L - 1, soma_div_ateh(N, L1, S1), parcela(N, L, P), S is S1 + P. %%% parcela(N, L, P) eh satisfeito quando P eh a parcela a somar nos dividores de N relativa a L. %%% em outras palavras, se L divide N, a parcela eh L; se L nao divide N, a parcela eh zero. parcela(N, L, 0) :- 0 =\= N mod L. parcela(N, L, L) :- 0 =:= N mod L.
O critério de correção começa por decidir como será a pontuação de uma questão: de cima para baixo ou de baixo para cima. Se a resposta está 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 procede de cima para baixo, ou seja, parte-se do valor integral e vão sendo subtraídas frações de pontos para cada defeito encontrado.
Por outro lado, se a resposta está mal escrita, com sintaxe errada, resolvendo o problema errado ou incompleta, então a correção procede 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.
Os seguintes critérios gerais foram universalmente aplicados:
A seguir, critérios específicos para cada questão.
Conforme foi dito em classe, a performance do predicado não afetou a nota. Tampouco o fato de o predicado aceitar variáveis afetou a nota.
© 2014 João Meidanis