80 likes | 166 Views
Luís Rodrigues – 30434010 Universidade dos Açores - 2008. A Negação na Programação em Lógica e no Prolog. O QUE É A NEGAÇÃO?. Negação é uma operação básica unária que resulta verdadeira quando o seu argumento é falso, e falso caso contrário.
E N D
Luís Rodrigues – 30434010 Universidade dos Açores - 2008 A Negação na Programação em Lógica e no Prolog
O QUE É A NEGAÇÃO? • Negação é uma operação básica unária que resulta verdadeira quando o seu argumento é falso, e falso caso contrário. • O Prolog inclui a operação de negação, no entanto essa operação não corresponde exactamente à operação de negação lógica.
A NEGAÇÃO NO PROLOG • No Prolog a negação é realizada pelo predicado not. • O argumento para este predicado é o que queremos verificar na sua forma negada.
DEFINIÇÃO DA NEGAÇÃO not(G) :- G, !, fail. not(G). • Pela primeira clausula temos que se o predicado G for verdadeiro, o predicado not vai falhar, e o cut impede qualquer possibilidade de backtracking. • Se G for falso, então pela segunda clausula, o predicado not é verdadeiro.
EXEMPLO DE UTILIZAÇÃO voa(X) :- ave(X), not(pinguim(X)). • Assumindo que os predicados ave e pinguim estão bem definidos algures, pela clausula anterior vemos que o predicado voa(X) só será verdadeiro se X não falhar no predicado ave mas falhar no predicado pinguim. • X voa se X for uma ave e X não for um pinguim.
LIMITAÇÕES • Em certas situações a utilização da negação pode levar situações onde os resultados esperados intuitivamente não são de facto alcançados. • Da negação é impossível instanciar valores para as variáveis. Apenas retorna sucesso ou falha.
EXEMPLOS DAS LIMITAÇÕES I candidato_bombeiro(X) :- not(piromaniaco(X)), pontual(X). piromaniaco(nero). pontual(joao). • Se fizermos a pesquisa candidato_bombeiro(W). no exemplo anterior, seria de esperar receber a resposta W=joao, mas a negação vai anular a resposta do predicado pontual. • Esta situação pode ser resolvida trocando a ordem dos predicados verificados.
EXEMPLOS DAS LIMITAÇÕES II verificar(G) :- not(not(G)). • Intuitivamente sabemos que a clausula anterior é logicamente idêntica à clausula verificar(G) :- G. que deveria resultar sempre os valores instanciáveis de G. • Em programação lógica isso não é verdade. A dupla negação, ao contrário de na lógica de primeira ordem, não é equivalente ao predicado. • Nota: Em ProLog a clausula acima nem sequer é válida.