Edit page

Lógica de Primeira Ordem II

Tal como para a Lógica Proposicional, é possível automatizar alguns aspetos relacionados com a Lógica de Primeira Ordem. Em relação ao sistema dedutivo, vamos voltar a olhar para a resolução. Além disso, olhamos agora para a Lógica de Primeira Ordem como forma de representar conhecimento sobre um dado contexto - um mundo.

Representação do Conhecimento

Aviso

Se estiverem apenas a estudar para a avaliação das práticas, as secções dos agentes cognitivos e das hipóteses subjacentes não são particularmente relevantes. A secção Representar Conhecimento em Lógica volta a ser relevante para esse propósito.

Tem como objetivo principal fornecer a um computador declarações sobre um domínio, com vista a permitir que o próprio computador realize operações inteligentes sobre esse mesmo domínio. Ligada à área da Inteligência Artificial.

Agentes cognitivos

A inteligência artificial constrói programas que agem tendo por base uma representação do conhecimento, os agentes cognitivos. São sensores que permitem que o computador se aperceba e possa agir em relação ao mundo que o rodeia; os procedimentos têm apenas por base aquilo que o computador sabe sobre o mundo.

Os agentes cognitivos têm como componentes principais a base de conhecimento, que contém uma representação do mundo, e o motor de inferência, conjunto de procedimentos independentes do conhecimento representado que manipulam a base do conhecimento.

Agentes Cognitivos

Existem duas hipóteses (dizem-se hipóteses porque ainda não foi provado que são falsas) importantes em relação a este tipo de sistemas - a hipótese do sistema de símbolos físicos e a hipótese de representação do conhecimento.

A primeira consiste em ter um sistema de símbolos físicos compostos por um conjunto de entidades, os tais símbolos, que correspondem a "padrões físicos", que podem ser agrupados em estruturas, e por um conjunto de procedimentos que operam sobre eles. Haverá uma máquina a produzir sucessões de estruturas de símbolos, que contém memória para guardar informação sobre eles, entre outras propriedades.

  • Qualquer sistema que apresente comportamento inteligente pode ser visto como um sistema de símbolos físicos - aplica-se a humanos por exemplo, onde os símbolos físicos aplicam-se na nossa memória. O nosso cérebro reage conforme identifica (ou não) um dado padrão, e tem capacidade de o memorizar.
  • Qualquer sistema de símbolos físicos de tamanho adequado (não qualquer programa) pode ser organizado de modo a exibir comportamento inteligente.

Esta hipótese afirma, portanto, que é possível escrever um programa, um sistema de símbolos físicos, que exibe comportamento inteligente (aqui, inteligente no sentido de entidades inteligentes que surjam no mundo que nos rodeia, não no sentido de uma calculadora).

A segunda, a hipótese de representação do conhecimento, complementa a hipótese anterior. Diz-nos que qualquer processo mecânico que exibe comportamento inteligente é composto por estruturas, atribuídas por um observador externo, a uma representação proposicional do conhecimento usado por esse mesmo processo. Desempenham um papel formal, causal e essencial no comportamento que esse conhecimento manifesta. As tais estruturas proposicionais abrangem qualquer estrutura de dados, dos grafos às matrizes, estruturas essas armazenadas na base de conhecimento. Afirma, ainda, que é o conhecimento representado, independentemente de como o representamos, que gera o comportamento do sistema.

Representar Conhecimento em Lógica

Modelar o que pretendemos representar

O primeiro passo a tomar é inventar um modelo daquilo que pretendemos representar.

Consideramos um modelo como uma abstração do mundo, que apenas captura os seus aspetos relevantes para um certo problema ou tarefa. Neste modelo, devemos definir as entidades do mundo sobre as quais queremos falar, o universo do discurso, e as funções e relações que vamos utilizar. Estamos, assim, a definir o vocabulário utilizado pelas fbfs da representação escolhida. Depois de tomadas essas decisões, escrevemos as fbfs que relacionam constantes, funções e/ou relações: dizem-se axiomas próprios, proposições aceites sem prova em relação ao domínio atual.

O conjunto de todas as constantes, funções, relações e axiomas próprios é a ontologia do domínio.

Consideremos a seguinte definição de vocabulário, vocabulário esse a ser utilizado nos restantes exemplos desta secção:

Definição do Vocabulário

Vamos ter um conjunto de constantes, que, neste contexto, corresponderão a algumas personagens da série The Simpsons.

Bart,Lisa,Maggie,Marge,Homer,Selma,Abe,Bart, Lisa, Maggie, Marge, Homer, Selma, Abe, \dots

Vamos ainda ter o seguinte conjunto de relações, unárias e binárias:

Homem(x)=x eˊ um homemMulher(x)=x eˊ uma mulherAD(x,y)=x eˊ um ascendente direto de yPai(x,y)=x eˊ o pai de yMa~e(x,y)=x eˊ a ma˜e de yAnt(x,y)=x eˊ antepassado de yA2Linha(x,y)=x eˊ um ascendente de 2ª linha de yHomem(x) = \text{$x$ é um homem}\\ Mulher(x) = \text{$x$ é uma mulher}\\ AD(x, y) = \text{$x$ é um ascendente direto de $y$}\\ Pai(x, y) = \text{$x$ é o pai de $y$}\\ Mãe(x, y) = \text{$x$ é a mãe de $y$}\\ Ant(x, y) = \text{$x$ é antepassado de $y$}\\ A2Linha(x, y) =\text{$x$ é um ascendente de 2ª linha de $y$}\\ \dots

Com o vocabulário apresentado acima, podemos escrever algumas fórmulas chãs:

Homem(Homer)Homem(Abe)AD(Abe,Homer)Homem(Homer)\\ Homem(Abe)\\ AD(Abe, Homer)\\

Podemos ainda escrever algumas fbfs, aqui já com variáveis individuais:

x,y[AD(x,y)Ant(x,y)]x,y,z[AD(x,y)AD(y,z)AD(x,z)]\forall x, y[AD(x, y) \to Ant(x, y)]\\ \forall x, y, z[AD(x, y) \wedge AD(y, z) \to AD(x, z)]\\

Podemos até realizar provas utilizando estas representações! Na prova abaixo, vamos chegar à conclusão que AbeAbe é Avo^Avô de BartBart, partindo de um conjunto de informações iniciais.

1Homem(Abe)Prem2Homem(Homer)Prem3Homem(Bart)Prem4AD(Abe,Homer)Prem5AD(Homer,Bart)Prem6x,y,z[(AD(x,y)AD(y,z))A2Linha(x,z)]Prem7x,y[(A2Linha(x,y)Homem(x))Avo^(x,y)]Prem8(AD(Abe,Homer)AD(Homer,Bart))A2Linha(Abe,Bart)E,69AD(Abe,Homer)AD(Homer,Bart)I,(4,5)10A2Linha(Abe,Bart)E,(9,8)11(A2Linha(Abe,Bart)Homem(Abe))Avo^(Abe,Bart)E,712(A2Linha(Abe,Bart)Homem(Abe))Avo^(Abe,Bart)E,1113A2Linha(Abe,Bart)Homem(Abe)I,(10,1)14Avo^(Abe,Bart)E,(13,12)\def\arraystretch{1.5} \begin{array}{lll} 1 & Homem(Abe) && Prem\\ 2 & Homem(Homer) && Prem\\ 3 & Homem(Bart) && Prem\\ 4 & AD(Abe, Homer) && Prem\\ 5 & AD(Homer, Bart) && Prem\\ 6 & \forall x, y, z[(AD(x, y) \wedge AD(y, z)) \to A2Linha(x, z)] && Prem\\ 7 & \forall x, y[(A2Linha(x, y) \wedge Homem(x)) \leftrightarrow Avô(x, y)] && Prem\\ 8 & (AD(Abe, Homer) \wedge AD(Homer, Bart)) \to A2Linha(Abe, Bart) && E\forall, 6\\ 9 & AD(Abe, Homer) \wedge AD(Homer, Bart) && I\wedge, (4, 5)\\ 10 & A2Linha(Abe, Bart) && E\to, (9, 8)\\ 11 & (A2Linha(Abe, Bart) \wedge Homem(Abe)) \leftrightarrow Avô(Abe, Bart) && E\forall, 7\\ 12 & (A2Linha(Abe, Bart) \wedge Homem(Abe)) \to Avô(Abe, Bart) && E\leftrightarrow, 11\\ 13 & A2Linha(Abe, Bart) \wedge Homem(Abe) && I\wedge, (10, 1)\\ 14 & Avô(Abe, Bart) && E\to, (13, 12) \end{array}

Forma Clausal

Obtida de forma semelhante à da Lógica Proposicional, contando com algumas diferenças.

Eliminação do símbolo \to

Funciona de igual forma à lógica proposicional.

Redução do domínio de ¬\neg

Igual à lógica proposicional, tendo ainda a adição das segundas leis de De Morgan.

A primeira afirma que "dizer que nem todo o xx tem uma certa propriedade é o mesmo que dizer que há pelo menos um xx que não a tem".

¬x[α(x)]x[¬α(x)]\neg\forall x[\alpha (x)] \leftrightarrow \exists x[\neg\alpha (x)]

Por outro lado, a segunda afirma que "dizer que não há nenhum xx que tenha uma certa propriedade é o mesmo que dizer que todo o xx não tem a falta dessa propriedade".

¬x[α(x)]x[¬α(x)]\neg\exists x[\alpha (x)] \leftrightarrow \forall x[\neg\alpha (x)]

Entra aqui um passo novo: a normalização de variáveis.

Normalização de variáveis

As ocorrências ligadas (dentro do domínio do quantificador) correspondem a variáveis mudas (irrelevantes para o valor da operação - por exemplo, em k=151\sum_{k = 1}^{5} 1, kk é uma variável muda). A normalização de variáveis consiste em mudar o nome de algumas das variáveis, de modo a que o quantificador esteja associado a um único nome de variável - o objetivo é não haver quantificadores associados às mesmas variáveis dentro do domínio de um quantificador.

Pegando num exemplo mais concreto,

x[¬P(x)(y[¬P(y)P(f(x,y))])y[Q(x,y)¬P(y)]]\forall x[\neg P(x) \vee (\forall y[\neg P(y) \vee P(f(x, y))]) \wedge \exists y[Q(x, y) \wedge \neg P(y)]]

passa, através da normalização de variáveis, a:

x[¬P(x)(y[¬P(y)P(f(x,y))])z[Q(x,z)¬P(z)]].\forall x[\neg P(x) \vee (\forall y[\neg P(y) \vee P(f(x, y))]) \wedge \exists z[Q(x, z) \wedge \neg P(z)]].

Note-se que, caso os quantificadores interiores estivessem fora do domínio do quantificador x\forall x, a normalização de variáveis não ocorreria!

Eliminação dos quantificadores existenciais

Fase separada em dois passos:

  • Eliminar quantificadores isolados - substituímos a fbf x[α(x)]\exists x[\alpha (x)] por α(c)\alpha (c), onde cc é uma nova constante - a constante de Skolem. A constante de Skolem é considerada a entidade que verifica a propriedade α\alpha, apesar de nada sabermos em concreto sobre ela. Só pode ser aplicada a quantificadores isolados, fora do domínio de outros quantificadores.

  • Verificar dependências entre quantificadores existenciais e universais - se um quantificador existencial aparecer dentro do domínio de um quantificador universal, existe a possibilidade do valor da variável quantificada existencialmente depender do valor da variável quantificada universalmente. Caso dependa, substituímos a variável por um novo símbolo de função - função de Skolem, fsk(x)f_{sk}(x). Aqui, "a variável de dentro depende/é função da de fora; o yy (interior) depende/é função de xx (exterior)". A existência do yy está diretamente dependente de qual é o xx em questão, e é daí que vem a noção de função.

Exemplos

Podemos passar

