1
resposta

[Projeto] Construindo um sistema especialista

# ================================
# Base de Conhecimento
# ================================
class BaseDeConhecimento:
    def __init__(self):
        self.fatos = set()
        self.regras = []

    def adicionar_fato(self, fato):
        self.fatos.add(fato)

    def adicionar_regra(self, condicoes, conclusao):
        """
        condicoes: lista de fatos necessários
        conclusao: fato que será inferido
        """
        self.regras.append((condicoes, conclusao))

    def mostrar_fatos(self):
        return self.fatos


# ================================
# Sistema Especialista
# ================================
class SistemaEspecialista:
    def __init__(self, base_conhecimento):
        self.base = base_conhecimento
        self.explicacoes = []

    def inferir(self):
        novos_fatos = True

        while novos_fatos:
            novos_fatos = False

            for condicoes, conclusao in self.base.regras:
                if all(cond in self.base.fatos for cond in condicoes):
                    if conclusao not in self.base.fatos:
                        self.base.adicionar_fato(conclusao)
                        novos_fatos = True

                        explicacao = f"Regra aplicada: SE {condicoes} ENTÃO {conclusao}"
                        self.explicacoes.append(explicacao)

    def mostrar_resultados(self):
        print("Fatos finais:")
        for fato in sorted(self.base.fatos):
            print("-", fato)

        print("\nExplicação do raciocínio:")
        for exp in self.explicacoes:
            print("-", exp)


# ================================
# Teste do Sistema
# ================================
if __name__ == "__main__":
    # Criando base de conhecimento
    base = BaseDeConhecimento()

    # Adicionando regras
    base.adicionar_regra(["febre_alta", "tosse"], "infeccao_respiratoria")
    base.adicionar_regra(["infeccao_respiratoria", "dificuldade_respirar"], "pneumonia")

    # Adicionando fatos (sintomas do paciente)
    base.adicionar_fato("febre_alta")
    base.adicionar_fato("tosse")
    base.adicionar_fato("dificuldade_respirar")

    # Criando sistema especialista
    sistema = SistemaEspecialista(base)

    # Executando inferência
    sistema.inferir()

    # Mostrando resultados
    sistema.mostrar_resultados()
1 resposta

Oi, Cássio! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei bastante da forma como você estruturou o sistema separando a BaseDeConhecimento e o SistemaEspecialista. Isso deixa o código mais organizado e facilita evoluir depois, principalmente com a lista de explicações, que ajuda a entender o raciocínio da inferência.

Se quiser, você pode testar o método set.issubset() pra verificar condições de forma mais direta.


condicoes = {"febre_alta", "tosse"}
fatos = {"febre_alta", "tosse", "dificuldade_respirar"}

if condicoes.issubset(fatos):
    print("Regra pode ser aplicada")

Nesse código, issubset verifica se todas as condições estão dentro dos fatos, deixando a leitura mais simples.

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