Está en la página 1de 23

MEMORIA GRAMÁTICA DE

CLÁUSULAS DEFINIDAS EN
PROLOG
Analizador Sintáctico

David Menoyo Ros 54005758X


Alberto Fernández Hernández 54003003S
1.Planteamiento Inicial
El objetivo de la práctica es poder analizar sintácticamente oraciones en español, de manera que se
tenga en cuenta sus reglas más importantes de concordancia, y se muestre el árbol de análisis de
manera clara.
Al ser la gramática española muy compleja, seguiremos unas reglas gramaticales y de concordancia
simplificada:
• Concordancia de género entre el sustantivo y los posibles adjetivos o artículos que lo
acompañen.
• Concordancia verbal de número y persona con el sujeto realizado (si el sujeto es múltiple, se
detecta y forzamos verbo plural).
• El pronombre con su antecedente o consecuente.
• El sujeto con el atributo, con el predicativo o con el participio del verbo de la pasiva
perifrástica.
• Concordancia verbal centrada en la comprobación de número y persona.

Los grupos sintácticos contemplados son:


• Grupo nominal
• Grupo adjetival
• Grupo adverbial
• Grupo preposicional
• Grupo verbal
Los términos contemplados son:
• Determinantes
• Nombres comunes
• Nombres propios
• Pronombres
• Verbos
• Adjetivos
• Adverbios
• Conjunciones
• Preposiciones

Y finalmente, se ha realizado una programación que atiende a los siguientes requisitos:


• Realizamos un estudio inicial de la oración para establecer ciertas estrategias según se
detecte una frase con varios verbos o no. De manera que podremos actuar de manera más
sencilla en caso de ser una oración simple o compuesta.
• Se ha realizado un sistema que detecte los requisitos de concordancia que en caso de fallar
muestran el mensaje con el requisito que no se cumple.
2.Aspectos de la programación
2.1-Menú
El menú consiste en el inicio del programa, así como en un bucle que permitirá al usuario introducir
oraciones continuamente hasta que decida salir de la partida (1 para continuar, 0 para salir. La orden
inicial es: analizar.).

