Inferência em
Lógica de Primeira Ordem
Sumário
• Inferência em lógica proposicional vs.
inferência em lógica de primeira ordem
• Unificação
• Modus Ponens Generalizado
• Encadeamento para a frente
• Encadeamento para trás
Instanciação Universal
• A partir de uma frase com um quantificador universal, podemos inferir uma frase que resulta da substituição da variável por um termo sem variáveis
v α
Subst({v/g}, α)
• E.g., x Rei(x) Ambicioso(x) Malvado(x) permite inferir:
Rei(João) Ambicioso(João) Malvado(João)
Rei(Ricardo) Ambicioso(Ricardo) Malvado(Ricardo)
Rei(Pai(João)) Ambicioso(Pai(João)) Malvado(Pai(João))
. . .
Instanciação Existencial
• Para uma frase α, uma variável v, e uma constante k
que
não
aparece em nenhuma frase da base de
conhecimento
v α
Subst({v/k}, α)
• E.g., A partir de x ECoroa(x) NaCabeca(x,João)
podemos inferir ECoroa(C
1) NaCabeca(C
1,João
)
desde que C
1seja um símbolo de constante novo,
chamado
constante de Skolem
• A frase que contém o quantificador existencial pode ser
eliminada equivalência por inferência
Redução para inferência
proposicional
Consideremos que a BC contém as seguintes frases:
x Rei(x) Ambicioso(x) Malvado(x) Rei(João)
Ambicioso(João)
Irmãos(Ricardo,João)
• Instanciando a frase com de todas as formas possíveis, obtemos:
Rei(João) Ambicioso(João) Malvado(João)
Rei(Ricardo) Ambicioso(Ricardo) Malvado(Ricardo) Rei(João)
Ambicioso(João)
Irmãos(Ricardo,João)
• A BC está proposicionalizada, ou seja, contém apenas símbolos
proposicionais:
Redução (cont.)
• Todas as BC em LPO podem ser proposicionalizadas de
modo a preservar as consequências lógicas
• Uma termo sem variáveis é consequência da nova BC
sse é consequência lógica da BC original
• Ideia: proposicionalizar BC e frase que é consequência
lógica – aplicar resolução para fazer a prova
• Problema:
para símbolos de função o número de termos
sem variáveis é infinito
Redução (cont.)
Teorema [Herbrand,1930] Se uma frase α é consequência lógica de uma BC em LPO, então α é consequência lógica de um
subconjunto finito da BC proposicionalizada Ideia: Para n = 0 ∞
criar uma BC proposicional instanciando termos até à profundidade n verificar se α é consequência lógica da BC
Problema: funciona se α é efectivamente consequência lógica, não termina se α não é consequência lógica
Teorema [Turing,1936][Church,1936] Consequências lógicas em LPO são semi-decidíveis, i.e. existem algoritmos que identificam
consequências lógicas, mas não existem algoritmos que identifiquem frases que não são consequências lógicas
P
roposicionalização:
problemas
• Proposicionalização pode gerar muitas frases irrelevantes • E.g., a partir de:
x Rei(x) Ambicioso(x) Malvado(x) Rei(João)
y Ambicioso(y)
Irmãos(Ricardo,João)
• Parece óbvio inferir Malvado(João), mas a proposicionalização
produz outros factos como Ambicioso(Ricardo) que são irrelevantes • Para p predicados com aridade k e n constantes, existem p·nk
Unificação
x Rei(x) Ambicioso(x) Malvado(x)
• Se conseguimos encontrar uma substituição θ para x para a qual se verifica Rei(x) e Ambicioso(x) então podemos inferir Malvado(x)
• Genericamente: se conseguirmos encontrar uma substituição θ que converta a premissa de uma implicação numa frase já existente na BC, então podemos derivar a conclusão da implicação após
efectuada a substituição θ Exº
• x Rei(x) Ambicioso(x) Malvado(x) • Rei(João)
• y Ambicioso(y)
θ = {x/João,y/João} permite inferir Malvado(João)
• Unificação = identificação de uma substituição que permita que duas frases sejam logicamente equivalentes
Unificação: exemplo
• Unificação(α,β) = θ se αθ = βθ α β θ Conhece(João,x) Conhece(João,Rita) Conhece(João,x) Conhece(y,Isabel) Conhece(João,x) Conhece(y,Mãe(y)) Conhece(João,x) Conhece(x,Isabel)Unificação: exemplo
• Unificação(α,β) = θ se αθ = βθ
α β θ
Conhece(João,x) Conhece(João,Rita) {x/Rita}
Conhece(João,x) Conhece(y,Isabel) Conhece(João,x) Conhece(y,Mãe(y)) Conhece(João,x) Conhece(x,Isabel)
Unificação: exemplo
• Unificação(α,β) = θ se αθ = βθ
α β θ
Conhece(João,x) Conhece(João,Rita) {x/Rita}
Conhece(João,x) Conhece(y,Isabel) {x/Isabel,y/João}
Conhece(João,x) Conhece(y,Mãe(y)) Conhece(João,x) Conhece(x,Isabel)
Unificação: exemplo
• Unificação(α,β) = θ se αθ = βθ
α β θ
Conhece(João,x) Conhece(João,Rita) {x/Rita}
Conhece(João,x) Conhece(y,Isabel) {x/Isabel,y/João}
Conhece(João,x) Conhece(y,Mãe(y)) {y/João,x/Mãe(João)}
Unificação: exemplo
• Unificação(α,β) = θ se αθ = βθ
α β θ
Conhece(João,x) Conhece(João,Rita) {x/Rita}
Conhece(João,x) Conhece(y,Isabel) {x/Isabel,y/João}
Conhece(João,x) Conhece(y,Mãe(y)) {y/João,x/Mãe(João)}
Estandardização
• Conhece(João,x) e Conhece(x,Isabel) poderão ser
unificados se substituirmos x por outra variável
• Esta unificação faz sentido
– Conhece(João,x) significa que o João conhece toda a gente
– Conhece(x,Isabel) significa que a Isabel é conhecida por toda a gente
– Logo, o João conhece a Isabel
• Estandardização = renomeação de variáveis numa das
duas frases a serem unificadas para evitar conflitos nos
nomes das variáveis
• Conhece(João,x) e Conhece(y,Isabel) pode ser
unificado com {x/Isabel,y/João}
Unificação: UMG
• Para unificar Conhece(João,x) e Conhece(y,z),
θ = {y/João, x/z } ou θ = {y/João, x/João, z/João}
• A primeira substituição é
mais genérica
do que
a segunda.
• Existe um único
unificador mais geral
(UMG):
efectua o menor número de substituições para
unificar dois termos
Algoritmo de Unificação
Função
Unifica(x,y,
) devolve
uma substituição que unifica x e y
(x e y são variáveis, constantes, compostos ou listas,
inicialmente vazio)
se
=falha então devolve falha
senão se x=y então devolve
senão se
Variável?(x) então devolve UnificaVar(x,y,
)
senão se
Variável?(y) então devolve UnificaVar(y,x,
)
senão se
Composto?(x) e Composto?(y) então
devolve
Unifica(Args[x],Args[y],Unifica(Op[x],Op[y],
))
senão se
Lista?(x) e Lista?(y) então
devolve
Unifica(Rest[x],Rest[y],Unifica(First[x],First[y],
))
senão devolve falha
Algoritmo de Unificação
Função
UnificaVar(var,x,
) devolve
uma substuição
(x é uma expressão)
se {var/val}
então devolve
Unifica(val,x,
)
senão se {x/val}
então devolve
Unifica(var,val,
)
senão se
VerificaOcorrencia?(var,x) então devolve falha
senão
adiciona {var/x} a
VerificaOcorrencia?(var,x) verifica se var ocorre na expressão x Complexidade do algoritmo é quadrática na dimensão das expressões que pretendemos unificar
Modus Ponens Generalizado
(MPG)
p1', p2', … , pn', ( p1 p2 … pn q) qθ p1' é Rei(João) p1 é Rei(x) p2' é Ambicioso(y) p2 é Ambicioso(x) θ é {x/João,y/João} q é Malvado(x) q θ é Malvado(João)• MPG usado com BC com cláusulas que têm exactamente um literal positivo: (p1 p2 … pn q) equivale a (p1 p2 … pn q)
• Todas as variáveis estão quantificadas universalmente
Solidez de MPG
•
É preciso provar que
p
1', …, p
n', (p
1 … p
n q) ╞ qθ
quando temos p
i'θ = p
iθ para todo o i
•
Lema: Para qualquer frase p, temos p ╞ pθ pela
instanciação universal
1. (p1 … pn q) ╞ (p1 … pn q)θ = (p1θ … pnθ qθ) 2. p1', … ,pn' ╞ p1' … pn' ╞ p1'θ … pn'θ
Exemplo: base de conhecimento
• Do ponto de vista legal, um Americano é um criminoso
por vender armas a nações hostis. O país Nono, um
inimigo da América, possui alguns mísseis, e todos
estes mísseis foram-lhe vendidos pelo Coronel West,
que é Americano.
Exemplo: base de
conhecimento (cont.)
... um Americano é um criminoso por vender armas a nações hostis:
Americano(x) Arma(y) Vende(x,y,z) Hostil(z) Criminoso(x)
Nono … possui alguns mísseis, i.e., x Possui(Nono,x) Míssil(x):
Possui(Nono,M1) e Missil(M1) [instanciação existencial]
… todos os mísseis foram-lhe vendidos pelo Coronel West
Missil(x) Possui(Nono,x) Vende(West,x,Nono)
Mísseis são armas:
Missil(x) Arma(x)
Um inimigo da América é considerado “hostil”:
Inimigo(x,America) Hostil(x)
West é Americano …
Americano(West)
O país Nono é um inimigo da América …
Encadeamento progressivo:
algoritmo
Função EP-LPO-Pergunta(BC,) devolve uma substuição ou falso
(var.local) novo conjº de frases inferidas em cada iteração repetir até novo ser vazio
novo { } paracada frase r na BC (p1 … pn q) estandardização(r) paracada t.q. (p1 … pn q) = (p1‘ … pn‘ q) para algum p1‘, …, pn‘ na BC q’ q
se q’ não é uma renomeação de uma frase na BC ou em novo então adicionar q’ a novo
Unifica(q’,)
se não é falha então devolve adiciona novo à BC
devolve falso
Encadeamento progressivo: prova
Propriedades do
encadeamento progressivo
• Sólido e completo para cláusulas na forma (p
1
…
p
n q) em lógica de primeira ordem
• Datalog
= cláusulas na forma (p
1 … p
n q)
em lógica de primeira ordem +
não há funções
• EP termina para Datalog num número finito de
iterações
• Não termina se α não é consequência lógica
• Não podemos resolver este problema:
Eficiência do encadeamento
progressivo
Encadeamento progressivo incremental: só é necessário
fazer um emparelhamento de uma frase na iteração k se
uma premissa tiver sido adicionada na iteração k-1
Emparelhar cada frase cuja premissa contém um novo literal positivo
Emparelhamento pode ser dispendioso:
Bases de dados indexadas
permitem encontrar factos
conhecidos em tempo constante (O(1))
– e.g., pergunta Missil(x) responde Missil(M1)
Encadeamento progressivo é muito usado em
bases de
dados dedutivas
Emparelhamento: exemplo
Míssil(x) Possui(Nono,x) Vende(West,x,Nono)
• Podemos obter os objectos possuídos pelo Nono em
tempo constante, e depois verificar se algum desses
objectos é um míssil
• Se existirem muitos objectos possuídos pelo Nono e
poucos mísseis, então é preferível começar por obter os
mísseis e posteriormente verificar quais são possuídos
pelo Nono
Emparelhamento difícil: exemplo
• ColoracaoOK() é inferido sse o CSP tem solução
• Dificilmente conseguimos perceber qual a ordem a
seguir para fazer o emparelhamento de menor custo
Diff(wa,nt) Diff(wa,sa) Diff(nt,q) Diff(nt,sa) Diff(q,nsw) Diff(q,sa) Diff(nsw,v) Diff(nsw,sa) Diff(v,sa) ColoracaoOK()
Diff(Verm,Azul) Diff (Verm,Verde) Diff(Verde,Verm) Diff(Verde,Azul) Diff(Azul,Verm) Diff(Azul,Verde)
Emparelhamento difícil: soluções
• Objectivo: encontrar uma ordenação óptima de
modo a que o custo do emparelhamento seja
minimizado difícil para problemas
NP-difíceis!
• Solução: uso de heurísticas; e.g. escolher
variável com mais restrições
Encadeamento regressivo: algoritmo
SUBST(COMPOE(θ1, θ2), p) = SUBST(θ2, SUBST(θ1, p))
Função ER-LPO-Pergunta(BC,objectivos,)
devolve conjunto de substituições
, substituição actual, inicialmente { }
(var.local) resp, conjº de substituições, inicialmente { }
se objectivos está vazio então devolver {} q’ Substitui(,First(objectivos))
paracada r em BC onde estandardização(r) = (p1 … pn q)
e ’ Unifica(q,q’) não falha resp ER-LPO-Pergunta(BC,[p1,…,pn|Rest(objectivos)],
COMPOE(, ’)) resp
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Encadeamento regressivo:
exemplo
Propriedades do
encadeamento regressivo
• Prova com procura em profundidade com
recursão: espaço é linear no tamanho da prova
• Incompletude devido a ciclos infinitos
– Podem ser evitados comparando o objectivo actual
com os objectivos na pilha
• Ineficiente devido à existência de sub-objectivos
repetidos (tanto com sucesso como falha)
– Guardar em memória resultados obtidos
anteriormente memória adicional
Programação em Lógica: Prolog
• Algoritmo = Lógica + Controlo
• Base: encadeamento regressivo com cláusulas de Horn
Fácil prototipagem, manipulação de símbolos (e.g. compiladores, parsing de língua natural)
• Programa = conjunto de cláusulas = cabeça :- literal1, … literaln.
criminoso(X) :- americano(X), arma(Y), vende(X,Y,Z), hostil(Z).
• Encadeamento regressivo: profundidade, esquerdadireita
• Predicados pré-definidos para aritmética etc., e.g., X is Y*Z+3. • Predicados pré-definidos com efeitos colaterais
• Mundo fechado
– e.g., considerando vivo(X) :- not morto(X). – vivo(joão) é verdade se morto(joao) falha
Prolog (1)
• Concatenação de duas listas para produzir uma terceira lista: append([],Y,Y). append([A|X],Y,[A|Z]) :- append(X,Y,Z).
• Aparentemente semelhante à definição de Lisp mas com mais funcionalidades
• Questão: append(A,B,[1,2]) ? • Respostas: A=[] B=[1,2]
A=[1] B=[2] A=[1,2] B=[]
Prolog: append
Procedimento Append(ax,y,az)
caminho ApontadorGlobalCaminho()
se ax=[] e Unifica(y,az) então continua
ResetCaminho(caminho)
a NovaVariavel(), x NovaVariavel(), z NovaVariavel()