Diseño de un motor de reglas en JavaScript (Parte – III)
La base de
conocimientos
La
base de conocimientos escrita en JavaScript en notación JSON puede ser leída
desde otro archivo .js, un servicio Web o una base de datos local o remota.
La
base de conocimientos tiene 5 objetos de tipo Array obligatorios:
Objeto
|
Descripción
|
askfirst
|
La
pregunta o preguntas iniciales a partir de las cuáles comienza las
evaluaciones el motor de reglas
|
statefirst
|
Hechos
que son establecidos como verdaderos a partir de los cuáles comienza la
evaluación del motor de reglas
|
questions
|
Preguntas
al usuario
|
facts
|
Todos
los hechos, incluidos aquellos que son conclusivos
|
rules
|
Reglas
que permiten obtener conclusiones relacionando hechos y respuestas a las
preguntas
|
var
knowledge = {
// Pregunta o preguntas iniciales
askfirst:[],
// Hechos que inicialmente queremos
establecer como
// verdaderos
statefirst:[],
// Definicion de las preguntas
questions:[],
// Hechos
facts:[],
// Reglas
rules:[]
};
Vamos
a escribir nuestra base de conocimientos con la información que ya tenemos
sobre los coches.
Preguntas
La
primera pregunta nos va permitir seleccionar el modelo de coche que vamos a
comprar:
{qid:1,
qtext:'Por favor, elija el modelo de
coche que desea comprar',
qdesc:'Cabrio: es modelo de coche
descapotable de dos puertas.’+
'Cupé: modelo de coche de dos puertas.' +
'Berlina: modelo de coche de cuatro
puertas.',
qtype:'selection',
info:[
'cabrio',
'cupe',
'berlina']}
La
segunda pregunta nos va a permitir identificar el rango de precios del coche
que queremos comprar:
{qid:2,
qtext:'Por favor, elija un rango de
precios',
qdesc:'Define el rango de precios del
coche que queremos comprar',
qtype:'selection',
info:[
'10,000-30,000€',
'31,000-50,000€',
'+50,000€']}
Las
nueve preguntas siguientes equivalen a seleccionar uno de los coches de cada
una de las nueve posibilidades que da la matriz de cruzar los tipos de coches
con los rangos de precios:
Para
los cabrios:
{qid:3,
qtext:'Por favor, elija cabrio de entre
10,000 y 30,000€',
qdesc:'',
qtype:'selection',
info:[
'Peugeot
207',
'Renault
Megane',
'Maxda MX5']}
{qid:4,
qtext:'Por favor, elija cabrio de
entre 31,000 y 50,000€',
qdesc:'',
qtype:'selection',
info:[
'BMW z4',
'Volvo c70']}
{qid:5,
qtext:'Por favor, elija cabrio de más de
50,000€',
qdesc:'',
qtype:'selection',
info:[
'Audi TTRS',
'Audi TTS',
'BMW Serie
G']}
Para
los cupes:
{qid:6,
qtext:'Por favor, elija cupe de entre
10,000 y 30,000€',
qdesc:'',
qtype:'selection',
info:[
'Renault Laguna',
'BMW Serie 1']}
{qid:7,
qtext:'Por favor, elija cupe de
entre 31,000 y 50,000€',
qdesc:'',
qtype:'selection',
info:[
'Audi A5',
'Chevrolet Camaro',
'Mercedes Clase E']}
{qid:8,
qtext:'Por favor, elija cupe de más de
50,000€',
qdesc:'',
qtype:'selection',
info:[
'Audi TTS',
'Chevrolet
Corvette',
'Porsche
911']}
Para
las berlinas:
{qid:9,
qtext:'Por favor, elija berlina de entre
10,000 y 30,000€',
qdesc:'',
qtype:'selection',
info:[
'Alfa Romeo MiTo',
'Fiat Bravo']}
{qid:10,
qtext:'Por favor, elija berlina de
entre 31,000 y 50,000€',
qdesc:'',
qtype:'selection',
info:[
'Audi A5',
'BMW Serie 5']}
{qid:11,
qtext:'Por favor, elija berlina de más de
50,000€',
qdesc:'',
qtype:'selection',
info:[
'Audi S6',
'BMW Serie 6',
'BMW Serie 7']}
Hechos
Los
hechos describen a cada uno de los coches con sus precios y otras
características. Por simplicidad solo nos vamos a referir al precio.
{fid:1,ftext:'Peugeot 207 cabrio por 15,300€'}
{fid:2,ftext:'Renault Megane cabrio por 22,000€'}
{fid:3,ftext:'Maxda MX5 cabrio por 22,000€'}
{fid:4,ftext:'BMW z4 cabrio por 32,000€'}
{fid:5,ftext:'Volvo c70 cabrio por 37,000€'}
{fid:6,ftext:'Audi TTRS cabrio por 64,000€'}
{fid:7,ftext:'Audi TTS cabrio por 55,000€'}
{fid:8,ftext:'BMW Serie G cabrio por 83,000€'}
{fid:9,ftext:'Renault Laguna cupe por 23,000€'}
{fid:10,ftext:'BMW Serie 1 cupe por 24,000€'}
{fid:11,ftext:'Audi A5 cupe por 35,000€'}
{fid:12,ftext:'Chevrolet Camaro cupe por 44,000€'}
{fid:13,ftext:'Mercedes Clase E cupe por 44,000€'}
{fid:14,ftext:'Audi TTS cupe por 51,000€'}
{fid:15,ftext:'Chevrolet Corvette cupe por 86,000€'}
{fid:16,ftext:'Porsche 911 por 96,000€'}
{fid:17,ftext:'Alfa Romeo MiTo berlina por 14,000€'}
{fid:18,ftext:'Fiat Bravo berlina por 12,000€'}
{fid:19,ftext:'Audi A5 berlina por 34,000€'}
{fid:20,ftext:'BMW Serie 5 berlina por 35,000€'}
{fid:21,ftext:'Audi S6 berlina por 86,000€'}
{fid:22,ftext:'BMW Serie 6 berlina por 80,000€'}
{fid:23,ftext:'BMW Serie 7 berlina por 74,000€'}
Reglas
Las
reglas combinan las preguntas y los hechos:
{rid:1,cond:
'q(1) == ”cabrio” && q(2)==”10,000-30,000€”',
iftrue:'ask(3);',
iffalse:''},
{rid:2,cond:
'q(1) == ”cabrio” && q(2)==”31,000-50,000€”',
iftrue:'ask(4);',
iffalse:''},
{rid:3,cond:
'q(1) == ”cabrio” && q(2)==”+50,000€”',
iftrue:'ask(5);',
iffalse:''},
{rid:4,cond:
'q(1) == ”cupe” && q(2)==”10,000-30,000€”',
iftrue:'ask(6);',
iffalse:''},
{rid:5,cond:
'q(1) == ”cupe” && q(2)==”31,000-50,000€”',
iftrue:'ask(7);',
iffalse:''},
{rid:6,cond:
'q(1) == ”cupe” && q(2)==”+50,000€”',
iftrue:'ask(8);',
iffalse:''},
{rid:7,cond:
'q(1) == ”berlina” && q(2)==”10,000-30,000€”',
iftrue:'ask(9);',
iffalse:''},
{rid:8,cond:
'q(1) == ”berlina” && q(2)==”31,000-50,000€”',
iftrue:'ask(10);',
iffalse:''},
{rid:9,cond:
'q(1) == ”berlina” && q(2)==”+50,000€”',
iftrue:'ask(11);',
iffalse:''},
{rid:10,cond:
'q(3) == ”Peugeot 207”',
iftrue:'final(1);',
iffalse:''},
{rid:11,cond:
'q(3) == ”Renault Megane”',
iftrue:'final(2);',
iffalse:''},
{rid:12,cond:
'q(3) == ”Maxda MX5”',
iftrue:'final(3);',
iffalse:''},
{rid:10,cond:
'q(4) == ”BMW z4”',
iftrue:'final(4);',
iffalse:''},
{rid:11,cond:
'q(4) == ”Volvo c70”',
iftrue:'final(5);',
iffalse:''},
{rid:12,cond:
'q(5) == ”Audi TTRS”',
iftrue:'final(6);',
iffalse:''},
{rid:13,cond:
'q(5) == ”Audi TTS”',
iftrue:'final(7);',
iffalse:''},
{rid:14,cond:
'q(5) == ”BMW Serie G”',
iftrue:'final(8);',
iffalse:''},
{rid:15,cond: 'q(6)
== ”Renault Laguna”',
iftrue:'final(9);',
iffalse:''},
{rid:16,cond: 'q(6)
== ”BMW Serie 1”',
iftrue:'final(10);',
iffalse:''},
{rid:17,cond: 'q(7)
== ”Audi A5”',
iftrue:'final(11);',
iffalse:''},
{rid:18,cond: 'q(7)
== ”Chevrolet Camaro”',
iftrue:'final(12);',
iffalse:''},
{rid:19,cond:
'q(7) == ”Mercedes Clase E”',
iftrue:'final(13);',
iffalse:''},
{rid:20,cond: 'q(8)
== ”Audi TTS”',
iftrue:'final(14);',
iffalse:''},
{rid:21,cond: 'q(8)
== ”Chevrolet Corvette”',
iftrue:'final(15);',
iffalse:''},
{rid:22,cond: 'q(8)
== ”Porsche 911”',
iftrue:'final(16);',
iffalse:''},
{rid:23,cond:
'q(9) == ”Alfa Romeo MiTo”',
iftrue:'final(17);',
iffalse:''},
{rid:24,cond: 'q(9)
== ”Fiat Bravo”',
iftrue:'final(18);',
iffalse:''},
{rid:25,cond: 'q(10)
== ”Audi A5”',
iftrue:'final(19);',
iffalse:''},
{rid:26,cond: 'q(10)
== ”BMW Serie 5”',
iftrue:'final(20);',
iffalse:''},
{rid:27,cond: 'q(11)
== ”Audi A6”',
iftrue:'final(21);',
iffalse:''},
{rid:28,cond: 'q(11)
== ”BMW Serie 6”',
iftrue:'final(22);',
iffalse:''},
{rid:29,cond: 'q(11)
== ”BMW Serie 7”',
iftrue:'final(23);',
iffalse:''},
Preguntas
iniciales
Las
primeras preguntas a realizar son sobre el tipo de coche y el rango de precios,
que son las preguntas 1 y 2.
askfirst:[1,2],
Hechos iniciales
Inicialmente
no se establece ningún hecho:
statefirst:[],
0 comentarios:
Publicar un comentario