UD05 · Notebook 10 — Simular un sistema experto con experta¶
Requisitos
Python 3.10+ con experta. Recuerda el parche de compatibilidad (collections.Mapping desapareció en Python 3.10):
import collections, collections.abc
if not hasattr(collections, 'Mapping'):
collections.Mapping = collections.abc.Mapping
collections.Iterable = collections.abc.Iterable
collections.MutableMapping = collections.abc.MutableMapping
Objetivo: construir un sistema experto que diagnostique un problema y lo compare con uno de clasificación, demostrando que un mismo motor simula comportamientos de ámbitos distintos (CE b).
Es una entrega evaluable: se corrige con la rúbrica de su tarea en Moodle.
Fase 1 — Parche e importación¶
%pip install experta
# experta (2019) rompe en Python 3.10+ porque `collections.Mapping` se eliminó.
# Parche de tres líneas antes de importar (ya documentado en la UD00):
import collections, collections.abc
if not hasattr(collections, 'Mapping'):
collections.Mapping = collections.abc.Mapping
collections.Iterable = collections.abc.Iterable
collections.MutableMapping = collections.abc.MutableMapping
from experta import *
✏️ Respuesta: ¿por qué el parche tiene que ir antes del import?
(escribe aquí)
Fase 2 — Sistema de diagnóstico de un coche que no arranca¶
Salida esperada:
Anota la salida y explica qué reglas se dispararon y en qué orden.
class DiagnosticoCoche(KnowledgeEngine):
# TU CÓDIGO: @DefFacts() con el hecho inicial
...
# TU CÓDIGO: regla de arranque con salience=10 que declare los sintomas
...
# TU CÓDIGO: regla que deduzca la causa
...
# TU CÓDIGO: regla que imprima el resultado
...
motor = DiagnosticoCoche()
motor.reset() # sin reset() no se cargan los DefFacts
motor.run()
✏️ Respuesta: anota la salida y explica qué reglas se dispararon y en qué orden.
(escribe aquí)
Fase 3 — Sistema de clasificación (otro ámbito)¶
El fallo más habitual de esta fase
Si llamas a Animales().run() sin reset() antes, no se dispara ninguna regla: run() solo ejecuta el ciclo de inferencia sobre los hechos ya cargados, y es reset() quien invoca @DefFacts() para cargarlos. Sin ese paso, engine.facts queda casi vacío y no hay nada que coincida con las reglas.
class Animales(KnowledgeEngine):
# TU CÓDIGO
...
motor = Animales()
motor.reset() # sin reset() no se cargan los DefFacts
motor.run()
✏️ Respuesta: ¿qué has tenido que cambiar del motor entre la Fase 2 y la Fase 3? ¿Y qué has conservado? Esa es la idea de fondo del criterio.
(escribe aquí)
Fase 4 — Analiza el orden de disparo¶
Modifica la regla mamifero para que tenga salience=5 y vuelve a ejecutar. ¿Qué cambia? Explica la resolución de conflictos.
# TU CÓDIGO: repite el motor de la Fase 3 con la salience cambiada
...
✏️ Respuesta: ¿qué cambia? Explica la resolución de conflictos: cuando varias reglas están activas a la vez, ¿cómo decide el motor?
(escribe aquí)
Fase 5 — Añade una regla con NOT y pregunta al usuario¶
class DiagnosticoConPregunta(KnowledgeEngine):
# TU CÓDIGO: usa input() en la regla de arranque y declara el hecho segun la respuesta
...
motor = DiagnosticoConPregunta()
motor.reset()
motor.run()
✏️ Respuesta: ¿qué aporta NOT que no se pueda hacer con una regla normal?
(escribe aquí)
Fase 6 — Analiza la sensibilidad¶
Añade una regla con umbral (usuarios > 50 → critica) y prueba con distintos valores (40, 55, 50). ¿Qué ocurre justo en el umbral? ¿Cómo lo harías robusto (histéresis, §9)?
# TU CÓDIGO: regla con umbral y las tres pruebas
# Pista: para comparar dentro de un Fact hace falta un constraint de predicado, P(...)
...
✏️ Respuesta: ¿qué ocurre justo en el umbral? ¿Cómo lo harías robusto con histéresis?
(escribe aquí)
Entrega¶
Recopila las capturas y las explicaciones de las seis fases en una memoria en PDF. Se valora que expliques qué reglas se dispararon y en qué orden, no solo la salida final.
| Fase | Evidencia mínima |
|---|---|
| 1 | El parche aplicado y experta importado sin error |
| 2 | El diagnóstico del coche funcionando, con las reglas que se dispararon |
| 3 | La clasificación del guepardo, y por qué el mismo motor sirve para otro ámbito |
| 4 | El cambio de salience y su efecto en el orden de disparo |
| 5 | La regla con NOT y la versión que pregunta al usuario |
| 6 | El umbral probado con tres valores, y tu propuesta de histéresis |
Soluciones
Las soluciones no se publican: se corrigen y comentan en clase.