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