x[Num_Nat(x)y[Num_Nat(y)y>x]]\forall x[Num\_Nat(x) \to \exists y[Num\_Nat(y) \wedge y > x]]

para

x[Num_Nat(x)Num_Nat(fsk(x))fsk(x)>x].\forall x[Num\_Nat(x) \to Num\_Nat(f_{sk}(x)) \wedge f_{sk}(x) > x].

Aqui, o valor de yy depende do de xx, pelo que para eliminar o quantificador existencial é necessário substituir a variável associada por um termo formado por um novo símbolo de função. ff é uma função de Skolem. Ao tentar substituir por uma constante de Skolem, obteríamos uma afirmação falsa (algo do género "Há um natural maior que todos os outros").

Temos então, portanto, que se nenhum quantificador universal aparecer "por fora" de um dado quantificador existencial, substituímos todas as ocorrências da variável a ele ligada pela constante de Skolem e removemos o quantificador; caso contrário, removemos também o quantificador, mas em vez de substituir a variável pela constante, substituímos pela função de Skolem.

Conversão para a forma Prenex normal

Todas as ocorrências de quantificadores universais são passadas para a esquerda. Vem de uma afirmação que fizemos mais atrás, onde dissemos que queremos sempre as representações o mais sucintas possível: se podemos condensar a nossa representação utilizando um único quantificador, fá-lo-emos.

Um exemplo seria, por exemplo, passar de

x[¬P(x)(y[¬P(y)P(f(x,y))](Q(x,gsk(x))¬P(gsk(x))))]\forall x [\neg P(x)\vee(\forall y[\neg P(y) \vee P(f(x, y))] \wedge (Q(x, g_{sk}(x)) \wedge \neg P(g_{sk}(x))))]

para

x,y[¬P(x)((¬P(y)P(f(x,y)))(Q(x,gsk(x))¬P(gsk(x))))].\forall x,y[\neg P(x) \vee ((\neg P(y) \vee P(f(x, y))) \wedge (Q(x, g_{sk}(x)) \wedge \neg P(g_{sk}(x))))].

Eliminação da Quantificação Universal

Sendo que não há variáveis livres, e que todas elas estão quantificadas universalmente, a presença do quantificador acaba por ser irrelevante, visto que, lá está, as propriedades são universais. Podemos, agora, remover esses quantificadores.

Uma passagem possível seria de

xy[¬P(x)((¬P(y)P(f(x,y)))(Q(x,gsk(x))¬P(gsk(x))))]\forall x\forall y[\neg P(x) \vee ((\neg P(y) \vee P(f(x, y))) \wedge (Q(x, g_{sk}(x)) \wedge \neg P(g_{sk}(x))))]

para

¬P(x)((¬P(y)P(f(x,y)))(Q(x,gsk(x))¬P(gsk(x)))).\neg P(x) \vee ((\neg P(y) \vee P(f(x, y))) \wedge (Q(x, g_{sk}(x)) \wedge \neg P(g_{sk}(x)))).

A obtenção da forma conjuntiva normal/eliminar os símbolos \wedge e \vee segue processos idênticos aos da Lógica Proposicional.

Unificação

Processo ligado à substituição. Permite determinar se duas fbfs atómicas podem ser tornadas iguais através de substituições apropriadas para as suas variáveis livres. Antes de considerar o problema da unificação, é relevante introduzir a composição de substituições.

Composição de substituições

Sendo s1s_{1} e s2s_{2} duas substituições, a composição destas, s1s2s_{1} \circ s_{2}, é igual a ss tal que:

as=a(s1s2)=(as1)s2.a \cdot s = a \cdot (s_{1} \circ s_{2}) = (a \cdot s_{1}) \cdot s_{2}.

Colocado de forma formal, corresponde a:

s1s2=({(t1s2)/x1,,(tns2)/xn}{uj/yjs2:yjx1,,xn}){(tis2)/xi:(tis2)=xi}.s_{1} \circ s_{2} = \\ (\{(t_{1} \cdot s_{2})/x_{1}, \dots, (t_{n} \cdot s_{2})/x_{n}\}\\ \cup \quad \{u_{j}/y_{j} \in s_{2}: y_{j} \notin {x_{1}, \dots, x_{n}}\})\\ - \quad\{(t_{i} \cdot s_{2})/x_{i}: (t_{i} \cdot s_{2}) = x_{i}\}.

A composição de substituições goza da propriedade associativa, mas não da comutativa.

Temos ainda que, e recuperando a noção de substituição vazia (ϵ\epsilon), a composição com a substituição vazia é tal que ssϵϵss \leftrightarrow s \circ \epsilon \leftrightarrow \epsilon \circ s.

Composição de Substituições - Exemplo

À primeira vista esta operação parece um "monstro", mas na verdade não tem nada que saber! A título de exemplo (e com ajuda de algumas cores), temos:

s1={f(y)/x,z/y,a/w},s2={a/x,b/y,y/z,a/w}.s_{1} = \{\smartcolor{orange}{f(y)}/\smartcolor{blue}{x}, \smartcolor{orange}{z}/\smartcolor{blue}{y}, \smartcolor{orange}{a}/\smartcolor{blue}{w}\},\\ s_{2} = \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\}.
s1s2=({(f(y){a/x,b/y,y/z,a/w})/x,(z{a/x,b/y,y/z,a/w})/y,(a{a/x,b/y,y/z,a/w})/w}{y/z}){(z{a/x,b/y,y/z,a/w})/y}s_{1} \circ s_{2} = \\ (\{(\smartcolor{orange}{f(y)} \cdot \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\})/\smartcolor{blue}x,\\ (\smartcolor{orange}z \cdot \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\})/\smartcolor{blue}y,\\ (\smartcolor{orange}a \cdot \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\})/\smartcolor{blue}w\}\\ \cup \quad \{\smartcolor{green}y/\smartcolor{pink}z\}) \\ - \quad\{(\smartcolor{orange}z \cdot \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\})/\smartcolor{blue}y\}

No fundo (e em linguagem corrente), devemos:

  • pegar em todos os termos de s1s_1 (à esquerda, portanto), e aplicar a substituição associada ao termo de s2s_2 (por exemplo, f(y)f(y) fica f(b)f(b), visto que em s2s_2 existe a substituição b/yb/y) - consideremos o termo resultante tjt_j; consideremos ainda que a variável original associada a cada substituição de s1s_1, a azul, é dada por vv. A substituição resultante corresponde então a tj/vt_j/v. Devemos, de seguida, aplicar esta lógica a todos os pares termo-variável de s1s_1.

  • unir o conjunto acima obtido ao conjunto de pares termo-variável de s2s_2 em que a variável não está presente em s1s_1: neste caso y/zy/z, já que zz apenas aparece em s1s_1 como termo (à esquerda), não como variável "substituível".

  • retirar todas as novas substituições que iam levar a termos iguais a variáveis - irrelevantes, portanto. Aqui, isso iria acontecer com a substituição (z{a/x,b/y,y/z,a/w})/y(\smartcolor{orange}z \cdot \{\smartcolor{green}a/\smartcolor{pink}x, \smartcolor{green}b/\smartcolor{pink}y, \smartcolor{green}y/\smartcolor{pink}z, \smartcolor{green}a/\smartcolor{pink}w\})/\smartcolor{blue}y, que como se pode observar abaixo leva a y/yy/y - uma substituição claramente irrelevante, e que pode portanto ser retirada.

O resultado final seria dado por:

{f(b)/x,y/y,a/w,y/z}{y/y}={f(b)/x,a/w,y/z}.\{f(b)/x, y/y, a/w, y/z\} - \{y/y\} = \{f(b)/x, a/w, y/z\}.

Podemos ainda definir conjunto unificador: dado um conjunto de fbfs atómicas, este conjunto diz-se unificável caso exista uma substituição que torne idênticas todas as fbfs do conjunto, dizendo-se que essa substituição é um unificador do conjunto. Pode haver mais que um unificador para um dado conjunto.

