Confesso que utilizei IA para me auxiliar com este exercício. Segue resolução:
class BaseDeConhecimento:
"""
Gerencia os fatos (sintomas do paciente) e as regras lógicas do sistema.
As regras são armazenadas como tuplas: (antecedentes, consequente)
Onde antecedentes é um conjunto (set) de condições e o consequente é a conclusão.
"""
def init(self):
self.fatos = set()
self.regras = []
def adicionar_fato(self, fato):
self.fatos.add(fato.lower().strip())
def adicionar_regra(self, antecedentes, consequente):
# Normaliza para letras minúsculas para evitar problemas de case-sensitivity
antecedentes_normalizados = {ant.lower().strip() for ant in antecedentes}
consequente_normalizado = consequente.lower().strip()
self.regras.append((antecedentes_normalizados, consequente_normalizado))
def obter_fatos(self):
return self.fatos
def obter_regras(self):
return self.regras
class SistemaEspecialista:
"""
Mecanismo de Inferência que utiliza Forward Chaining (Encadeamento para Frente)
para deduzir novas conclusões a partir da Base de Conhecimento.
"""
def init(self, base_conhecimento):
self.base = base_conhecimento
def executar_inferencia(self):
print("=== INICIANDO PROCESSO DE INFERÊNCIA CLÍNICA ===")
print(f"Sintomas iniciais relatados: {list(self.base.obter_fatos())}\n")
novas_deducoes = True
passo = 1
# O ciclo continua enquanto novas regras forem ativadas e novos fatos forem gerados
while novas_deducoes:
novas_deducoes = False
for antecedentes, consequente in self.base.obter_regras():
# Se o consequente já é um fato conhecido, pula para a próxima regra
if consequente in self.base.obter_fatos():
continue
# Verifica se TODOS os antecedentes da regra estão presentes nos fatos atuais
if antecedentes.issubset(self.base.obter_fatos()):
print(f"[Passo {passo}] Regra Ativada:")
print(f" SE {list(antecedentes)} -> ENTÃO deduz-se: '{consequente.upper()}'")
# Adiciona a nova conclusão à base de fatos
self.base.adicionar_fato(consequente)
novas_deducoes = True
passo += 1
break # Reinicia o loop para garantir a ordem sequencial correta
print("\n=== PROCESSO CONCLUÍDO ===")
return self.base.obter_fatos()
--- 3 & 4: IMPLEMENTAÇÃO DOS DIAGNÓSTICOS E TESTE DO SISTEMA ---
if name == "main":
# 1. Instanciando a Base de Conhecimento
base_medica = BaseDeConhecimento()
# 2. Definindo as Regras Regras de Lógica Proposicional
# Regra 1: Se febre alta E tosse -> Infecção Respiratória
base_medica.add_regra = base_medica.adicionar_regra(
antecedentes={"febre alta", "tosse"},
consequente="infecção respiratória"
)
# Regra 2: Se infecção respiratória E dificuldade para respirar -> Pneumonia
base_medica.adicionar_regra(
antecedentes={"infecção respiratória", "dificuldade para respirar"},
consequente="pneumonia"
)
# 3. Inserindo os Fatos (Sintomas relatados pelo paciente)
base_medica.adicionar_fato("febre alta")
base_medica.adicionar_fato("tosse")
base_medica.adicionar_fato("dificuldade para respirar")
# 4. Executando o Mecanismo de Inferência
diagnosticador = SistemaEspecialista(base_medica)
fatos_finais = diagnosticador.executar_inferencia()
# 5. Exibindo o Resultado Final
print("\nResultados Finais na Base de Conhecimento:")
for fato in fatos_finais:
print(f" - {fato}")