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 = []
        self.regras = []

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

    def adicionar_regra(self, condicao, conclusao):
        self.regras.append((condicao, conclusao))


class SistemaEspecialista:
    def __init__(self, base_conhecimento):
        self.base_conhecimento = base_conhecimento

    def inferir(self):
        novos_fatos = True

        while novos_fatos:
            novos_fatos = False

            for condicao, conclusao in self.base_conhecimento.regras:

                # Verifica se todos os fatos da condição existem
                if all(fato in self.base_conhecimento.fatos for fato in condicao):

                    # Evita adicionar fatos repetidos
                    if conclusao not in self.base_conhecimento.fatos:

                        print(f"Regra aplicada: {condicao} -> {conclusao}")

                        self.base_conhecimento.fatos.append(conclusao)
                        novos_fatos = True


# ==========================
# Base de conhecimento
# ==========================

base = BaseDeConhecimento()

# Fatos informados pelo paciente
base.adicionar_fato("febre alta")
base.adicionar_fato("tosse")
base.adicionar_fato("dificuldade para respirar")

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

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

# ==========================
# Sistema especialista
# ==========================

sistema = SistemaEspecialista(base)

print("Fatos iniciais:")
print(base.fatos)

print("\nExecutando inferência...\n")
sistema.inferir()

print("\nFatos finais:")
print(base.fatos)
1 resposta

Boa tarde, Isis! Tranquilo?

Gostei demais da sua solução, continue assim!

Mandou muito bem explorando o while para controlar a inferência em Python, aplicou de maneira eficiente a estrutura de regras e fatos para simular um sistema especialista e entendeu como usar o all para verificar múltiplas condições de forma elegante.

E um detalhe curioso para aprimorar seria encapsular a lógica de inferência em métodos auxiliares, permitindo reutilização e testes mais fáceis. Exemplo:

def aplicar_regra(self, condicao, conclusao):
    if all(fato in self.base_conhecimento.fatos for fato in condicao):
        if conclusao not in self.base_conhecimento.fatos:
            print(f"Regra aplicada: {condicao} -> {conclusao}")
            self.base_conhecimento.fatos.append(conclusao)
            return True
    return False

Isso faz com que o código fique mais modular e organizado.

Para aprimorar suas soluções, algumas boas práticas são:

  • Legibilidade: usar nomes de variáveis mais descritivos.
  • Encapsulamento: separar métodos para aplicar regras e adicionar fatos.
  • Expansão: permitir que regras sejam carregadas de arquivos externos para maior flexibilidade.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: o que você gostaria de praticar mais agora, deixar o sistema especialista mais robusto com regras externas ou implementar explicações automáticas para justificar cada inferência ao usuário?

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

Abraço e bons estudos!

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