/* La gramatica es bastante sencilla, se puede dividir en determinar cuatro informaciones: - El tipo de orden - Que producto se vende - Donde se vende - Cuando se vende Esta gramatica crea una representacion del tipo: op(Tipo_op,Producto,Mercado,Condicion). Para el Tipo de operacion solo hay que determinar si es compra o venta Para el producto, depende del mercado: deuda(cantidad,plazo,pais) valores(cantidad,empresa) materias(cantidad,unidad,materia) divisas(cantidad,moneda) futuros(cantidad,indice) El producto determina el mercado, y es una informacion que hay que pasar para comprobar las siguientes restricciones Para el mercado hay que ver que cuadre con el producto. Adicionalmente para la deuda hay que comprobar que cuadre el banco emisor con el pais. Para las condiciones hay que comprobar tambien que cuadre con el mercado */ analisis(F,X,Y):- ordenes(F,X,Y). ordenes([F]) --> orden(F). ordenes([F|R]) --> orden(F),coma,ordenes(R). orden(op(Tipo,Producto,Mercado,Condicion)) --> que_tipo(Tipo), que_producto(Producto,Prod_Merc,Pais), que_mercado(Mercado,Prod_Merc,Pais), que_condicion(Condicion,Prod_Merc). que_tipo(Tipo) --> es_orden(Tipo). /* --- */ que_producto(divisas(Cantidad,Moneda),divisas,_) --> numero(Cantidad),de,es_divisa(Moneda). /* Aqui nos hace falta saber el pais */ que_producto(deuda(Cantidad,Plazo,Pais),deuda,Pais) --> numero(Cantidad),[bonos,de,deuda,a], es_plazo(Plazo),de,es_pais(Pais). que_producto(materias(Cantidad,Unidad,Materia),materias,_) --> numero(Cantidad),es_unidad(Unidad),de, es_materia(Materia,Unidad). que_producto(futuros(Cantidad,Indice),futuros,_) --> numero(Cantidad),[opciones,de,futuros,referenciados,al], es_indice(Indice). que_producto(valores(Cantidad,Empresa),valores,_) --> numero(Cantidad),[acciones,de], es_empresa(Empresa). /* --- */ /* Hay que pasar el pais para ver que cuadra */ que_mercado(deuda(Banco),deuda,Pais) --> [en,el,mercado,de,deuda,del,banco,de],es_banco(Banco,Pais). que_mercado(divisas(Ciudad),divisas,_) --> [en,el,mercado,de,divisas,de],es_ciudad(Ciudad). que_mercado(materias(Ciudad),materias,_) --> [en,el,mercado,de,materias,de],es_ciudad(Ciudad). que_mercado(valores(Ciudad),valores,_) --> [en,el,mercado,de,valores,de],es_ciudad(Ciudad). que_mercado(futuros(Ciudad),futuros,_) --> [en,el,mercado,de,futuros,de],es_ciudad(Ciudad). /* --- */ que_condicion([],_) --> []. /* esta produccion es importante */ que_condicion([Mov,Condicion],Tipo) --> [cuando],es_movimiento(Mov),es_condicion(Condicion,Tipo). es_condicion([Cantidad,dolar],materias) --> numero(Cantidad),es_divisa(dolar). es_condicion([Cantidad,Moneda],valores) --> numero(Cantidad),es_divisa(Moneda). es_condicion([Cantidad,puntos],futuros) --> numero(Cantidad),[puntos]. es_condicion([Cantidad,dolar],divisas) --> numero(Cantidad),es_divisa(dolar). es_condicion([Cantidad,'%'],deuda) --> numero(Cantidad),['%']. /* Terminales */ coma --> [',']. es_orden(Tipo) --> [W],{operacion(W,Tipo)}. numero(Cantidad) --> [Cantidad],{number(Cantidad)}. numero(Cantidad) --> ([Num,millon];[Num,millones]), {number(Num),Cantidad is Num * 1000000}. de --> [de]. es_plazo(Plazo) --> [Plazo],{number(Plazo)},[anyo]. es_plazo(Plazo) --> [Plazo],{number(Plazo)},[anyos]. es_pais(Pais) --> [Pais],{pais(Pais)}. es_empresa(Empresa) --> [Empresa],{empresa(Empresa)}. es_divisa(Divisa) --> [Div],{divisa(Div,Divisa)}. es_unidad(Unidad) --> [Uni],{unidad(Uni,Unidad)}. es_materia(Materia,Unidad) --> [Materia],{materia(Materia,Unidad)}. es_indice(Indice) --> [Indice],{indice(Indice)}. es_banco(Banco,Pais) --> [Banco],{banco(Banco,Pais)}. es_ciudad(Ciudad) --> [Ciudad],{ciudad(Ciudad)}. es_movimiento(mayor_igual) --> ([suban,a];[suban,al];[suba,a];[suba,al]). es_movimiento(menor) --> ([bajen,de];[bajen,del];[baje,de],[baje,del]). es_movimiento(igual) --> ([lleguen,a];[lleguen,al];[llegue,a];[llegue,al]). es_movimiento(igual) --> ([esten,a];[esten,al];[este,a];[este,al]). /* Lexicon */ operacion(comprame,comprar). operacion(vendeme,vender). pais(usa). pais(alemania). pais(francia). empresa(endesa). empresa(telefonica). divisa(dolares,dolar). divisa(dolar,dolar). divisa(euros,euro). divisa(euro,euro). divisa(yenes,yen). divisa(yen,yen). unidad(kg,kg). unidad(barril,barril). unidad(barriles,barril). materia(oro,kg). materia(oro,lingotes). materia(petroleo,barril). indice(ibex). indice(nasdaq). indice(dow). indice(ftse). indice(nikkei). banco(america,usa). banco(alemania,alemania). banco(francia,francia). ciudad(londres). ciudad(paris). ciudad(madrid). ciudad(tokio). ciudad(francfort). ciudad(nueva_york). test1(F):- analisis(F,[comprame,200,acciones,de,endesa,en,el,mercado,de,valores,de,madrid],[]). test2(F):- analisis(F,[comprame,100,opciones,de,futuros,referenciados,al,ftse,en,el,mercado,de,futuros,de,londres],[]). test3(F):-analisis(F,[vendeme,10,kg,de,oro,en,el,mercado,de,materias,de,nueva_york],[]). test4(F):-analisis(F,[comprame,500,bonos,de,deuda,a,10,anyos,de,alemania,en,el,mercado,de,deuda,del,banco,de,alemania],[]). test5(F):-analisis(F,[vendeme,1,millon,de,yenes,en,el,mercado,de,divisas,de,tokio],[]). testt(F):-analisis(F,[comprame,200,acciones,de,endesa,en,el,mercado,de,valores,de,madrid,',',comprame,100,opciones,de,futuros,referenciados,al,ftse,en,el,mercado,de,futuros,de,londres,',',vendeme,10,kg,de,oro,en,el,mercado,de,materias,de,nueva_york,',',comprame,500,bonos,de,deuda,a,10,anyos,de,alemania,en,el,mercado,de,deuda,del,banco,de,alemania,',',vendeme,1,millon,de,yenes,en,el,mercado,de,divisas,de,tokio],[]). test1_1(F):- analisis(F,[comprame,200,acciones,de,endesa,en,el,mercado,de,valores,de,madrid,cuando,bajen,de,40,euros],[]). test2_1(F):- analisis(F,[comprame,100,opciones,de,futuros,referenciados,al,ftse,en,el,mercado,de,futuros,de,londres,cuando,lleguen,a,15000,puntos],[]). test3_1(F):-analisis(F,[vendeme,10,kg,de,oro,en,el,mercado,de,materias,de,nueva_york,cuando,baje,de,11,dolares],[]). test4_1(F):-analisis(F,[comprame,500,bonos,de,deuda,a,10,anyos,de,alemania,en,el,mercado,de,deuda,del,banco,de,alemania,cuando,suban,al,5,'%'],[]). test5_1(F):-analisis(F,[vendeme,1,millon,de,yenes,en,el,mercado,de,divisas,de,tokio,cuando,esten,a,2,dolares],[]).