class BaseDeConocimiento:
def __init__(self):
self.hechos = set()
self.reglas = []
def agregar_hecho(self, hecho):
self.hechos.add(hecho)
def agregar_regla(self, condiciones, conclusion):
regla = {
"condiciones": set(condiciones),
"conclusion": conclusion
}
self.reglas.append(regla)
def obtener_hechos(self):
return self.hechos
def obtener_reglas(self):
return self.reglas
class SistemaExperto:
def __init__(self, base_conocimiento):
self.base_conocimiento = base_conocimiento
self.razonamiento = []
def inferir(self):
nuevos_hechos = True
while nuevos_hechos:
nuevos_hechos = False
for regla in self.base_conocimiento.obtener_reglas():
condiciones = regla["condiciones"]
conclusion = regla["conclusion"]
# Verifica si todas las condiciones están en los hechos conocidos
if condiciones.issubset(self.base_conocimiento.obtener_hechos()):
if conclusion not in self.base_conocimiento.obtener_hechos():
self.base_conocimiento.agregar_hecho(conclusion)
nuevos_hechos = True
explicacion = (
f"Como se cumplen las condiciones {condiciones}, "
f"se concluye: {conclusion}"
)
self.razonamiento.append(explicacion)
def mostrar_diagnosticos(self):
print("Hechos y diagnósticos encontrados:")
print("----------------------------------")
for hecho in self.base_conocimiento.obtener_hechos():
print(f"- {hecho}")
def mostrar_razonamiento(self):
print("\nRazonamiento seguido:")
print("---------------------")
if not self.razonamiento:
print("No se generaron nuevas conclusiones.")
else:
for paso in self.razonamiento:
print(f"- {paso}")
# Crear base de conocimiento
base = BaseDeConocimiento()
# Hechos entregados por el paciente
base.agregar_hecho("fiebre alta")
base.agregar_hecho("tos")
base.agregar_hecho("dificultad para respirar")
# Reglas del sistema experto
base.agregar_regla(
["fiebre alta", "tos"],
"infección respiratoria"
)
base.agregar_regla(
["infección respiratoria", "dificultad para respirar"],
"neumonía"
)
base.agregar_regla(
["tos", "dificultad para respirar"],
"posible compromiso respiratorio"
)
# Crear sistema experto
sistema = SistemaExperto(base)
# Ejecutar inferencia
sistema.inferir()
# Mostrar resultados
sistema.mostrar_diagnosticos()
sistema.mostrar_razonamiento()
Hechos y diagnósticos encontrados:
- fiebre alta
- tos
- dificultad para respirar
- infección respiratoria
- neumonía
- posible compromiso respiratorio
Razonamiento seguido:
- Como se cumplen las condiciones {'fiebre alta', 'tos'}, se concluye: infección respiratoria
- Como se cumplen las condiciones {'infección respiratoria', 'dificultad para respirar'}, se concluye: neumonía
- Como se cumplen las condiciones {'tos', 'dificultad para respirar'}, se concluye: posible compromiso respiratorio
La clase BaseDeConocimiento almacena los hechos, que representan los síntomas reportados por el paciente, y las reglas, que relacionan esos síntomas con posibles diagnósticos.
Luego, la clase SistemaExperto aplica un mecanismo de inferencia basado en lógica proposicional. El sistema revisa si los hechos existentes cumplen las condiciones de cada regla. Si una regla se cumple, agrega una nueva conclusión como hecho. Este proceso se repite hasta que ya no se puedan obtener nuevas conclusiones.
Por ejemplo, si el paciente presenta fiebre alta y tos, el sistema concluye que puede existir una infección respiratoria. Luego, si además existe dificultad para respirar, el sistema puede inferir neumonía. De esta forma, el sistema explica paso a paso el razonamiento utilizado para llegar a cada diagnóstico.