MC346 - Prova Prolog

Criada: 2014-07-27
Modificada: 2014-10-26

Enunciado distribuído na sala.

Gabarito

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.

Questão 1

%%% 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']).

Questão 2

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

Questão 3

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

Questão 4

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

Critérios de correção

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:

Critérios de cima para baixo:

Critérios de baixo para cima:

A seguir, critérios específicos para cada questão.

Questão 1

Critérios de cima para baixo:

Critérios de baixo para cima:

Questão 2

Critérios de cima para baixo:

Questão 3

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.

Critérios de cima para baixo:

Critérios de baixo para cima:

Questão 4

Critérios de cima para baixo:


MC346 Home

© 2014 João Meidanis