A substituição {a/x,b/y,c/z}\{a/x, b/y, c/z\} é unificador do conjunto {P(a,y,z),P(x,b,z)}\{P(a, y, z), P(x, b, z)\}, dando origem a {P(a,b,c)}\{P(a, b, c)\}.

Existe ainda a noção de Unificador mais geral: dado um conjunto de fbfs atómicas, o unificador mais geral do conjunto, mgu, é um unificador ss com a seguinte propriedade:

  • se s1s_{1} for um unificador da fbf da qual ss é o mgu, então existe uma substituição s2s_{2} tal que s1=ss2s_{1} = s \circ s_{2}.

O mgu é único, exceto para variantes alfabéticas de variáveis.

Algoritmo de Unificação

Recebe um conjunto de fbfs atómicas e decide se podem ser unificadas, devolvendo o seu mgu. O algoritmo apresentado a seguir percorre, em paralelo, os constituintes desse conjunto (as fbfs a unificar), da esquerda para a direita, começando pelo mais à esquerda. À medida que vai encontrando constituintes diferentes, em desacordo, tenta determinar uma substituição que os torne iguais. Em caso de sucesso, o algoritmo continua a percorrer as fbfs que resultam da aplicação dessa substituição a todas as fbfs a unificar; caso contrário, termina, indicando que o conjunto não é unificável. Percorridas todas as fbfs, o algoritmo termina com sucesso e a composição das substituições encontradas corresponde ao mgu.

O algoritmo de unificação usa ainda outro algoritmo, o de desacordo, para determinar o conjunto de desacordo de um conjunto de fbfs. Obtém-se localizando o primeiro constituinte, a partir da esquerda, que não é igual a todas as fbfs do conjunto e extraindo das fbfs todos os componentes nessa posição.

Em Δ={P(x,f(x,y)),P(x,a),P(x,g(x))}\Delta = \{P(x, f(x, y)), P(x, a), P(x, g(x))\}, o conjunto de desacordo é {f(x,y),a,g(x)}\{f(x, y), a, g(x)\}: corresponde ao conjunto de fbfs em desacordo, que não são iguais em todas as fbfs de Δ\Delta.

Exemplo de aplicação do Algoritmo de Unificação

Seja Δ\Delta o conjunto {P(x,x),P(y,f(y))}\{P(x, x), P(y, f(y))\}. Se quisermos tentar determinar o seu mgu:


Δ\Delta ss DD {t/x}\{t/x\}
{P(x,x),P(y,f(y))}\{P(x, x), P(y, f(y))\} {}\{\} {x,y}\{x, y\} y/x{y/x}
{P(y,y),P(y,f(y))}\{P(y, y), P(y, f(y))\} {y/x}\{y/x\} {y,f(y)}\{y,f(y)\} falhafalha

De cima para baixo, da esquerda para a direita:
Começamos por olhar para Δ\Delta da esquerda para a direita; como podemos constatar, xx e yy estão em desacordo, se considerarmos os primeiros argumentos de cada fbf. Assim sendo, o conjunto atual de desacordo, DD, passa a ser {x,y}\{x, y\}. Sabemos que deixa de ficar em desacordo se substituirmos xx por yy (a decisão é feita, mais uma vez, ao ler da esquerda para a direita), e adicionamos, portanto essa mesma substituição ao conjunto s=s{y/x}={y/x}s = s \circ \{y/x\} = \{y/x\}. Voltamos a verificar o conjunto de desacordo, desta vez para o segundo argumento de cada fbf. Como é possível constatar, yy e f(y)f(y) estão em desacordo. Contudo, yy ocorre em f(y)f(y), pelo que a unificação não é possível (originaria uma espécie de recursão infinita), e o algoritmo falha. O conjunto não é unificável.

Resolução

Podemos agora enunciar o princípio da resolução para o caso em que as cláusulas contêm variáveis.

Princípio da Resolução - caso geral

