UD02 · Notebook 2 — Sistema basado en reglas con experta¶
Requisitos
pip install "frozendict>=2.3"
pip install --no-deps experta
pip install schema==0.6.7
experta necesita un parche en Python 3.10+
experta 1.9.4 importa collections.Mapping, retirado de la librería estándar. El parche (issue #34 del proyecto) va siempre antes de from experta import *, o el import falla con ImportError: cannot import name 'Mapping' from 'collections'. Ver Fase 2.
Objetivo: implementar un mini sistema experto de diagnóstico de un PC que no arranca, con experta, y comprobar en código el ciclo reconocer-actuar de un sistema basado en reglas (RA2-e).
Es una entrega evaluable: se corrige con la rúbrica de su tarea en Moodle.
Fase 1 — Instala y verifica el parche¶
%pip install "frozendict>=2.3"
%pip install --no-deps experta
%pip install schema==0.6.7
import collections
import 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 *
Fase 3 — Define el motor de conocimiento¶
# TU CÓDIGO
class DiagnosticoPC(KnowledgeEngine):
@DefFacts()
def inicio(self):
yield Fact(accion="diagnosticar")
@Rule(Fact(accion="diagnosticar"), salience=10)
def arrancar(self):
...
# TU CÓDIGO: reglas ram, gpu, resultado_ram, resultado_gpu
...
Fase 4 — Ejecuta y observa la agenda¶
Registra en el informe la salida y explica qué hechos se declararon y qué reglas se dispararon.
# TU CÓDIGO
engine = DiagnosticoPC()
engine.reset()
engine.run()
✏️ Respuesta: ¿qué hechos se declararon y qué reglas se dispararon? ¿En qué orden?
(escribe aquí)
Fase 5 — Añade una regla con salience y variables¶
Modifica el motor para que el diagnóstico tenga prioridad y acepte un hecho parametrizado:
# TU CÓDIGO: regla 'prioridad' con salience=5 sobre causa=problema_ram, y una nueva ejecución
...
Fase 6 — Amplía el sistema¶
Añade dos reglas nuevas: si luz_encendida=False → causa="sin_alimentacion" con su mensaje de diagnóstico, y si pantalla="mensaje_bios" → causa="configuracion_bios". Responde en el informe: ¿cuándo usarías lógica difusa (Taller 1) y cuándo un sistema basado en reglas como este? Justifica con un ejemplo real.
# TU CÓDIGO
...
✏️ Respuesta: ¿cuándo usarías lógica difusa (Taller 1) y cuándo un sistema basado en reglas como este? Justifica con un ejemplo real.
(escribe aquí)
Entrega¶
| Fase | Evidencia mínima |
|---|---|
| 1-2 | El parche aplicado y la importación sin errores |
| 3 | El código completo del motor de conocimiento |
| 4 | La salida de engine.run(), con los hechos declarados y las reglas disparadas explicados |
| 5 | La regla con salience añadida y su efecto comprobado |
| 6 | Las dos reglas nuevas y la respuesta comparando lógica difusa frente a reglas |
Soluciones
Las soluciones no se publican: se corrigen y comentan en clase.