III.2 Programación Dirigida por Sintaxis

(Un Método de Desarrollo de Sistemas Basado

en el Lenguaje del Usuario)

Fernado Galindo Soria*

 

Resumen

La Programación Dirigida por Sintaxis es un método de desarrollo basado en la Lingüística Matemática y orientado a facilitar la comunicación hombre-máquina.

   Este método tiene la característica de permitir desarrollar el sistema de información a partir del lenguaje del usuario, por lo que, el manejo de requerimientos se realiza en un “lenguaje natural restringido” parecido al que utiliza el usuario en su comunicación dentro del área problema.

   La idea original partió de los métodos de construcción de compiladores con los cuales a partir de la gramática de un lenguaje se puede construir un traductor capaz de reconocer instrucciones en ese lenguaje, por lo que originalmente se construyeron reconocedores que tenían como entrada la gramática de un lenguaje muy restringido (tipo FORTRAN, BASIC ó PASCAL) y que interpretaba instrucciones de éste lenguaje. Más adelante se amplio el concepto de lenguaje y se construyeron traductores de lenguajes orientado a base de datos, sistemas operativos y validación de datos entre otros, para lo cual únicamente se cambió la gramática, ya que el reconocedor siguió siendo el mismo, por lo que se vio que ahora el problema principal era encontrar la gramática representativa de un lenguaje dado, ya que contando con la gramática el proceso de reconocimiento se tenía resuelto (y en realidad existen muchisimos métodos de reconocimiento de un lenguaje a partir de su gramática en los libros de construcción de compiladores), por lo que se buscaron y desarrollaron métodos de inferencia gramatical con los cuales se puede encontrar la gramática de un lenguaje a partir de ejemplos de éste. (ejemplos de estos métodos aparecen en trabajos sobre reconocimiento sintáctico de patrones), más adelante se reordenaron éstos métodos para que quedaran en una forma lógica,

 

* Fernando Galindo Soria, enero 1988

 

en la cual primero se estudia el área y se encuentran ejemplos significativos del lenguaje (Análisis), más adelante se obtiene una gramática con atributos que representa el lenguaje (Diseño) y finalmente se construye el reconocedor del lenguaje (Implantación).

 

Introducción

En la actualidad se considera que el proceso de razonamiento se desarrolla principalmente mediante métodos deductivos e inductivos; en los métodos deductivos se aplica un conjunto de reglas preestablecidas para encontrar la solución de un problema dado y por su parte los métodos inductivos buscan obtener precisamente reglas generales o patrones a partir de casos particulares, de donde se ve que son métodos complementarios.

   Sin embargo, en la actualidad, prácticamente todas las formas de programación que se utilizan se orientan al manejo de sistemas de tipo deductivo (o sea que aplican un conjunto de reglas preestablecidas para resolver un problema) y esto ocurre independientemente de la aplicación (nomina, manejador de base de datos, sistema experto, simulador de juegos, etc.) y del lenguaje o herramienta automatizada que se utilice (COBOL, FORTRAN, Pascal, LISP, PROLOG, Lotus, etc.), por lo que el informático o programador tiene que desarrollar la parte inductiva del problema a mano (lo cual ha propiciado el surgimiento de métodos para encontrar reglas generales para resolver problemas como son: el Desarrollo de Sistemas, Algorítmica, Ingeniería de Software, Ingeniería de Conocimientos, etc.).

   Por esto surge la idea de desarrollar y en su caso automatizar métodos de Programación de tipo Inductivo mediante los cuales sea relativamente fácil encontrar el conjunto de reglas generales de un problema a partir de casos particulares.

   En éste documento se presenta un método de programación de tipo inductivo basado en la Teoría de Lenguajes y en los métodos de Reconocimiento de Patrones (o formas) y orientados a facilitar la comunicación entre el usuario y la computadora en un lenguaje lo más natural posible y al manejo por parte de la computadora y de formas ó patrones más que de datos o conocimientos específicos.

   Este método tiene la característica de permitir desarrollar el sistema de información a partir del lenguaje del usuario. Por lo que, el manejo de requerimientos se realiza en un “ lenguaje natural restringido” parecido al que utiliza el usuario en su comunicación dentro del área problema. A pesar de que tradicionalmente en la literatura se presenta el problema de manejo del lenguaje natural como un problema de alta complejidad y que por tal motivo sólo puede ser atacado por personas de muy alto nivel y no es factible su manejo por la generalidad de los informáticos, sin embargo, se ha detectado que éste planteamiento es erróneo y que por el contrario, atacar los problemas informáticos a base del “lenguaje natural restringido” no sólo es más sencillo que los enfoque tradicionales sino que además permite resolver los problemas de una forma más completa, ya que al encadenarse con los métodos de reconocimiento sintáctico patrones se tiene un doble mecanismo en el cual se parte de múltiples ejemplos del lenguaje del usuario, se puede encontrar una gramática en la cual se encuentra precisamente representada la forma del lenguaje, y a partir de esta gramática es relativamente fácil construir por ejemplo las instrucciones de un sistema de información o el conjunto de reglas de inferencia de un sistema experto, de donde el sistema experto, el sistema de información se transforma en la parte deductiva de un sistema mucho más poderoso.

   La idea de éste método surge de los métodos de construcción de compiladores con los cuales a partir de la gramática de un lenguaje se puede construir un traductor capaz de reconocer instrucciones de ese lenguaje, por lo que originalmente se construyeron reconocedores que tenían como entrada la gramática de un lenguaje muy restringido (tipo FORTRAN, BASIC ó Pascal) y que interpretan instrucciones de éste lenguaje. Más adelante de amplió el concepto de lenguaje y se construyeron traductores de lenguajes orientados a base de datos, sistemas operativos y validación de datos, entre otros. Para lo cual únicamente se cambió la gramática, ya que el reconocedor siguió siendo el mismo, por lo que se vió que ahora el problema principal era el de encontrar la gramática representativa de un lenguaje dado, ya que contando con la gramática el proceso de reconocimiento se tenía resuelto (y en realidad existen muchisimos métodos de reconocimiento de un lenguaje a partir de su gramática en los libros de construcción de compiladores) por lo que se buscaron y desarrollaron métodos de inferencia gramatical, con los cuales se puede encontrar la gramática de un lenguaje a partir de ejemplos de éste. (ejemplos de éstos métodos aparecen en trabajos sobre reconocimiento sintáctico de patrones), más adelante se ordenaron estos métodos para que quedaran en una forma lógica y al método resultante se le llamó Programación Dirigida por Sintaxis.

   En la actualidad éste método se ha utilizado para desarrollar sistemas en áreas tan disímbolas como construcción de compiladores, sistemas operativos, editores, bases de datos, comunicación de datos, seguridad, etc.; lenguajes para paquetes estadísticos, de validación de datos, de control de paquetes de graficación y simuladores de robots; y aplicando el concepto de lenguaje en áreas no tradicionales se han utilizado para enseñar a la computadora a reconocer reglas ortográfica, análisis de contenido, reconocimiento de imágenes, aprendizaje de juegos (viendo las imágenes y las jugadas como ejemplos de oraciones y para desarrollar modelos neurales y secuencias lógicas de actividades) por lo que como se observa, el potencial de ésta herramienta es muy grande, ya que en contra de lo que se maneja tradicionalmente, es relativamente sencillo construir sistemas capaces de reconocer un “lenguaje natural restringido“, por lo que ésta herramienta ha trascendido el área académica se utiliza actualmente, tanto en empresas privadas como en diversas áreas del sector público, con el fin de desarrollar sus sistemas con una orientación mayor hacia el usuario, por lo que, uno de los objetivos de éste trabajo es el de difundir éste tipo de métodos y
lograr que un grupo mayor de la comunidad I.A. se involucre en su utilización y principalmente en su estudio, ya que es un área nueva y existen múltiples temas abiertos de investigación, como por ejemplo:

1) Ampliación del concepto de lenguaje.

2) Inferencia Gramatical

3) Automatización de las diferentes etapas del método.

4) Construcción de Sistemas Evolutivos.

Con éste documento se pretende entre otras cosas:

1) Mostrar un método de programación no tradicional.

2) Lograr que los sistemas de información tengan comunicación más orientada al usuario.

3) Mostrar que los métodos de construcción de compiladores no son exclusivos de los especialistas en esa área, sino que lo mismo se puede aplicar para construir un compilador, un sistema manejador de base de datos, un sistema operativo, una nómina ó sistema de inventarios, con lo cual se ve en un momento dado el hecho de tener diferentes aplicaciones no implica que no pueda usar la misma herramienta.

4) Presentar un proceso integrado para resolver problemas y que actualmente no se maneja de ésta forma (por ejemplo en los cursos de compiladores es común que se indique como obtener el lenguaje ó a partir de éste cómo obtener la gramática).

5) Mostrar la gran importancia que tiene la teoría de gramáticas (en general los sistemas formales) como herramientas para el desarrollo de sistemas.

6) Mostrar la gran importancia que tiene la Teoría de Reconocimiento de Formas (en particular el Reconocimiento Sintáctico de Patrones) como herramientas para el desarrollo de sistemas y mostrar como su integración con la Teoría de Gramáticas proporciona una herramienta aplicable en diversas aplicaciones.

 

I  Conceptos Generales

Como se ha comentado anteriormente éste método se basan principalmente en herramientas de Lingüística Matemática y de Reconocimiento Sintáctico de Patrones y en particular en las Gramáticas Libres de Contexto (o tipo 2 de la Jerarquía de Chomsky)por lo que como primer punto se presentará en forma general éste concepto y más adelante se mostrará su ámbito de aplicación.

 

1  Definición de Gramáticas Libre de Contexto

Una Gramática Libre de Contexto es una herramienta, con la cual se puede describir la estructura de las oraciones de una lengua, ésta herramienta consiste básicamente en cuatro componentes: G = <Vn , Vt, S, P > donde:

1) Vn es un conjunto de elementos o variables no terminales que sirven para representar los cambios de un estado a otro, normalmente las variables no terminales se denotan con letras mayúsculas.

2) Vt es un conjunto de elementos o variables terminales que equivalen a las señales u órdenes sobre el sistema, normalmente se denotan con letra minúscula.

3) Se tiene un elemento no terminal que indica el estado inicial o el axioma del sistema y se denota como S.

4) P es un conjunto de reglas con las cuales se describe la estructura del problema y son de la forma:

A ® a

donde A es algún estado e indica que esa regla sólo se aplica si se encuentra el problema en el estado A y a es una cadena de estados y señales.

P es un conjunto de relaciones o reglas de producción con domino y contradominio en V* (V = Vn È Vt). V* es el conjunto de todas las posibles cadenas formadas por la concatenación de elementos de V. Si a Î V* se dice que a es una cadena de elementos.

Ejemplo: El conjunto de reglas:

S ® v A

A ® + v A

A ® ;

Indican que si se está en el estado S entonces se debe verificar que llegue la señal v, si llega v entonces se pasa al estado A. En el caso del estado A se tienen dos posibles caminos: si llega la señal + se toma uno y si llega la señal ; se toma el otro. Por simplicidad cuando existen varios caminos se puede denotar como:

A ® + v A | ;

donde el símbolo | indica camino alterno.

Si no llega alguna de las señales esperadas entonces se detecta que ese no era un camino válido y se regresa al estado anterior a buscar otro camino, si ya no existe ninguno camino posible entonces la señal es errónea.

En éste ejemplo en particular las cadenas de señales válidas es de la forma:

v ;

v + v ;

v + v + v ;

v + v + . . . + v ;

O sea ésta gramática espera señales que indiquen sumas de variables.

 

2  Equivalencia Estructural entre Gramáticas y Sistemas de Información

Si partimos de que un lenguaje es un mecanismo con el que se puede representar y transmitir el conocimiento y observamos el lenguaje que se utiliza el alguna área problema podemos encontrar que en éste se encuentran en forma natural los componentes de un sistema de información, ya que podemos encontrar un conjunto de acciones que se refieren a ciertos objetos en un orden dado, donde las acciones del lenguaje se pueden representar como acciones en el sistema; a partir de los objetos se pueden obtener las entidades, atributos y valores de la estructura de datos y finalmente a partir del orden en que aparecen las acciones y objetos en la oración se puede encontrar el orden o estructura de control del Sistema de Información.

   En particular, mediante la gramática que representa el lenguaje se puede representar la estructura del Sistema de Información. Esta posibilidad de representar un sistema como una gramática permite por ejemplo obtener la gramática del Sistema de Información y estudiar la estructura del sistema y en su momento encontrar una nueva gramática que realice lo mismo (gramática equivalente) y a partir de ésta proponer un mejor sistema.

   Por lo que a continuación se verá que cualquier sistema, programa o estructura de datos es estructuralmente (también se le dice débilmente) equivalente a una gramática y como esto nos permite utilizar las gramáticas como un mecanismo para representar sistemas (como los diagramas de Warnier, de Flujo, de Flujo de Datos, etc.)

 

2.1  Equivalencia de Gramáticas y Programas

Como primer punto, se verá que la estructura de un programa se puede representar con una gramática y viceversa.

   La equivalencia entre una gramática y un programa se puede observar si se toma un programa típico.

Programa típico

Rutina A

Ejecuta B

Si C entonces D sino E

