Mi experiencia investigadora, está centrada en el ámbito de los lenguajes de programación declarativos, la integración de paradigmas (programación lógica, programación funcional y lógica difusa), así como en la transformación automática de programas.
Estas son las líneas en la que prioritariamente he trabajado o estoy trabajando:
PROGRAMACIÓN LÓGICA DIFUSA
Durante más de una década he impulsado el desarrollo del lenguaje de programación lógica difusa Bousi~Prolog, tanto en sus aspectos de diseño como de implementación, participando activamente en todas las etapas. Bousi~Prolog utiliza una semántica operacional basada en lo que denominamos “resolución débil”. La resolución débil es un procedimiento en el que se sustituye el mecanismo de unificación sintáctico de la resolución SLD clásica, por un algoritmo de unificación débil. El algoritmo de unificación débil que utilizamos se basa en el uso de relaciones proximidad (relaciones borrosas que cumplen las propiedades reflexiva y simétrica, pero no necesariamente la transitiva) sobre un dominio sintáctico. Las relaciones de proximidad permiten flexibilizar la búsqueda de respuestas y son útiles para modelar muchas situaciones reales.
En los últimos años, hemos realizado un avance significativo en la línea de fundamentar teóricamente un marco de programación basado en relaciones de proximidad, mediante la propuesta de un nuevo concepto de proximidad entre expresiones (términos o formulas atómicas) y la definición de un nuevo algoritmo de unificación débil capaz de tratar con relaciones de proximidad de forma conveniente. Se han demostrado las propiedades formales más relevantes que cumple el algoritmo de unificación débil propuesto. Este algoritmo termina, es correcto (i.e., produce un unificador débil de dos expresiones, si éstas son unificables) y es completo (i.e.,es capaz de computar un unificador más general débil para dos expresiones unificables.). La importancia de estos resultados radica en que, por primera vez, nos acercan a una vía que puede permitir la definición de un mecanismo operacional basado en relaciones de proximidad correcto y completo. Recientemente, hemos conseguido implementar dicho algoritmo de unificación débil basado en proximidad de forma eficiente, superando uno de los mayores impedimentos de este algoritmo.
Bousi~Prolog puede contribuir a resolver diversos problemas extraídos de áreas de aplicación donde resulta imprescindible tratar con la vaguedad y el conocimiento incierto, tal y como sucede con las bases de datos deductivas (flexibles), los sistemas basados en conocimiento, el control difuso, la recuperación de información o el razonamiento aproximado. Mediante este lenguaje es posible modelar el conocimiento incierto mediante relaciones de proximidad y/o conjuntos difusos (otra de las características integradas en nuestro lenguaje) de una manera clara y sencilla de entender, sin el pesado componente sintáctico de otros lenguajes de programación lógica borrosa. El uso de conjuntos difusos conduce a un modelado más declarativo de la vaguedad, sin la necesidad de especificar los pesos de las entradas de una relación de proximidad de forma “ad-hoc”.
Para ampliar el rango de aplicación de este lenguaje, hemos agregado reglas graduadas (es decir, reglas con anotaciones de grados de verdad) y acceso directo a WordNet (una base de datos léxica del inglés). La imagen final que se traduce es la de un lenguaje bien posicionado para la búsqueda flexible de soluciones, procesamiento lingüístico y capaz de abordar aplicaciones de la vida real.
BASES DE DATOS DEDUCTIVAS DIFUSAS
Las bases de datos deductivas han surgido del deseo de combinar la programación lógica con las bases de datos relacionales. Una base de datos deductiva es un sistema de base de datos que puede hacer deducciones (es decir, concluir hechos adicionales) en base a las reglas y hechos almacenados en la base de datos (deductiva). DATALOG es el lenguaje que generalmente se usa para especificar hechos, reglas y consultas en bases de datos deductivas.
Recientemente, hemos desarrollado una propuesta para un sistema de base de datos deductivo con DATALOG borroso como lenguaje de consulta. Conceptos que dan soporte al lenguaje de programación lógica difusa Bousi~Prolog se han adaptado a las necesidades del Sistema DES (Datalog Educational System). El sistema DES es una base de datos deductiva dirigida a la enseñanza de las bases de datos y sus lenguajes de consulta que ha sido implementado por Fernando Sáenz-Pérez.
La unificación débil y la resolución SLD débil, utilizadas por Bousi~Prolog, se han adaptado y amplíado para permitir reglas anotadas con grados de verdad. De esta forma, proporcionamos una implementación pública, codificada en Prolog, de una base de datos deductiva difusa, de código abierto, multiplataforma, portátil y en memoria, que presenta una interfaz gráfica para el usuario.
PROGRAMACIÓN LÓGICA FUNCIONAL
Durante las primeras etapas de mi carrera investigadora, mi interés se centró en el área de la programación de lógica funcional. El objetivo de la programación lógica funcional es integrar las mejores características de la programación funcional y lógica. La programación lógica proporciona el uso de predicados y fórmulas lógicas. Los programas lógicos tienen un gran poder expresivo gracias a la capacidad de los lenguajes lógicos de computación que usan variables lógicas, estructuras de datos parciales y un mecanismo operacional que permite una búsqueda no determinista de respuestas. La programación funcional se basa en el concepto de función. En un programa funcional, las funciones se definen por medio de ecuaciones. La evaluación determinista de las expresiones básicas aumenta la eficiencia de los programas funcionales. El concepto de estrategias de evaluación, que también aumenta la eficiencia de los cómputos funcionales, se relaciona con la existencia y manipulación de términos anidados. La combinación de estas características hacen que los lenguajes lógico funcionales sean más expresivos que los lenguajes funcionales y más eficientes que los lenguajes lógicos tradicionales.
Los lenguajes lógico funcionales usan sistemas de reescritura de términos como programas y (alguna variante) del estrechamiento (narrowing) como semántica operacional. El narrowing amplía el principio de la reescritura reemplazando el ajuste de patrones por la unificación, estas dos técnicas coinciden cuando se aplican a términos básicos. El narrowing calcula una sustitución adecuada que cuando se aplica a un término, se puede reducir en un paso de reescritura. El narrowing proporciona completitud en el sentido de programación lógica (cálculo de todas las respuestas -sustituciones- a una pregunta) y también en el sentido de programación funcional (cálculo de valores o formas normales). El narrowing es un procedimiento no determinista, ya que existen dos niveles de libertad: la elección de un subtérmino reducible y la elección de una regla que se usa en la reducción. Por esta razón, genera un gran espacio de búsqueda. Se han definido muchas estrategias de narrowing para controlar el tamaño del espacio de búsqueda, eliminando algunas derivaciones inútiles. Una estrategia es una restricción que reduce la cantidad de posiciones que se explotarán.
Mi trabajo en esta área se centró en la formalización de una estrategia de narrowing dirigida por demanda y en el estudio de la relación formal entre el narrowing necesario y esta estrategia de narrowing dirigida por demanda (no tan perezosa) que es la base de las implementaciones de los lenguajes lógico funcionales no estrictos más populares. Además, también me interesé por los aspectos de implementación de las estrategias de narrowing y las extensiones del narrowing (por ejemplo, para cálculos no deterministas).
TRANSFORMACIÓN DE PROGRAMAS Y EVALUACIÓN PARCIAL
El objetivo de la transformación del programa es derivar un programa semánticamente equivalente al programa original, pero con un mejor comportamiento w.r.t. algunas propiedades determinadas (por lo general, queremos que el programa transformado se pueda ejecutar más eficientemente que el inicial). Más exactamente, dado un programa inicial, P, queremos obtener un nuevo programa, P ‘, que calcula los mismos resultados y respuestas que P para cualquier término de entrada. Desde un punto de vista teórico, la propiedad más importante de una transformación es su corrección. Decimos que una transformación es muy sólida cuando, dados un término, los resultados y respuestas calculados por P ‘son exactamente los mismos que los calculados por el programa original P para ese término. Por otro lado, decimos que una transformación es débilmente sonora cuando para cada resultado y respuesta calculada por P ‘existe el mismo resultado pero una respuesta computada más general en P. Las definiciones de compleción (fuerte / débil) son las contrarias a la últimos conceptos.
La evaluación parcial es una técnica de transformación de programa, también conocida como especialización de programa, que tiene como objetivo derivar una instancia especializada de un programa w.r.t. un conjunto restringido de entradas. La evaluación parcial se ha aplicado a todo tipo de lenguajes de programación, incluidos los idiomas imperativos (consulte aquí una referencia estándar).
La evaluación parcial de los lenguajes lógicos funcionales fue formalizada por primera vez por Maria Alpuente y sus compañeros del grupo ELP, fui coautora de algunos de estos documentos. De hecho, mi tesis doctoral consistió en una extensión perezosa del método de evaluación parcial manejada dirigido por narrowing (EPN) de los programas lógico funcionales, introducido por María Alpuente et al. Ese trabajo consistió en dar una definición formal de la estrategia de narrowing perezoso que sirviera de mecanismo operacional de la instancia perezosa del evaluador parcial y en demostrar la corrección formal del evaluador parcial perezoso obtenido.
Más tarde, investigué una técnica de transformación de programas para mejorar cálculos no deterministas.
Además, también estuve interesado en la aplicación de técnicas de transformación de programas en el marco de las implementaciones basadas en narrowing. La idea era introducir técnicas de transformación dentro del proceso de compilación para mejorar la calidad del código compilado generado.
Más recientemente, he participado en la adaptación de técnicas de transformación de programas al ámbito de la programación lógica difusa. Principalmente, hemos formalizado la transformación de desplegado para el marco de la programación lógica multiadjunta (MALP), un lenguaje de programación lógico borroso –desarrollado por Medina et. alt. (2004)–. Es importante hacer mención de que los resultados son pioneros en el ámbito de la programación lógica difusa y constituyen una base para el desarrollo de herramientas sofisticadas para la optimización de programas multiadjuntos, tales como son los sistemas de transformación de plegado/desplegado o los evaluadores parciales.
También he aplicado técnicas de evaluación parcial para mejorar el mecanismo operacional del lenguaje MALP y técnicas de desplegado para analizar la equivalencia semántica de programas lógico difusos.