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:[],

posted under , |

0 comentarios:

Publicar un comentario

Entrada más reciente Entrada antigua Inicio