Raciocínio Não Monotônico e Abdução Gustavo Lacerda Jacques Robin CIn-UFPE Agente baseado em conhecimento dedutivo ou abdutivo Sensores Base de Conhecimento Intencional (BCI): regras, classes, formulas lógicas universalmente quantificadas Não Monotônica Ask Ambiente Máquina de inferência dedutiva ou abdutiva Tell Ask Retract Base de Conhecimento Extensional (BCE): fatos, objetos formulas lógicas instanciadas Atuadores Tipologia de raciocínio não monotônico Raciocínio sobre ações e mudanças em ambientes não estacionários Axiomatização em lógica monotônica de raciocínio não monotônico temporal: Cálculo situacional Cálculo de eventos Revisão não monotônica via retract de base de conhecimento extensional armazenando apenas fatos presentemente verdadeiros Manutenção da verdade da base de conhecimento depois de um retract Raciocínio hipotético com informação parcial em ambientes inacessíveis Negação por falha em programação em lógica Herança com sobrescrita em hierarquias de classes Abdução Revisão das crenças hipotéticas Causas da necessidade de tal revisão: Recepção sensorial ou comunicativa de novos fatos confirmados, e que contradiz hipótese default ou abduzida Tal contradição pode ser direta ou indireta via dedução Ações, Situações e Eventos Cálculo de Situações denota estados resultantes de ações Ontologia: tudo são termos lógicos * situações: A função Result(a,s) denota a situação que resulta quando a ação a é executada na situação s. * fluentes: funções e predicados que variam de uma situação para outra. e.g. ~Holding(G1, S0) quer dizer que o agente não está com o ouro na situação inicial S0. * predicados eternos: e.g. Gold(G1) (não se escreve a situação) Ações, Situações e Eventos Cálculo de Situações Além de ações individuais, nós podemos falar sobre seqüências de ações. Executar uma seqüência vazia não muda a situação: Result([],s) = s. Executar outras seqüências: executar a primeira ação e depois executar o resto na situação resultante: Result([a|seq],s) = Result(seq, Result(a,s)). Ações, Situações e Eventos Cálculo de Situações Duas coisinhas a lembrar: Toda situação, exceto S0, é o resultado de uma ação ou sequência de ações a partir de S0. Na nossa notação, a situação é sempre o último argumento Ações, Situações e Eventos Cálculo de Situações Projeção: dado um estado inicial e uma seqüência de ações, deduzir o estado final. Planejamento: dado um estado inicial e um estado final desejado, responder a pergunta: “que sequência de ações vai resultar no estado desejado?”. ou seja, quais valores de seq satisfazem At(G1, [1,1], Result(seq,S0))? (o objetivo sendo que o ouro G1 esteja na posição [1,1]) Ações, Situações e Eventos Cálculo de Situações Axiomas de Possibilidade: que ações são possíveis numa dada situação. e.g. “o agente pode se mover entre locais adjacentes” At(Agent,x,s) /\ Adjacent(x,y) => Poss(Go(x,y),s). e.g. “se o agente está segurando alguma coisa, ele pode soltar” Holding(g,s) => Poss(Release(g),s). Ações, Situações e Eventos Cálculo de Situações Axiomas de Consequências: quais propriedades (fluentes) vão ser “setadas” como resultado de executar a ação. e.g. Poss(Go(x,y),s) => At(Agent,y,Result(Go(x,y),s)). e.g. Poss(Grab(g),s) => Holding(g,Result(Grab(g),s)). Ações, Situações e Eventos Cálculo de Situações Agora vamos tentar usar um plano no mundo Wumpus: digamos que o objetivo é pegar o ouro G1, que está em [1,2], com o agente começando em [1,1]. A ação Go([1,1],[1,2]) funciona, e podemos dizer que o agente chegou lá: At(Agent[1,2],Result(Go([1,1],[1,2]),S0)) Agora, precisamos mostrar que é possível o agente pegar o ouro, ou seja… Ações, Situações e Eventos Cálculo de Situações • Queremos mostrar que é possível o agente pegar o ouro. • Já sabemos que o agente está em [1,2] • Só resta confirmar que o ouro também está lá… “o ouro está em [1,2] na nova situação” At(G1,[1,2],Result(Go([1,1],[1,2]),S0)) • Infelizmente, nada no nosso KB justifica essa conclusão. • O problema é que os axiomas de consequências dizem o que muda, mas não dizem o que fica igual. • Neste caso, a posição do ouro (antes de pegá-lo) • Este é o famoso frame problem. Ações, Situações e Eventos Frame Problem: Como representar as coisas que não mudam? Possíveis Soluções: Axiomas de Frame: para cada ação, para cada fluente, nós dizemos se/quando a ação não influencia o fluente. Desvantagem: o número de axiomas vai ser O(AF). Axiomas de Estado Sucessor: Ação é possível => (fluente é verdadeiro no estado resultante (a ação tornou o fluente verdadeiro \/ o fluente já era verdadeiro ) Os problemas das ramificações e da qualificação Ramificação: Se o agente está segurando uma mala, e o agente move, então a mala move com ele. Se dentro da mala tem uma banana, ela também move. E assim por diante... e.g.: em cima da p.333 Qualificação: para modelar o mundo real, uma regra precisa de muitas condições. Sempre vão existir os casos imprevisíveis, aonde as regras vão estar erradas ou incompletas. e.g.: Se a gosma do Wumpus melar o ouro, a ação “Grab” pode não funcionar. Exemplificar os dois no Wumpus com lógica (pegar exemplo do AIMA) Limitações do cálculo situacional Assume que o agente é o único causador de mudança do mundo Representa tempo de maneira pontual e não intervalar, indiretamente via situações. Representa a topologia do tempo, mas não a geometria, ou seja a ordem “antes e depois” é preservada, porém situações não diferenciam entre um intervalo de 1s e de 1 semana. “Cálculo de Eventos” supera essas limitações. Cálculo situacional x de eventos Regras do Mundo Wumpus Situation Calculus Event Calculus At(o,x,S0) ((o = Agent x = [1,1]) (o = G1 x = [1,2])). T = holds holds(at(Agent,[1,1],T0). holds(at(G1,[1,2],T0). Agent G1. Holding(o,SO). Gold(G1) Adjacent([1,1],[1,2]) Adjacent([1,2],[1,1]). Initiates(Go(x,y),At(Agent,y ),t). Initiates(Grab(g),Holding(g) ,t). AIMA pp.330-334 Cálculo de eventos Ontologia No Cálculo de Eventos, os predicados não são do domínio. Ver abaixo. Eventos Discretos: como ações, mas não precisam ser causadas por um agente Initiates(e,f,t) indica que o evento e no tempo t causa o fluente f a ser verdade. Terminates(w,f,t) indica que o evento e no tempo t causa o fluente f a não ser verdade. Happens(e,t) indica que o evento e acontece no tempo t. Clipped(f,t,t2) diz que f é terminado por algum evento entre t e t2. Ontologia do cálculo de eventos Eventos Líquidos: Eventos que não acontecem imediatamente. E(e,i) quer dizer que um evento tipo e ocorreu dentro do intervalo i. T(e,i) quer dizer que um evento tipo e ocorreu exatamente no intervalo i. Estados: Além de descrever processos de mudança contínua, eventos líquidos podem descrever processos de constância contínua. T(In(Shankar,NewYork),Today) quer dizer que Shankar passou o dia inteiro em NewYork. Intervalos: Podemos falar sobre as possíveis relações entre dois intervalos de tempo: Meet, Before, After, During, Overlap. Fluentes e objetos: O objeto “USA” é um evento que começou em 1776. Sua propriedade “President” é um fluente, que representamos assim: T(President(USA) = GeorgeWashington, AD1790). Limitações do cálculo de eventos Eficiência: para cada situação, você calcula o mundo inteiro novamente. Alto custo de memória e de processamento. Solução: sistemas de planejamento especializados. Raciocinar sobre crenças e conhecimento Seção 10.4 do AIMA Quando o agente raciocina sobre suas ações, ele pode: usar proposições sobre crenças e proposições, tanto de outros agente quanto dele mesmo. Ações podem ter precondições e efeitos de conhecimento. Por exemplo: a ação “discar o telefone de alguém” tem o conhecimento desse número como precondição; enquanto que a ação “procurar um número na lista telefônica” tem o efeito de saber o número. Raciocinar sobre crenças e conhecimento Seção 10.4 do AIMA Problema ao representar crenças: transparência referencial, ou seja, a gente sempre pode substituir um termo por outro que tenha o mesmo valor. (Superman = Clark) |= Believes(Lois,Flies(Superman)) Believes(Lois, Flies(Clark)) Raciocinar sobre crenças e conhecimento Uma solução é usar a lógica modal epistêmica / doxástica, que usa operadores referencialmente “opacos”. Num agente com um mínimo de racionalidade, (K(A B), K(A)) K(B) (A, K(A B)) ou (K(A), A B) são suficientes para concluir B, mas não para concluir K(B). Nós temos BLois(Flies(Superman)), mas não temos BLois (Superman = Clark) Então não podemos concluir que BLois(Flies(Clark)) (que bom!) Raciocinar sobre crenças e conhecimento Outra solução é usar aspas, com o unique string axiom e uma função de denotação: então temos den(“Superman”) = den(“Clark”) = Objeto4892, enquanto que “Superman” “Clark”. Refletir mudanças do ambiente em base de conhecimento instantânea com retract Codificar atualização do modelo do agente de um ambiente não estacionário usando: retract(old fact) e tell(new fact), no lugar de tell(new fact, new situation) Porém, surge o problema da manutenção da verdade O que foi deduzido a partir do fato retirado, tem que ser por sua vez retirado Executamos uma regra tipo Go(x,y): Com esse tipo de sistema, acontece o seguinte: tell(At(Agent,y)) retract(At(Agent,x)) simultaneamente Regra de ramificação do ouro andando junto ao agente quando está segurando o ouro permitiu prova a partir de At(Agent,x), Holding(G1). Precisamos retrair também At(G1,y). Exemplo do problema da manutenção da verdade no Mundo do Wumpus Parece ser eficiente em relação ao cálculo de eventos, já que não faz cópia de toda base para cada modificação do ambiente. Porém pode levar a um processo em cadeia, no qual se desfaz a maioria das deduções passadas. Repô-las pode ter um custo equivalente. Abordagem ingênua para manutenção de verdade: retrair tudo o que foi deduzido após a inclusão do fato que foi retraído recomeçar dedução de tudo que foi deduzido depois desse ponto (via resolução ou encadeamento de regras para frente) isto é INEFICIENTE Manutenção da verdade baseada em justificativa Abordagem JTMS (Justification-Based Truth Maintenance System): cada frase na KB é anotada com uma justificação (as frases a partir da qual ela foi inferida) Quando o Retract é executado, todas as frases que usavam a frase retraída como justificativa são re-avaliadas: se não passarem, elas serão retraídas também, recursivamente... E tudo o que não é mais justificável vai ser retraído nessa reação em cadeia. Porém as frases retraídas não são deletadas, pois elas podem voltar a ser consideradas no futuro. Desta maneira a cadeia de inferências é mantida caso a frase volte a ser considerada True. Vantagem: mais rápido que o sistema ingênuo quando há hipóteses que são consideradas True e False alternadamente. Limitações: mudança de contexto é ineficiente Além de permitir a retração de informação incorreta, TMSs em geral podem acelerar a análise de múltiplas hipóteses. Por exemplo, se a cidade das olimpíadas de 2048 mudar de Bucharest para Sibil, a cadeia pode ser re-usada. Manutenção da verdade baseada em suposição Cada frase é rotulada com o conjunto de assunções que a torna verdade. Desta maneira é fácil verificar se uma frase é deduzível ou não: é equivalente a testar “set containment”. Circunscrição Seção 10.7 do AIMA Versão mais poderosa da hipótese do mundo fechado Bird(x) Abnormal(x) Flies(x) Se Abnormal for circunscrito, um raciocinador circunscritivo pode assumir Abnormal(x) a menos que Abnormal(x) seja sabido. Republican(Nixon) Quaker(Nixon). Republican(x) Abnormal2(x) Pacifist(x). Quaker(x) Abnormal(x) Pacifist(x). Como o sistema resolve isso? * Dois modelos preferidos: Abnormal1(Nixon) e Abnormal2(x). O sistema fica corretamente indeciso sobre esta frase. * Porém, podemos usar circunscrição priorizada, aonde uma regra é dada mais importância que a outra. Lógica default Seção 10.7 do AIMA Usa regras default para gerar conclusões não-monotônicas. Bird(x) : Flies(x)/Flies(x). quer dizer se x é um pássaro, e “x voa” é consistente com a KB, então “x voa” pode ser concluído por default. Obviamente, a conclusão default estará sujeita a revisão. Abdução Conhecimento Prévio Causal em Intenção X co(X) ca(X) e(X) Conhecimento Prévio em Extensão: • Efeitos Observados e(a), e(b), ... • Causais Observadas Incompletas co(a), co(b), ... Abdução CPCI CPEC NCEC |= CPEE Viés sobre Hipóteses: X ca(X) Novo Conhecimento em Extensão: Causas Hipotéticas ca(a), ca(b) ... Abdução: exemplo A partir de: Conhecimento prévio causal em intenção: X,Y,T loc(agent,X,Y,T) orientation(0,T) do(forward,T) loc(wall,X+1,Y) loc(agent,X,Y,T+1) Conhecimento prévio em extensão incompleto de causas: loc(agent,4,1,1) orientation(0,1) do(forward,1) Conhecimento prévio em extensão de efeitos observados: loc(agent,4,1,2) Abduzir: Novo conhecimento em extensão de causa hipotética: loc(wall,5,1) Aplicações práticas da abdução em IA Tirado de p. 1 e 13-14 de Kakas-Denecker (KD), Seção 1.3 de Kakas-Kowalski-Toni (KKT) Diagnóstico de Falha (Diagnóstico médico): aqui a teoria descreve o comportamento “normal” do sistema. Quando se tem a observação que o comportamento está anormal, busca-se o componente anormal que explica esse comportamento anormal do sistema. Visão de Alto Nível: as hipóteses abduzíveis são os objetos a serem reconhecidos, e observações são descrições parciais dos objetos. Raciocínio Legal: para encontrar casos similares. Engenharia de Software: para resolver inconsistências em requirementos de sistemas Constraint Solving Problems: Quebra-cabeças lógicos, N-Queens, problemas de planejamento no mundo dos blocos, etc. Formulações lógicas da abdução Seções 1-3 de KD Seções 1.2-1.3 de KKT Dada uma teoria conhecida P, uma explicação abdutiva para um query Q é um conjunto de átomos abduzíveis tal que: Visão de derivação: (P Q) (P | False) (P IC) Visão de consistência: (P Q) (P IC | False) Esta escolha vai depender do que você quer fazer Viés sobre hipóteses abdutivas: objetivos pp. 4-6 de KKT Encontrar conjunto de hipótese mais conciso e mais geral Encontrar causas explicando os efeitos observados, no lugar de encontrar co-efeitos das mesmas causas subjacentes Encontrar causas mais profundas (básicas), no lugar de causas intermediárias, efeitos dessas causas profundas Encontrar um número mínimo que causas que expliquem o máximo de observações Considerar apenas instâncias de um conjunto prédefinido de predicados chamado de abduzíveis. Geralmente escolhidos dentro dos predicados sem definição intencional na base de conhecimento Podem ser estratificados em níveis de preferências Viés sobre hipóteses: predicados abduzíveis Exemplo: grass-is-wet rained-last-night grass-is-wet sprinkler-was-on shoes-are-wet grass-is-wet Para a observação shoes-are-wet: A explicação {grass-is-wet} não é básica enquanto {rained-last-night} e {sprinkler-was-on} são. A explicação {rained-last-night, sprinkler-was-on} não é mínima. Viés sobre hipóteses abdutivas: restrições de integridade Excluir hipóteses que: Violam diretamente um conjunto pré-definido de restrições de integridades Cuja inclusão na base de conhecimento permite deduzir fatos que violam uma dessas restrições Logicamente: Exemplo: At(Wumpus(x)) At(Wumpus(y) x = y sprinkler choveu false Viés sobre hipóteses abdutivas: minimização Excluir conjunto de hipóteses que podem ser explicadas em termos de (i.e., deduzidas a partir de) outras hipóteses igualmente válidas Exemplo: grassIsWet, quando sabemos sprinkler-was-on Preferir conjunto de hipóteses com maior número de efeitos observados (corroboração) Exemplo: formigasDeAsas corrobora chuva e não sprinkler Preferir conjunto de hipóteses mais geral Exemplo: Preferir conjunto de hipóteses mais conciso: quanto menos prerequisitos, mais plausível é que as hipóteses sejam verdade. Exemplo: Dedução Conhecimento Prévio Causal em Intenção X c(X) e(X) Conhecimento Prévio em Extensão: Causas Observadas c(a), c(b), ... Dedução CPEC CPCI |= NCEE Novo Conhecimento em Extensão: Efeitos Previstos e(a), e(b) ... Conhecimento Prévio Diagnóstico em Intenção X e(X) c(X) Conhecimento Prévio em Extensão: Efeitos Observados e(a), e(b), ... Dedução CPDI CPEE |= NCEC Novo Conhecimento em Extensão: Causas c(a), c(b) ... Dedução: exemplos A partir de: Conhecimento prévio causal em intenção: X,Y,T loc(agent,X,Y,T) orientation(0,T) forward(T) loc(wall,X+1,Y) loc(agent,X+1,Y,T+1) Conhecimento prévio em extensão de causas observadas: loc(agent,1,1,1) orientation(0,1) forward(1) loc(wall,2,1) Deduzir: Novo conhecimento em extensão de efeito previsto: loc(agent,2,1,2). A partir de: Conhecimento prévio diagnóstico em intenção: X,Y,T loc(agent,X,Y,T) smell(stench,T) smelly(X,Y). X,Y smelly(X,Y) loc(wumpus,X+1,Y) loc(wumpus,X-1,Y) loc(wumpus,X,Y+1) loc(wumpus,X,Y-1)). Conhecimento prévio em extensão de efeito observado smell(stench,3) loc(agent,2,2,3) Deduzir: Novo conhecimento em extensão de causa hipotética: loc(wumpus,3,2) loc(wumpus,1,2) loc(wumpus,2,3) loc(wumpus,2,1)). Indução Conhecimento Prévio Causal em Intenção Incompleto X c(X) i(X) Conhecimento Prévio em Extensão: • Efeitos Observados e(a), e(b), ... • Causais Observadas c(a), c(b), ... Indução CPCI NCCI CPEC |= CPEE Viés sobre Hipóteses: X,Y i(X) Y(X) Novo Conhecimento Causal Hipotético em Intenção X i(X) e(X) Indução: exemplo A partir de: Conhecimento prévio em extensão: loc(wall,1,1) loc(wall,0,1) loc(wall,1,2) loc(0,2) ... loc(wall,4,5) loc(wall,4,4) loc(wall,3,5) loc(wall,3,4) ... Viés sobre hipótese: P1,P2,P3,P4 {>,<,=}, C {, }, Q1,Q2,Q3 {,}: Q1U1,U2,U3,U4 Q2V1,V2,V3,V4 Q3W P1(U,V1) P2(U,V2) P3(U,V3) P4(U,V4) loc(W,U,V) Induzir: Novo conhecimento em intenção: X,Y X<1 X>4 Y<1 Y>4 loc(wall,X,Y) Variação: Conhecimento prévio em intenção: X,Y,H,W X<1 X>H Y<1 Y>W loc(wall,X,Y)