Mientras F ejecuta G

Llama a D

Fin rutina

ya que en éste se pueden encontrar cuatro estructuras de control básicas:

1) Sentencias

2) Interacciones

3) Decisiones

4) Recursión

y cada una de estas puede representarlas en abstracto mediante una gramática:

1) Sentencias: A ® B

2) Iteraciones: A ® E*

3) Decisiones A ®{C | D}

4) Recursiónes: A ® d A

Por lo que una rutina de la forma:

Rutina A

B

D ó E

(G)*

Fin rutina

se puede representar mediante la siguiente producción

A ®B {C | D} G*

o de otra forma

A ® B X Y

X ® D | E

Y ® G*

Por otro lado, a partir de la gramática se puede encontrar el programa, ya que:

1) S ® D

equivale a

Rutina S

llama a D

Fin rutina

2) S ® A B C

equivale a

Rutina S

llama a A

llama a B

llama a C

Fin rutina

3) S ® a A

equivale a

Rutina S

Si a entonces llama a A

Fin rutina

4) S ® a A | b B

equivale a

Rutina S

Si a entonces llama a A

sino Si b entonces llama a B

Fin si

Fin rutina

5) S ® a A | b B | c C | … | z Z

equivale a

 

 

 

 

 

 

 

 

 


Cualquier programa es equivalente estructuralmente a una gramática por lo que se puede tomar un programas, encontrar su gramática y detectar:

1) El tipo de lenguaje que tiene.

2) Problemas estructurales.

3) Oraciones que no reconoce.

4) etc., etc.

   Se puede tomar una gramática y construir un programa que la representa, con lo que se tendría el Sistema de Información.

 

2.2  Equivalencia entre Grmáticas y Diagramas de Warnier

Los diagramas de Warnier son herramientas para representar sistemas, ya que absorben las características de los diagramas Top/Down y de la programación estructurada con la ventaja de ser sencillos de manejar y con ellos se puede representar fácilmente, por ejemplo, Sistemas de Información, Estructuras de Datos y programas de tipo administrativo.

   En estos diagramas se permite:

1) La secuencia. La rutina A se compone de B, C y D

 

 

 

 

 

 

 


2) La decisión.En la rutina A se ejecuta B ó C

 

 

 

 

 

 

 

 

 

 


3) La iteración.En la rutina A se repite el proceso B, b veces

 

 

 

 

 

 

 

   Dado que es muy fácil obtener los programas y el sistema de información del diagrama de Warnier, este es de aplicación general, por lo que veremos que es equivalente a una gramática.

 

1)

 

 

 

 

 

 


equivale a:

A ® B C D

 

2)

 

 

 

 

 

 


equivale a:

A ® B | C

 

3)

 

 

 

 

 

 


equivale a:

A ® {B}b  C

 

como no es de uso común el exponente se puede sustituir por una gramática recursiva:

A ® B X

X ® B X | C

 

El proceso de equivalencia es el mismo por lo que por ejemplo de la gramática:

S ®  a  A | X

A ®  b  B | C  e  f

X ®  j  k  l  m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


2  Método de Programación Dirigida por Sintaxis

El hecho de que sea relativamente fácil representar un sistema de información como una gramática y que por el otro lado la gramática represente los patrones o reglas generales de algún lenguaje plantea la posibilidad de contar con un mecanismo que nos permita obtener a partir del lenguaje la estructura de un sistema de información y de ahí obtener el sistema.

   A continuación describiremos el método de Programación Dirigida por Sintaxis y en los siguientes puntos se presentará a detalle cada paso con el fin de mostrar su uso y algunas de sus posibilidades.

   El método en general consta de una fase de Análisis, en la cual se estudia el área significativa y se encuentran ejemplos significativos del lenguaje, otra de Diseño en la cual se encuentra una gramática con atributos que representa los patrones del comportamiento del lenguaje y la estructura del sistema y finalmente una fase de Implantación, donde se desarrollan las herramientas para reconocer el lenguaje.

   Detallando un poco, el método consta de las siguientes parte:

1) Análisis:

i) Detección de un área de aplicación o campa problema.

ii) Estudio del lenguaje del área y detección de ejemplos significativos del lenguaje.

2) Diseño:

i) Detección de las unidades léxicas del enunciado.

ii) Obtención de una Gramática Generativa Canónica, mediante la sustitución de cada una de las unidades léxicas en las oraciones por un símbolo que indica su tipo de unidad léxica e introduciendo un axioma que genere las oraciones.

