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

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):
        self.regras.append({
            "condicoes": condicoes,
            "conclusao": conclusao
        })
        
        
class SistemaEspecialista:
    def __init__(self, base_conhecimento):
        self.base = base_conhecimento

    def inferir(self):
        novos_fatos = True

        while novos_fatos:
            novos_fatos = False

            for regra in self.base.regras:
                condicoes = regra["condicoes"]
                conclusao = regra["conclusao"]

                if all(condicao in self.base.fatos for condicao in condicoes):
                    if conclusao not in self.base.fatos:
                        print(
                            f"Regra aplicada: "
                            f"{' E '.join(condicoes)} -> {conclusao}"
                        )

                        self.base.adicionar_fato(conclusao)
                        novos_fatos = True

        return self.base.fatos
        
        
base = BaseDeConhecimento()

base.adicionar_fato("febre alta")
base.adicionar_fato("tosse")
base.adicionar_fato("dificuldade para respirar")

base.adicionar_regra(
    ["febre alta", "tosse"],
    "infecção respiratória"
)

base.adicionar_regra(
    ["infecção respiratória", "dificuldade para respirar"],
    "pneumonia"
)

sistema = SistemaEspecialista(base)

resultado = sistema.inferir()


Regra aplicada: febre alta E tosse -> infecção respiratória
Regra aplicada: infecção respiratória E dificuldade para respirar -> pneumonia



print("\nFatos e diagnósticos obtidos:")

for fato in resultado:
    print("-", fato)
    



Fatos e diagnósticos obtidos:
- dificuldade para respirar
- febre alta
- infecção respiratória
- tosse
- pneumonia
1 resposta

Oi, Marcelo! Como vai?

Seu projeto ficou muito bem estruturado e mostra uma boa compreensão de sistemas especialistas, separando a BaseDeConhecimento do SistemaEspecialista. Gostei da forma como as regras são aplicadas em cadeia: primeiro o sistema identifica "infecção respiratória" e, com esse novo fato, consegue chegar ao diagnóstico "pneumonia".

Continue praticando essa lógica de inferência, porque ela ajuda a entender como sistemas baseados em conhecimento chegam a novas conclusões a partir de fatos e regras. Dica: para evoluir o projeto, você pode testar novas regras e observar se o sistema consegue gerar conclusões em sequência, como aconteceu no seu exemplo. Qual outro conjunto de fatos e regras você testaria nesse sistema especialista?

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