Indice

Volver al Indice Gramática


La primera parte de la gramática que he realizado es la encargada de dividir el problema en una única solicitud de viaje o en un grupo de viajes.

asercion(R) --> viaje(R,_).
asercion(B) --> mas_viajes(B,_).

mas_viajes([A|B],N) --> viaje(A,N), coma, mas_viajes(B,N).
mas_viajes([A,B],N) --> viaje(A,N), y, viaje(B,N).


La primera producción será la encargada de añadir un único viaje.
La segunda se encarga de añadir un grupo de viajes, de la forma:

[(viaje,)* viaje y viaje]

A continuación declaramos las producciones encargadas de realizar los diferentes tipos de viaje, dependiendo de si son de un tren, barco, autobús o avión.

viaje(tren(N,T,C,O,D,I,M),N) --> n_billetes(N), es_ttren(T), lugares(O,D),
                                 c_tren(C), fecha(I,M).

viaje(barco(N,O,D,I,M),N) --> n_billetes(N), barco, lugares(O,D),
                              fecha(I,M).

viaje(atobus(N,T,O,D,I,M),N) --> n_billetes(N), t_bus(T), lugares(O,D),
                                 fecha(I,M).

viaje(avion(N,T,C,O,D,I,M),N) --> n_billetes(N), t_avion(T), lugares(O,D),
                                  c_avion(C), fecha(I,M).


Las producciones cuentan con un parámetro N que representa el número de billetes solicitados por cada viaje. De este modo en caso de ser un grupo de viajes pasaremos la cantidad de billetes solicitados por parámetro.

Seguidamente añadimos la parte encargada de determinar la fecha de salida, el origen y destino, la clase o el transporte utilizado.

t_bus(T) --> autobus, de, es_cautobus(T).
t_avion(T) --> vuelo, de, es_caerea(T).

c_tren(C) --> en, clase_t(C).
c_avion(C) --> en, clase_a(C).

lugares(O,D) --> de, es_poblacion(O), a, es_poblacion(D).
fecha(I,M) --> para_el, numero(I), de, es_mes(M).

Para terminar declaramos las producciones encargadas de gestionar el número de billetes.

En la producción n_billetes añadimos la condición {N\=[]} para asegurarnos que siempre se especifique un número de billetes, independientemente de si es un conjunto de viajes o un único viaje.

Con estas condiciones nos aseguramos que no se puedan generar frases de la forma:

reserva para el talgo...
reserva 1 billete .... , 5 billetes para el y 2 billetes para el ...

Añadimos los símbolos terminales [billete] o [billetes] dependiendo de si el número de billetes es N<2 o N>1 respectivamente.

/* Un único viaje o el primero de un cjt */
n_billetes(N) --> numero(N), billetes(N), para_el, {N\=[]}.
/* Producción usada para un cjt de viajes */
n_billetes(N) --> para_el, {N\=[]}.

billetes(N) --> [billetes],{N>1}.
billetes(N) --> [billete],{N<2}.


Sintacticamente podríamos decir que la producción n_billetes no es correcta puesto que la generación para_el depende del transporte y no del billete.
Seria más correcto decir:

produccion(...) --> para_el, barco.
produccion(...) --> para_el, autobus, de, es_cautobus(...).
...

Lo he hecho de esta forma con el fin de simplificar la gramática. De todos modos ambos resultados son gramáticas que generan el mismo lenguaje.





Observaciones


Al generar el conjunto de pruebas he observado que el resultado es aparentemente correcto. Además creo que la gramática no es ambigua puesto que una determinada generación se tiene que hacer con una única combinación de producciones.

Seria interesante añadir la posibilidad de indicar si las localidades tienen puerto o estación de tren o aeropuerto. Puesto que no es posible hacer un viaje en barco de Madrid a Barcelona. Para evitar esto, tendríamos que cambiar el vocabulario de la gramática.

Volver al Indice Pruebas

Prueba 1


Entrada:
reserva para el talgo de barcelona a zaragoza en primera clase para el 10 de octubre.

Salida:
[frase, incorrecta]

Observaciones:
La entrada es incorrecta puesto que no se indica el número de billetes.
La gramática no ejecuta la producción n_billetes puesto que no se cumple la condición.

Prueba 2


Entrada:
reserva 9 billetes para el vuelo de iberia de madrid a barcelona en litera para el 6 de marzo.

Salida:
[frase, incorrecta]

Observaciones:
La entrada es incorrecta puesto que no se permite que un vuelo de iberia tenga clase litera.
La gramática no crea ambiguidad.

Prueba 3


Entrada:
reserva 4 billete para el talgo de barcelona a zaragoza en segunda clase para el 20 de marzo.

Salida:
[frase, incorrecta]

Observaciones:
La gramática detecta que el número de la palabra "billete" no corresponde con el número de billetes solicitados.
La producción billetes no permite que sea una entrada valida.

Prueba 4


Entrada:
reserva 2 billetes para el vuelo de virgin de barcelona a ginebra en turista para el 5 de enero y para el largo recorrido de ginebra a moscu en litera para el 7 de enero, para el vuelo de aeroflot de moscu a barcelona en turista para el 10 de enero.

Salida:
[frase, incorrecta]

Observaciones:
La entrada es de la forma "viaje y viaje, viaje" cosa que la producción aserción no permite como entrada.

Prueba 5


Entrada:
reserva 5 billetes para el talgo de barcelona a zaragoza en primera clase para el 10 de octubre.

Salida:
tren(5, talgo, primera, barcelona, zaragoza, 10, octubre)

Observaciones:
La entrada esta bien formalizada. La gramática la acepta sin problemas.

Prueba 6


Entrada:
reserva 4 billetes para el barco de zaragoza a madrid para el 8 de agosto.

Salida:
barco(4, zaragoza, madrid, 8, agosto)

Observaciones:
La entrada esta bien formalizada. La gramática la acepta sin problemas.
La gramática no es capaz de detectar si la origen y destino son sitios costeros.
No debería aceptar puesto que ni zaragoza ni madrid tienen mar.

Para solucionar esto podriamos clasificar las ciudades según si tienen costa o no, o si tienen aeropuerto o estación de tren. El problema para esos casos es simétrico.

Prueba 7


Entrada:
reserva 2 billetes para el vuelo de virgin de barcelona a ginebra en turista para el 5 de enero, para el largo recorrido de ginebra a moscu en litera para el 7 de enero y para el vuelo de aeroflot de moscu a barcelona en turista para el 10 de enero.

Salida:
[avion(2, virgin, turista, barcelona, ginebra, 5, enero), tren(2, [largo, recorrido], litera, ginebra, moscu, 7, enero), avion(2, aeroflot, turista, moscu, barcelona, 10, enero)]

Observaciones:
En este caso podemos ver una solicitud de un grupo de viajes. La gramática detecta el número de billetes solicitados y la aplica a todos los viajes.

Prueba 8


Entrada:
reserva 1 billete para el talgo de barcelona a zaragoza en segunda clase para el 20 de marzo, para el vuelo de iberia de madrid a barcelona en turista para el 6 de marzo y para el vuelo de aeroflot de moscu a barcelona en turista para el 10 de enero.

Salida:
[tren(1, talgo, segunda, barcelona, zaragoza, 20, marzo), avion(1, iberia, turista, madrid, barcelona, 6, marzo), avion(1, aeroflot, turista, moscu, barcelona, 10, enero)]

Observaciones:
En este caso podemos ver una solicitud de un grupo de viajes. La gramática detecta el número de billetes solicitados y la aplica a todos los viajes.