Primero se crea la estructura que almacena
class Regla:
def __init__(self, condiciones, conclusion):
self.condiciones = condiciones
self.conclusion = conclusion
def __str__(self):
return f"Si {' y '.join(self.condiciones)} -> Entonces {self.conclusion}"
Se crea la clase para gestionar los hechos y reglas
class BaseDeConocimiento:
def __init__(self):
self.hechos = set()
self.reglas = []
def agregar_hecho(self, hecho):
self.hechos.add(hecho.lower().strip())
def agregar_regla(self, condiciones, conclusion):
# Normalizamos a minúsculas para evitar errores de dedo
condiciones_limpias = [c.lower().strip() for c in condiciones]
conclusion_limpia = conclusion.lower().strip()
self.reglas.append(Regla(condiciones_limpias, conclusion_limpia))
Se crea la clase de sistema experto para la base conocimiento
class SistemaExperto:
def __init__(self, base_conocimiento):
self.bc = base_conocimiento
def inferir(self):
print("=== INICIANDO PROCESO DE INFERENCIA LÓGICA ===")
print(f"Hechos iniciales del paciente: {list(self.bc.hechos)}\n")
nuevos_hechos_descubiertos = True
paso = 1
while nuevos_hechos_descubiertos:
nuevos_hechos_descubiertos = False
for regla in self.bc.reglas:
# Si la conclusión ya la conocemos, saltamos la regla
if regla.conclusion in self.bc.hechos:
continue
# Verificamos si TODAS las condiciones de la regla están en los hechos actuales
# Esto equivale a la operación lógica AND (A ∧ B ∧ C...)
if all(condicion in self.bc.hechos for condicion in regla.condiciones):
print(f"[Paso {paso}] Regla activada: {str(regla)}")
print(f" -> Dedicido: Se agrega '{regla.conclusion}' a la base de conocimientos.")
self.bc.agregar_hecho(regla.conclusion)
nuevos_hechos_descubiertos = True
paso += 1
# Rompemos el ciclo actual para reiniciar la evaluación con el nuevo hecho
break
print("\n=== FIN DEL PROCESO ===")
return self.bc.hechos
1. Inicializar la Base de Conocimiento
bc_medica = BaseDeConocimiento()
2. Agregar el motor de reglas solicitado
bc_medica.agregar_regla(["fiebre alta", "tos"], "infeccion respiratoria")
bc_medica.agregar_regla(["infeccion respiratoria", "dificultad para respirar"], "neumonia")
bc_medica.agregar_regla(["tos", "congestion nasal"], "resfriado comun") # Regla extra para robustez
3. Insertar los hechos del paciente (Síntomas reportados)
Ejemplo: El paciente llega con fiebre alta, tos y dificultad para respirar
bc_medica.agregar_hecho("fiebre alta")
bc_medica.agregar_hecho("tos")
bc_medica.agregar_hecho("dificultad para respirar")
4. Inicializar el Sistema Experto y ejecutar la inferencia
motor_diagnostico = SistemaExperto(bc_medica)
hechos_finales = motor_diagnostico.inferir()
5. Mostrar resultados
print("\n=== DIAGNÓSTICO FINAL ===")
diagnosticos_posibles = ["infeccion respiratoria", "neumonia", "resfriado comun"]
diagnosticos_encontrados = [h.upper() for h in hechos_finales if h in diagnosticos_posibles]
if diagnosticos_encontrados:
print(f"El sistema ha diagnosticado: {', '.join(diagnosticos_encontrados)}")
else:
print("No se pudo llegar a un diagnóstico definitivo con las reglas actuales.")
RESULTADO: