Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

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}")
1 resposta

Olá, Deivide! Como vai?

Parabéns pela realização das atividades!

Você apresentou um código muito bem estruturado, com clareza na definição da BaseDeConhecimento, organização no mecanismo de inferência e precisão na utilização das regras. Essa abordagem mostra domínio de lógica proposicional e aplicação prática de sistemas especialistas, o que é excelente para consolidar conceitos de IA.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Normalização: manter consistência nos dados de entrada para evitar duplicidade de fatos.
  • Expansão: adicionar novas regras para cobrir diagnósticos mais complexos.
  • Testes automatizados: validar diferentes combinações de sintomas para garantir robustez do sistema.

Ah uma pergunta: O que você considera mais interessante nesse projeto, ampliar a base de regras para diagnósticos mais variados ou otimizar o mecanismo de inferência para maior eficiência?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!