# sistema_especialista_respiratorio.py
class Regra:
def __init__(self, condicoes, conclusao, desc=""):
self.condicoes = set(condicoes)
self.conclusao = conclusao
self.desc = desc
def __repr__(self):
return f"Regra({self.condicoes} -> {self.conclusao})"
class BaseDeConhecimento:
def __init__(self):
self.fatos = set()
self.regras = []
def add_fato(self, fato: str):
self.fatos.add(fato)
def add_regra(self, regra: Regra):
self.regras.append(regra)
def tem_fato(self, fato: str) -> bool:
return fato in self.fatos
def get_fatos(self):
return set(self.fatos)
def get_regras(self):
return list(self.regras)
class SistemaEspecialista:
def __init__(self, base: BaseDeConhecimento):
self.base = base
# conclusao -> (regra, condicoes)
self.justificativas = {}
def inferir(self):
mudou = True
while mudou:
mudou = False
fatos_atual = self.base.get_fatos()
for r in self.base.get_regras():
if self.base.tem_fato(r.conclusao):
continue
if r.condicoes.issubset(fatos_atual):
self.base.add_fato(r.conclusao)
self.justificativas[r.conclusao] = (r, set(r.condicoes))
mudou = True
def explicar_fato(self, fato: str, nivel: int = 0):
ident = " " * nivel
if fato not in self.base.get_fatos():
print(f"{ident}- '{fato}' não está na base.")
return
if fato not in self.justificativas:
print(f"{ident}- {fato} (fato inicial informado)")
return
regra, conds = self.justificativas[fato]
texto = regra.desc if regra.desc else str(regra)
print(f"{ident}- {fato} (inferido: {texto})")
print(f"{ident} Porque:")
for c in conds:
self._explicar_condicao(c, nivel + 2)
def _explicar_condicao(self, cond: str, nivel: int):
if cond in self.justificativas:
self.explicar_fato(cond, nivel)
else:
ident = " " * nivel
print(f"{ident}- {cond} (fato inicial informado)")
if __name__ == "__main__":
# 1) Base de conhecimento
bk = BaseDeConhecimento()
# Regras:
# Se febre alta e tosse, então infecção respiratória.
r1 = Regra(
condicoes={"febre_alta", "tosse"},
conclusao="infeccao_respiratoria",
desc="Se febre alta e tosse, então infecção respiratória."
)
# Se infecção respiratória e dificuldade para respirar, então pneumonia.
r2 = Regra(
condicoes={"infeccao_respiratoria", "dificuldade_respirar"},
conclusao="pneumonia",
desc="Se infecção respiratória e dificuldade para respirar, então pneumonia."
)
bk.add_regra(r1)
bk.add_regra(r2)
# 2) Fatos (sintomas do paciente)
bk.add_fato("febre_alta")
bk.add_fato("tosse")
bk.add_fato("dificuldade_respirar")
# 3) Rodar inferência
sistema = SistemaEspecialista(bk)
sistema.inferir()
# 4) Mostrar resultados
print("=== Fatos finais ===")
for f in sorted(bk.get_fatos()):
print("-", f)
print("\n=== Explicação: infeccao_respiratoria ===")
sistema.explicar_fato("infeccao_respiratoria")
print("\n=== Explicação: pneumonia ===")
sistema.explicar_fato("pneumonia")