iii) Obtención de una Gramática Generalizada mediante Técnicas de Inferencia Gramatical.

iv) Obtención de la Gramática con Atributos mediante la inclusión de rutinas semánticas.

v) Detección de problemas estructurales y obtención de una gramática determinística (si existe) o de una gramática con pocos problemas.

3) Implantación:

i) Construcción de una Tabla Gramatical en la que se representa la estructura del sistema a partir de la gramática.

ii) Construcción o uso de algún Reconocedor de Lenguaje que recibe por un lado, la gramática de lenguaje (que representa los patrones de comportamiento del sistema) y por otro los requerimientos del usuario en un lenguaje natural, orientado a la aplicación y genera respuestas a los requerimientos.

 

III  Estudio del Lenguaje y Detección de Ejemplos Significativos

Dado que se tiene un área de aplicación o algún problema a resolver, el primer punto importante consiste en la detección del lenguaje involucrado.

Tradicionalmente el concepto de lenguaje está muy restringido y    por lo común o se piensa en instrucciones muy restringidas (tipo FORTRAN, Pascal, PROLOG, JCL, QUERY, etc.) o si bien va en términos de “Lenguaje natural restringido” , con lo que se quiere indicar algún subconjunto del Español escrito, sin embargo el concepto de lenguaje es mucho más amplio, ya que cualquier mecanismo en el que se encuentre un conjunto de elementos (alfabeto) sobre los que se puede aplicar un conjunto de reglas para relacionarlas (sintaxis) y asociarle un significado (semántica) se puede decir que se cuanta con un lenguaje, en su momento puede existir lenguajes de múltiples tipos : natural escrito, simbólico, hablado, visual, etc.; por lo que cuando se desarrolla un sistema mediante éste método, el universo de posibles mecanismos de comunicación se amplio enormemente y en su momento es un factor a tomar en cuanta, ya que sería poco adecuado restringirse a lenguajes tradicionales (menú, ensamblador, pseudocódigo, natural restringido, etc.) si existe algún otro lenguaje más adecuado.

1) En diagnóstico médico, la conversación del paciente con el médico.

2) En la nómina, la descripción escrita de los cambios o modificaciones requeridas.

3) En visión, la imagen a reconocer. La cual por ejemplo, se puede transformar en una oración tradicional mediante la aplicación de las técnicas de las primeras vecinos y número de forma.

4) Juegos de Tablero, la trayectoria de la pieza. En éste caso la idea es que la trayectoria de una pieza en el tablero se puede ver como una imagen visual y por tanto aplicarle las herramientas de 3)

5) Características Especiales, en éste caso el concepto de lenguaje pasa a otro nivel, ya que lo que se pretende es representar conceptos no tangibles como arriba, abajo, al lado, etc. En éste caso se requiere la confluencia de varios mecanismos de captación de información que la integran en una sola oración, por ejemplo (mecanismo visual, mecanismo especial y mecanismo escrito).

6) Atributos Generales, partiendo de la idea anterior del uso de varios mecanismos de captación que integran en una sola oración se pueden captar características como: más claro, más obscuro, verde, azul, curvo, etc.

7) Características Temporales, se puede integrar en una sola opción, eventos ocurridos en diferentes tiempos,


(introduciendo un operador temporal é) y captar por ejemplo cambios lógicos en un sistema (por ejemplo el crecimiento de una célula se rige por esos cambios lógicos, ya que no se transforma en forma brusca).

8) En pruebas de personalidad, éste es un ejemplo en el cual el concepto de lenguaje es de una simplicidad extrema y su fuerza es muy grande, ya que en éste caso la oración está formada únicamente por una cadena de letras, donde cada letra representa la respuesta a una pregunta de la prueba  (normalmente tienen un máximo de 5 posibles respuestas) y la cadena representa todas las posibles respuestas dadas por una persona, de donde una oración típica se parece a una cadena binaria.

 

   Como se observa de los ejemplos anteriores el concepto de lenguaje y es importante saber elegir el que se adecue más a nuestro problema. Ya que se eligió un lenguaje X el siguiente paso consiste en captar muchos ejemplos de oraciones (grabando, observándolo, sientiéndolo, etc.) como ejemplos distintivos o que muestran alguna característica gramatical que los distinga.

 

IV  Detección de las Unidades Léxicas

En ésta etapa es necesario analizar las oraciones con el fin de detectar las unidades léxicas ( Unidades mínimas con significado en el lenguaje) y clasificarlas en tipo de unidades léxicas, por ejemplo:

1) En la información visual se puede tener la siguiente convención: