Septiembre de 1996Resumen El problema de la integración de la programación lógica y funcional está considerado como uno de los más importantes en elárea de investigación sobre programación declarativa. Para que los lenguajes declarativos seanútiles y puedan utilizarse en aplicaciones reales, es necesario que el grado de eficiencia de su ejecución se aproxime al de los lenguajes imperativos, tal y como se ha conseguido con el lenguaje Prolog. Para ello, es imprescindible el desarrollo de herramientas potentes para el análisis y transformación de los programas, capaces de optimizar las implementaciones realizadas. En general, es deseable sustituir las aproximaciones ad-hoc por tratamientos más sistemáticos para los problemas de análisis y transformación de programas. Puesto que la semántica de los lenguajes lógico-funcionales ha sido objeto de numerosos estudios y está matemáticamente bien formalizada, surge el interés por el desarrollo de métodos y técnicas formales para la formulación de optimizaciones, basadas en la semántica, que preserven las propiedades computacionales del programa. Esta tesis se centra en el desarrollo de tales técnicas, adoptándose una aproximación formal basada en la semántica (operacional) del lenguaje para desarrollar y analizar, en un contexto unificado, las diferentes optimizaciones.En la primera parte, desarrollamos un marco para el análisis estático de programas lógico-funcionales, basado en la idea de construir aproximaciones correctas de la semántica operacional del programa. Formalizamos un esquema de análisis simple, uniforme y flexible, que permite estudiar distintos tipos de propiedades (relacionadas con el conjunto de respuestas computadas por el programa) de manera correcta y fácilmente implementable. El esquema es independiente de la estrategia de narrowing usada en la formulación del mecanismo operacional del lenguaje, lo que contribuye a dar generalidad al mismo.Las técnicas de evaluación parcial son, de entre la gran variedad de técnicas existentes para la transformación de programas, las que mayor interés han despertado en las dosúltimas décadas. Su utilidad no resideúnicamente en la posibilidad de especializar programas, sino que sus aplicaciones se extienden también a la generación automática de compiladores o a la optimización de código, por citar sólo las más importantes. En la segunda parte de esta tesis mostramos que, en el contexto de los leni guajes lógico-funcionales, la especialización de programas se puede basar directamente en el mecanismo operacional de narrowing que, debido a la propagación bidireccional de parámetros realizada a través del procedimiento de unificación, es capaz de producir optimizaciones apreciables. Esta visión unificada de ejecución y especialización nos permite explotar las contribuciones de ambos campos, funcional y lógico, y desarrollar un esquema simple y potente para mejorar el programa original respecto a su capacidad para computar respuestas. También mostramos que, debido a la componente funcional, son posibles otras optimizacion...