martes 13 de enero de 2009

Ejemplo sencillo de un sistgema experto

La Inteligencia Artificial sigue siendo una ciencia para elegidos, siendo su utilización propiedad casi exclusiva de centros de investigación y universidades. Y es que aun en estos tiempos sigue exigiendo por parte del  programador de un gran derroche de  ingenio y de gran esfuerzo y dedicación.

 

Como ya sabemos un Sistema Experto  simple, consta de:

1.      Una base de hechos.

2.      Una base de conocimientos.

3.      Una maquina de inferencias.

 

Ahora veremos un ejemplo de un programita en Javascript. Recuerdan el caso de las tinas?

 

Vamos a recordarlo: Se tienen dos tinas una de 3 gls y otra de 4 gls, ambas vacías y una pila o llave de agua, para ir llenandolas.  Se quiere dejar dos galones en la tina de 4 gls, ejecutando las acciones de llenar una tina, vaciar una tina en la otra y botar el contenido de una tina. Ya se acuerdan?

 

Aquí les va el programa en Javascript.

 

<HTML>

<HEAD>

<TITLE>Tinas</TITLE>

</HEAD>

<BODY>

<CENTER>Programa TINAS <CENTER>

<BR>

<script>

function tinas()

{//Base de hechos

  var x = 0

  var y = 0

  if (document.ftinas.tina[0].checked)

     {x = eval(document.ftinas.tina[0].value)

      document.write("Llenar la tina de 3 gls (3,0)" + "<br>" )

     }

     else

     {y = eval(document.ftinas.tina[1].value)

      document.write("Llenar la tina de 4 gls (0,4)" + "<br>" )

     }

//Maquina de inferencia

for (i=1;i<=15;i++)

        { if (y == 2)

           { document.write("Solucion satisfactoria: Hay dos galones en la tina de 4" + "<br>" )

             break

           }

//Base de conocimientos

//Regla 1:

         if (x == 0 && y == 0)

           { x = 3

             y = 0

             document.write("Llenar la tina de 3 gls (3,0)" + "<br>" )

             continue

           }

//Regla 2:

         if (x == 0 && y == 0)

           { x = 0

             y = 4

             document.write("Llenar la tina de 4 gls (0,4)" + "<br>" )

             continue

           }

//Regla 3:

         if (x == 3 && y == 0)

           { x = 0

             y = 3

             document.write("Vaciar la tina de 3 gls en la de 4 gls (0,3)" + "<br>" )

             continue

           }

//Regla 4:

         if (x == 0 && y == 4)

           { x = 3

             y = 1

             document.write("Vaciar la tina de 4 gls en la de 3 gls (3,1)" + "<br>" )

             continue

           }

//Regla 5:

         if (x == 0 && y == 3)

           { x = 3

             y = 3

             document.write("Llenar la tina de 3 gls (3,3)" + "<br>" )

             continue

           }

//Regla 6:

         if (x == 3 && y == 1)

           { x = 0

             y = 1

             document.write("Botar el contenido de la tina de 3 gls (0,1)" + "<br>" )

             continue

           }

//Regla 7:

          if (x == 3 && y == 3)

           { x = 2

             y = 4

             document.write("Vaciar la tina de 3 gls en la de 4 gls (2,4)" + "<br>" )

             continue

           }

//Regla 8:

          if (x == 0 && y == 1)

           { x = 1

             y = 0

             document.write("Vaciar la tina de 4 gls en la de 3 gls (1,0)" + "<br>" )

             continue

           }

//Regla 9:

          if (x == 2 && y == 4)

           { x = 2

             y = 0

             document.write("Botar el contenido de la tina de 4 gls (2,0)" + "<br>" )

             continue

           }

//Regla 10:

          if (x == 1 && y == 0)

           { x = 1

             y = 4

             document.write("Llenar la tina de 4 gls (1,4)" + "<br>" )

             continue

           }

//Regla 11:

         if (x == 2 && y == 0)

           { x = 0

             y = 2

             document.write("Vaciar la tina de 3 gls en la de 4 gls (0,2)" + "<br>" )

             continue

          } 

//Regla 12:

         if (x == 1 && y == 4)

           { x = 3

             y = 2

             document.write("Vaciar la tina de 4 gls en la de 3 gls (3,2)" + "<br>" )

             continue

          } 

 

  }

}

</script>

Cual de las tinas prefiere llenar?

<br>

<form name="ftinas">

<input type="Radio" name="tina" value="3" checked> Tina de 3 gls

<br>

<input type="Radio" name="tina" value="4"> Tina de 4 gls

<br>

<input type="Button" name="" value=" Entrar " onclick="tinas()">

<br>

</form>

</BODY>

</HTML>

 

Observen que el programa consta de una base de hechos, una maquina de inferencia y base de conocimientos compuesta por 12 reglas. Noten que las reglas impares se refieren a comenzar llenado la tina de 3 gls y las reglas pares son para el llenado de la tina de 4 gls.

La maquina de inferencia lo único que hace es recorrer todas las reglas y en caso de que se llegue a la solución detiene el proceso.

La base de hechos inicializa los hechos (pone en cero las variables) y prepara las condiciones para la interfaz con el usuario.

 

Es bueno destacar que la base de conocimientos (BC) y la maquina de inferencias (MI) estas separados lógicamente (usted puede seguir agregando reglas sin que esto afecte la ejecución del programa), pero físicamente están unidas dentro del mismo programa. En la practica la BC y la MI deben estar separadas lógica y físicamente.

 

Pruebe agregar la siguiente regla y vera que no afecta para nada al  programa:

//Regla 13:

         if (x == 3 && y == 4)

           { x = 3

             y = 0

             document.write("Botar el contenido de  la tina de 4 gls  (3,0)" + "<br>" )

             continue

          } 

 

La regla 13 quiere decir que si esta llena la tina de 3 y esta llena la tina de 4 entonces botar el contenido de la tina de 4.

 

Esto es un ejemplo de cómo cualquier lenguaje por simple que parezca puede ser utilizado para resolver problemas que requieran de inteligencia.