Sejam Ψ\Psi e Φ\Phi duas cláusulas sem variáveis em comum, e α\alpha e β\beta duas fbfs atómicas tais que αΨ\alpha \in \Psi e βΦ\beta \in \Phi, e α\alpha e β\beta são unificáveis, com ss o mgu destas. Segundo o princípio da resolução, podemos inferir a cláusula ((Ψ{α})(Φ{¬β}))s((\Psi - \{\alpha \}) \cup (\Phi - \{\neg \beta \})) \cdot s. Os literais αs\alpha \cdot s e βs\beta \cdot s serão literais em conflito, e a cláusula obtida é o resolvente das cláusulas.

Em termos correntes, removemos os literais em conflito e aplicamos o mgu às que restam.

É, tal como a resolução da lógica proposicional, correta mas não completa. É, de igual forma, completa quanto à refutação.

Considere-se o seguinte exemplo, com:

Ψ={P(f(a),x)}Φ={¬P(y,h(z)),Q(f(y),z)}\Psi = \{P(f(a), x)\}\\ \Phi = \{\neg P(y, h(z)), Q(f(y), z)\}

O mgu de P(f(a),x)P(f(a), x) e P(y,h(z))P(y, h(z)) é {f(a)/y,h(z)/x}\{f(a)/y, h(z)/x\}, e portanto o resolvente será a aplicação desse mesmo mgu à cláusula restante, obtendo {Q(f(f(a)),z)}\{Q(f(f(a)), z)\}.

Graficamente:

Resolução

De notar que o resolvente pode não necessitar de uma substituição, isto é, pode existir resolvente entre duas cláusulas em que o conteúdo é "ele próprio" numa cláusula e a sua negação noutra, e aí podemos aplicar o resolvente tal como na lógica proposicional.

Renomeação de variáveis

Se repararmos, na definição é referida a necessidade de não haver variáveis em comum entre as fbfs. Esta necessidade pode ser satisfeita renomeando todas as variáveis das cláusulas relevantes antes da aplicação do princípio da resolução, por exemplo passar xx para xx'. Esta renomeação apenas ocorre numa das cláusulas, a outra instância mantém-se intacta (podemos fazer isto porque, na verdade, estamos na presença de variáveis quantificadas universalmente, portanto mudas).

A título de exemplo, sejam Ψ={P(x),Q(y)}\Psi = \{P(x), Q(y)\} e Φ={¬P(x),R(y)}\Phi = \{\neg P(x), R(y)\} duas cláusulas. Para aplicar o princípio da resolução, temos antes de renomear as variáveis, renomeação essa que origina a cláusula Φ={¬P(x),R(y)}\Phi = \{\neg P(x'), R(y')\}. Sendo xx e xx' duas variáveis diferentes, podemos agora unificá-las.

Porquê renomear as variáveis?

Consideremos a seguinte afirmação:

{x,y[P(x,y)R(y,x)],x,y[R(x,y)Q(y,x)]}x,y[P(x,y)Q(x,y)]\{\forall x, y[P(x, y) \to R(y, x)], \forall x, y[R(x, y) \to Q(y, x)]\} \vdash \forall x, y[P(x, y) \to Q(x, y)]

Na forma clausal, será

{{¬P(x,y),R(y,x)},{¬R(x,y),Q(y,x)}}{¬P(x,y),Q(x,y)}\{\{\neg P(x, y), R(y, x)\}, \{\neg R(x, y), Q(y, x)\}\} \vdash \{\neg P(x, y), Q(x, y)\}

Se não renomearmos as variáveis, o mgu de R(y,x)R(y, x) e R(x,y)R(x, y) será {x/y}\{x/y\}, e a partir daí só podemos obter a cláusula {P(x,x),Q(x,x)}\{P(x, x), Q(x,x)\}. Por outro lado, se renomearmos as variáveis obtemos um mgu diferente e é possível chegar à expressão pretendida.

Este pormenor pode muitas vezes despercebido, mas é bastante importante (e é abordado em contexto de avaliação).

Como nota final, podemos afirmar que as noções de prova por resolução e refutação, bem como as estratégias de eliminação e seleção de cláusulas, migram da lógica proposicional para a de primeira ordem.