Sistema Especialista para Diagnóstico Respiratório
class BaseDeConhecimento:
def __init__(self):
self.fatos = set()
self.regras = []
def adicionar_fato(self, fato):
self.fatos.add(fato)
def adicionar_regra(self, premissas, conclusao):
self.regras.append({"premissas": set(premissas), "conclusao": conclusao})
def obter_fatos(self):
return self.fatos
class SistemaEspecialista:
def __init__(self, base_conhecimento):
self.base = base_conhecimento
self.historico_inferencias = []
def inferir(self):
mudou = True
while mudou:
mudou = False
for regra in self.base.regras:
if regra["premissas"].issubset(self.base.fatos):
if regra["conclusao"] not in self.base.fatos:
self.base.adicionar_fato(regra["conclusao"])
self.historico_inferencias.append(
f"Inferência: {regra['premissas']} → {regra['conclusao']}"
)
mudou = True
def obter_diagnostico(self):
self.inferir()
diagnosticos = [f for f in self.base.fatos if "diagnóstico" in f.lower()]
return diagnosticos
def explicar_raciocinio(self):
return "\n".join(self.historico_inferencias)
# Configuração da Base de Conhecimento
base = BaseDeConhecimento()
# Adicionando regras de diagnóstico
base.adicionar_regra(
["febre alta", "tosse"],
"diagnóstico: infecção respiratória"
)
base.adicionar_regra(
["diagnóstico: infecção respiratória", "dificuldade respiratória"],
"diagnóstico: pneumonia"
)
base.adicionar_regra(
["febre baixa", "espirro", "nariz entupido"],
"diagnóstico: resfriado comum"
)
base.adicionar_regra(
["tosse seca", "fadiga", "febre"],
"diagnóstico: bronquite"
)
base.adicionar_regra(
["dificuldade respiratória", "sibilância"],
"diagnóstico: asma"
)
# Criando Sistema Especialista
sistema = SistemaEspecialista(base)
# Teste 1: Paciente com Pneumonia
print("=== TESTE 1: Paciente com Pneumonia ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("febre alta")
sistema.base.adicionar_fato("tosse")
sistema.base.adicionar_fato("dificuldade respiratória")
diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: febre alta, tosse, dificuldade respiratória")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}\n")
# Teste 2: Paciente com Resfriado
print("=== TESTE 2: Paciente com Resfriado ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("febre baixa")
sistema.base.adicionar_fato("espirro")
sistema.base.adicionar_fato("nariz entupido")
diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: febre baixa, espirro, nariz entupido")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}\n")
# Teste 3: Paciente com Asma
print("=== TESTE 3: Paciente com Asma ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("dificuldade respiratória")
sistema.base.adicionar_fato("sibilância")
diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: dificuldade respiratória, sibilância")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}")
Explicação:
- BaseDeConhecimento: Armazena fatos (sintomas) e regras (relações entre sintomas e diagnósticos)
- SistemaEspecialista: Implementa forward chaining, aplicando regras recursivamente até inferir todos os diagnósticos possíveis
- Inferir(): Executa encadeamento para frente, adicionando conclusões quando todas as premissas são atendidas
- Testes: Demonstram diagnósticos de pneumonia, resfriado e asma com raciocínio explícito