Sei sulla pagina 1di 21

Cap tulo 6

Programaci on de gram aticas clausales en Prolog


Fernando Soler Toscano1

En este trabajo presentamos una introducci on, a modo de tutorial, a la escritura de gram aticas de cl ausulas denidas (conocidas como DCG, por su nombre ingl es, Denite Clause Grammars ) en Prolog. No pretende ser un trabajo t ecnico ni sobre Programaci on L ogica ni sobre Ling u stica, sino una peque na ayuda para quien desee conocer de un modo pr actico algunas de las t ecnicas elementales de la programaci on de gram aticas.

6.1.

Introducci on

Como introducci on a las gram aticas formales, mostramos a continuaci on la jerarqu a que proporciona Chomsky [2] de las diferentes clases de gram aticas generativas en virtud del tipo de reglas que las conguran. Una gram atica G = Vn , Vt , R, O se compone de los siguientes cuatro elementos: Un conjunto de s mbolos no terminales, representado por Vn , que est a formado por las categor as gramaticales. En las gram aticas de ejemplo que veremos en las siguientes secciones, pertenecer an a este conjunto elementos tales como sintagma nominal, art culo, etc.
Este trabajo se enmarca en el proyecto de investigaci on L ogica y lenguaje: informaci on y representaci on (HUM2004-01255) del Ministerio de Educaci on y Ciencia.
1

92

Cap tulo 6. Programaci on de gram aticas clausales. . . Un conjunto de s mbolos terminales, reunidos en Vt , que m as o menos viene a ser el diccionario del lenguaje para el que escribimos la gram atica. Un conjunto de reglas de transformaci on, al que llamamos R, que tienen la forma , donde y son cadenas (secuencias) de elementos de Vn y Vt . Cada una de tales reglas nos permite transformar la cadena en , como m as adelante veremos. Un s mbolo ra z, que representamos mediante O, que debe pertenecer mbolo no terminal). Representa la a Vn (es decir, se trata de un s categor a superior de la gram atica, y debe constituir la parte izquierda de al menos una de las reglas de R. Cuando la gram atica G es la de una lengua natural2 , O se corresponde con la categor a oraci on.

Seg un las restricciones que se impongan respecto de la forma de cada elemento 3 de R, son posibles cuatro tipos de gram aticas4 : Tipo 0, formado por las gram aticas irrestrictas, o recursivamente enumerables, que no imponen restricciones a las estructuras de y . Tipo 1, de gram aticas dependientes del contexto. En este caso, = A y = , donde A es un s mbolo no terminal, y , y cadenas de s mbolos de Vn y Vt . En el caso de y , se permite que sean vac as; no as con . Tipo 2, de gram aticas independientes (o libres ) del contexto, en las mbolo de Vn y cualquier cadena de t erminos que debe ser un s (elementos tanto de Vn como de Vt ). Tipo 3, de gram aticas regulares o de estados nitos. En este caso, mbolo de Vt o debe ser un s mbolo de Vn y puede ser o bien un s bien la concatenaci on de un s mbolo de Vt y otro de Vn .
Este paradigma es usado en muchos contextos. Por ejemplo, es frecuente la descripci on de los lenguajes de programaci on seg un la forma conocida como de Backus-Naur (BNF, por Backus-Naur Form, en referencia a John Backus y Peter Naur), que no es m as que una gram atica con la misma estructura que hemos descrito. 3 Como hemos explicado y representan cadenas (secuencias de uno o m as elementos) de t erminos. Se llama t ermino a todo elemento que pertenece a Vn o Vt . 4 Mostramos s olo los rasgos m as importantes de cada tipo, y omitimos algunos de los detalles m as t ecnicos, como el tratamiento que cada uno de ellos hace de la cadena vac a .
2

6.1. Introducci on

93

La idea de jerarqu a de lenguajes se debe a que las restricciones que cada uno de los cuatro tipos impone son progresivamente m as estrictas, de modo que Tipo 3 Tipo 2 Tipo 1 Tipo 0 es decir, toda gram atica de tipo n + 1 (para n entre 0 y 2), es tambi en una gram atica de tipo n. Veamos un ejemplo ilustrativo de una gram atica G = Vn , Vt , R, O libre del contexto, compuesta por: Vn , que en este caso es el conjunto formado por o (que representa la categor a oraci on ), sn (sintagma nominal), sv (sintagma verbal), det (determinante), n (nombre), vt (verbo transitivo) y vi (verbo intransitivo). Vt , que se compone de: el, un, una, perro, hueso, ladra y muerde. R, que contiene las siguientes reglas: o sn, sv sn det, n sv vt, sn sv vi det el det un det una n perro n hueso vi ladra vt muerde O, que en este caso es o. Veamos c omo nuestra gram atica permite derivar la cadena el perro muerde un hueso. A continuaci on mostramos las transformaciones que deben aplicarse sucesivamente, comenzando por el s mbolo no terminal o, para obtener la oraci on anterior: (6.1) (6.2) (6.3) (6.4) (6.5) (6.6) (6.7) (6.8) (6.9) (6.10) (6.11)

94 o o o o o o o o o

Cap tulo 6. Programaci on de gram aticas clausales. . . sn, sv det, n, sv det, n, vt, sn det, n, vt, det, n el, n, vt, det, n el, n, vt, un, n el, perro, vt, un, n el, perro, vt, un, hueso el, perro, muerde, un, hueso regla regla regla regla regla regla regla regla regla (6.1) (6.2) (6.3) (6.2) (6.5) (6.6) (6.8) (6.9) (6.11)

En cada transformaci on se indica, a la derecha, la regla que se ha usado sobre el paso anterior. Podr amos haber empleado las reglas en otro orden on que quer apara llegar a o el, perro, muerde, un, hueso, oraci mos generar. Con esta gram atica podemos producir otras oraciones como un perro ladra. Igualmente, nos resulta imposible generar el perro ladra un hueso. Sin embargo, permite oraciones agramaticales, como una perro muerde una hueso. M as adelante veremos c omo podemos a nadir a las gram aticas restricciones de concordancia.

6.2.

Nuestra primera gram atica en Prolog

Prolog, el lenguaje m as popular de Programaci on L ogica, puede usarse para escribir parsers, analizadores gramaticales que se componen de: Una gram atica. Construiremos las gram aticas simplemente a partir de su conjunto de reglas, porque ah se encontrar an, impl citos, los conjuntos de s mbolos terminales y no terminales. Un mecanismo de b usqueda, que sirve para recorrer las reglas de la gram atica al generar o analizar producciones correctas. En nuestro caso, el mecanismo de b usqueda ser a el que proporciona Prolog, basado en las operaciones l ogicas de unicaci on y resoluci on5 . En este trabajo usaremos las gram aticas clausales para programar parsers gramaticales. Sin, embargo, las gram aticas DCG tambi en sirven para implementar parsers morfol ogicos. As , el sistema GRAMPAL [6], emplea las DCG de Prolog para escribir gram aticas de formaci on de palabras que sirven tanto para la generaci on como para el an alisis morfol ogico.
Para profundizar en los fundamentos l ogicos de Prolog, recomendamos especialmente el manual de P. Flach [4].
5

6.2. Nuestra primera gram atica en Prolog

95

Vamos a comenzar explicando los elementos m nimos que nos permitir an implementar gram aticas clausales en Prolog. Comencemos por el nal. La gram atica que mostramos en el ejemplo anterior puede programarse en Prolog escribiendo tan s olo lo siguiente, en un chero de texto que podr amos guardar, por ejemplo, con el nombre gramatica1.pl: o sn sv sv det det det n n vi vt --> --> --> --> --> --> --> --> --> --> --> sn, sv. det, n. vt, sn. vi. [el]. [un]. [una]. [perro]. [hueso]. [ladra]. [muerde].

Como puede observarse, la sintaxis es la misma que ya hab amos usado. S olo debemos tener en cuenta la forma de la echa de transformaci on -->, que todas las reglas terminan en punto, que a la izquierda de cada regla siempre hay un solo s mbolo no terminal, y que los s mbolos terminales van encerrados entre los corchetes [ y ]. Por lo dem as, podemos dar a los s mbolos los nombres que elijamos. Ahora bien, c omo hacemos para que nuestra gram atica funcione? Necesitamos un compilador de Prolog, un sistema que permite a nuestro ordenador comprender los programas (las gram aticas que escribiremos en este trabajo son en realidad programas l ogicos) escritos en Prolog. Recomendamos el uso de SWI-Prolog, pues es el que hemos usado para crear las gram aticas, y todo el c odigo que aparece en este trabajo funciona en dicho compilador6 . Puede descargarse gratis desde http://www.swi-prolog.org/, donde tambi en podemos encontrar abundante documentaci on. Una vez instalado7 , podemos abrirlo8 :
6 A diferencia de lo que ocurre con otros lenguajes de programaci on, no existe un est andar r gido en Prolog. Aunque se suele tomar [3] como referencia, cada compilador lo desarrolla de forma diferente, lo que hace que los programas escritos para un sistema deban adaptarse en mayor o menor medida para que funcionen con otros compiladores. 7 SWI-Prolog dispone de versiones para Linux, MS-Windows y MacOS X. En cualquier caso, la instalaci on es igual a la de cualquier programa para tales sistemas operativos. 8 Generalmente basta con teclear pl en una consola, tal como hacemos en el ejemplo.

96

Cap tulo 6. Programaci on de gram aticas clausales. . .

> pl Welcome to SWI-Prolog (Multi-threaded, Version 5.4.3) Copyright (c) 1990-2003 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details For help, use ?- help(Topic). or ?- apropos(Word). ?Entonces compilamos nuestra gram atica. S olo tenemos que escribir la orden [gramatica1]. tras el signo ?- con el que podemos dar instrucciones a Prolog. Veamos: ?- [gramatica1]. % gramatica1 compiled 0.01 sec, 3,060 bytes Yes De nuevo debemos observar que las instrucciones que damos terminan siempre en punto. Lo anterior s olo funciona si el chero gramatica1.pl que contiene nuestra gram atica se encuentra en la misma ruta desde la que ejecutamos SWI-Prolog en la consola. Una forma m as sencilla para escribir y compilar nuestras gram aticas es usar el editor que proporciona SWI-Prolog, que podemos abrir mediante ?- emacs.. Desde ah disponemos de men us que permiten abrir, editar y compilar nuestros programas. Adem as, ofrece facilidades de edici on como el coloreado de la sintaxis. Tras compilar gramatica1.pl volvemos a encontrar, en la consola de SWI-Prolog, el signo ?-. Ya podemos experimentar con nuestra gram atica: ?- phrase(o, [el, Yes ?- phrase(o, [el, Palabra = muerde Yes ?- phrase(o, [el, No ?- phrase(o, [el, Yes perro, ladra]). perro, Palabra, un, hueso]).

perro, ladra, un, hueso]). perro, muerde, una, hueso]).

6.3. Concordancia de g enero y n umero

97

Hemos usado phrase, que es el predicado que emplea Prolog para realizar las transformaciones gramaticales. Tambi en ahora hemos terminado cada instrucci on en un punto. Adem as, phrase toma dos argumentos, separados por comas y encerrados entre par entesis. Las oraciones las representamos como listas de Prolog, con los elementos separados por comas y encerrados entre corchetes. Por u ltimo, s olo las variables (m as adelante comentaremos m as sobre ellas) pueden comenzar por una letra may uscula. Para comprender el funcionamiento de phrase/2 (lo escribimos as por ser un predicado de dos argumentos), comentemos los ejemplos anteriores. Mediante ?- phrase(o, [el, perro, ladra]) lo que hacemos es preguntar a Prolog si el perro ladra es una transformaci on correcta (gramatical) de la categor a o (por supuesto, siempre referido a la gram atica que hemos compilado). Prolog nos responde que s y vuelve a aceptar una nueva orden. Entonces (segunda llamada a phrase/2) le preguntamos si hay alguna oraci on gramatical tipo el perro Palabra un hueso, para alg un valor de Palabra (se trata de una variable) y que nos diga cual es dicho valor. Entonces nos responde que s , la cadena es gramatical si Palabra vale muerde9 . En los dos u ltimos ejemplos nos ha dicho que el perro ladra un hueso no es gramatical, pero que s lo es el perro muerde una hueso.

6.3.

Concordancia de g enero y n umero

La gram atica que hemos construido no contiene ninguna restricci on de concordancia gramatical, por ello genera oraciones como el perro muerde una hueso. Una soluci on posible a este problema es: o sn(Gen,Num) sv(Num) sv(Num) det(f,sg) det(f,pl) det(m,sg) det(m,pl)
9

--> --> --> --> --> --> --> -->

sn(_Gen2,Num), sv(Num). det(Gen,Num), n(Gen,Num). vt(Num), sn(_Gen,_Num2). vi(Num). [la]; [una]. [las]; [unas]. [el]; [un]. [los]; [unos].

Cuando Prolog devuelve Palabra = muerde a un no escribe Yes, a la espera de que le pidamos o no m as soluciones (m as valores alternativos para Palabra). Lo que nosotros hemos hecho es pulsar la tecla enter en ese momento, por ello Prolog responde Yes. Pero podr amos haber escrito tambi en ; (seguido o no de enter, seg un la consola que usemos) para pedir nuevos valores de Palabra. En este u ltimo caso, la respuesta nal habr a sido No. Cuando hay valores alternativos, los devuelve tras cada pulsaci on del punto y coma.

98 vi(sg) vi(pl) vt(sg) vt(pl) n(f,sg) n(f,pl) n(m,sg) n(m,pl)

Cap tulo 6. Programaci on de gram aticas clausales. . . --> --> --> --> --> --> --> --> [ladra]. [ladran]. [muerde]. [muerden]. [perra]. [perras]. [perro]; [hueso]. [perros]; [huesos].

Lo que hemos hecho es convertir las categor as gramaticales en predicados de Prolog con argumentos que indican el g enero y el n umero. Por ejemplo, la regla sn(Gen,Num) --> det(Gen,Num), n(Gen,Num). indica que un sintagma nominal tiene g enero Gen (que ser a m para masculino y f para femenino) y n umero Num (sg para singular y pl para plural) si est a compuesto por det(Gen,Num) y n(Gen, Num), es decir, por un determinante y un nombre cuyos g enero y n umero no s olo deben coincidir entre s , sino que ser an el g enero y el n umero que se transeran a la oraci on. En algunas categor as, de las que s olo nos ha interesado marcar el n umero, hemos usado un solo argumento. Lo importante es que la gram atica guarde coherencia interna. Es decir, el n umero de argumentos, as como su orden y contenido (g enero, n umero, etc.) debe ser jo para cada categor a en toda la gram atica. Algo importante para que funcione la gram atica es que debe hacerse 10 un uso correcto de las variables de Prolog , que usaremos para expresar rasgos que pueden tomar distintos valores. Esta idea del uso de rasgos con contenido gramatical, y mecanismos de unicaci on (como hace Prolog) para imponer restricciones de concordancia, est a presente en numerosas teor as ling u sticas [8]. Las gram aticas DCG de Prolog pueden emplearse para implementar muchas de tales teor as, como la Gram atica L exico-Funcional [11]. Hemos usado la variable universal de Prolog, que se representa mediante cualquier cadena de caracteres que comience por el gui on bajo _. Por ejemplo, en la regla sv(Num)
10

--> vt(Num),

sn(_Gen,_Num2).

Como hemos comentado, son variables de Prolog las cadenas de letras que empiezan por al menos una letra may uscula.

6.3. Concordancia de g enero y n umero

99

la variable universal nos sirve para expresar que el sintagma verbal toma el n umero de su verbo, independientemente de los valores que tengan g enero y n umero de su sintagma nominal. En realidad, cuando usamos la variable universal no tiene importancia lo que escribamos tras el gui on. Por u ltimo, queremos comentar el uso que se ha hecho del punto y coma ;, que en Prolog tiene un valor disyuntivo. En realidad, una regla como n(m,sg) equivale a n(m,sg) n(m,sg) --> [perro]. --> [hueso]. --> [perro]; [hueso].

con lo que podr an haberse incluido las dos u ltimas en vez de la primera y la gram atica ser a equivalente (en el sentido de que generar a y reconocer a las mismas oraciones). Sin embargo, para que sean m as cortos los cheros hemos preferido emplear el punto y coma. Ya s olo queda usar nuestra gram atica11 . Veamos: ?- phrase(o,[el, perro, muerde, un, hueso]). Yes ?- phrase(o,[la, perro, muerde, un, hueso]). No ?- phrase(o,[las, perras, muerde, un, hueso]). No ?- phrase(o,[las, perras, muerden, un, hueso]). Yes ?- phrase(o,[las, perras, muerden, un, huesos]). No ?- phrase(o,[las, perras, muerden, unos, huesos]). Yes Ahora s hemos conseguido implementar la concordancia de g enero y n umero. Pero las gram aticas no s olo sirven para reconocer oraciones correctas, tambi en pueden generarlas: ?- phrase(o, Oraci on). Oraci on = [la, perra, muerde, la, perra] ; Oraci on = [la, perra, muerde, una, perra] ;
Como antes, para ello debemos guardarla en un chero con extensi on pl, como gramatica2.pl, y compilarla de la forma indicada.
11

100

Cap tulo 6. Programaci on de gram aticas clausales. . .

Oraci on = [la, perra, muerde, las, perras] ; Oraci on = [la, perra, muerde, unas, perras] Yes Ahora lo que se ha hecho es pedir a Prolog que devuelva posibles valores de Oraci on, y como lo pedimos mediante phrase(o, Oraci on) (sin olvidar el punto al nal cuando lo escribamos en el compilador) exigimos que Oraci on sea una transformaci on correcta de la categor a o en nuestra gram atica. Prolog comienza a devolver diferentes valores (como vemos hay cierto orden en las oraciones que devuelve, lo que se debe al modo en que recorre las reglas de la gram atica) mientras nosotros introduzcamos ;. Si no hubi eramos parado, habr a devuelto un total de 156 oraciones, todas gramaticales, pero alguna sin sentido, como los huesos ladran. Se trata de la cobertura de nuestra gram atica.

6.4.

Construcci on de arboles sint acticos

En ocasiones nos interesa no s olo que los sistemas determinen si cierta oraci on es o no gramatical, sino que adem as nos devuelvan un an alisis sint actico. Esto es lo que vamos a hacer en esta secci on, a nadir a nuestra gram atica la posibilidad de construir arboles sint acticos de las oraciones que genera. Veamos c omo queda: o(o(SN,SV)) --> sn(SN,_Gen,Num), sv(SV,Num). sn(sn(DET,N),Gen,Num) --> det(DET,Gen,Num), n(N,Gen,Num). sv(sv(VT,SN),Num) --> vt(VT,Num), sn(SN,_Gen,_Num). sv(sv(VI),Num) --> vi(VI,Num). det(det(X),f,sg) --> [X], {member(X,[la,una])}. det(det(X),f,pl) --> [X], {member(X,[las,unas])}. det(det(X),m,sg) --> [X], {member(X,[el,un])}. det(det(X),m,pl) --> [X], {member(X,[los,unos])}. vi(vi(ladra),sg) --> [ladra]. vi(vi(ladran),pl) --> [ladran]. vt(vt(muerde),sg) --> [muerde]. vt(vt(muerden),pl) --> [muerden]. n(n(perra),f,sg) --> [perra]. n(n(perras),f,pl) --> [perras]. n(n(X),m,sg) --> [X], {member(X,[perro,hueso])}. n(n(X),m,pl) --> [X], {member(X,[perros,huesos])}. arbol(Orac):- arbol(0,Orac).

6.4. Construcci on de arboles sint acticos arbol(Tab,R):nl,tab(Tab),R =.. Li, (Li = [_,_] -> format(~w,[R]); (Li = [S|Otros],format(~w(,[S]), atom_length(S,Ls),Tab2 is Tab+Ls+1, findall(_,(member(X,Otros),arbol(Tab2,X)),_)), format())).

101

Hay varias cosas que debemos explicar. Lo m as importante es que ahora los predicados que representan las categor as gramaticales toman un argumento m as. Los argumentos segundo y tercero no tienen ninguna novedad, son los que usamos en la gram atica de la secci on anterior. La clave est a en el primero. Para cada categor a, el primer argumento recoge su an alisis. Por ejemplo, la regla sn(sn(DET,N),Gen,Num) --> det(DET,Gen,Num), n(N,Gen,Num). indica que el an alisis de un sintagma nominal es sn(DET,N) si est a formado por un determinante cuyo an alisis es DET y por un nombre que tiene por an alisis N. Los restantes argumentos de cada categor a implementan las restricciones de concordancia, y se comportan como ya hemos explicado. De esta forma, se van anidando los an alisis de los diferentes componentes de la oraci on. El resultado es que, para una oraci on como el perro muerde unos huesos, el an alisis que se genera es: o(sn(det(el),n(perro)),sv(vt(muerde),sn(det(unos),n(huesos)))) Puede ser dif cil seguir la estructura del an alisis anterior debido al gran anidamiento de par entesis que contiene. Por ello, hemos incluido en la gram atica el predicado arbol/1, que sirve para representar gr acamente estructuras como la anterior de una forma m as sencilla de visualizar. Veamos un ejemplo de su uso: ?- phrase(o(A),[el,perro,muerde,unos,huesos]), arbol(A). o( sn( det(el) n(perro)) sv( vt(muerde) sn(

102

Cap tulo 6. Programaci on de gram aticas clausales. . .

det(unos) n(huesos)))) A = o(sn(det(el), n(perro)), sv(vt(muerde), sn(det(unos), n(huesos)))) Yes En este ejemplo hemos pedido a Prolog que compruebe si el perro muerde unos huesos es o no una oraci on correcta, cuyo an alisis sea A (puesto que hemos lanzado la pregunta usando phrase/2, y poniendo o(A) como la categor a de la que deseamos comprobar si la frase propuesta es una transformaci on correcta o no; como A es una variable estamos pidiendo los valores que debe tomar para que sea verdad nuestra pregunta). En este caso, no hemos puesto un punto al nal de la pregunta, sino una coma y otro predicado, arbol(A), seguido de un punto. Con esto lo que hacemos es que, una vez obtenido el valor de A, dibuje un arbol que represente su estructura. No vamos a explicar c omo funciona el predicado arbol/1; para ver m as detalles sobre esto, se puede acudir a la ayuda de SWI-Prolog (a la que es posible acceder mediante ?- help.), donde se da cuenta de todos los predicados contenidos en su denici on. Terminamos esta secci on comentando uno de los recursos m as interesantes que se han empleado en esta gram atica. Se trata de las llaves { y } que aparecen en algunas reglas. Aqu est a la clave de la gran expresividad que pueden tener estas gram aticas, puesto que con estas llaves resulta posible a nadir a las reglas condiciones adicionales, usando para ello todos los recursos del lenguaje Prolog. Como Prolog es un lenguaje de Programaci on universal, es decir, podemos implementar en el cualquier algoritmo, podremos hacer gram aticas tan expresivas como queramos (por supuesto, pagando el correspondiente precio en complejidad). En la gram atica anterior, hemos usado los corchetes s olo en reglas del tipo det(det(X),f,sg) --> [X], {member(X,[la,una])}. y lo que encierran en su interior es una llamada al predicado member/2 de Prolog, en este caso para se nalar que X debe ser un miembro de la lista formada por la y una. As , s olo necesitamos una regla para los determinantes de g enero femenino y n umero singular. En la secci on 6.6 se har a un mayor uso de este recurso.

6.5. Peque no sistema de traducci on

103

6.5.

Peque no sistema de traducci on

La traducci on autom atica es probablemente la aplicaci on m as importante de la Ling u stica Computacional. En esta secci on vamos a mostrar c omo podemos emplear las gram aticas para realizar traducciones. Nos centraremos en el conjunto de oraciones simples de tipo Sujeto -Verbo -Objeto usadas en el juego piedra, papel, tijeras. Las cl ausulas que denen nuestra gram atica son: % Ingl es sentence(s(S,V,O)) nom_p(np(M,S),N) modifier(m(art)) noun(n(n_1),sg) noun(n(n_2),sg) noun(n(n_3),pl) verb(v(v_1),sg) verb(v(v_2),sg) verb(v(v_3),sg) verb(v(v_1),pl) verb(v(v_2),pl) verb(v(v_3),pl) --> --> --> --> --> --> --> --> --> --> --> --> nom_p(S,N), verb(V,N), nom_p(O,_). modifier(M), noun(S,N). [the]. [stone]. [paper]. [scissors]. [cuts]. [wraps]. [breaks]. [cut]. [wrap]. [break].

% Espa~ nol oraci on(s(S,V,O)) --> sint_n(S,N), verbo(V,N), sint_n(O,_). sint_n(np(M,S),N) --> art culo(M,G,N), nombre(S,G,N). art culo(m(art),f,sg) --> [la]. art culo(m(art),m,sg) --> [el]. art culo(m(art),f,pl) --> [las]. nombre(n(n_1),f,sg) --> [piedra]. nombre(n(n_2),m,sg) --> [papel]. nombre(n(n_3),f,pl) --> [tijeras]. verbo(v(v_1),sg) --> [corta]. verbo(v(v_2),sg) --> [envuelve]. verbo(v(v_3),sg) --> [rompe]. verbo(v(v_1),pl) --> [cortan]. verbo(v(v_2),pl) --> [envuelven]. verbo(v(v_3),pl) --> [rompen]. Como vemos, la gram atica est a dividida en dos secciones. Una, que sirve para generar oraciones en ingl es, que desarrolla las transformaciones posibles

104

Cap tulo 6. Programaci on de gram aticas clausales. . .

del s mbolo no terminal sentence, y otra, para el espa nol, que hace posibles las transformaciones del s mbolo oraci on. Cada una de las dos partes por separado se parece a la gram atica que construimos en la secci on 6.4. Adem as, cada gram atica tiene sus propios s mbolos terminales y no terminales12 . No podemos ni siquiera hacer correspondencias exactas entre s mbolos, pues por ejemplo nombre, en la gram atica del espa nol, toma tres argumentos, mientras que noun, en la del ingl es, tiene tan solo dos. Entonces, qu e nos permitir a hacer traducciones? Pues que las dos gram aticas comparten el an alisis sint actico, que ahora no es el propio ni del espa nol ni del ingl es, sino que se trata de un c odigo articial (algo as como una interlingua ) que hemos creado a prop osito. Veamos, ?- phrase(oraci on(A),[las, tijeras, cortan, el, papel]). A = s(np(m(art), n(n_3)), v(v_1), np(m(art), n(n_2))) Yes ?- phrase(sentence(B),[the, scissors, cut, the, paper]). B = s(np(m(art), n(n_3)), v(v_1), np(m(art), n(n_2))) Yes Si pedimos el an alisis de las tijeras cortan el papel como transformaci on de oraci on(A) y de the scissors cut the paper de sentence(B), en ambos casos A y B contienen el mismo an alisis (v ease el ejemplo anterior). Se trata de un t ermino formado por el s mbolo s (que en espa nol representar a oraci on y en ingl es sentence) que toma dos argumentos (primero y tercero) construidos mediante el s mbolo np (que representa un sintagma nominal, lo que en la gram atica del espa nol se ha representado como sint_n y en la del ingl es como nom_p) y otro mediante v (verbo o verb). Por lo dem as, m representa un art culo y n un sustantivo. En cuanto al l exico, para este c odigo com un hemos usado unas etiquetas que despu es hacemos corresponden con palabras o conjuntos de palabras de cada lengua. As , v_1 representa en espa nol tanto corta como cortan (que se use una forma u otra, en cada oraci on, vendr a impuesto por las restricciones propias de la gram atica del espa nol) y en ingl es cuts o cut. Es signicativo lo que ocurre con art; mientras que en la gram atica del ingl es s olo se corresponde con the, en espa nol puede adquirir varias formas, seg un el g enero y n umero. Podemos usar estas gram aticas de varias formas: ?- phrase(sentence(A),[the, stone, breaks, the, scissors]),
12 Por ello hemos podido programar ambas gram aticas en el mismo chero. En otro caso habr a que haber usado m odulos (m as informaci on sobre esto en la documentaci on de SWI-Prolog).

6.6. Una gram atica m as compleja phrase(oraci on(A),Espa~ nol). A = s(np(m(art), n(n_1)), v(v_3), np(m(art), n(n_3))) Espa~ nol = [la, piedra, rompe, las, tijeras] Yes ?- phrase(oraci on(B),[el, papel, envuelve, la, piedra]), phrase(sentence(B),Ingl es). B = s(np(m(art), n(n_2)), v(v_2), np(m(art), n(n_1))) Ingl es = [the, paper, wraps, the, stone] Yes ?- phrase(oraci on(C),Espa~ nol), phrase(sentence(C),Ingl es). C = s(np(m(art), n(n_1)), v(v_1), np(m(art), n(n_1))) Espa~ nol = [la, piedra, corta, la, piedra] Ingl es = [the, stone, cuts, the, stone] ; C = s(np(m(art), n(n_1)), v(v_1), np(m(art), n(n_2))) Espa~ nol = [la, piedra, corta, el, papel] Ingl es = [the, stone, cuts, the, paper] Yes

105

En el primer caso, hemos pedido que analice the stone breaks the scissors como una transformaci on de sentence (por lo que emplear a la gram atica inglesa) y guarde el an alisis en A, para a continuaci on pedir que genere, en espa nol, una oraci on que tenga A por an alisis. Usamos la variable Espa~ nol para pedir dicha oraci on. Prolog realiza estas tareas, y devuelve para Espa~ nol el valor la piedra rompe las tijeras. El segundo ejemplo es similar, aunque esta vez traduce del espa nol al ingl es. En el u ltimo ejemplo, pedimos que genere una oraci on en espa nol que tenga C como an alisis y Espa~ nol como transformaci on. Como ambos argumentos son variables, Prolog buscar a la primera oraci on en espa nol que encuentre. A continuaci on, pedimos que genere la traducci on en ingl es para dicha oraci on, puesto que mediante phrase(sentence(C),Ingl es) pedimos que tome el an alisis C y lo transforme en Ingl es, una expansi on de sentence. Cuando Prolog nos devuelve la primera soluci on (con los valores correspondientes para C, Espa~ nol e Ingl es) pedimos otra mediante ;.

6.6.

Una gram atica m as compleja

A continuaci on presentamos una gram atica m as compleja que las anteriores, en que las reglas de producci on recurren frecuentemente a predicados de Prolog. El prop osito de esta gram atica es generar, para cada hora expre-

106

Cap tulo 6. Programaci on de gram aticas clausales. . .

sada num ericamente, como 4 : 45, una expresi on en espa nol que se reera a la misma hora, como las cinco menos cuarto. Igualmente, para cada expresi on verbal de una hora, deber a generar la hora correspondiente en forma num erica. As veremos que la posibilidad de analizar las oraciones generadas por gram aticas DCG sirve para mucho m as que para obtener arboles sint acticos. En realidad, lo que har a esta gram atica es relacionar pares H : M , umero de minutos entre 0 y en que H es una hora entre 1 y 12 y M un n 59, con secuencias de palabras que expresan cada hora. La cobertura ser a completa, es decir, para cada una de las 720 posibles horas (el producto de 12, n umero de horas, y 60, n umero de minutos) habr a una cadena de palabras correspondiente. Veamos el programa: hora(H:M) --> {between(1,12,H), between(0,59,M)}, art culo(H,M), qu e_hora(H,M), minutos(M). art culo(H,M) --> [la], {sg_pl(H,M,sg)}. art culo(H,M) --> [las], {sg_pl(H,M,pl)}. qu e_hora(H,M) --> [Hora], {hora_base(H,M,HB),h(HB,_,_,Hora)}. minutos(0) --> [en, punto]. minutos(M) --> [y], exp_mins(M), {between(1,30,M)}. minutos(M) --> [menos],exp_mins(M2), {between(31,59,M),h(M2,M,_,_)}. exp_mins(15) --> [cuarto]. exp_mins(30) --> [media]. exp_mins(M) --> [Pal], num_mins(M),{h(M,_,Pal,_), (between(1,14,M); between(16,29,M))}. num_mins(1) --> [minuto]. num_mins(M) --> [minutos], {between(2,29,M)}. sg_pl(H,M,sg) :- hora_base(H,M,1). sg_pl(H,M,pl) :- hora_base(H,M,HB), between(2,12,HB). hora_base(H,M,H) :- between(0,30,M). hora_base(12,M,1) :- between(31,59,M). hora_base(H,M,HB) :- between(31,59,M), between(2,12,HB), succ(H,HB). h(1, 59, un, una). h(Num1, Num2, Pal, Pal) :between(2,29,Num1),plus(Num1,Num2,60), nth1(Num1,[uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve, diez,once,doce,trece,catorce,quince,diecis eis,diecisiete, dieciocho,diecinueve,veinte,veintiun,veintid os,veintitres,

6.6. Una gram atica m as compleja

107

veinticuatro,veinticinco,veintis eis,veintisiete,veintiocho, veintinueve],Pal). El s mbolo ra z de la gram atica es hora(H:M). En su argumento, H:M, hemos usado los dos puntos :, que est an predenidos en Prolog como operador. En la regla de producci on correspondiente, se realizan llamadas (dentro de las llaves, para imponer a las reglas restricciones basadas en predicados de Prolog) a between(N1,N2,M), predicado que impone que el n umero M est e comprendido entre los dos n umeros N1 y N2. Con ello, restringimos las expresiones tipo H:M a valores de H entre 1 y 12 y de M entre 0 y 59. Entonces, hora(H:M) se reescribe como: art culo(H,M), que ser a o bien la (como en la una menos cuarto) o las (las cuatro y media), seg un sean H y M. qu e_hora(H,M), que ser a el nombre de la hora que se expresa, y depende no s olo de H sino tambi en de M, pues por ejemplo para 3:50 diremos las cuatro menos diez minutos. minutos(M), que seg un sea M tomar a valores tales como y media, en punto, menos diez minutos, y un minuto, etc. Comencemos con art culo(H,M). Las dos reglas de producci on para este s mbolo imponen que se reescriba como la o como las seg un sea sg o pl el valor que devuelva sg_pl(H,M,X) para X. En realidad, se trata de que la se reserve para la una. . . y en todos los dem as casos se use las. El predicado sg_pl/3 se encarga de este cometido. No comentaremos los predicados auxiliares empleados en esta gram atica. Est an todos construidos a partir de un peque no n umero de predicados predenidos en SWI-Prolog (puede encontrarse documentaci on sobre estos predicados en la ayuda del compilador). En cuanto a qu e_hora(H,M), se reescribe como la palabra correspondiente a la hora que va a aparecer en la expresi on correspondiente a H:M. La regla de producci on empleada recurre a los predicados hora_base(H,M,HB), que dadas H y M devuelve el n umero HB de la hora que se escribir a (debe tenerse en cuenta que si M es mayor a 30 entonces HB es la hora siguiente a H, y en otro caso es H; adem as, la hora siguiente a H no siempre se obtiene sum andole una unidad, pues cuando H es 12 la siguiente hora es la 1), y el predicado h(HB, _, _, Hora) (algunos argumentos aparecen con la variable universal porque su contenido no nos interesa ahora) que dada la hora HB devuelve su nombre Hora, que ser a una palabra como una, dos, etc.

108

Cap tulo 6. Programaci on de gram aticas clausales. . .

El s mbolo minutos(M) se transformar a o bien en en punto, si M es 0, o en una expresi on que comienza por y (si M est a entre 1 y 30) o por menos (para valores de M mayores a 30 y que termina por el n umero de minutos, resultado de transformar exp_mins(M), cuando M es menor o igual a 30, o bien exp_mins(M2), donde M2 es la diferencia entre 60 y M (para encontrar M2 se emplea h/4 tambi en), cuando M es mayor a 30. Esto es as porque, por ejemplo, para 5 : 35 decimos las seis menos veinticinco minutos, pues 60 35 = 25. La transformaci on de exp_mins(M) es cuarto (si M es 15), media (si M es 30) o bien la palabra que expresa el n umero de minutos M. Ahora, obtenemos esta palabra con el tercer argumento de h/4, en vez de con el cuarto, que usamos para las palabras correspondiente a las horas. Esto es as para respetar la concordancia de g enero entre de horas con las formas femeninas de los n umeros (la una ) y de minutos con las masculinas (y un minuto). Por u ltimo, la transformaci on de exp_mins(M) termina con num_mins(M). Finalmente, num_mins(M) se transforma en minuto si M es 1 y en minutos en otro caso. Terminamos con algunos ejemplos. En los dos primeros Prolog nos devuelve la frase correspondiente a una hora. En el u ltimo, nos dice la hora que corresponde a una frase: ?- phrase(hora(12:40),F). F = [la, una, menos, veinte, minutos] Yes ?- phrase(hora(15:25),F). F = [las, tres, y, veinticinco, minutos] Yes ?- phrase(hora(H), [las, dos, y, cuarto]). H = 2:15 Yes

6.7.

Comparaci on con las gram aticas independientes del contexto

Las gram aticas independientes del contexto han recibido siempre una atenci on especial, debido a la cantidad de fen omenos ling u sticos que permiten modelar, as como por su tratabilidad computacional13 , debido a su
A medida que subimos en la jerarqu a de Chomsky, y nos acercamos a las gram aticas de tipo 0, las gram aticas son m as expresivas, es decir, permiten generar mayor cantidad de
13

6.7. Comparaci on con las gram aticas. . .

109

moderada complejidad. Sin embargo, el propio Chomsky [2] observa que estas gram aticas no tienen suciente expresividad para dar cuenta de ciertas estructuras propias de las lenguas naturales. Por ejemplo, no es posible crear una gram atica independiente del contexto que genere todas las cadenas tipo an bn cn , es decir, cadenas compuestas por n repeticiones de a seguidas por otras tantas de b y nalmente de c, para cualquier valor arbitrario de n. Pues bien, esta limitaci on impide a las gram aticas independientes del contexto dar cuenta de oraciones que en ciertas lenguas naturales son gramaticales y que siguen esta misma estructura. Sin embargo, es posible escribir en Prolog una gram atica DCG que gen n n nere todas y s olo todas las cadenas tipo a b c . Veamos: o s(I) s(I) nb(i(I)) nb(i) nc(i(I)) nc(i) --> --> --> --> --> --> --> [a], nb(I), [a], [b], [b]. [c], [c]. s(i). nc(I). s(i(I)). nb(I). nc(I). % % % % % % % 1 2 3 4 5 6 7

Si pedimos mediante phrase(o,C) que genere sucesivamente todas las transformaciones posibles para la categor a o ocurre lo siguiente: ?- phrase(o,C). C = [a, b, c] ; C = [a, a, b, b, c, c] ; C = [a, a, a, b, b, b, c, c, c] ; C = [a, a, a, a, b, b, b, b, c, c, c, c] Yes Como vemos, se generan s olo las cadenas que quer amos. Con esto observamos que las gram aticas DCG de Prolog son m as expresivas que las gram aticas independientes del contexto. C omo consigue la gram atica anterior generar todas las cadenas tipo an bn cn ? La clave est a en el s mbolo no terminal s(I), que funciona como un contador. Al inicio, la u nica transformaci on posible es la que permite la
lenguajes. Pero a la vez, los parsers que pueden manejar tales gram aticas (para analizar o generar oraciones correctas) son m as complejos, en el sentido de que necesitan m as recursos (en un ordenador, memoria y tiempo) para funcionar. Por ello, uno de los temas de investigaci on m as recurrentes en Ling u stica Computacional es la b usqueda de las gram aticas menos complejas que puedan dar cuenta de los fen omenos ling u sticos propios de las lenguas naturales.

110

Cap tulo 6. Programaci on de gram aticas clausales. . .

regla 1 (nos referimos a cada regla por el n umero que aparece tras %; este signo se usa para hacer comentarios en el programa, anotaciones que el compilador no interpreta), que transforma o en la secuencia que contiene a y s(i). Este es u nico s mbolo al que es posible ahora aplicar una transformaci on; en este momento tiene el valor inicial del contador. Entonces, mientras se apliquen ahora sucesivas transformaciones seg un la regla 3, se van a nadiendo nuevas a a la cadena, pero a la vez el valor del contador se incrementa, pasando de s(i) a s(s(i)), a s(s(s(i))) y as sucesivamente. Finalmente, cuando se aplica al contador la regla 2, se escriben tantas b y tantas c como sea su valor, mediante las reglas 47. El recurso que nos ha permitido superar la expresividad de las gram aticas independientes del contexto ha sido, como hemos comentado, el uso que hemos hecho de los mecanismos propios de Prolog. En resumen, los elementos de las DCG que extienden las gram aticas independientes del contexto, son: La posibilidad de usar predicados (en el sentido de Prolog) para los s mbolos terminales y no terminales. Este recurso, que hemos usado en todas las gram aticas presentadas a partir de la secci on 6.3., ha mostrado su utilidad para implementar desde la concordancia de g enero y n umero hasta la traducci on entre lenguas. La posibilidad de a nadir condiciones adicionales a las reglas. Esto lo hemos hecho en la gram atica de la secci on 6.4 (donde se explic o el uso de las llaves { y } a este prop osito) y en la secci on 6.6. La disponibilidad de los mecanismos de control propios de Prolog. De hecho, estas gram aticas son programas l ogicos en Prolog, por lo que pueden usarse recursos como la disyunci on ; o el corte !14 .

Bibliograf a
[1] Patrick Blackburn, Johan Bos, y Kristina Striegnitz. Learn Prolog now! University of the Saarland, 2001. Publicaci on electr onica en http://www.coli.uni-sb.de/kris/learn-prolog-now/.
No hemos comentado nada del corte ! de Prolog, puesto que va m as all a de los objetivos de este trabajo. Los lectores que deseen profundizar en Prolog pueden hacerlo a trav es de las referencias que proporcionamos en la bibliograf a. Recomendamos especialmente el curso de P. Blackburn, J. Boss y K. Striegnitz [1], al que puede accederse libremente a trav es de Internet.
14

Bibliograf a

111

[2] Noam Chomsky. Syntactic Structures. Mouton, La Haya, 1957. Trad. esp.: Estructuras sint acticas, M exico, Siglo XXI, 1974. [3] Pierre Deransart, AbdelAli Ed-Dbali, and Laurent Cervoni. Prolog, The Standard: Reference Manual. Springer, 1996. [4] Peter Flach. Simply Logical. Intelligent Reasoning by Example. John Wiley, 1994. [5] Joaqu n Garrido Medina. L ogica y Ling u stica. S ntesis, 1994. [6] Antonio Moreno y Jos e M. Go ni. GRAMPAL: a morphological processor for Spanish implemented in Prolog. En Proceedings of the Joint Conference on Declarative Programming (GULP-PRODE95), p aginas 321331, 1995. [7] Antonio Moreno Sandoval. Ling u stica computacional. Ed. S ntesis, 1998. [8] Antonio Moreno Sandoval. Gram aticas de unicaci on y rasgos. A. Machado Libros, 2001. [9] David Poole, Alan Mackworth, y Randy Goebel. Computational Intelligence: A Logical Approach. Oxford University Press, 1998. [10] Stuart Russell y Peter Norvig. Inteligencia Articial: un enfoque moderno. Prentice Hall, 1996. [11] Hideki Yasukawa. LFG System in Prolog. En COLING, p aginas 358 361, 1984.

Potrebbero piacerti anche