2.Características necessárias para Resolução
2.1.Conceitos de Lógica Proposicional
Para a negação de uma expressão proposicional, foi necessário abordar as seguintes regras.
A regra not ( not (a) ) <=> a é manipulada através do predicado recursivo simplifica(X,Y).
As demais são manipuladas pelo predicado recursivo negacao(X,Y).
Para manipulação correta dos operadores devemos avaliar a precedência dos mesmos.
Quando uma entrada como a or b and c for dada devemos saber se deve ser considerada como:
(a or b) and c ou a or (b and c)
Identificamos que a segunda opção será a tomada como correta e que a precedência dos operadores pode ser descrita
como:
2.2.Operadores
Utilizando a notação de operadores em Prolog e utilizando a ordem de precedência vista anteriormente
podemos declará-los como:
Onde o not é um operador prefixo e os demais infixos.
x e y representam respectivamente argumento cuja precedência é estritamente menor que a do operador, e
argumento cuja precedência é menor ou igual a do operador. [Bratko].
2.3.Recursividade e uso de Cortes
A funcionalidade do programa depende basicamente de dois predicados recursivos que já foram descritos
anteriormente:
simplifica(X,Y)
negacao(X,Y).
A segunda realiza a negação da operação de acordo com a regra e precedência apropriadas e utiliza a simplifica
para aplicar a regra de equivalência (not (not a ) <=> a).
A primeira por sua vez, recursivamente, vai retirando da expressão dois operadores not a cada chamada do
realizada ao predicado.
O uso de cortes garante a eficiência na execução uma vez que se uma das regras declaradas pelo predicado
negacao já foi satisfeita, não deve haver execução de outra regra (clausula).
2.4.Entrada e Saída
A entrada deve ser dada através da linha de comando, adicionando a expressão (operandos e operadores separados
por espaço) a ser negada ao predicado neg.
Ex.:
neg(a and b).
Parênteses podem ser usados para indicar a a precedência.
A saída é a expressão gerada pela negação da expressão de entrada, estas são mostradas por uma janela.