1
resposta

[Sistema Especialista Respiratório] - sistema_especialista_respiratorio.py

# sistema_especialista_respiratorio.py

class Regra:
    def __init__(self, condicoes, conclusao, desc=""):
        self.condicoes = set(condicoes)
        self.conclusao = conclusao
        self.desc = desc

    def __repr__(self):
        return f"Regra({self.condicoes} -> {self.conclusao})"


class BaseDeConhecimento:
    def __init__(self):
        self.fatos = set()
        self.regras = []

    def add_fato(self, fato: str):
        self.fatos.add(fato)

    def add_regra(self, regra: Regra):
        self.regras.append(regra)

    def tem_fato(self, fato: str) -> bool:
        return fato in self.fatos

    def get_fatos(self):
        return set(self.fatos)

    def get_regras(self):
        return list(self.regras)


class SistemaEspecialista:
    def __init__(self, base: BaseDeConhecimento):
        self.base = base
        # conclusao -> (regra, condicoes)
        self.justificativas = {}

    def inferir(self):
        mudou = True
        while mudou:
            mudou = False
            fatos_atual = self.base.get_fatos()
            for r in self.base.get_regras():
                if self.base.tem_fato(r.conclusao):
                    continue
                if r.condicoes.issubset(fatos_atual):
                    self.base.add_fato(r.conclusao)
                    self.justificativas[r.conclusao] = (r, set(r.condicoes))
                    mudou = True

    def explicar_fato(self, fato: str, nivel: int = 0):
        ident = "  " * nivel
        if fato not in self.base.get_fatos():
            print(f"{ident}- '{fato}' não está na base.")
            return
        if fato not in self.justificativas:
            print(f"{ident}- {fato} (fato inicial informado)")
            return

        regra, conds = self.justificativas[fato]
        texto = regra.desc if regra.desc else str(regra)
        print(f"{ident}- {fato} (inferido: {texto})")
        print(f"{ident}  Porque:")
        for c in conds:
            self._explicar_condicao(c, nivel + 2)

    def _explicar_condicao(self, cond: str, nivel: int):
        if cond in self.justificativas:
            self.explicar_fato(cond, nivel)
        else:
            ident = "  " * nivel
            print(f"{ident}- {cond} (fato inicial informado)")


if __name__ == "__main__":
    # 1) Base de conhecimento
    bk = BaseDeConhecimento()

    # Regras:
    # Se febre alta e tosse, então infecção respiratória.
    r1 = Regra(
        condicoes={"febre_alta", "tosse"},
        conclusao="infeccao_respiratoria",
        desc="Se febre alta e tosse, então infecção respiratória."
    )

    # Se infecção respiratória e dificuldade para respirar, então pneumonia.
    r2 = Regra(
        condicoes={"infeccao_respiratoria", "dificuldade_respirar"},
        conclusao="pneumonia",
        desc="Se infecção respiratória e dificuldade para respirar, então pneumonia."
    )

    bk.add_regra(r1)
    bk.add_regra(r2)

    # 2) Fatos (sintomas do paciente)
    bk.add_fato("febre_alta")
    bk.add_fato("tosse")
    bk.add_fato("dificuldade_respirar")

    # 3) Rodar inferência
    sistema = SistemaEspecialista(bk)
    sistema.inferir()

    # 4) Mostrar resultados
    print("=== Fatos finais ===")
    for f in sorted(bk.get_fatos()):
        print("-", f)

    print("\n=== Explicação: infeccao_respiratoria ===")
    sistema.explicar_fato("infeccao_respiratoria")

    print("\n=== Explicação: pneumonia ===")
    sistema.explicar_fato("pneumonia")
1 resposta

Olá, Marcelo! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de regras para estruturar a lógica de inferência, utilizou muito bem a base de conhecimento para organizar fatos e ainda compreendeu a importância da explicação detalhada para justificar cada conclusão do sistema especialista.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

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!