graph TD
S["Sentença LPO"] --> FBF["Fórmula Bem Formada"];
FBF --> Atomica["Fórmula Atômica"];
FBF --> Negacao["¬ FBF"];
FBF --> Conectivo["(FBF Conectivo FBF)"];
FBF --> Universal["∀ Variável FBF"];
FBF --> Existencial["∃ Variável FBF"];
Atomica --> Predicado["Símbolo de Predicado"];
Atomica --> Termos["(Termo, Termo, ...)"];
Termos --> Constante[Constante];
Termos --> Variavel[Variável];
Termos --> Funcao["Função(Termo, ...)"];
style S fill:#f9f,stroke:#333,stroke-width:2px;
style FBF fill:#add8e6,stroke:#333,stroke-width:2px;
style Atomica,Negacao,Conectivo,Universal,Existencial fill:#afeeee,stroke:#333,stroke-width:2px;
style Predicado,Termos,Constante,Variavel,Funcao fill:#ffd700,stroke:#333,stroke-width:2px;
Representação de Conhecimento: Lógica de Predicados
Representando Conhecimento Mais Complexo Usando Lógica de Predicados e Quantificadores
Introdução
Na aula anterior, exploramos a Lógica Proposicional (LP) como uma ferramenta fundamental para a Representação de Conhecimento (RC). Embora a LP forneça uma base sólida para o raciocínio dedutivo, vimos que suas limitações em expressividade – especialmente a incapacidade de lidar com objetos, suas propriedades, relações e quantificadores (“todos”, “alguns”) – a tornam inadequada para representar a complexidade do mundo real em muitos domínios da Inteligência Artificial.
Nesta aula, avançaremos para a Lógica de Predicados de Primeira Ordem (LPO), frequentemente chamada apenas de Lógica de Predicados. Este formalismo mais poderoso nos permitirá representar conhecimento de uma forma muito mais rica e flexível, introduzindo conceitos como predicados, funções, variáveis e quantificadores, elementos essenciais para modelar o mundo de forma mais granular e expressiva.
Objetivo de Aprendizagem
Ao final desta aula, você será capaz de:
- Explicar as diferenças e vantagens da Lógica de Predicados em relação à Lógica Proposicional.
- Compreender os componentes sintáticos da Lógica de Predicados: termos, predicados, funções, variáveis e quantificadores.
- Construir Fórmulas Bem Formadas (FBFs) em Lógica de Predicados para representar sentenças complexas do mundo real.
- Interpretar a semântica de sentenças em Lógica de Predicados.
- Entender o conceito de unificação e seu papel na inferência em Lógica de Predicados.
- Identificar cenários onde a Lógica de Predicados é mais apropriada para a RC.
Revisão Rápida: Limitações da Lógica Proposicional
Conforme discutido, a Lógica Proposicional representa fatos como unidades atômicas (P, Q, Chuva). Ela não pode expressar:
Propriedades de objetos: Não consigo dizer
Cor(Céu, Azul)ouIdade(João, 30).Relações entre objetos: Não consigo dizer
Pai(João, Pedro)ouGosta(Maria, Pizza).Quantificação: Não consigo expressar “Todos os pássaros voam” ou “Existe um número primo”.
- Para “Todos os humanos são mortais”, teríamos que ter
Humano1_Mortal,Humano2_Mortal, …, o que é inviável e não permite generalização.
- Para “Todos os humanos são mortais”, teríamos que ter
A Lógica de Predicados de Primeira Ordem supera essas limitações.
Lógica de Predicados de Primeira Ordem (LPO)
A LPO é um formalismo mais expressivo para representar conhecimento, permitindo uma descrição mais detalhada de objetos, suas propriedades e relações. Ela expande a Lógica Proposicional introduzindo:
- Objetos: Entidades no mundo (pessoas, carros, números).
- Predicados: Relações ou propriedades sobre objetos.
- Funções: Mapeiam um ou mais objetos para outro objeto.
- Variáveis: Representam objetos em geral.
- Quantificadores: Permitem expressar “para todos” (universal) e “existe” (existencial).
Sintaxe da Lógica de Predicados
A sintaxe da LPO define como construir expressões válidas.
Termos
Um termo refere-se a um objeto no mundo. Podem ser:
Constantes: Símbolos que representam objetos específicos (e.g.,
João,Roma,2,Quadrado). Geralmente iniciam com letra maiúscula.Variáveis: Símbolos que representam qualquer objeto dentro de um domínio (e.g.,
x,y,z). Geralmente iniciam com letra minúscula.Funções: Um símbolo de função seguido por uma lista de termos entre parênteses. A função mapeia um ou mais termos para outro termo.
- Exemplos:
pai(João),distancia(Roma, Paris),soma(x, y).
- Exemplos:
Predicados (Símbolos de Predicado)
Um predicado representa uma relação entre objetos ou uma propriedade de um objeto. Um símbolo de predicado seguido por uma lista de termos entre parênteses forma uma fórmula atômica.
Exemplos:
Pai(João, Maria): João é pai de Maria.Gosta(Maria, Pizza): Maria gosta de Pizza.ÉPar(2): 2 é um número par.Maior(5, 3): 5 é maior que 3.
Conectivos Lógicos
Os mesmos conectivos da Lógica Proposicional são usados:
| Símbolo | Nome | Significado |
|---|---|---|
| \(\neg\) | Negação | “não” |
| \(\wedge\) | Conjunção | “e” |
| \(\vee\) | Disjunção | “ou” |
| \(\rightarrow\) | Implicação (Condicional) | “se…então…” |
| \(\leftrightarrow\) | Bicondicional | “se e somente se” |
Quantificadores
Essenciais para expressar sentenças sobre coleções de objetos.
Quantificador Universal (\(\forall\)): “Para todo”, “Para cada”, “Para qualquer”.
- Sintaxe: \(\forall x \ P(x)\)
- Significado: Para todos os objetos
xno domínio, a propriedadeP(x)é verdadeira. - Exemplo: \(\forall x \ (Pássaro(x) \rightarrow Voa(x))\) (Todos os pássaros voam).
Quantificador Existencial (\(\exists\)): “Existe um”, “Pelo menos um”, “Algum”.
- Sintaxe: \(\exists x \ P(x)\)
- Significado: Existe pelo menos um objeto
xno domínio para o qual a propriedadeP(x)é verdadeira. - Exemplo: \(\exists x \ (Homem(x) \wedge Morto(x))\) (Existe algum homem que está morto).
Fórmulas Bem Formadas (FBFs) em LPO
As regras para construir FBFs em LPO são:
- Uma fórmula atômica é uma FBF.
- Se \(\phi\) é uma FBF, então \(\neg \phi\) é uma FBF.
- Se \(\phi\) e \(\psi\) são FBFs, então \((\phi \wedge \psi)\), \((\phi \vee \psi)\), \((\phi \rightarrow \psi)\) e \((\phi \leftrightarrow \psi)\) são FBFs.
- Se \(\phi\) é uma FBF e \(x\) é uma variável, então \(\forall x \ \phi\) e \(\exists x \ \phi\) são FBFs.
- Nada mais é uma FBF.
- Variáveis Livres e Ligadas: Uma variável é ligada se estiver dentro do escopo de um quantificador. Caso contrário, é livre. Em geral, as FBFs que usamos em bases de conhecimento não devem ter variáveis livres.
Exemplos de Sentenças em LPO
- “Todos os humanos são mortais”: \(\forall x \ (Humano(x) \rightarrow Mortal(x))\)
- “Sócrates é humano”: \(Humano(Sócrates)\)
- “Existe um aluno que gosta de café”: \(\exists x \ (Aluno(x) \wedge Gosta(x, Café))\)
- “Nenhum pássaro nada” (equivalente a “Para todo pássaro, não é verdade que ele nada”): \(\forall x \ (Pássaro(x) \rightarrow \neg Nada(x))\)
- “Todo mundo gosta de alguém”: \(\forall x \ \exists y \ Gosta(x, y)\)
- “Alguém gosta de todo mundo”: \(\exists x \ \forall y \ Gosta(x, y)\)
Semântica da Lógica de Predicados
A semântica da LPO define o significado das FBFs em relação a um modelo do mundo.
Modelo
Um modelo em LPO é composto por:
Um Domínio (D): Um conjunto não vazio de objetos sobre os quais o conhecimento está sendo expresso.
- Exemplo: \(D = \{Sócrates, Platão, Aristóteles\}\).
Uma Interpretação: Mapeia cada:
- Constante para um objeto em \(D\).
- Símbolo de Predicado de \(n\) argumentos para uma relação de \(n\)-ários sobre \(D\).
- Símbolo de Função de \(n\) argumentos para uma função de \(n\)-ários de \(D^n\) para \(D\).
O valor de verdade de uma FBF é determinado recursivamente com base na interpretação e nos valores de verdade de suas subfórmulas.
Quantificadores:
- \(\forall x \ \phi(x)\) é verdadeiro se \(\phi(x)\) for verdadeiro para todo objeto \(x\) no domínio.
- \(\exists x \ \phi(x)\) é verdadeiro se \(\phi(x)\) for verdadeiro para pelo menos um objeto \(x\) no domínio.
Inferência em Lógica de Predicados
A inferência em LPO é mais complexa do que em LP, devido à presença de variáveis e quantificadores.
Instanciação Universal (Universal Instantiation - UI)
Se temos uma sentença da forma \(\forall x \ \phi(x)\), podemos inferir \(\phi(c)\) para qualquer constante \(c\) no domínio.
Exemplo:
- \(\forall x \ (Humano(x) \rightarrow Mortal(x))\)
- Inferimos: \(Humano(Sócrates) \rightarrow Mortal(Sócrates)\)
Instanciação Existencial (Existential Instantiation - EI)
Se temos uma sentença da forma \(\exists x \ \phi(x)\), podemos inferir \(\phi(k)\), onde \(k\) é uma constante nova que não aparece em nenhum outro lugar na base de conhecimento (uma constante de Skolem).
Exemplo:
- \(\exists x \ (Pássaro(x) \wedge Voa(x))\)
- Inferimos: \(Pássaro(B) \wedge Voa(B)\), onde
Bé uma nova constante que representa aquele pássaro específico que voa.
Modus Ponens Generalizado
Esta é uma extensão do Modus Ponens para LPO. Se temos uma regra universal e um fato que unifica com a premissa da regra, podemos inferir a consequência.
Exemplo:
- \(\forall x \ (Humano(x) \rightarrow Mortal(x))\)
- \(Humano(Sócrates)\)
- Usando UI com \(x=Sócrates\) na primeira, obtemos \(Humano(Sócrates) \rightarrow Mortal(Sócrates)\).
- Aplicando Modus Ponens com \(Humano(Sócrates)\) e \(Humano(Sócrates) \rightarrow Mortal(Sócrates)\), inferimos \(Mortal(Sócrates)\).
Unificação (Unification)
A unificação é o processo de encontrar substituições para variáveis que tornam duas expressões lógicas idênticas. É crucial para aplicar regras de inferência como o Modus Ponens Generalizado e a Resolução em LPO.
Exemplo:
Expressão 1:
Gosta(João, x)Expressão 2:
Gosta(João, Pizza)Unificador:
{x/Pizza}(SubstituixporPizza).Expressão 1:
Gosta(Pai(y), y)Expressão 2:
Gosta(Pai(Zeca), Zeca)Unificador:
{y/Zeca}
Resolução em LPO
Assim como em LP, a resolução é um método de prova por refutação em LPO. Envolve a conversão de sentenças para a Forma Normal Clausal (Clausal Form) e a aplicação repetida da regra de resolução, que agora precisa de unificação para combinar literais. É um algoritmo completo e sólido para LPO. (Russell; Norvig, 2004, p. 289–299)
Exemplo de Inferência em LPO (Conceitual)
Considere a seguinte base de conhecimento:
- \(\forall x \ (Pássaro(x) \rightarrow Voa(x))\) (“Todos os pássaros voam”)
- \(Pássaro(Piupiu)\) (“Piupiu é um pássaro”)
- \(\forall y \ (Ovo(y) \rightarrow Pássaro(pai(y)))\) (“Todo ovo tem um pai que é pássaro”)
- \(Ovo(OvoDePiupiu)\) (“Existe um ovo de Piupiu”)
Queremos provar que Voa(Piupiu).
- Passo 1: Usar Instanciação Universal na sentença 1 com \(x=Piupiu\): \(Pássaro(Piupiu) \rightarrow Voa(Piupiu)\)
- Passo 2: Aplicar Modus Ponens generalizado com a sentença 2 (\(Pássaro(Piupiu)\)) e a conclusão do Passo 1: Inferimos: \(Voa(Piupiu)\).
Queremos provar que existe algo que voa (ou seja, \(\exists z \ Voa(z)\)).
- Passo 1: Já provamos que
Voa(Piupiu). - Passo 2: Pela regra de Introdução Existencial, se \(\phi(c)\) é verdade para uma constante \(c\), então \(\exists x \ \phi(x)\) é verdade. Inferimos: \(\exists z \ Voa(z)\).
Comparação entre Lógica Proposicional e Lógica de Predicados
| Característica | Lógica Proposicional (LP) | Lógica de Predicados (LPO) |
|---|---|---|
| Elementos Básicos | Proposições atômicas | Objetos, propriedades, relações |
| Variáveis | Não possui | Sim (para objetos) |
| Quantificadores | Não possui | Sim (\(\forall, \exists\)) |
| Expressividade | Limitada; apenas fatos “sim ou não” | Rica; pode expressar propriedades de objetos, relações, generalizações |
| Domínio de Aplicação | Problemas simples, pequenos, sem necessidade de generalização | Problemas complexos, domínios grandes, exige raciocínio sobre objetos e suas interações |
| Complexidade da Inferência | Decidível (tabelas verdade, resolução) | Semidecidível (completa mas não sempre termina se a conclusão não for consequência lógica); computacionalmente mais complexa |
graph LR
LP[Lógica Proposicional] --> LP_Atomica[Proposições Atômicas];
LP_Atomica --> LP_Simples[Fatos Simples];
LP_Simples --> LP_Limitacoes[Limitações];
LPO[Lógica de Predicados] --> LPO_Termos[Termos];
LPO --> LPO_Predicados[Predicados];
LPO --> LPO_Quantificadores[Quantificadores];
LPO_Termos --> LPO_Expressividade[Alta Expressividade];
LPO_Predicados --> LPO_Expressividade;
LPO_Quantificadores --> LPO_Expressividade;
LPO_Expressividade --> LPO_Complexidade[Maior Complexidade];
style LP fill:#add8e6,stroke:#333,stroke-width:2px;
style LPO fill:#ffa07a,stroke:#333,stroke-width:2px;
style LP_Atomica,LP_Simples,LPO_Termos,LPO_Predicados,LPO_Quantificadores fill:#f0e68c,stroke:#333,stroke-width:2px;
style LP_Limitacoes,LPO_Expressividade,LPO_Complexidade fill:#98fb98,stroke:#333,stroke-width:2px;
LPO em Python (Bibliotecas)
Implementar um motor de inferência completo para Lógica de Predicados do zero em Python é uma tarefa consideravelmente complexa. Envolveria parsers para as FBFs, implementações de unificação e resolução. No entanto, existem bibliotecas que podem ajudar a trabalhar com lógica simbólica em Python.
Uma das bibliotecas mais conhecidas é a SymPy, que embora seja focada em matemática simbólica, possui módulos que podem ser usados para lógica. Para sistemas de raciocínio mais robustos, outras ferramentas e linguagens (como Prolog) são mais comuns.
Exemplo (Conceitual - Usando SymPy para Lógica Proposicional Extendida):
Embora SymPy não implemente LPO completa com unificação e resolução por padrão, ela pode representar e manipular expressões lógicas de forma simbólica. Este é um exemplo simplificado que mostra como lidaríamos com algumas expressões.
from sympy.logic.boolalg import And, Or, Not, Implies, Equivalent
from sympy.abc import x, y, z # Variáveis simbólicas
# Em SymPy, predicados e funções são representados por objetos Function e Symbol
# e quantificadores não são diretamente suportados para inferência de forma nativa
# como em um resolvedor de LPO.
# Este é um exemplo mais ilustrativo das sentenças que queremos representar.
# Definindo símbolos para predicados e funções
# Em um sistema de LPO real, estes teriam aridades definidas
Pássaro = lambda arg: f"Pássaro({arg})"
Voa = lambda arg: f"Voa({arg})"
Humano = lambda arg: f"Humano({arg})"
Mortal = lambda arg: f"Mortal({arg})"
Pai = lambda arg1, arg2: f"Pai({arg1}, {arg2})"
# Definindo constantes
Sócrates = "Sócrates"
Piupiu = "Piupiu"
João = "João"
Pedro = "Pedro"
# Representando sentenças em LPO
# (Note: Isso é uma representação de strings, não um motor de inferência LPO real do SymPy)
# 1. "Todos os humanos são mortais"
# Sem quantificador universal direto em SymPy para inferência como LPO
# Seria uma série de implicações para cada humano conhecido:
# Implies(Humano(Sócrates), Mortal(Sócrates))
# Implies(Humano(Platão), Mortal(Platão))
# ...
# Para expressar a regra universalmente, usamos a notação teórica
sentenca_1 = "∀x (Humano(x) → Mortal(x))"
print(f"Sentença 1: {sentenca_1}")
# 2. "Sócrates é humano"
sentenca_2 = Humano(Sócrates)
print(f"Sentença 2: {sentenca_2}")
# 3. "João é pai de Pedro"
sentenca_3 = Pai(João, Pedro)
print(f"Sentença 3: {sentenca_3}")
# 4. "Existe um pássaro que voa"
sentenca_4 = "∃x (Pássaro(x) ∧ Voa(x))"
print(f"Sentença 4: {sentenca_4}")
# --- Simulação de Modus Ponens Generalizado (manual) ---
print("\n--- Simulação de Inferência (Modus Ponens Generalizado) ---")
# KB:
# Regra: ∀x (Humano(x) → Mortal(x))
# Fato: Humano(Sócrates)
# 1. Instanciação Universal (aplicar a regra para Sócrates)
# Resulta em: Humano(Sócrates) → Mortal(Sócrates)
print(f"Instanciação Universal: {Humano(Sócrates)} → {Mortal(Sócrates)}")
# 2. Modus Ponens
# Se temos (Humano(Sócrates) → Mortal(Sócrates)) e Humano(Sócrates) é True,
# então inferimos Mortal(Sócrates)
if Humano(Sócrates): # Assumindo que este fato é conhecido como True
print(f"Aplicando Modus Ponens com {Humano(Sócrates)} e {Humano(Sócrates)} → {Mortal(Sócrates)}...")
print(f"Conclusão: {Mortal(Sócrates)}")
else:
print("Fato 'Humano(Sócrates)' não é verdadeiro, não podemos inferir.")
# --- Exemplo de Unificação (conceitual) ---
print("\n--- Simulação de Unificação (Conceitual) ---")
def unificar(expressao1, expressao2):
"""
Função conceitual para demonstrar unificação.
Em uma implementação real, seria muito mais complexa.
"""
if expressao1 == expressao2:
return {} # Já são idênticas
if isinstance(expressao1, str) and expressao1.islower() and expressao1 not in [Sócrates, Piupiu, João, Pedro]: # É uma variável
return {expressao1: expressao2}
if isinstance(expressao2, str) and expressao2.islower() and expressao2 not in [Sócrates, Piupiu, João, Pedro]: # É uma variável
return {expressao2: expressao1}
# Lógica mais complexa para predicados e funções aqui...
return None # Não unificável ou complexidade não tratada
e1_var = "Gosta(João, x)"
e2_const = "Gosta(João, Pizza)"
unificador_ex1 = unificar(e1_var.split(', ')[:-1], e2_const.split(', ')[:-1]) # Simplificando para apenas o termo 'x'
print(f"Unificador para '{e1_var}' e '{e2_const}': {unificador_ex1}") # Esperado: {'x': 'Pizza'}
e3_var = "Gosta(y, Pedro)"
e4_const = "Gosta(Maria, Pedro)"
unificador_ex2 = unificar(e3_var.split('(').split(','), e4_const.split('(').split(',')) # Simplificando para apenas o termo 'y'
print(f"Unificador para '{e3_var}' e '{e4_const}': {unificador_ex2}") # Esperado: {'y': 'Maria'}
# Um exemplo mais complexo de unificação real precisaria de um parser
# e tratamento recursivo de estruturas.Considerações Finais
A Lógica de Predicados de Primeira Ordem é uma ferramenta poderosa para a Representação de Conhecimento na Inteligência Artificial. Sua capacidade de expressar propriedades de objetos, relações e quantificações a torna indispensável para domínios complexos, onde fatos não podem ser simplesmente representados como proposições atômicas. Embora a inferência em LPO seja computacionalmente mais desafiadora, a sua expressividade é um trade-off necessário para modelar cenários ricos do mundo real, formando a base de sistemas de raciocínio lógico mais avançados.
Verificação de Aprendizagem
Responda às seguintes questões e implemente as tarefas propostas para solidificar seu entendimento sobre a Lógica de Predicados.
Diferenças LP vs. LPO:
Qual a principal motivação para usar Lógica de Predicados em vez de Lógica Proposicional na representação de conhecimento de um agente inteligente? Cite dois exemplos de sentenças que são facilmente representáveis em LPO, mas difíceis ou impossíveis em LP.
Sintaxe da LPO:
Identifique e explique os três tipos de termos em Lógica de Predicados. Para cada tipo, forneça um exemplo concreto.
Quantificadores:
- Explique a diferença entre o quantificador universal (\(\forall\)) e o quantificador existencial (\(\exists\)).
- Traduza as seguintes sentenças para FBFs em Lógica de Predicados:
- “Todos os carros têm rodas.”
- “Existe um professor que é amigo de todos os alunos.”
- “Nenhum animal é imortal.” (Tente duas formas diferentes de expressar isso usando quantificadores e negação)
- “Nem todos os alunos gostam de matemática.”
Inferência em LPO:
Você tem a seguinte base de conhecimento (KB):
- \(\forall x \ (Homem(x) \rightarrow Mortal(x))\)
- \(\forall y \ (Grego(y) \rightarrow Homem(y))\)
- \(Grego(Platão)\)
- Usando as regras de inferência (Instanciação Universal e Modus Ponens Generalizado), mostre os passos para provar que \(Mortal(Platão)\) é uma consequência lógica desta KB.
- Explique o conceito de unificação e como ele é essencial para a inferência em LPO, usando um exemplo diferente dos apresentados na aula.
Limitações e Desafios:
Mesmo com sua maior expressividade, a Lógica de Predicados de Primeira Ordem ainda possui desafios. Pesquise brevemente (fora dos materiais da aula, se necessário) e discuta uma limitação ou desafio que a LPO enfrenta na representação de conhecimento do senso comum ou em domínios mais complexos.