O sistema usa lógica proposicional: fatos (sintomas) e regras "SE condição ENTÃO conclusão". A classe BaseDeConhecimento guarda fatos e regras. A classe Sistema Especialista aplica as regras repetidamente (forward chaining), inferindo novos diagnósticos até não haver mais novidades, e explica o raciocínio usado.
class BaseDeConhecimento:
"""Armazena os fatos (sintomas) e as regras (condicao -> conclusao)."""
def __init__(self):
self.fatos = []
self.regras = []
def adicionar_fato(self, fato):
if fato not in self.fatos:
self.fatos.append(fato)
def adicionar_regra(self, condicao, conclusao):
self.regras.append((condicao, conclusao))
class SistemaEspecialista:
"""Mecanismo de inferencia por encadeamento progressivo (forward chaining)."""
def __init__(self, base_conhecimento):
self.base = base_conhecimento
self.raciocinio = []
def inferir(self):
novos_fatos = True
while novos_fatos:
novos_fatos = False
for condicao, conclusao in self.base.regras:
if all(f in self.base.fatos for f in condicao) and conclusao not in self.base.fatos:
self.base.fatos.append(conclusao)
self.raciocinio.append((condicao, conclusao))
novos_fatos = True
def explicar_raciocinio(self):
if not self.raciocinio:
print("Nenhuma regra foi disparada.")
return
print("Raciocinio do sistema:")
for i, (cond, conc) in enumerate(self.raciocinio, 1):
print(f" Passo {i}: SE ({' E '.join(cond)}) ENTAO '{conc}'")
# Criando a base de conhecimento
base = BaseDeConhecimento()
# Fatos (sintomas do paciente)
base.adicionar_fato("febre alta")
base.adicionar_fato("tosse")
base.adicionar_fato("dificuldade para respirar")
# Regras
base.adicionar_regra(["febre alta", "tosse"], "infeccao respiratoria")
base.adicionar_regra(["infeccao respiratoria", "dificuldade para respirar"], "pneumonia")
base.adicionar_regra(["dor de garganta", "espirros"], "resfriado comum")
base.adicionar_regra(["tosse seca", "coriza"], "gripe")
base.adicionar_regra(["pneumonia", "dor no peito"], "pneumonia grave - encaminhar para exame")
base.adicionar_regra(["chiado no peito", "dificuldade para respirar"], "possivel crise de asma")
# Executando a inferencia
sistema = SistemaEspecialista(base)
sistema.inferir()
# Explicando o raciocinio e mostrando os fatos finais
sistema.explicar_raciocinio()
print("\nFatos finais:")
print(base.fatos)