Diseño de un motor de reglas en JavaScript (Parte – IV final)
Ahora
vamos a tratar como invocar desde una simple aplicación JavaScript el motor de
reglas.
Para
este ejemplo, hemos colocado todas las reglas, hechos y preguntas en un archivo
al que llamaremos rules.js y formará parte de nuestro sitio Web.
De
manera muy básica solo tenemos que cambiar reglas en este archivo y
actualizarlo para que el motor pueda encontrar soluciones de una manera u otra.
También
se puede persistirse este objeto JSON (JavaScript Object Notation) en una base
de datos remota y tener una aplicación que permita construir y mantener la
información depositada en la base de conocimientos.
Lo
primero es ver como esta organizado el motor:
Archivo
|
Descripción
|
Question.js
|
Clase
que define a las preguntas
|
Fact.js
|
Clase
que define a los hechos
|
Rule.js
|
Clase
que define las reglas
|
REE.js
|
Motor
de evaluación de reglas
|
Por
lo tanto, en nuestra aplicación Web deberíamos incluir los archivos de esta
manera:
<!--
business rules -->
<script
src="Rules.js" type="text/javascript"></script>
<!--
rules evaluation engine -->
<script
src="Question.js" type="text/javascript"></script>
<script
src="Fact.js" type="text/javascript"></script>
<script
src="Rule.js" type="text/javascript"></script>
<script
src="REE.js" type="text/javascript"></script>
Luego
tenemos que construir una instancia del motor.
ree = new RulesEvaluationEngine(knowledge,
askCallback,
solutionCallback,
logicaCallback,true);
Los
parámetros de esta llamada son:
- La base de conocimientos
en formato JSON
- La función callback para
realizar las preguntas
- La función callback para
presentar la solución
- La función callback para
presentar la lógica de la solución (esta versión del motor solo incluye
hechos y preguntas. Las reglas no se incluyen)
- Un parámetro booleano que
indica si el motor se ejecuta paso a paso o en modo de evaluación completa
El
motor tiene dos formas de ejecutarse:
Forma de
ejecución
|
Descripción
|
Paso
a paso
|
El
motor va generando las preguntas necesarias según las respuestas a preguntas
anteriores
|
Evaluación
completa
|
El
usuario responde todas las preguntas y luego el motor evalúa todos los
resultados.
|
La
comunicación entre la aplicación y el motor se realiza a través de tres
funciones callback:
Callback
function
|
Descripción
|
askCallback
|
Realiza
las preguntas
|
solutionCallback
|
Presenta
los resultados de la evaluación de las reglas
|
logicaCallback
|
Devuelve
los hechos establecidos y las respuestas del usuario para aclarar como se
llegó a una conclusión
|
Antes
de ejecutar el motor en cualquiera de los modos, tenemos que iniciar la
evaluación, proceso que elimina todas las respuestas y todos los hechos
establecidos de una evaluación anterior:
ree.initEvaluation();
Para
evaluar las preguntas, si estamos utilizando el modo de evaluación completa
tenemos dos funciones para navegar y responder en el conjunto de preguntas:
ree.Next();
ree.Prev();
Estas
funciones tienen que combinarse con la función Evaluate() que realmente invoca
al motor para obtener las conclusiones. En el caso de la evaluación paso a paso,
en cada paso se realizan evaluaciones o inferencias en el motor hasta encontrar
una solución.
En
el caso de evaluación paso a paso tenemos la función Step:
ree.Step();
Por
último, la función Logica() devuelve el conjunto de preguntas y hechos
establecidos durante la evaluación.
ree.Logica();
En
el ejemplo utilizaremos las últimas versiones de jQuery y jQuery Mobile para
construir una sencilla interfaz de usuario con tres botones:
- El primero para iniciar el
motor (poner condiciones iniciales)
- El segundo para realizar
preguntas
- El tercero para mostrar la
lógica de la solución
Limitaciones
Este
motor de evaluación de reglas en JavaScript es muy simple y ligero. Su
algoritmo de evaluación se basa en reglas de producción con una máquina de inferencia
con encadenamiento hacia adelante
(forward chaining).
Entre
las limitaciones de esta versión está el no incluir las reglas evaluadas dentro
de la lógica de como se encontró una solución.
Otra
limitación es que se ejecuta en el navegador. Una base de conocimientos muy
extensa podría provocar lentitud en nuestro sitio Web debido a que dependería
de la potencia de proceso del terminal que tengamos (no es lo mismo responder
las preguntas en un móvil que responderlas en un iMac).
Código del proyecto
El código de este proyecto podemos descargarlo desde Google Code:
0 comentarios:
Publicar un comentario