Para este desafío cambié un poco el código ya que me gusta más cuando es interactivo, para este caso creé la lista de reglas, mientras que la de hechos se va llenendo dependiendo de lo que presente el paciente, muestro mi código a continuación, me ayude de IA para construirlo:
class BaseDeConocimiento:
def init(self):
self.hechos = []
self.reglas = []
def agregar_hecho(self, hecho):
if hecho not in self.hechos:
self.hechos.append(hecho)
def agregar_regla(self, condicion, conclusion):
self.reglas.append((condicion, conclusion))
class SistemaExperto:
def init(self, base_conocimiento):
self.base_conocimiento = base_conocimiento
def inferir(self):
nuevos_hechos = True
while nuevos_hechos:
nuevos_hechos = False
for condicion, conclusion in self.base_conocimiento.reglas:
if all(hecho in self.base_conocimiento.hechos for hecho in condicion):
if conclusion not in self.base_conocimiento.hechos:
self.base_conocimiento.hechos.append(conclusion)
nuevos_hechos = True
1. Configuración de la base de reglas fija
base_maestra = BaseDeConocimiento()
base_maestra.agregar_regla(["fiebre", "dolor de cabeza"], "gripe")
base_maestra.agregar_regla(["fiebre", "dolor de garganta"], "infección respiratoria")
base_maestra.agregar_regla(["infección respiratoria", "dificultad para respirar"], "neumonía")
base_maestra.agregar_regla(["dolor estomacal", "fiebre"], "infección gastrointestinal")
base_maestra.agregar_regla(["infección gastrointestinal", "deshidratación"], "gastroenteritis severa")
base_maestra.agregar_regla(["tos", "dificultad para respirar"], "bronquitis")
base_maestra.agregar_regla(["fiebre", "dolor estomacal", "vómitos"], "intoxicación alimentaria")
base_maestra.agregar_regla(["dolor de cabeza", "visión borrosa"], "migraña severa")
Lista de síntomas disponibles extraídos de las reglas para mostrarlos en el menú
sintomas_disponibles = sorted(list(set(
sintoma for condicion, _ in base_maestra.reglas for sintoma in condicion
)))
2. Bucle principal de atención a pacientes
while True:
print("\n" + "="*50)
print(" SISTEMA EXPERTO DE DIAGNÓSTICO MÉDICO")
print("="*50)
print("Seleccione los síntomas del paciente (separe los números por comas):")
Mostramos el menú con índices numéricos
for i, sintoma in enumerate(sintomas_disponibles, 1):
print(f" {i}. {sintoma}")
print(" 0. Salir del programa")
print("="*50)
entrada = input("Ingrese su selección (ejemplo: 1,3,5): ").strip()
if entrada == "0":
print("\nCerrando el sistema médico. ¡Hasta luego!")
break
try:
# Procesamos la entrada del usuario
indices = [int(x.strip()) for x in entrada.split(",") if x.strip().isdigit()]
Creamos una instancia limpia de la base de conocimiento para ESTE paciente
base_paciente = BaseDeConocimiento()
base_paciente.reglas = base_maestra.reglas # Hereda las reglas maestras
sintomas_seleccionados = []
for idx in indices:
if 1 <= idx <= len(sintomas_disponibles):
sintoma_elegido = sintomas_disponibles[idx - 1]
base_paciente.agregar_hecho(sintoma_elegido)
sintomas_seleccionados.append(sintoma_elegido)
if not sintomas_seleccionados:
print("\n[!] No seleccionó ningún síntoma válido. Intente de nuevo.")
continue
Ejecutamos el motor de inferencia solo con los datos del paciente actual
sistema = SistemaExperto(base_paciente)
sistema.inferir()
Filtramos las conclusiones (lo que no estaba en los síntomas iniciales)
diagnosticos = [h for h in base_paciente.hechos if h not in sintomas_seleccionados]
Mostramos los resultados en pantalla
print("\n" + "-"50)
print(" REPORTE DEL PACIENTE")
print("-"50)
print("SÍNTOMAS:")
for s in sintomasseleccionados:
print(f" • {s}")*
print("\nDIAGNÓSTICO INFERIDO:")
if diagnosticos:
for d in diagnosticos:
print(f" ▶ \033[1;32m{d.upper()}\033[0m")
else:
print(" • No se encontraron patrones concluyentes para un diagnóstico.")
print("-"*50)
input("\nPresione Enter para evaluar a otro paciente...")
except ValueError:
print("\n[!] Error en el formato de entrada. Use números separados por comas.")
Aquí les dejo algunas imágenes de la ejecución: