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

[Projeto] Sistema Especialista

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

    def adicionar_fato(self, fato):
        """Adiciona um novo fato à base de conhecimento."""
        self.fatos.add(fato)
        print(f"Fato adicionado: {fato}")

    def adicionar_regra(self, antecedentes, consequente):
        """Adiciona uma nova regra à base de conhecimento.
        Uma regra consiste em uma lista de antecedentes e um consequente.
        Ex: (['febre alta', 'tosse'], 'infecção respiratória')
        """
        self.regras.append({'antecedentes': antecedentes, 'consequente': consequente})
        print(f"Regra adicionada: SE {', E '.join(antecedentes)} ENTÃO {consequente}")

    def __repr__(self):
        return f"BaseDeConhecimento(Fatos={list(self.fatos)}, Regras={self.regras})"
  1. Mecanismo de inferência
class SistemaEspecialista:
    def __init__(self, base_conhecimento):
        self.base_conhecimento = base_conhecimento
        self.diagnosticos_inferidos = set()
        self.raciocinio = []

    def inferir(self):
        """Executa o mecanismo de inferência (encadeamento para frente) para deduzir novos fatos."""
        novos_fatos_inferidos = True
        iteracao = 0

        self.raciocinio.append(f"Iniciando inferência com fatos iniciais: {list(self.base_conhecimento.fatos)}")

        while novos_fatos_inferidos:
            novos_fatos_inferidos = False
            iteracao += 1
            self.raciocinio.append(f"\n--- Iteração {iteracao} ---")

            for regra in self.base_conhecimento.regras:
                antecedentes = set(regra['antecedentes'])
                consequente = regra['consequente']

                # Verifica se todos os antecedentes da regra estão presentes nos fatos conhecidos
                if antecedentes.issubset(self.base_conhecimento.fatos) and consequente not in self.base_conhecimento.fatos:
                    self.base_conhecimento.adicionar_fato(consequente) # Adiciona o novo fato
                    self.diagnosticos_inferidos.add(consequente)
                    self.raciocinio.append(f"Regra Aplicada: SE {' E '.join(regra['antecedentes'])} ENTÃO {consequente}")
                    self.raciocinio.append(f"  -> Novo fato inferido: {consequente}")
                    novos_fatos_inferidos = True

        self.raciocinio.append("\n--- Fim da Inferência ---")
        self.raciocinio.append(f"Fatos finais conhecidos: {list(self.base_conhecimento.fatos)}")
        self.raciocinio.append(f"Diagnósticos inferidos: {list(self.diagnosticos_inferidos)}")

        return list(self.diagnosticos_inferidos), self.raciocinio
  1. Implementando os Diagnósticos e Testando o Sistema
# 1. Criar a base de conhecimento
base_conhecimento_respiratorio = BaseDeConhecimento()

# 2. Adicionar regras
print("\n--- Adicionando Regras ---")
base_conhecimento_respiratorio.adicionar_regra(['febre alta', 'tosse'], 'infecção respiratória')
base_conhecimento_respiratorio.adicionar_regra(['infecção respiratória', 'dificuldade para respirar'], 'pneumonia')
base_conhecimento_respiratorio.adicionar_regra(['dor de garganta', 'febre baixa'], 'resfriado comum')
base_conhecimento_respiratorio.adicionar_regra(['coriza', 'espirros'], 'rinite alérgica')
base_conhecimento_respiratorio.adicionar_regra(['infecção respiratória', 'dor no peito'], 'bronquite')

# 3. Inserir exemplos de fatos (sintomas de um paciente)
print("\n--- Adicionando Fatos (Sintomas do Paciente) ---")
base_conhecimento_respiratorio.adicionar_fato('febre alta')
base_conhecimento_respiratorio.adicionar_fato('tosse')
base_conhecimento_respiratorio.adicionar_fato('dificuldade para respirar')
# base_conhecimento_respiratorio.adicionar_fato('dor de garganta')
# base_conhecimento_respiratorio.adicionar_fato('febre baixa')

print(f"\nEstado inicial da Base de Conhecimento: {base_conhecimento_respiratorio}")

# 4. Criar o sistema especialista e inferir
sistema_respiratorio = SistemaEspecialista(base_conhecimento_respiratorio)
print("\n--- Executando Inferência ---")
diagnosticos, raciocinio_passos = sistema_respiratorio.inferir()

print("\n--- Raciocínio Detalhado do Sistema ---")
for passo in raciocinio_passos:
    print(passo)

print("\n--- Diagnósticos Finais Inferidos ---")
if diagnosticos:
    for diag in diagnosticos:
        print(f"- {diag}")
else:
    print("Nenhum diagnóstico pôde ser inferido com os fatos fornecidos.")
1 resposta

Oi, Paulo! Como vai?

Interessante o seu projeto "Sistema Especialista" e a atividade de construção de um sistema baseado em conhecimento, agradeço por compartilhar seu código com a comunidade Alura.

Analisando a forma como você organizou a solução, separando a BaseDeConhecimento do SistemaEspecialista e implementando o mecanismo de inferência por encadeamento para frente, ela está coerente. Essa divisão deixa o código mais legível e facilita futuras manutenções ou expansões, como a inclusão de novas regras e sintomas.

Outro ponto interessante foi o uso de set para armazenar os fatos conhecidos, evitando duplicidades de maneira simples e eficiente. O registro do raciocínio passo a passo também agrega muito valor, pois permite acompanhar como cada diagnóstico foi inferido, tornando o funcionamento do sistema mais transparente e fácil de depurar.

Uma dica interessante para o futuro é utilizar o metodo update() para adicionar varios fatos de uma so vez em um conjunto. Veja este exemplo:


fatos = set()
fatos.update(["febre alta", "tosse", "coriza"])
print(fatos)

Nesse exemplo, o metodo update() adiciona varios elementos ao conjunto em uma unica operacao, deixando o codigo mais organizado quando ha diversos fatos iniciais para inserir.

Quais outras condicoes ou diagnosticos voce adicionaria para deixar esse sistema ainda mais completo?

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