siguiente anterior arriba atrasadelante (solo si previamente se ha ido
atras)

A.2.4. Un analizador sintáctico

La notación BNF, bien conocida para la definición de la sintaxis de lenguajes de programación, es un convenio metalingüístico para representar reglas de escritura o producciones. La gramática (sintaxis) de un lenguaje en general puede expresarse como un conjunto de producciones, que definen de manera declarativa al lenguaje, es decir, que determinan las cadenas de símbolos correctas o sentencias que forman ese lenguaje. Estas reglas pueden expresarse en la sintaxis de Prolog, y, acompañadas de los hechos que definen los símbolos terminales y de consultas, constituyen programas cuya ejecución conduce a la comprobación o la formación de sentencias.

De hecho, Prolog surgió de investigaciones sobre procesamiento del lenguaje natural, y éste sigue siendo uno de sus campos de aplicación. Muchas implementaciones de Prolog admiten un tipo especial de reglas, las reglas gramaticales, para trabajar con comodidad en la representación de gramáticas, pero veamós cómo también pueden utilizarse directamente las reglas de Prolog que ya conocemos.

Consideremos la lengua española. Para describir la formación de sentencias (oraciones) utilizamos categorías sintácticas o sintagmas, como «nombre» , «verbo» , etc. (o «sintagma nominal» , «sintagma verbal» , etc). Está claro que, si bien «nombre» es un nombre, «verbo» no es un verbo. Esto es debido a que para describir el lenguaje utilizaremos como metalenguaje el propio español, y ponemos las comillas para destacar que la palabra en cuestión se utiliza como elemento del metalenguaje. La notación habitualmente seguida para indicar que se trata de un elemento del metalenguaje consiste en encerrar la palabra entre paréntesis angulares: <nombre>, <verbo>, etc.

Una sentencia castellana sintácticamente correcta estará compuesta por palabras concretas pertenecientes a las diversas categorías sintácticas (uno o varios sintagmas nominales, uno o varios sintagmas predicativos, etc.) combinadas de acuerdo con ciertas reglas.

Por ejemplo, una regla puede ser:

(1)
Para formar una sentencia, póngase un sintagma nominal y a continuación un sintagma predicativo.

Y otras:

(2)
Un nombre propio es un sintagma nominal.
(3)
«España» es un nombre propio.
(4)
Un sintagma predicativo puede formarse con una forma verbal sustantiva y un sintagma nominal.
(5)
«es» es una forma verbal sustantiva.
(6)
Un sintagma nominal puede formarse con un determinante y un nombre común.
(7)
Un artículo es un determinante.
(8)
«un» es un artículo.
(9)
«estado» es un nombre común.

Del conjunto de estas nueve reglas puede deducirse que «España es un estado» es una sentencia (u «oración» ) del castellano.

Las reglas anteriores pueden expresarse formalmente (utilizando ya el convenio de expresar los elementos del metalenguaje mediante «<...>» ) así:

(1)
<S> --><SN> <SP>
(2)
<SN> --><Npr>
(3)
<Npr> --> España
(4)
<SP> --><FVs> <SN>
(5)
<FVs> --> es
(6)
<SN> --><Det> <Ncom>
(7)
<Det> --><Art>
(8)
<Art> --> un
(9)
<Ncom> --> estado

(El símbolo «-->» es equivalente al «::=» de la notación BNF).

La oración obtenida puede descomponerse sintácticamente de acuerdo con las reglas; esta descomposición puede indicarse mediante corchetes etiquetados:



   [   [   [Espana] ]   [    [es]  [    [     [un] ]   [estado] ] ] ]
   S   SN  Npr          SP   FVs  SN   Det   Art      Ncom

o bien, de forma gráfica, con un árbol llamado árbol de derivación o árbol sintáctico (Figura A.3).


pict

Figura A.3: Árbol de derivación de la sentencia “España es un estado”.


Las frases (o sentencias) del español pueden considerarse como listas de palabras, y así, por ejemplo, «España es un estado» se representará como «[’Espana’,es,un,estado]» . A cada categoría sintáctica (sentencia, artículo, etc.) le corresponderá un predicado: «sentencia(S)» será verdadero si la lista S es una sentencia correcta («S» es una variable con nombre arbitrario; igual podría llamarse «X» o «Sentencia» o «_sentencia» ).

Las reglas de escritura terminales (aquellas que tienen en su parte derecha palabras del lenguaje), como «<Art>--> un» , se representarán como hechos: «articulo([un])» , y las auxiliares (aquellas en cuya parte derecha figura algún elemento del metalenguaje), por ejemplo,

<SP>--><FVs><SN>

como reglas Prolog que expresen el significado de la regla; en ese ejemplo, «un sintagma predicativo se forma concatenando una forma verbal y un sintagma nominal» , es decir:

 sint_pred(SP) :- forma_v_s(FVS),sint_nom(SN),  
                  concatena(FVT,SN,SP).  
 

(De nuevo, «SP» , «FVS» y «SN» son nombres arbitrarios de variables).

De acuerdo con esto, y escribiendo los hechos y reglas Prolog en el mismo orden en que aparecen las reglas de escritura dadas anteriormente, resulta:

 sentencia(S) :- sint_nom(SN),  
                 sint_pred(SP),  
                 concatena(SN,SP,S).  
 
 sint_nom(SN) :- nom_prop(SN).  
 
 nom_prop([’Espana’]).  
 
 sint_pred(SP) :- forma_v_s(FVS),  
                  sint_nom(SN),  
                  concatena(FVS,SN,SP).  
 
 forma_v_s([es]).  
 
 sint_nom(SN) :- det(DET),  
                 nom_com(NC),  
                 concatena(DET,NC,SN).  
 
 det(X) :- art(X).  
 
 art([un]).  
 
 nom_com([estado]).  
 
 
 concatena([],L,L).  
 
 concatena([X|L1],L2,[X|L3]) :- concatena(L1,L2,L3).  
 
 

Ante la consulta:

  ?- sentencia(X).  
 

el sistema encontrará todas las sentencias que pueden formarse de acuerdo con las reglas dadas:

  X=[’Espana’,es,’Espana’]  
  X=[’Espana’,es,un,estado]  
  X=[un,estado,es,’Espana’]  
  X=[un,estado,es,un,estado]  
 

En el Apartado A.4.3 veremos cómo se puede conseguir una interacción más natural con la máquina (es decir que, aunque la representación interna sea en forma de listas, la salida del ordenador y, eventualmente, la entrada sean cadenas de palabras tal como las escribimos habitualmente).


siguiente
anterior arriba atrasadelante (sólo si previamente se ha ido atras)


algunos derechos reservados DIT-ETSIT-UPM
Portada