analizar:-repeat,
write(' /_\\ | \\| | /_\\ | | |_ _|_ / /_\\ | \\ / _ \\| _ \\ / __|_
_| \\| |_ _/_\\ / __|_ _|_ _/ __/ _ \\ / __| | / __|'),nl,

write(' / _ \\| .` |/ _ \\| |__ | | / / / _ \\| |) | (_) | / \\__ \\| || .`


| | |/ _ | (__ | | | | (_| (_) | | (_ | |_| (__'),nl,
write('/_/ \\_|_|\\_/_/ \\_|____|___/___/_/ \\_|___/ \\___/|_|_\\ |___|___|
_|\\_| |_/_/ \\_\\___| |_| |___\\___\\___/ \\___|____\\___|'),nl,
write('Introduzca la opción:'), nl,
write(' '), nl,
write('Pulsa 1 para empezar'), nl,
write('Pulsa 0 para salir'), nl,
read(X),
comprobar_respuesta(X),
X==0,!,nl,nl,writeln('¡Adios!'),nl.

%Si el usuario elige 1...


%...Debera introducir la oracion en formato lista
comprobar_respuesta(1):-writeln('Introduce la oración:'),read(L),pre_proc(L),!.
%...Si el usuario elige 0: Fin del programa
comprobar_respuesta(0):-!.

2.2- Diccionario

El diccionario contiene todos los términos que el analizador es capaz de interpretar.


Cada uno de los términos básicos como nombres propios, adjetivos, verbos, pronombres,
preposiciones,conjunciones, artículos y adverbios presentan sus propias características de género,
número y persona, según proceda.
Además, se ha añadido algún término más específico para facilitar el análisis sintáctico, como
puede ser el caso del verbo sustantivado o el cuantificador.

%Verbos(persona y numero)
verbo(vrb(X), Num, Per) --> [X],{v(X,Num, Per)}.
v(ama,sing,3).
v(come,sing,3).
v(comen,plural,3).
v(hace,sing,3).
v(habla,sing,3).
v(canta,sing,3).
v(alzó,sing,3).
v(beben,plural,3).
v(vimos,plural,1).
v(sirve,sing,3).
v(es,sing,3).
v(era,sing,3).
v(son,plural,3).
v(está,sing,3).
v(depende,sing,3).
v(salta,sing,3).
v(sonríe,sing,3).
v(compré,sing,1).
v(toma,sing,3).
v(estudia,sing,3).
v(recoge,sing,3).
v(cazó,sing,3).

%Verbo sustantivado: para las oraciones subordinadas adverbiales


%Ejemplo: para escribir documentos
verbo_sustantivado(vs(X)) --> [X],{vs(X)}.
vs(escribir).

%Nombre: puede ser o nombre comun(Genero,Numero,Persona)...


nombre(n(X), Gen, Num,Per) --> nombreComun(n(X), Gen, Num,Per).
%...o nombre propio(Genero y Persona), pues el numero es singular.
nombre(np(X), Gen, sing,Per) --> nombrePropio(np(X), Gen,Per).

%nombre comun(Genero,Numero,Persona)
nombreComun(n(X), Gen, Num,Per) --> [X], {n(X,Gen,Num,Per)}.
n(hombre,masc,sing,3).
n(mujer,fem,sing,3).
n(gato,masc,sing,3).
n(tenedor,masc,sing,3).
n(cuchillo,masc,sing,3).
n(práctica,fem,sing,3).
n(profesor,masc,sing,3).
n(profesores,masc,plural,3).
n(canario,masc,sing,3).
n(vuelo,masc,sing,3).
n(esperanza,fem,sing,3).
n(universidad,fem,sing,3).
n(paloma,fem,sing,3).
n(patatas,fem,plural,3).
n(cerveza,fem,sing,3).
n(reflejos,masc,plural,3).
n(pantalón,masc,sing,3).
n(vida,fem,sing,3).
n(corbata,fem,sing,3).
n(lugar,masc,sing,3).
n(mesa,fem,sing,3).
n(manzana,fem,sing,3).
n(manzanas,fem,plural,3).
n(niño,masc,sing,3).
n(procesador,masc,sing,3).
n(café,masc,sing,3).
n(textos,masc,plural,3).
n(nacimiento,masc,sing,3).
n(herramienta,fem,sing,3).
n(documentos,masc,plural,3).
n(ratón,masc,sing,3).
n(ratones,masc,plural,3).
n(alumno,masc,sing,3).

%nombre propio(Genero,Persona)
%Los nombres propios, por si solos, pertenecen a la 3º persona del sing.
nombrePropio(np(X), Gen,Per) --> [X], {np(X,Gen,Per)}.
np('Héctor',masc,3).
np('Irene',fem,3).
np('Juan',masc,3).
np('María',fem,3).
np('Madrid',masc,3).

%determinante(Genero,Numero)
determinante(d(X), Gen, Num) --> [X], {d(X,Gen, Num)}.
d(el, masc, sing).
d(la, fem, sing).
d(los, masc, plural).
d(las, fem, plural).
d(un, masc, sing).
d(una, fem, sing).
d(mi,_,sing).
d(mis,_,plural).
d(unos, masc, plural).
d(unas, fem, plural).
d(su, masc, sing).

%pronombre(Genero,Numero,Persona)
pronombre(pr(X), Gen, Num,Per) --> [X], {pr(X,Gen,Num,Per)}.
pr(ella, fem, sing,3).
pr(él,masc,sing,3).
pr(yo, masc, sing,1).
pr(tú,masc,sing,2).
pr(ellos, masc, plural,3).
pr(ello, masc, sing,3).
pr(ellas, fem, plural,3).
pr(nosotros,masc,plura,1).
pr(nosotras,fem,plural,1).
pr(usted, _, sing,2).
pr(ustedes, _, plural,2).
pr(vosotros,masc,plural,2).
pr(vosotras,fem,plural,2).
pr(que,_,_,_).

%adjetivo(Genero,Numero)
adjetivo(a(X),Gen, Num) --> [X], {a(X,Gen, Num)}.
a(guapo,masc,sing).
a(guapa,fem,sing).
a(grande,_,sing).
a(blanca,fem,sing).
a(lejos,masc,sing).
a(lento,masc,sing).
a(lenta,fem,sing).
a(delicado,masc,sing).
a(fritas,fem,plural).
a(roja,fem,sing).
a(alegre,_,sing).
a(potente,_,sing).
a(moreno,masc,sing).
a(rojas,fem,plural).
a(negros,masc,plural).
a(negras,fem,plural).
a(negro,masc,sing).
a(negra,fem,sing).
a(alta,fem,sing).
a(gris,_,sing).

%adverbio
adverbio(adv(X)) --> [X], {adv(X)}.
adv(bastante).
adv(lejos).
adv(cerca).
adv(claramente).
adv(mientras).
adv(solamente).

%preposicion para complementos del Adjetivo


preposicionAdj(pAdj(X)) --> [X], {pAdj(X)}.
pAdj(de).
pAdj(en).

%preposicion
preposicion(p(X)) --> [X], {p(X)}.
p(a).
p(cabe).
p(con).
p(de).
p(desde).
p(en).
p(hasta).
p(para).

conjuncion(c(X)) --> [X], {c(X)}.


c(y).
c(e).
c(ni).
c(u).
c(pero).
c(aunque).
c(mas).
c(sino).

%cuantificador
cuantificador(cuant(X)) --> [X], {cuant(X)}.
cuant(muy).
2.3- Gramática

La gramática comprende todas las reglas que permiten analizar una estructura sintáctica.
La codificación de este apartado es ciertamente compleja, pero podríamos distinguir 3 partes claras:

2.3.1- Primera parte distinguida - Comprobaciones y estudios iniciales


La primera parte pretende iniciar las comprobaciones iniciales sobre la oración introducida de
manera que se consiga:
• Detectar si todos los términos de la oración son reconocibles por nuestro diccionario, de
manera que no se analice la frase en dicho caso.
• Detectar las características de la oración que nos permitan seguir una determinada estrategia
de análisis:
◦ La identificación de características se centra en encontrar varios verbos en la oración, así
como posibles estructuras que empiecen por “que”, de manera que se siga el protocolo
asociado a oraciones complejas en vez de simples.
2.3.2- Segunda parte distinguida - Análisis sintáctico
En la segunda parte nos encontramos con todas las reglas que realizan el análisis sintáctico de la
oración.
De manera general, el proceso es el siguiente:
1. Oraciones SIMPLES:
1. Discriminamos entre dos tipos de oraciones simples: aquella con gnominal +
gverbal, y aquellas que únicamente presentan un gverbal. No permitimos oraciones
con únicamente un gnominal puesto que no se consideran oraciones sino frases.
%Oracion simple
%Compuesta por: Grupo_nominal + Grupo Verbal...
oracion(o(GN,GV)) --> g_nominal(GN,G,Num,Per), g_verbal(GV,G,Num,Per).
%... O por un unico Grupo Verbal (sujeto omitido)
oracion(o(GV)) --> g_verbal(GV,_,_,_).

2. Se realizan las reglas que detectan las diferentes estructuras posibles, por ejemplo,
para el análisis de los grupos nominales, tenemos unas 13 reglas que recogen todas las
estructuras especificadas en el enunciado de la práctica, así como con las necesidades
encontradas a lo largo de la realización del programa. Vamos a comentar una de estas
reglas, pero la lógica y el patrón aplicado es el mismo en prácticamente cualquier regla
definida para cualquier otro grupo:
%5º Regla de gnominal: det + nombre + adj
g_nominal(gnom(D,N,GAdj),G,Num,Per) --> determinante(D, G, Num),nombre(N, G1,
Num1,Per),concGen(G1,G),concNum(Num1,Num),g_adjetival(GAdj, G, Num).

Como vemos, la regla define una serie de elementos que se tienen que cumplir, como el
determinante + nombre + grupo adjetival, pero, además, se tiene que comprobar en el
proceso la concordancia entre diferentes características como el género o el número.

Lo mismo sucede con otros grupos como el gverbal, veamos otro ejemplo:
%6º Regla de gverbal: verbo + adv
g_verbal(gvrb(V,GAdv),_,Num,Per) --> verbo(V,Num1,Per1),
concP(Per,Per1),concNum(Num,Num1),g_adverbial(GAdv).
En este caso comprobamos que la estructura contenga un verbo+ un grupo adverbial, y
además, comprobamos que haya concordancia de persona y de número.
2. Oraciones COMPUESTAS:
1. Discriminamos entre 3 grandes tipos de estructuras complejas( aunque luego en el
tratamiento de las mismas surgen muchas variantes). Veamos el código
%Oracion compuesta
%¿Que tipos de oraciones compuestas hay?
%1. Una conjuncion de varias oraciones: oracion coordinada
%Este predicado se emplea para crear oraciones coordinadas que contienen,
%a su vez, otros tipos de oraciones (coordinadas,subordinadas)
oracion_comp(ocm(Conj,O)) --> conjuncion(Conj),oracion_comp(O).
oracion_comp(ocm(O1,Conj,O2)) -->
oracion_coord(O1,_,_),conjuncion(Conj),oracion_coord(O2,_,_).
%2. Oraciones subordinadas.
oracion_comp(ocm(GN,GV)) --> g_nominal(GN,_,Num,Per),g_verbal_sub(GV,Num,Per).
%3. Oraciones relativas.
oracion_comp(ocm(GN,GV)) --> g_nominal_rel(GN,G,Num,Per),g_verbal(GV,G,Num,Per).
oracion_comp(ocm(GN,GV)) -->
g_nominal_rel(GN,_,Num,Per),g_verbal_sub(GV,Num,Per).

2. Se realizan las reglas que detectan las diferentes estructuras posibles, aplicando
prácticamente la mismas reglas que en las oraciones simples.

2.3.3- Tercera parte distinguida – Definición de las reglas de


concordancia
En la última parte distinguida del código que analiza las oraciones podemos destacar aquellas reglas
encargadas de comprobar la concordancia de género, número y persona. Dichas reglas tienen en
cuanta incluso aquellos casos más complejos como los que presentan sujeto múltiple, veamos este
último caso:
%Concordancia: ¿que ocurre si el sujeto tiene mas de un nucleo?
%Ej: Maria y Juan. El y sus amigas.
%Para establecer la concordancia en cuanto al genero:
%1. Si uno de los dos nucleos es masculino, automaticamente el genero comun
%pasara a ser masculino
concGenN('masc',_,'masc',L,L):-true.
concGenN(_,'masc','masc',L,L):-true.
%2. Si uno de los dos nucleos es masculino PERO resulta que el adjetivo esta en
%femenino (tercer parametro de entrada), dara entonces un error.
concGenN('masc',_,'fem',L,L):-false.
concGenN(_,'masc','fem',L,L):-false.

Finalmente, las 3 partes distinguidas cooperan entre sí para conseguir el objetivo del programa, que
no es nada más ni nada menos que realizar el árbol sintáctico de diversas oraciones (con ayuda de
draw.pl).

El programa realizado contiene comentarios en prácticamente todo lo que se realiza para ayudar a
entenderlo.
3. Resultados obtenidos
Finalmente, a la vista de los resultados de analizar las 20 frases obligatorias podemos concluir que
se realizan muy satisfactoriamente, incluso hemos comprobado con otros analizadores sintácticos
online para tener cierta garantía de que estamos realizando correctamente el proceso, y ello nos
permite confirmar que la programación funciona como debería.
Veamos los 20 ejemplos de estudio:

1º Oración:El hombre grande come la manzana roja


4º Oración: Ella hace la práctica de Juan.
5º Oración:El canario de Juan y María canta

6º Oración: La blanca paloma alzó el vuelo


7º Oración: Esta muy lejos de Madrid

8º Oración: Él es lento de reflejos.


9º Oración: Juan habla muy claramente.

10º Oración:La esperanza de vida de un niño depende de su lugar de nacimiento.


11º Oración: El hombre que vimos en la Universidad era mi profesor.

12º Oración:Juan, que es muy delicado, come solamente manzanas rojas.


13º Oración: El procesador de textos, que es una herramienta muy potente, sirve para
escribir documentos.

14º Oración: Juan es moreno y María es alta.


15º Oración: Juan recoge la mesa mientras María toma un cafe.

16º Oración: Compré un pantalon y una corbata negros.


17º Oración: Juan y Héctor comen patatas fritas y beben cerveza.

18º Oración: Irene canta y salta mientras Juan estudia.


19º Oración: Irene canta y salta y sonríe alegre.

20º Oración: El procesador de textos es una herramienta muy potente que sirve para
escribir documentos pero es bastante lento.

Por último, quedaría comprobar el tema de gestión de errores de concordancias o de términos no


definidos en el diccionario, y podemos decir que cumple el objetivo, pero no nos dimos cuenta de la
problemática de nuestro sistema de concordancia hasta que ya era un poco tarde para solucionar el
“inconveniente estético” de imprimir los errores de concordancia varias veces sin necesidad.
Ello se debe a la forma de Prolog de trazar las reglas, y al tener las comprobaciones de
concordancia en prácticamente todas las reglas sintácticas o por lo menos en las que sabemos que
son “finales”, se puede producir la impresión del mismo mensaje varias veces, probablemente
hubiera sido más conveniente propagar el error por todas las reglas al estilo de una lista de manera
que en la raíz se gestionara dicho error.
No obstante, veamos algunos ejemplos:
1º Error producido por palabra no definida en el diccionario:

2º Error producido por falta de concordancia de número:

Como vemos la impresión del error de concordancia número aparece varias veces debido a
la manera de trabajar de prolog, así como de nuestro sistema de gestión de errores.
3º Error producido por falta de concordancia de género:

4º Error de concordancia verbal (número y persona) con sujeto múltiple:


5º Error de concordancia verbal con detección cuando hay varios verbos:

6º Error de concordancia entre sujeto y adjetivo, pero en oraciones complejas coordinadas:

Podríamos pensar que estas comprobaciones son más complejas y por tanto difíciles de
gestionar, pero aunque nuestro sistema tenga el inconveniente de la impresión múltiple, es muy
sencillo de extender e implementar, ya que, como se aprecia en el código, solo tengo que propagar
en este caso el género y número del sujeto Juan por las sucesivas reglas, hasta que llegue, como en
este caso, a un grupo adjetival el cual recibirá que el género de Juan es masculino, pero el de roja es
femenino, generando el correspondiente error de concordancia.
7º Error de concordancia de número entre sujeto y verbo, pero en oraciones complejas coordinadas:

En este caso comen no concuerda con el sujeto que es singular.

En este otro caso el error se produce en otro verbo fuera del apartado del “que”.
En definitiva, se gestionan prácticamente todos los errores propuestos más comunes y sencillos, así
como alguno más “complejo” como el mostrado en el sétimo caso anterior. No obstante,
recordemos que la lengua castellana es bastante compleja gramaticalmente, y es posible que muchas
otras concordancias no se gestionen, pero se trataría de concordancias más complicadas y al trabajar
con una gramática sencilla no nos extendemos en exceso.
Aun así, el sistema está perfecto para programar las características de concordancia, por eso muchas
otras reglas en las que no se ha detectado concordancias sencillas tiene el placeholder “_” sobre el
cual se podrían implementar parámetros de género, número y/o persona para complicar aún más la
concordancia de las oraciones.

ANEXO
Ofrecemos las listas de entrada para probar las oraciones, para que simplemente sea copiar y pegar:
1.Consula:
[el,hombre,grande,come,la,manzana,roja].
2.Consulta:
[el,hombre,con,un,tenedor,grande,come,la,manzana,roja].
3.Consulta:
['Juan',y,'María',comen,la,manzana,roja,con,un,tenedor,y,un,cuchillo].
4.Consulta:
[ella,hace,la,práctica,de,'Juan'].
5.Consulta:
[el,canario,de,'Juan',y,'María',canta].
6.Consulta:
[la,blanca,paloma,alzó,el,vuelo].
7.Consulta:
[está,muy,lejos,de,'Madrid'].
8.Consulta:
[él,es,lento,de,reflejos].
9.Consulta:
['Juan',habla,muy,claramente].
10.Consulta:
[la,esperanza,de,vida,de,un,niño,depende,de,su,lugar,de,nacimiento].
11.Consulta:
[el,hombre,que,vimos,en,la,universidad,era,mi,profesor].
12.Consulta:
['Juan',que,es,muy,delicado,come,solamente,manzanas,rojas].
13.Consulta:
[el,procesador,de,textos,que,es,una,herramienta,muy,potente,sirve,para,escribir,documentos].
14.Consulta:
['Juan',es,moreno,y,'María',es,alta].
15.Consulta:
['Juan',recoge,la,mesa,mientras,'María',toma,un,café].
16.Consulta:
[compré,un,pantalón,y,una,corbata,negros].
17.Consulta:
['Juan',y,'Héctor',comen,patatas,fritas,y,beben,cerveza].
18.Consulta:
['Irene',canta,y,salta,mientras,'Juan',estudia].
19.Consulta:
['Irene',canta,y,salta,y,sonríe,alegre].
20.Consulta:
[el,procesador,de,textos,es,una,herramienta,muy,potente,que,sirve,para,escribir,documentos,pero,es,bastante,lento].

Frases sencillas
1.Consulta:
[el,hombre,come,una,manzana].
2.Consulta:
[la,mujer,come,manzanas].
3.Consulta:
['María',come,una,manzana,roja].
4.Consulta:
['Juan',ama,a,'María'].
5.Consulta:
[el,gato,grande,come,un,ratón,gris].
6.Consulta:
['Juan',estudia,en,la,universidad].
7.Consulta:
[el,alumno,ama,la,universidad].
8.Consulta:
[el,gato,come,ratones].
9.Consulta:
[el,ratón,que,cazó,el,gato,era,gris].
10.Consulta:
[la,universidad,es,grande].

También podría gustarte