Variação: Sistema Dinâmico e Interativo (Chatbot Especialista)
Sistemas reais não recebem todos os fatos de uma vez. Muitas vezes, eles leem as regras e perguntam ao usuário os sintomas faltantes para tentar validar uma hipótese.
O que muda?
Se o sistema esbarrar em uma regra onde falta uma informação, ele pausa e pergunta ao paciente (via input) se ele tem aquele sintoma específico.
class SistemaEspecialistaInterativo:
def __init__(self, base_conhecimento):
self.base = base_conhecimento
self.perguntas_feitas = set() # Evita fazer a mesma pergunta duas vezes
def inferir_interativamente(self):
print("=== INICIANDO TRIAGEM MÉDICA ===\n")
novos_fatos = True
while novos_fatos:
novos_fatos = False
for condicoes, conclusao in self.base.regras:
# Se o diagnóstico já foi feito, pula a regra
if conclusao in self.base.fatos:
continue
condicoes_atendidas = True
for condicao in condicoes:
if condicao not in self.base.fatos:
# Se não sabemos desse fato e ainda não perguntamos, perguntamos agora!
if condicao not in self.perguntas_feitas and "infecção" not in condicao:
# O 'infecção' é checado para ele não perguntar diagnósticos intermediários
resposta = input(f"O paciente apresenta '{condicao}'? (S/N): ").strip().upper()
self.perguntas_feitas.add(condicao)
if resposta == 'S':
self.base.fatos.append(condicao)
else:
condicoes_atendidas = False
break # Falhou nesta regra, vai para a próxima
else:
condicoes_atendidas = False
break
# Se passou por todas as condições (sendo S ou já estando na base)
if condicoes_atendidas:
print(f"\n[!] DIAGNÓSTICO INFERIDO: {conclusao.upper()} [!]\n")
self.base.fatos.append(conclusao)
novos_fatos = True
# --- TESTANDO A VARIAÇÃO 2 ---
# Usando a mesma BaseDeConhecimento original do seu exemplo
base_v2 = BaseDeConhecimento() # Supondo que a classe original está importada
base_v2.adicionar_regra(["febre alta", "tosse"], "infecção respiratória")
base_v2.adicionar_regra(["infecção respiratória", "dificuldade para respirar"], "pneumonia")
sistema_v2 = SistemaEspecialistaInterativo(base_v2)
# Ao rodar, ele perguntará: "O paciente apresenta 'febre alta'? (S/N):"
# sistema_v2.inferir_interativamente()