Negação Com os mecanismos que estudámos até agora não é possível derivar informação negativa de um programa: dada uma fórmula atómica chã p e um programa P, P {p} admite sempre um modelo (e.g. a base de Herbrand de P) e, portanto, p não é consequência lógica de P. Qual o interesse de derivar conclusões negativas? Universidade da Madeira Departamento de Matemática Elsa Carvalho 262 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação Considere-se o programa rei(joaoII) rei(afonsoV) rei(duarte) pai(joaoII, afonsoV) pai(afonsoV, duarte) Suponhamos que queríamos estabelecer que o rei D. Duarte não é pai do rei D. João II. A fórmula pai(joaoII, duarte) não é consequência lógica do programa. No entanto, pai(joaoII, duarte) também não é! Universidade da Madeira Departamento de Matemática Elsa Carvalho 263 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação Hipótese (regra) do mundo fechado (closed world assumption) Dado um programa P e uma fórmula atómica chã p, se p não é consequência lógica de P, podemos inferir p. Trata-se de uma regra particularmente intuitiva no contexto de bases de dados (colecção de factos), ou seja, assume-se que toda a informação que não está explicitamente presente na base de dados é falsa. Universidade da Madeira Departamento de Matemática Elsa Carvalho 264 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação A adequação ou não desta regra tem de ser determinada para cada aplicação. Por exemplo, aplicando a regra podemos inferir tanto rei(mario) como rei(joaoI). A HMF assume que o programa possui conhecimento completo sobre o domínio. Trata-se de uma regra não monotónica, ou seja, por adição de novos axiomas (por exemplo rei(joaoI)), deixamos de poder derivar certas conclusões. Universidade da Madeira Departamento de Matemática Elsa Carvalho 265 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação Questão Como aplicar esta regra no caso geral? O problema de determinar se p é consequência de P não é decidível, isto é, não existe algoritmo que tome um p arbitrário como entrada e responda em tempo finito. Se p não for consequência de P, podemos entrar num ciclo infinito. Regra da Falha Finita Dado um programa P e uma fórmula atómica chã p se a árvore SLD para P e p é finita e só contém derivações falhadas (ramos que terminam com ) então podemos inferir p. Universidade da Madeira Departamento de Matemática Elsa Carvalho 266 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação Um objectivo normal é uma colecção de literais (fórmulas atómicas ou negação de fórmulas atómicas). Se p é uma fórmula atómica chã, a chamada a (p) falha se a chamada a p é bem sucedida, e é bem sucedida se a chamada a p falha em tempo finito. Vamos mostrar a árvore de execução do objectivo normal rei(X), pai(afonsoV, X) sobre o programa anterior Universidade da Madeira Departamento de Matemática Elsa Carvalho 267 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo rei(X), pai(afonsoV, X) pai(afonsoV, joaoII) pai(afonsoV, duarte) pai(afonsoV, joaoII) pai(afonsoV, duarte) X/joaoII pai(afonsoV, afonsoV) pai(afonsoV, joaoII) X/afonsoV Universidade da Madeira Departamento de Matemática Elsa Carvalho 268 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Negação Uma cláusula normal é um par p q1, ..., qn onde q1, ..., qn são literais (fórmulas atómicas ou negações de fórmulas atómicas). Um programa normal é um conjunto de cláusulas normais. diferentes(X, Y) membro(Z, X), membro(Z, Y) diferentes(X, Y) membro(Z, Y), membro(Z, X) Uma regra de computação diz-se segura quando nunca selecciona um literal negativo que não seja chão. Universidade da Madeira Departamento de Matemática Elsa Carvalho 269 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Define-se do seguinte modo a árvore (SLD)NF para um programa P e um objectivo G normais via uma regra de computação segura S: a raiz é G seja q1, ..., qk, ..., qn um nó e suponha-se que é qk é seleccionado por S. se qk é um literal positivo, então o nó tem um descendente para cada um dos objectivos deriváveis (possivelmente nenhum) se qk é um literal negativo chão pk e existe uma árvore SLDNF finita falhada (sem ramos bem sucedidos) para P e pk, então o único descendente é q1, ..., qk-1, qk+1,..., qn se qk é um literal negativo chão pk e existe uma refutação SLDNF para P e pk, então o nó não tem descendentes o nó vazio não tem descendentes Universidade da Madeira Departamento de Matemática Elsa Carvalho 270 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF A resolução SLDNF é a extensão da resolução SLD com a regra da falha finita (SLD + Negation by Failure) Definem-se ainda por generalização os conceitos de derivaçãoSLDNF, refutação-SDLNF e resposta derivada por uma refutação-SLDNF. Ramos que terminam por se ter atingido um nó que contém apenas literais negativos dos quais nenhum é chão não correspondem a derivações (a regra de computação não é aplicável), correspondem a computações atoladas. Universidade da Madeira Departamento de Matemática Elsa Carvalho 271 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo Qual a importância de restringir a selecção de literais negativos aos que são chãos? Suponhamos que enriquecíamos o programa da dinastia com: pai_de_todos(X) pai_normal(X) pai_normal(X) pai(Y,X) (está-se a ler o predicado pai como X é pai de Y) Qual será o comportamento do programa face ao objectivo pai_de_todos(afonsoV) se a restrição de segurança for levantada? Universidade da Madeira Departamento de Matemática Elsa Carvalho 272 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo (cont.) pai_de_todos(afonsoV) pai_normal(afonsoV) pai_normal(afonsoV) pai(Y, afonsoV) pai(Y, afonsoV) Universidade da Madeira Departamento de Matemática Elsa Carvalho 273 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF A resposta obtida é manifestamente incorrecta: existe alguém de quem afonsoV não é pai, i.e., existe um Y tal que pai(Y, afonsoV) falha, nomeadamente Y = duarte, o que faz de afonsoV um pai_ normal e não pai_de_todos ! De facto a leitura intuitiva da chamada pai(Y,afonsoV) é, à semelhança da leitura para literais positivos, “encontrar um Y tal que pai(Y,afonsoV)”. Assim, a cláusula pai_normal(X) pai(Y,X) corresponde à fórmula pai_normal(X) (Y)pai(Y,X) Universidade da Madeira Departamento de Matemática Elsa Carvalho 274 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Ora, a semântica procedimental é totalmente diferente. Esta chamada falha porque a chamada pai(Y, afonsoV) é bem sucedida. Quer dizer, a cláusula pai_normal(X) pai(Y,X) está a ser interpretada como correspondendo a pai_normal(X) (Y)pai(Y,X) Logo, as chamadas negativas não chãs não são coerentes com a semântica declarativa, e podem gerar respostas incorrectas. Universidade da Madeira Departamento de Matemática Elsa Carvalho 275 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Como implementar regras de computação seguras? A maneira mais simples de implementar a condição de segurança num sistema Prolog é adiar as chamadas negativas até que se encontrem instanciadas em termos chãos, e interromper a execução quando só for possível seleccionar literais negativos não chãos. Mas isto é caro pois implica aceder à estrutura das chamadas. A maioria dos sistemas não se dá a esse trabalho o que implica programas potencialmente incorrectos e nos quais tem que ser o programador a garantir que as chamadas negativas só são activadas quando chãs. Universidade da Madeira Departamento de Matemática Elsa Carvalho 276 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF É possível estabelecer condições sobre P e G de modo a garantir que nenhuma computação ficará atolada. Uma cláusula de programa C diz-se admissível se toda a variável que ocorre em C ocorre ou na cabeça ou num literal positivo do corpo de C. Por exemplo, a seguinte cláusula é admissível: diferentes(X, Y) membro(Z, X), membro(Z, Y) Uma cláusula de programa C diz-se permitida se toda a variável que ocorre em C ocorre em pelo menos um literal positivo do corpo de C. Por exemplo a cláusula anterior não é permitida. Universidade da Madeira Departamento de Matemática Elsa Carvalho 277 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Um objectivo G diz-se permitido se toda a variável que ocorre em G ocorre em pelo menos um literal positivo de G. Dizemos que um programa P é permitido para um objectivo G sse toda a cláusula de P é admissível todas as cláusulas que fazem parte dos procedimentos que definem símbolos de predicado que ocorrem em literais positivos de G são permitidas todas as cláusulas que fazem parte dos procedimentos que definem símbolos de predicado que ocorrem em literais positivos no corpo de cláusulas de P são permitidas Universidade da Madeira Departamento de Matemática Elsa Carvalho 278 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Se G é um objectivo permitido e P é um programa permitido para G, nenhuma computação para P e G fica atolada. O enriquecimento do programa dinastia com: pai_de_todos(X) pai_normal(X) pai_normal(X) pai(Y,X) não é permitido para o objectivo pai_de_todos(afonsoV). Universidade da Madeira Departamento de Matemática Elsa Carvalho 279 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Substituindo estas cláusulas por: pai_de_todos(X) rei(X), pai_normal(X) pai_normal(X) rei(Y), pai(Y,X) o programa fica permitido para o mesmo objectivo pois apesar de pai_normal(X) rei(Y), pai(Y,X) não ser permitida, o símbolo de predicado pai_normal não ocorre em literais positivos quer do objectivo quer do corpo das cláusulas. Logo, as cláusulas que o definem não precisam de ser permitidas, basta que sejam admissíveis. Universidade da Madeira Departamento de Matemática Elsa Carvalho 280 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Resolução SLDNF Note-se que a adição das chamadas a rei requer que se prove que as cláusulas que definem rei são permitidas! Neste caso, o comportamento procedimental é correcto face à leitura declarativa das cláusulas: pai_normal(X) (Y)(rei(Y) pai(Y,X)) Universidade da Madeira Departamento de Matemática Elsa Carvalho 281 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)