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

Faça como eu fiz: construindo um sistema especialista

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

Oi, Everton. Tudo bem com você?

Obrigado por compartilhar sua implementação do sistema especialista. A classe BaseDeConhecimento centraliza corretamente o armazenamento de fatos e regras, enquanto a classe SistemaEspecialista utiliza o encadeamento progressivo para inferir novos conhecimentos até que nenhuma regra adicional possa ser aplicada. Além disso, a explicação do raciocínio torna o processo de inferência mais transparente, característica bastante importante em sistemas especialistas.

Um ponto interessante foi a inclusão de regras adicionais além das solicitadas, ampliando os cenários de diagnóstico. Como exemplo, quando os fatos "febre alta", "tosse" e "dificuldade para respirar" estão presentes, o sistema infere primeiro "infeccao respiratoria" e, em seguida, utiliza esse novo fato para concluir "pneumonia". Esse comportamento demonstra corretamente o funcionamento do forward chaining e evidencia como novos fatos podem ativar outras regras ao longo da inferência.

Na sua opinião, como esse sistema poderia ser adaptado para lidar com diferentes níveis de confiança nos diagnósticos, em vez de produzir apenas conclusões determinísticas?

Parabéns pela atividade e por compartilhar sua solução com a comunidade. Continue praticando e explorando novas possibilidades. O fórum está à disposição sempre que precisar.

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