- Base de Conhecimento
class BaseDeConhecimento:
def __init__(self):
self.fatos = set() # Conjunto de fatos conhecidos
self.regras = [] # Lista de regras
def adicionar_fato(self, fato):
"""Adiciona um novo fato à base de conhecimento."""
self.fatos.add(fato)
print(f"Fato adicionado: {fato}")
def adicionar_regra(self, antecedentes, consequente):
"""Adiciona uma nova regra à base de conhecimento.
Uma regra consiste em uma lista de antecedentes e um consequente.
Ex: (['febre alta', 'tosse'], 'infecção respiratória')
"""
self.regras.append({'antecedentes': antecedentes, 'consequente': consequente})
print(f"Regra adicionada: SE {', E '.join(antecedentes)} ENTÃO {consequente}")
def __repr__(self):
return f"BaseDeConhecimento(Fatos={list(self.fatos)}, Regras={self.regras})"
- Mecanismo de inferência
class SistemaEspecialista:
def __init__(self, base_conhecimento):
self.base_conhecimento = base_conhecimento
self.diagnosticos_inferidos = set()
self.raciocinio = []
def inferir(self):
"""Executa o mecanismo de inferência (encadeamento para frente) para deduzir novos fatos."""
novos_fatos_inferidos = True
iteracao = 0
self.raciocinio.append(f"Iniciando inferência com fatos iniciais: {list(self.base_conhecimento.fatos)}")
while novos_fatos_inferidos:
novos_fatos_inferidos = False
iteracao += 1
self.raciocinio.append(f"\n--- Iteração {iteracao} ---")
for regra in self.base_conhecimento.regras:
antecedentes = set(regra['antecedentes'])
consequente = regra['consequente']
# Verifica se todos os antecedentes da regra estão presentes nos fatos conhecidos
if antecedentes.issubset(self.base_conhecimento.fatos) and consequente not in self.base_conhecimento.fatos:
self.base_conhecimento.adicionar_fato(consequente) # Adiciona o novo fato
self.diagnosticos_inferidos.add(consequente)
self.raciocinio.append(f"Regra Aplicada: SE {' E '.join(regra['antecedentes'])} ENTÃO {consequente}")
self.raciocinio.append(f" -> Novo fato inferido: {consequente}")
novos_fatos_inferidos = True
self.raciocinio.append("\n--- Fim da Inferência ---")
self.raciocinio.append(f"Fatos finais conhecidos: {list(self.base_conhecimento.fatos)}")
self.raciocinio.append(f"Diagnósticos inferidos: {list(self.diagnosticos_inferidos)}")
return list(self.diagnosticos_inferidos), self.raciocinio
- Implementando os Diagnósticos e Testando o Sistema
# 1. Criar a base de conhecimento
base_conhecimento_respiratorio = BaseDeConhecimento()
# 2. Adicionar regras
print("\n--- Adicionando Regras ---")
base_conhecimento_respiratorio.adicionar_regra(['febre alta', 'tosse'], 'infecção respiratória')
base_conhecimento_respiratorio.adicionar_regra(['infecção respiratória', 'dificuldade para respirar'], 'pneumonia')
base_conhecimento_respiratorio.adicionar_regra(['dor de garganta', 'febre baixa'], 'resfriado comum')
base_conhecimento_respiratorio.adicionar_regra(['coriza', 'espirros'], 'rinite alérgica')
base_conhecimento_respiratorio.adicionar_regra(['infecção respiratória', 'dor no peito'], 'bronquite')
# 3. Inserir exemplos de fatos (sintomas de um paciente)
print("\n--- Adicionando Fatos (Sintomas do Paciente) ---")
base_conhecimento_respiratorio.adicionar_fato('febre alta')
base_conhecimento_respiratorio.adicionar_fato('tosse')
base_conhecimento_respiratorio.adicionar_fato('dificuldade para respirar')
# base_conhecimento_respiratorio.adicionar_fato('dor de garganta')
# base_conhecimento_respiratorio.adicionar_fato('febre baixa')
print(f"\nEstado inicial da Base de Conhecimento: {base_conhecimento_respiratorio}")
# 4. Criar o sistema especialista e inferir
sistema_respiratorio = SistemaEspecialista(base_conhecimento_respiratorio)
print("\n--- Executando Inferência ---")
diagnosticos, raciocinio_passos = sistema_respiratorio.inferir()
print("\n--- Raciocínio Detalhado do Sistema ---")
for passo in raciocinio_passos:
print(passo)
print("\n--- Diagnósticos Finais Inferidos ---")
if diagnosticos:
for diag in diagnosticos:
print(f"- {diag}")
else:
print("Nenhum diagnóstico pôde ser inferido com os fatos fornecidos.")