UD02 · Taller 2 — Sistema basado en reglas con experta¶
Objetivo: implementar un mini sistema experto de diagnóstico de un PC que no arranca, con experta.
Fase 1 y 2 — Instala el parche e importa experta¶
Aplica el parche de compatibilidad con Python 3.10+ antes de importar experta.
In [1]:
Copied!
%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 *
%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¶
Completa la clase DiagnosticoPC con esta lógica:
inicio(@DefFacts): declara el hechoaccion="diagnosticar".arrancar(se dispara conaccion="diagnosticar",salience=10): imprime un mensaje de inicio y declara tres hechos:luz_encendida=True,sonido="pitidos_cortos",pantalla="negra".ram: siluz_encendida=TrueYsonido="pitidos_cortos", declaracausa="problema_ram".gpu: siluz_encendida=TrueYpantalla="negra", declaracausa="problema_grafica".resultado_ram: sicausa="problema_ram", imprime el diagnóstico de fallo de memoria RAM.resultado_gpu: sicausa="problema_grafica", imprime el diagnóstico de fallo de gráfica.
In [1]:
Copied!
# 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
...
# 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¶
In [1]:
Copied!
# TU CÓDIGO
engine = DiagnosticoPC()
engine.reset()
engine.run()
# 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¶
Amplía la clase (puedes heredar de DiagnosticoPC) con una regla prioridad: si causa="problema_ram", con salience=5, imprime un mensaje avisando de que hay que revisar la RAM con prioridad. Vuelve a ejecutar y comprueba en qué orden salen ahora los mensajes.
In [1]:
Copied!
# TU CÓDIGO: regla 'prioridad' con salience=5 sobre causa=problema_ram, y una nueva ejecución
...
# 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→ declaracausa="sin_alimentacion", con su regla de resultado que imprima el diagnóstico correspondiente (revisar cable y fuente de alimentación). - Si
pantalla="mensaje_bios"→ declaracausa="configuracion_bios", con su regla de resultado que imprima el diagnóstico correspondiente (revisar configuración de la BIOS).
In [1]:
Copied!
# TU CÓDIGO
...
# 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í)