Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

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:
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad