MC346 - Paradigmas de Programação: Programação Lógica: Desafio

      Criada: 2016-03-12
    

Projeto Prolog

Seu desafio envolvendo a linguagem Prolog será ler e resolver uma equação de primeiro grau em uma variável.

Sobre a entrada

Você deverá receber do dispositivo de entrada padrão um texto contendo uma equação. Esta equação poderá ser composta de várias linhas. A equação deverá possuir um único sinal de igual (=). De cada lado desse sinal, deverá haver uma expressão aritmética envolvendo apenas variáveis, números inteiros ou em ponto flutuante, os sinais aritméticos +, -, *, / e parênteses para agrupar expressões aritméticas. Ao final da equação, deverá haver um ponto final (".") para indicar ao Prolog o fim de um termo. Desta forma, a equação poderá ser lida com o predicado pré-definido read/1 de Prolog.

A equação poderá conter espaços em branco, caracteres de tabulação e caracteres de quebra de linha à vontade. Devem ser aceitos como nomes de variáveis sequências de caracteres constituídas de letras e dígitos, com inicial minúscula. Outros nomes de variáveis podem ser aceitos a critério do implementador, porém não podem ser aceitos nomes com inicial maiúscula. A equação deverá envolver apenas uma variável e possuir apenas termos de grau no máximo um com respeito a esta variável.

Verificação adicional da entrada

Seu programa deverá verificar a entrada e acusar erro caso ela não esteja dentro do esperado. Casos de erro devem incluir:

Alguns casos dúbios serão deixados a cargo do implementador. Por exemplo, a seguinte equação é do primeiro grau ou não?

x * x * 0 - 2 * x = 4

Deixaremos a cargo do implementador a decisão de aceitar ou não tal equação. Da mesma forma, equações como:

0 * y = 3 * x - 1

contém mais de uma variável ou não? Fica a cargo do implementador decidir. Outro caso dúbio:

x * x + 2 * x = 3 * x + x * x + 8 - 4

Neste caso, os termos quadráticos se cancelam. Poderia ser aceita como de primeiro grau, mas também poderia ser recusada, a critério do implementador.

Na equação a seguir, o mesmo caso ocorre com os termos em y. Poderia ser aceita ou recusada.

y + x = y + 3

Na equação a seguir, o coeficiente de x é zero, mas pode não ser devido a problemas de arredondamento. Fica a cargo do implementador decidir o que fazer.

9 + (((1/1000001 - 1)*1000001)/1000000 + 1) * x = 2

No caso a seguir, ao ser realizada a multiplicação de cada lado da equação por um fator conveniente, resulta uma equação do primeiro grau. Mas a equação original envolve a divisão por (x - 2), o que impede que seja atribuído o valor x = 2. Isto pode servir de base para que esta equação seja considerada não de grau 1, pois expressões de grau 1 não têm limitações de domínio.

(x + 3)/(x - 2) = 3

No caso a seguir, pode-se tanto recusar a equação como soltar qualquer valor para sua resposta, já que qualquer valor será válido:

x + 1 = x + 1

Todos estes casos e outros semelhantes não serão usados nos testes abertos nem fechados do sistema de submissão (SuSy), e portanto o encaminhamento que for dado a eles pelo implementador é irrelevante para a avaliação de correção do programa, embora possa influir na avaliação das mensagens de diagnóstico.

Saída

Seu programa deverá imprimir no dispositivo de saída padrão o valor numérico da resposta à equação lida, ou a palavra "erro" se a entrada não for válida de acordo com as diretrizes descritas acima.

Para facilitar a depuração, outras informações podem ser escritas na saída padrão, da seguinte forma. Após o resultado, imprimir ponto-e-vírgula (";") seguido da informação extra desejada. O verificador de respostas corretas será instruído a ignorar tudo o que vier após o ponto-e-vírgula. Porém, em todos os casos, a saída padrão deverá ser constituída de uma única linha.

Avaliação

Em princípio, a nota recebida será composta da seguinte forma:

A nota de correção será o quociente entre o número de testes abertos e fechados acertados e o número total de testes abertos e fechados.

A nota de estilo avaliará o bom estilo declarativo do programador. Serão levados em conta aspectos como warnings, predicados ou cláusulas não usados ou desnecessários, nomes de predicados e variáveis, modularização, etc.

A nota de comentários avaliará a qualidade dos comentários dispostos no código. Este poderia ser um quesito do estilo, mas comentários são tão importantes que merecem um item de avaliação à parte.

A nota de mensagens de diagnóstico avaliará a qualidade da informação extra impressa a título de diagnóstico, especialmente nos casos em que a saída for "erro" e nos casos dúbios. Note que, apesar dos casos dúbios não constarem do SuSy, eles poderão ser usados em avaliações adicionais para o quesito de mensagens de diagnóstico.


MC346 Home

© 2016 João Meidanis