Descargar

El nuevo mundo de la generación de código (página 2)


Partes: 1, 2

Generalidades de los Sistemas Expertos

Un avance firme y verdadero de la inteligencia artificial lo constituyen sin dudas los sistemas expertos. Estos pueden incorporar miles de reglas. A una persona le causaría trauma realizar una búsqueda de reglas posibles para completar un problema y a la vez hacer que concuerden estas con la posible solución, mientras sigue en un papel el mejor de los caminos en un árbol de búsqueda de soluciones .

Los sistemas expertos realizan amablemente esta tarea; mientras que la persona responde a las preguntas formuladas por el sistema experto, este busca recorriendo las ramas más interesantes del árbol, hasta dar con la respuesta afín al problema, o en su falta, la más parecida esta. Los sistemas expertos tienen la ventaja frente a otros tipos de programas de Inteligencia Artificial, de proporcionar gran flexisivilidad a la hora de incorporar nuevos conocimientos. Para ello solo tenemos que introducir la nueva regla que deseemos hacer constar y…ya está, sin necesidad de cambiar el funcionamiento propio del programa. Los sistemas expertos son "autoexplicativos", al contrario que en los programas convencionales, en los que el conocimiento como tal está encriptado junto al propio programa en forma de lenguaje de ordenador. Los expertos de I.A. dicen que los sistemas expertos tienen un conocimiento declarativo, mientras que en los demás programas es procedural.

El Sistema Experto más adecuado para la Generación inteligente

Bajo la plataforma .NET corre de manera silenciosa pero veloz :ExpertCoder, un conjunto de herramientas para escribir generadores de código. Estas herramientas no son generadores de generadores; sino que se apoya en un conjunto de librerías para escribir los generadores.

Existen otras alternativas más avanzadas, como por ejemplo utilizar plantillas XSLT para transformar documentos XML en código fuente; con estas alternativas se gana en claridad, ya que el código del generador (la plantilla) se parece mucho al código generado; sin embargo exponen sus desventajas a la hora de agregarle inteligencia al generador, ya que el conjunto de herramientas y librerías accesibles desde una plantilla es bastante reducido.

El propósito de este proyecto es construir un conjunto de herramientas que provean al desarrollador de generadores de código lo mejor de ambos mundos:

  • La claridad que aporta el uso de plantillas para la generación de código.
  • La potencia de la plataforma .NET, junto a su enorme librería de clases, brinda un gran poder de expresión al desarrollador.

Adicionalmente, al estar basado en los principios de los sistemas expertos, los generadores resultantes son fácilmente extensibles, modulares y su estructura es más declarativa que imperativa.

¿Qué es lo que más nos interesa en la entrada del generador?

En un ambiente de generación de código, no nos interesan la posición ni el tamaño de los cuadros, ni tampoco el grosor ni color de las líneas u otros componentes del dibujo grafico; nos interesan los conceptos que más profundamente representan estas imágenes. El conjunto de estos conceptos representados es lo que llamamos Modelo, y es en definitiva el diseño que el autor del diagrama quiso representar gráficamente. Esto es lo que se convierte en una parte importante de la materia prima de nuestro sistema generador.

Veamos entonces el funcionamiento de este poderoso Sistema Experto

La idea básica es crear un sistema experto, escribiendo un conjunto de reglas y especificando las distintas precedencias entre ellas. Estas reglas son evaluadas por un motor de ejecución, quien determina en base a las precedencias y al estado de activación de cada regla cual ejecutar.

El motor de ejecución provee un entorno, donde hay información proveniente de tres fuentes:

  • Parámetros: estos se encuentran almacenados en ficheros de configuración.
  • Modelo de entrada: es el modelo que se quiere convertir.
  • Conocimiento deducido: el mismo sistema experto puede modificar su memoria activa. De esta manera se puede implementar un mecanismo de interacción indirecto entre reglas.

El entorno del motor mantiene referencias a:

  • El modelo de entrada.
  • El elemento actual del modelo de entrada.
  • El modelo de salida.
  • El elemento actual del modelo de salida.

Un generador típico estará compuesto por dos tipos de reglas: reglas de navegación y reglas de producción. Las reglas de navegación se activan ante la presencia de un determinado tipo de elemento en la entrada, y procede a "navegar" las relaciones de dicho elemento, cambiando el elemento actual del modelo de entrada. Las reglas de producción, al activarse ante un elemento en la entrada ( y tal vez también cierto tipo de elemento a la salida), aplican un algoritmo escrito por el desarrollador para generar nodos a la salida utilizando la información actual que se encuentra en la entrada y la memoria activa.

Una manera de hacer bien las cosas

La forma de trabajo, consiste en crear un sistema experto escribiendo un conjunto de reglas y especificando las distintas precedencias entre ellas. Estas reglas son evaluadas por un motor de ejecución (del Sistema Experto), quien determina cual ejecutar en base a las precedencias y al estado de activación de cada regla. Esto resuelve la problemática planteada. Aunque la forma de hacerlo esta planteada en lo adelante ninguna herramienta individual ha logrado hacer uso eficiente de estos recursos que provee la plataforma .NET

El motor de ejecución provee un entorno, donde hay información proveniente de tres fuentes:

  • Parámetros: estos se encuentran almacenados en ficheros de configuración.
  • Modelo de entrada: es el modelo que se quiere convertir.
  • Conocimiento deducido: el mismo sistema experto puede modificar su memoria activa. De esta manera se puede implementar un mecanismo de interacción indirecto entre reglas.

El entorno del motor mantiene referencias a los siguientes elementos:

  • El modelo de entrada.
  • El elemento actual del modelo de entrada.
  • El modelo de salida.
  • El elemento actual del modelo de salida.

Un generador típico estará compuesto por dos tipos de reglas: reglas de navegación y reglas de producción.

Las reglas de navegación se activan ante la presencia de un determinado tipo de elemento en la entrada, y procede a "navegar" las relaciones de dicho elemento, cambiando el elemento actual del modelo de entrada.

Las reglas de producción, al activarse ante un elemento en la entrada (y tal vez también ante cierto tipo de elemento a la salida), aplican un algoritmo escrito por el desarrollador para generar nodos a la salida utilizando la información actual que se encuentra en la entrada y la memoria activa.

Usando plantillas

Una plantilla es un documento de texto plano, donde pueden escribirse algunos marcadores especiales. Estos marcadores pueden luego ser reemplazados por valores durante la ejecución de un programa. No hay un formato predefinido para los marcadores; cada programador puede escoger el esquema que más le guste o que más le convenga.

Este documento, puede ser tratado por el sistema experto de manera encapsulada haciendo tratamiento de ficheros que agilizan el trabajo del sistema experto, pues permiten agregar reglas que estan previamente delimitadas.

La librería para manipular plantillas es ExpertCoder.Templates.dll.

Lo novedoso aqui es que dentro de las plantillas se pueden crear marcadores,un marcador puede reemplazarse por una cadena de caracteres cualquiera, sin importar de donde se obtuvo dicha cadena. Por lo tanto, el valor de un marcador podría obtenerse a partir de otra plantilla. Aprovechando esto es posible crear árboles de plantillas, o sea, estructuras jerárquicas donde una plantilla contiene a otras plantillas.

Buscando una arquitectura que soporte los propósitos

Cada cosa planteada anteriormente se convierte para muchos en un reto, podemos encarar la tarea de escribir un generador de código que genere a partir de un modelo un sistema informático completo, incluyendo los mecanismos para su compilación. Lo más eficiente en este caso es escribir varios generadores, uno por cada capa.

La arquitectura del código generado estará pensada de manera tal que todas sus piezas calcen a la perfección, dejando lugar para que los programadores añadan funcionalidad o restrinjan el comportamiento del sistema. Deberán minimizarse, siempre que sea posible, los casos donde el generador cree sólo la versión inicial de un fichero que el programador pueda modificar; las interacciones entre el código generado y el código escrito a mano podrán ser mediante mecanimos de herencia o composición.

Como ya se mencionó, es altamente probable que el código generado haga uso de librerías escritas por los mismos desarrolladores del generador.

No es el fin del pensamiento informático

La generación de código es sólo una solución pragmática a la situación actual. No implica abandonar todo pensamiento crítico, toda esperanza de mejora en la creación de sofware. Creo que vamos por buen camino: tenemos arquitectura, patrones, vamos conociendo cada vez más, cómo generar software de calidad. Estamos, creo, en una etapa ingeniosa de nuestra disciplina: estamos ordenando conocimientos, clasificando datos, comenzando a darnos cuenta de cuáles son los esquemas, relaciones, problemas esenciales. Vamos por la línea de Turing.

Conclusiones

Muchos son los caminos mediante los cuales los desarrolladores pueden simplificar su trabajo y disminuir el valor de la poderosa variable tiempo en los procesos de desarrollo del software. Utilizar eficazmente estos recursos brindados por .NET posibilita una abstracción en la programación necesaria para las técnicas actuales de desarrollo.

El diseño de ste tipo de programas no puede dejar de cumplir estos requisitos que garantizan lo novedoso, lo que lo acerca al mundo d el ainteligenmcia artificial:

Aprender de la experiencia y aplicar el conocimiento adquirido a nuevas situaciones.Hacer una determinación de lo que es importante. Lograr hacer software que almacenan conocimientos y haga inferencias.

Bibliografía

Russell, Russell, Stuart. Norvig, Peter (1996), "Inteligencia Artificial. Un enfoque moderno". Editorial Prentice Hall. 1996.

Giarritano, J. (2001), Sistemas expertos, principios y programación, Internacional

Simons, G. (1985), Expert Systems and mycros, Manchester National Computing Centre

Booch,Grady(1999), UML in Action, Comunication of the ACM

Coleman Derek(1997) , UML:The Language of blueprints for Software

http://www.aircenter.net

http://www.codegeneration.net/

Ayuda de Visual Estudio.NET

Biografía del autor

Lázaro Campoalegre Vera, estudiante de Ultimo año de Ingeniería en Ciencias Informáticas, Facultad de Entornos Virtuales, Universidad de las Ciencias Informáticas (UCI), Ciudad de la Habana, Cuba.

 

Lazaro Campoalegre Vera

Facultad de Entornos Virtuales

Universidad de las Ciencias Informáticas

Ciudad de la Habana,Cuba, 22 de octubre de 2007.

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente