+ All Categories
Home > Documents > Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers ›...

Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers ›...

Date post: 29-Jun-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
257
Una aproximaci´ on al fallo en programaci´ on declarativa multiparadigma TESIS DOCTORAL Autor: Jaime S´ anchez Hern´ andez Departamento de Sistemas Inform´ aticos y Programaci´ on Universidad Complutense de Madrid (Espa˜ na) Director: Francisco Javier L´ opez Fraguas Junio de 2004
Transcript
Page 1: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Una aproximacion al fallo en

programacion declarativa multiparadigma

TESIS DOCTORAL

Autor: Jaime Sanchez Hernandez

Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid (Espana)

Director: Francisco Javier Lopez Fraguas

Junio de 2004

Page 2: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on
Page 3: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Una aproximacion al fallo en

programacion declarativa

multiparadigma

Jaime Sanchez Hernandez

Dirigida por

Francisco Javier Lopez Fraguas

Departamento de Sistemas Informaticos y Programacion

Universidad Complutense de Madrid

Junio de 2004

Este trabajo ha sido apoyado por los proyectos ’TREND’ (TIC 98/0445/C03/02) y‘MELODIAS’ TIC 2002-01167.

Page 4: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on
Page 5: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Agradecimientos

Creo que el valor de un viaje, mas que en las experiencias que pueda aportar, quiza esteen la diferencia con que se ven las cosas cotidianas al termino del mismo. Este trabajoha sido para mı precisamente eso, una larga travesıa que ha transformado mi vision masalla del tema que trata. Y a su termino, igual que al hacer cumbre en una montana, meresulta inevitable echar la vista atras, tomar un respiro y hacer memoria.

En mi ultimo ano de licenciatura, a raız de algunas lecturas sobre la crisis de lasmatematicas a finales del siglo XIX, tuve mi propia crisis “logica” (la primera). Ası co-menzo un pasatiempo con Paco Lopez (por aquel entonces mi profesor de Teorıa de laComputabilidad) que consistıa en ir reconstruyendo las demostraciones de su asignaturade acuerdo a las reglas de nuestro juego (casi suspendo el primer parcial). Al acabar lalicenciatura probe suerte en una empresa, pero los pasatiempos allı no eran tan estimulan-tes. Y entonces Paco me propuso uno nuevo, una tesis... sobre negacion en programacionlogico-funcional (?). Fue una apuesta valiente y muy generosa por su parte. Buena par-te de la alegrıa de terminar este trabajo es porque hayas ganado esa apuesta. Si tuvieseque emprender otra tesis dudarıa la tematica, pero no el director que me gustarıa tener.Muchısimas gracias Paco por tu dedicacion y tu amistad.

El paso “iniciatico” de mi andadura fue trabajar con Rafa Caballero en la programacionde un sistema logico-funcional, que fue mi caballo de batalla durante muchos meses y queacabo por llamarse T OY (no podıa ser de otro modo). Y despues la tesis. Siempre me haresultado difıcil, por no decir imposible, trabajar en algo que no me apasiona. El tema deesta tesis me engancho cuando el azar puso en mis manos un libro delicioso: “El teoremade Godel”, de E. Nagel y J.R. Newman. El tema en cuestion no tiene mucho que ver conel de esta tesis, pero la idea de trabajar con “demostraciones de indemostrabilidad” meparecio un exotismo tan seductor que no podıa perdermelo.

En estos anos ha habido momentos duros en los que apenas sabıamos hacia donde ir oque estabamos haciendo. Por suerte, tanto en esos momentos como en los otros (que tam-bien han abundado), he tenido siempre gente cerca que me ha brindado apoyo “cientıfico”,pero sobre todo su amistad. Gracias a Puri Arenas por su constante “si necesitas X telo paso” (“X” polimorfico), a Ana Gil por su aliento y por estar siempre pendiente demı (aquı esta el “tocho”, Ana), a Antonio Gavilanes por juegos como el “puzle japones” yesas riquısimas charlas de despacho, a Mario Rodrıguez por todos sus comentarios (cientıfi-cos y acientıficos) y por iniciarme en el disfrute del te, a Rafa Caballero, companero de te yde otras gestas. Gracias a mis companeros del Departamento de Sistemas Informaticos y

Page 6: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6

Programacion por la amabilidad que han mostrado siempre hacia mı y a los companerosde despacho que he tenido en estos anos por su paciencia y sus animos, en especial a BelenDıaz por todo lo que ha compartido conmigo (incluidas las patadas de Javi cuando estabaembarazada). Estoy en deuda con Jesus Almendros y Antonio Becerra, que tuvieron lagenerosidad de invitarme a Almerıa a hacer ciencia (y tomar unos vinos); fue un placer.No puedo dejar de mencionar a la comunidad Linux/GNU cuando toda esta tesis se haelaborado con sus (geniales) programas, en especial a Luis Llana, nuestro “guru” local.

Hay personas que han sido la antıtesis (o la anti-tesis) y me han ayudado a desconectary disfrutar de otras cosas (a veces tambien me han recordado que existen otras cosas). Laprincipal “desconectadora” es Nuria, que es algo ası como la banda sonora de esta tesis.Muchas gracias por tu musica y por caminar conmigo... caminar con una persona es lamejor manera que conozco para acercarse a ella. Aun no tengo teorema en este sentido,pero son muchos los que han ayudado a elaborar esta idea. En especial he tenido la fortunade caminar con Tete y toda la gente de montana que arrastra (los de Burgos, Valladolid,Madrid, etc), Manu (companero de mi primer Camino de Santiago), Nines, Esther, Marıa,Almudena, Nandi, Sara... y un largısimo etc. A Javi y a Pili les agradezco su disposicionpara echar una mano (o las dos si hace falta) y soportar mi ultima etapa pre-tesis. ARuben le debo una muy interesante teorıa de la relatividad.

Por ultimo, tengo que agradecer a mi familia que este siempre ahı, en especial a mipadre por despertar mi curiosidad y estimularme para estudiar en vez de dedicarme alpastoreo, mi vocacion frustrada (todavıa no lo descarto). Gracias a mi abuelo por laserena calma que me inspira.

Page 7: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Resumen

La negacion en programacion logica es un tema ampliamente investigado desde losinicios de este estilo de programacion. En este trabajo estudiamos un recurso similar parala programacion logico-funcional. La contrapartida natural a la negacion en el contextologico-funcional es el fallo en la reduccion, que es donde se centra nuestro estudio. To-mamos como referencia la negacion constructiva de la programacion logica, que es capazde encontrar valores para las variables de los objetivos, y en ese mismo sentido, nues-tra propuesta sera de fallo constructivo. En el marco logico-funcional, el fallo encuentraademas otros usos interesantes, como las reglas por defecto o posibilidades de recoleccionde valores.

Nuestra investigacion toma como punto de partida la logica de reescritura del marcoCRWL, un formalismo bien establecido y estudiado para el paradigma logico-funcional.Para incorporar el fallo proponemos una logica orientada a la reduccion conjuntista, elabo-rando las nociones y propiedades que se desprenden de la misma. Entre estas propiedadesse tiene que una prueba de fallo en esta logica corresponde a una prueba de indemostra-bilidad con respecto a la logica de CRWL, con lo que el fallo adquiere una caracterizacionsemantica precisa.

Abordamos tambien la semantica operacional mediante una relacion de estrechamientoque tambien se apoya en la vision conjuntista. Para facilitar la presentacion, esta cons-truccion se lleva a cabo en dos etapas: en la primera se descarta la igualdad, que despuesse analiza como relacion aislada y se funde con el mecanismo global de estrechamiento.

Por ultimo, nos centramos en la implementacion efectiva del fallo en programacionlogico-funcional. Es sencillo extender un lenguaje como T OY o Curry con fallo no cons-tructivo (sin variables en el ambito de los fallos). Pero el fallo constructivo plantea seriasdificultades debido al mecanismo de reduccion que utilizan estos sistemas. Por ello, hemosdisenado el prototipo experimental OOPS con un mecanismo de reduccion basado en lasemantica conjuntista que hemos desarrollado y que es capaz de manipular el fallo cons-tructivo. Este prototipo ha supuesto una valiosa herramienta de investigacion con la queexperimentar los distintos usos del fallo.

Page 8: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

8

Page 9: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Indice general

1. Introduccion 13

1.1. Objetivos de este trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.2. Organizacion del trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.3. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.3.1. Programacion funcional . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.3.2. Negacion en programacion logica . . . . . . . . . . . . . . . . . . . . 18

1.3.3. Programacion logico-funcional . . . . . . . . . . . . . . . . . . . . . . 19

1.4. El fallo en el contexto logico-funcional . . . . . . . . . . . . . . . . . . . . . 21

2. El uso del fallo en programacion logico-funcional 23

2.1. Fallo como contrapartida a la negacion en programacion logica . . . . . . . 24

2.2. Reglas por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.3. El fallo en problemas de busqueda . . . . . . . . . . . . . . . . . . . . . . . 27

2.3.1. Caminos en un grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.3.2. Automatas finitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.4. Juegos bipersonales finitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.5. Recoleccion de respuestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2.6. Fallo y falso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3. Semantica logica: la vision conjuntista 43

3.1. El marco CRWL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.1.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.1.2. El calculo de pruebas CRWL “estandar” . . . . . . . . . . . . . . . . 49

3.1.3. Eliminando restricciones en CRWL . . . . . . . . . . . . . . . . . . . 53

3.2. La vision conjuntista: el marco SRL . . . . . . . . . . . . . . . . . . . . . . 57

3.2.1. Preliminares tecnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

3.2.2. SRL-Programas: obtencion a partir de CRWL-Programas . . . . . . 67

3.2.3. El calculo de pruebas SRL . . . . . . . . . . . . . . . . . . . . . . . . 75

3.2.4. Equivalencia entre CRWL y SRL . . . . . . . . . . . . . . . . . . . . 79

3.2.5. Propiedades de SRL . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

3.2.6. Afinando la relacion entre CRWL y SRL . . . . . . . . . . . . . . . . 96

3.3. Contribucion de los SAS’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Page 10: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

10 Indice general

4. Semantica logica para el fallo 101

4.1. El marco SRLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

4.1.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

4.1.2. El calculo de pruebas SRLF . . . . . . . . . . . . . . . . . . . . . . . 111

4.1.3. Propiedades de SRLF . . . . . . . . . . . . . . . . . . . . . . . . . . 115

4.2. Relacion entre SRL y SRLF . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

4.3. Fallo finito y aproximaciones computables . . . . . . . . . . . . . . . . . . . 125

5. Semantica operacional: primer acercamiento 127

5.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

5.1.1. Contextos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

5.1.2. Formas contextuales principales . . . . . . . . . . . . . . . . . . . . . 131

5.1.3. Conjunto informacion de una c-expresion . . . . . . . . . . . . . . . 133

5.2. Estrechamiento de c-expresiones: la Relacion SNarr . . . . . . . . . . . . . . 136

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF . . . . 141

6. Semantica Operacional con Igualdad 155

6.1. Desigualdades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

6.2. Mecanismo operacional de (==) . . . . . . . . . . . . . . . . . . . . . . . . 159

6.2.1. Correccion y completitud de la relacion� . . . . . . . . . . . . . . 161

6.3. Estrechamiento de c-expresiones con (==) . . . . . . . . . . . . . . . . . . . 172

6.3.1. C-expresiones con desigualdades y contextos . . . . . . . . . . . . . . 172

6.3.2. La relacion SNarr con (==) . . . . . . . . . . . . . . . . . . . . . . 174

6.3.3. Correccion y completitud de SNarr con (==) . . . . . . . . . . . . . 177

7. Implementacion del fallo en PLF: el sistema OOPS 183

7.1. Primeras tentativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

7.1.1. Extension de T OY con fallo . . . . . . . . . . . . . . . . . . . . . . 183

7.1.2. El fallo en Curry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

7.1.3. Un intento en programacion funcional . . . . . . . . . . . . . . . . . 185

7.2. Hacia una implementacion de la relacion SNarr . . . . . . . . . . . . . . . . 187

7.2.1. El problema del indeterminismo . . . . . . . . . . . . . . . . . . . . 189

7.2.2. Estrechamiento conjuntista guiado por la demanda . . . . . . . . . . 190

7.3. El sistema OOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

7.3.1. Descripcion del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 196

7.3.2. Ejecutando OOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

7.3.3. Implementacion de OOPS . . . . . . . . . . . . . . . . . . . . . . . . 203

7.3.4. Analisis lexico y sintactico . . . . . . . . . . . . . . . . . . . . . . . . 203

7.3.5. Traduccion a la sintaxis conjuntista . . . . . . . . . . . . . . . . . . 204

7.3.6. El motor de reduccion de OOPS . . . . . . . . . . . . . . . . . . . . 206

7.3.7. Funcion (==) y gestion de desigualdades . . . . . . . . . . . . . . . 211

7.4. Balance de la implementacion . . . . . . . . . . . . . . . . . . . . . . . . . . 216

8. Conclusiones y trabajo futuro 219

Page 11: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Indice general 11

A. Motor de reduccion de OOPS 223

B. Puzle japones 235

C. Relacion de trabajos del autor 241

Bibliografıa 245

Page 12: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

12 Indice general

Page 13: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 1

Introduccion

El objetivo fundamental de la programacion declarativa en sentido amplio, es pro-porcionar un alto nivel de abstraccion en el que la especificacion de un problema seaun programa capaz de resolverlo. Con ello se pretende liberar al programador de describirdetalladamente la secuencia de acciones que debe realizar la maquina para obtener el resul-tado buscado, como es habitual en programacion imperativa. Se abstraen tanto los detallesconcretos del hardware, como otros sobre gestion de la memoria y control de flujo, con loque en general se consiguen programas mas breves y sencillos de mantener. Ademas, loslenguajes declarativos estan basados en formalismos matematicos que facilitan el estudioriguroso y preciso de los aspectos semanticos subyacentes.

No obstante, la programacion declarativa no tiene un paradigma representativo unico.Los dos estilos clasicos, la programacion logica y la funcional, (en lo sucesivo PL y PFrespectivamente) han evolucionado de forma bastante independiente. Como resultado sehan forjado dos estilos de programacion distintos, que tratan de sacar provecho de lasventajas de uno u otro enfoque en busca de la expresividad del lenguaje. El potencial,en el caso de la programacion funcional viene dado por la propia composicionalidad delas funciones (que permite anidamiento de expresiones), el orden superior, los sistemas detipos o la evaluacion perezosa (en algunos lenguajes). Por su parte, la programacion logicacuenta con el recurso del indeterminismo, los modos multiples de uso de los predicados oreversibilidad de los mismos, ası como el uso de las propias variables logicas que posibili-tan la manipulacion de estructuras de datos incompletas. La programacion logica ofreceademas un marco adecuado en el que incorporar restricciones (sobre los numeros reales, dedominio finito, etc), una de las vertientes que mas han evolucionado en los ultimos anos.

Como amalgama de estos dos estilos de programacion surge la programacion logico-funcional (PLF en lo sucesivo), que pretende integrar las principales ventajas de ambosparadigmas en uno nuevo (vease [75] para una panoramica). El interes que ha suscitadoesta propuesta se ha concretado en lenguajes como Curry [20, 81] o T OY [110, 44, 1].Estos dos son los lenguajes mas relacionados con este trabajo y que tomaremos comoreferencia, en especial T OY que se ha desarrollado en nuestro grupo y que conocemos enprofundidad.

A grandes rasgos, tanto Curry como T OY capturan las caracterısticas principales de

Page 14: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

14 1. Introduccion

los estilos funcional y logico. Pero hay un punto destacado en PL que no implementaninguno de ellos: la negacion. Este recurso ha sido (y sigue siendo) ampliamente estudiadoen PL practicamente desde sus inicios (vease [23] para una vision general). En el marcoPLF las clausulas que definen predicados de PL pueden reemplazarse por reglas de funcionque devuelven el valor true y en algunos casos simples, para tratar la negacion, es suficientecompletar las reglas de funcion con otras que capturen los casos negativos mediante el valorfalse. Pero la negacion logica proporciona mas expresividad de la que puede conseguirsecon esta tecnica.

Nuestro objetivo es precisamente incorporar al paradigma logico-funcional un recur-so similar al de la negacion en PL. Decimos “un recurso similar” porque las piezas deconstruccion ahora son funciones y no predicados como en la programacion logica, y ri-gurosamente hablando, no tiene mucho sentido estudiar la “negacion de una funcion”. Lacontrapartida natural en PLF es estudiar el fallo de una funcion, o mas en general, elfallo de una expresion. Siguiendo en esta lınea, si la negacion en PL se expresa medianteun predicado, en PLF lo natural sera utilizar una funcion de fallo. Ası pues, podemospensar en una funcion booleana del estilo fails(e), que determine si la expresion e falla enla reduccion o no, devolviendo los valores true y false respectivamente.

En un contexto funcional, el fallo en la reduccion de una expresion es debido a que lasfunciones pueden estar parcialmente definidas, i.e., pueden no estar definidas sobre todoslos valores del tipo de sus argumentos. Son precisamente estos valores ajenos al dominio dela funcion los que producen fallos en la reduccion. A su vez dichos fallos pueden propagarsea otras funciones que hagan uso de las primeras. Por ejemplo, si tenemos las siguientesfunciones:

f(X) = g(X)g(0) = 0

para evaluar la expresion f(1), en principio podrıamos interpretar que no se produceningun fallo puesto que puede reducirse a g(1). Pero para la expresion resultante g(1)no puede aplicarse ninguna regla, i.e., falla en la reduccion. En nuestra concepcion, f(1)falla. El significado preciso de esta interpretacion se apoya en la nocion (operacional) deforma normal de cabeza: cualquier expresion de la forma X (variable) o c(. . .) (con unaconstructora en la raız). Ası la funcion fails responde a la siguiente definicion:

fails(e) =

{true si e no es reducible a forma normal de cabezafalse en otro caso

En el ejemplo anterior, es claro que f(1) no puede reducirse a forma normal de cabeza ypor lo tanto fails(f(1)) se evaluarıa a true. Desde el punto de vista practico, en un sistemacomo T OY o Curry fallo en la reduccion es sinonimo de fallo en el computo, mientrasque con esta extension los fallos podran capturarse y manipularse explıcitamente en elprograma mediante un valor booleano. De hecho, la funcion fails podra utilizarse en ladefinicion de funciones de programa (no solo en las expresiones a reducir).

Desde el punto de vista teorico, si tomasemos alguno de los calculos de estrechamientoexistentes con respecto al que hablar de formas normales de cabeza, la caracterizacionanterior de fails tendrıa pleno sentido. Pero este fallo no serıa constructivo en el sentido de

Page 15: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

1.1. Objetivos de este trabajo 15

que no tendrıa el comportamiento esperado en presencia de variables (no serıa reversible)1.Por ejemplo, asumiendo los numeros naturales definidos con las constructoras z (cero) ys (sucesor), para una funcion como:

h(z ) = true

de acuerdo con la caracterizacion de fails, la expresion fails(h(z)) se reduce a false, mientrasque fails(h(s(z))) se evalua a true. En una version constructiva, tambien la expresionfails(h(X)) deberıa poder evaluarse a true ligando X = z y a false con cualquier otrovalor para X (X = s(. . .)).

1.1. Objetivos de este trabajo

Como ya se hemos anticipado, el objetivo central de este trabajo es incorporar a PLFuna construccion primitiva fails(e) capaz de capturar el posible fallo en la reduccion de e.Este objetivo se plantea para un lenguaje logico-funcional perezoso de primer orden y sindisciplina de tipos.

La caracterizacion del fallo en los terminos operacionales de la seccion anterior aportauna primera intuicion sencilla y util acerca de nuestro proposito, que de hecho nos guiara enel desarrollo del trabajo. Pero no deja de ser una caracterizacion insuficiente e informalen ausencia de una semantica con respecto a la que se pueda hablar de forma normal decabeza. Incluso desde el punto de vista operacional, el hecho de pretender que sea falloconstructivo en el sentido del apartado anterior, tambien hace insuficiente la formulacionanterior.

Por un lado, la funcion fails requiere un fundamento semantico riguroso que determinesu significado preciso. Y por otro, es necesario un mecanismo operacional mas elaboradoque el sugerido arriba. Como es logico hay una cuestion previa al desarrollo teorico en quenos embarcamos: ¿cual es el interes que pueda tener esta propuesta en la practica, a lahora de utilizar un lenguaje logico-funcional? Este sera el primer aspecto que trataremos.Ası pues, nuestro objetivo de partida se concreta en los siguientes:

aportacion practica de la funcion fails en PLF. Uno de los usos que cabe esperar paraesta funcion es precisamente que pueda jugar, de algun modo, el papel de la negacionen PL. Pero en el contexto de PLF, que tiene caracterısticas ajenas a PL (ajuste depatrones, pereza, etc), es posible plantearse otros usos que interesa explorar;

caracterizacion denotacional de la funcion fails. Para ello construiremos una logicade reescritura (sin estrechamiento) con reglas especıficas para la funcion fails. Estalogica sigue en lıneas generales el enfoque del marco logico CRWL introducido en[70, 71]. Pero hay diferencias esenciales en los planteamientos de partida que obligana replantear el marco formal y disenar una nueva logica. La relacion entre la nuevalogica y su precursora sera especialmente interesante en lo que al fallo se refiere;

1Esencialmente es el mismo problema que tiene la negacion como fallo finito en Prolog, que solo secomporta bien para objetivos sin variables.

Page 16: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

16 1. Introduccion

construccion de un mecanismo operacional de estrechamiento (perezoso) especıficopara el nuevo marco de PLF con fallo (constructivo). Estableceremos los resultadospertinentes de correccion y completitud con respecto a la logica del punto anterior;

implementacion efectiva del fallo en PLF. Como nuestra relacion de estrechamientoes esencialmente distinta de la de los sistemas existentes (T OY, Curry) habra quereplantearse el mecanismo de evaluacion.

Aunque la funcion fails tiene una interpretacion relativamente sencilla de entrada, sujustificacion semantica y su implementacion constructiva en el sentido expuesto exigen unelaborado desarrollo.

1.2. Organizacion del trabajo

La organizacion del trabajo sigue la pauta marcada en los objetivos de la Seccionprecedente. Para facilitar la presentacion, tanto la logica de reescritura como la relacionde estrechamiento se desglosaran en dos capıtulos cada una:

el capıtulo 2 contiene una seleccion de ejemplos de programacion que ilustran lariqueza expresiva que aporta la funcion fails a PLF. Ademas de su uso inmediatocomo contrapartida de la negacion logica, el planteamiento de algunos problemasincita de modo natural a su uso (con independencia del estilo de programacion desdeel que se aborden). Tambien puede utilizase para hacer otras construcciones comolas reglas por defecto o la recoleccion de valores, sin merma de la declaratividaddel lenguaje. De manera indirecta esta funcion permite un control mas fino delindeterminismo;

los capıtulos 3 a 6 constituyen el fundamento teorico del desarrollo:

• en el capıtulo 3 se introduce brevemente la logica de reescritura CRWL [70, 71],y se utiliza como marco semantico de partida para construir una nueva logicaSRL en la que el indeterminismo se maneja a traves de conjuntos de recoleccion.Ello implica reinterpretar las expresiones, los programas, las denotaciones ydemas elementos implicados en CRWL, para adaptarlos a la vision conjuntista.Ademas, se establecen las conexiones oportunas entre CRWL y SRL. El falloaun no se ha introducido, pero el camino queda preparado para hacerlo;

• en el capıtulo 4 se extiende la logica SRL con la construccion fails, obteniendouna nueva logica SRLF que proporciona el fundamento semantico del fallo. Seestablecen tambien las relaciones adecuadas con CRWL y SRL. En particular,los fallos capturados por SRLF corresponden a demostraciones de indemostra-bilidad con respecto a CRWL;

• en el capıtulo 5 se estudia un mecanismo operacional para PLF con la funcionfails. Este mecanismo es una relacion de estrechamiento SNarr basada en ma-nipulaciones de estilo conjuntista. Se establecen los resultados de correccion ycompletitud de la misma con respecto a SRLF;

Page 17: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

1.3. Antecedentes 17

• el capıtulo 6 extiende la relacion SNarr con una funcion de igualdad estricta(que indirectamente tambien proporciona desigualdad). Los capıtulos 3 y 4sı incluıan esta primitiva, que por simplicidad (para centrarnos en el fallo) seexcluyo del capıtulo 5, ya que la igualdad requiere mecanismos de resolucionespecıficos, ası como la gestion de desigualdades. Se amplıan los resultados decorreccion y completitud de SNarr con respecto a SRLF.

en el capıtulo 7 estudiamos la implementacion del fallo en un sistema logico-funcional.Comenzamos analizando la viabilidad de utilizar un sistema ya existente comoT OY o Curry. Es posible obtener implementaciones en ambos casos, pero con limi-taciones en cuanto al uso de variables: no pueden utilizarse dentro de invocacionesa fails (no es fallo constructivo). Abordamos entonces la construccion del prototi-po OOPS basado en la relacion SNarr, que opera con fails de modo constructivo(no se limita el uso de variables en esta funcion). Para ello se reformula la relacionSNarr con una estrategia adecuada de seleccion de redex, que resulta directamenteimplementable;

por ultimo, el capıtulo 8 recoge algunas conclusiones de este trabajo y trata de arrojaralguna luz sobre cuestiones que han quedado abiertas y que podran abordarse en elfuturo;

El Apendice A incluye el codigo Prolog correspondiente al motor de reduccion deOOPS, el Apendice B amplıa un ejemplo presentado en el capıtulo 2 y el Apendice Cincluye una descripcion de los trabajos del autor en relacion con el paradigma PLF y conesta tesis en particular.

1.3. Antecedentes

Por la tematica, los trabajos mas cercanos a esta tesis proceden de las investigacionesprevias en PLF y del campo de la negacion en PL. La relacion de nuestra propuesta con PFes evidente, como en el resto de trabajos de PLF; pero aparte de esta conexion generica, enel tema especıfico del fallo la relacion es mas escasa. A continuacion enmarcamos nuestrotrabajo en relacion con estas tres lıneas.

1.3.1. Programacion funcional

El lenguaje funcional que tomamos de referencia es Haskell2 [83, 131, 132, 37], enparticular una de las implementaciones mas extendidas de este lenguaje, el interpreteHugs [92].

En el ambito de PF el fallo no surge de modo tan evidente como la negacion en PL y noabundan los trabajos directamente relacionados. Pero hay una propuesta muy interesanteen [159] que plantea el fallo como un recurso directamente definible en el propio lenguaje

2En http://www.haskell.org estan accesibles distintas implementaciones de Haskell y abundante do-cumentacion.

Page 18: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

18 1. Introduccion

(funcional). En la Seccion 7.1.3 exploraremos una idea cercana a alguna de las que sugiereeste trabajo. Otro punto de contacto con PF son las reglas por defecto, implıcitas en sumecanismo de evaluacion y que pueden tambien abordarse en PLF [122, 124].

Por otro lado, el indeterminismo juega un papel destacado en nuestra propuesta yhay tambien trabajos sobre indeterminismo en PF (vease por ejemplo [149]), pero laperspectiva es muy distinta a la nuestra.

1.3.2. Negacion en programacion logica

La cantidad de material existente respecto a la negacion en PL pone de relieve el interesque suscita, ası como la dificultad que entrana (en [23], a pesar de no ser una referenciareciente, puede encontrarse una valiosa vision de conjunto).

Una primera forma de dar significado a la negacion en programacion logica es mediantela hipotesis del mundo cerrado (Closed World Assumption) [137]: dado un programa logicoP y un atomo cerrado A:

¬A es consecuencia de P si A no puede probarse con respecto a P

La intuicion que encierra esta hipotesis es clara y muy razonable. No obstante, mientrasla resolucion SLD [95] es una relacion monotona, con la hipotesis CWA se introduce nomonotonıa en el razonamiento: si anadimos nuevas clausulas al programa P es posible queA pueda probarse, con lo que ¬A dejara de ser consecuencia de P .

La perdida de monotonıa no es en realidad un problema. El problema de CWA es queno es decidible. La negacion como fallo finito [49] (vease tambien [142, 143, 144]) serıa laversion finitaria de CWA:

¬A es consecuencia de P si A falla finitamente con respecto a P

Formalmente, el mecanismo de resolucion SLD se extiende a SLDNF con la negacion comoregla de fallo [99] (vease tambien [21]). Operacionalmente, la negacion de un objetivo tieneexito cuando el objetivo (sin negar) produce un arbol de busqueda en el que todas las ramasson de fallo. Esta idea es sencilla de implementar y es la negacion que habitualmente seutiliza en los sistemas Prolog [52, 130] por razones practicas.

Pero aun hay otro inconveniente con esta negacion: solo es adecuada para objetivoscerrados, es decir, objetivos sin variables. Y esta limitacion es especialmente relevante enPL, ya que afecta directamente a la reversibilidad en el uso de los predicados.

Hay distintas propuestas para tratar la negacion de objetivos generales, entre las quedestaca la negacion constructiva propuesta en [47, 48, 60]. Posteriormente, en [151, 152, 61]se extiende al marco de la programacion logica con restricciones [90, 89] apoyandose enlogicas multivaluadas [65, 97]. Dentro de las propuestas de negacion constructiva es re-levante la version conocida como negacion intensional [34, 35], extendida tambien a laprogramacion logica con restricciones en [40]. Este es un enfoque bastante eficiente en elque, dado un programa, se sintetiza otro que incluye la negacion de los predicados origi-nales. El proceso de transformacion incluye una factorizacion y complecion del programaoriginal, que guardan cierta analogıa con nuestra propuesta, pero como el contexto departida es distinto, no hay en realidad una conexion inmediata.

Page 19: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

1.3.3 Programacion logico-funcional 19

Hay varias propuestas de implementacion para la negacion constructiva, como BCN[14, 15]. Recientemente, en [125, 126, 127] se ha desarrollado una propuesta “mixta”, queimplementa distintos tipos de negacion (como fallo finito, intensional, constructiva) enun mismo sistema Prolog (en concreto en CIAO3 [41]) y mediante un analisis estaticoutiliza la alternativa mas adecuada. En general, los metodos mas eficientes imponen masrestricciones sobre los objetivos para garantizar la completitud. Se trata por tanto, deanalizar el problema y escoger la alternativa mas eficiente, garantizando la completitud delas respuestas.

Por otro lado, existen distintos trabajos [153, 91, 39] que se aproximan a la nega-cion desde la teorıa de la demostracion (“proof theory”), mediante calculos logicos quepreservan la idea de negacion como fallo, pero que permiten la construccion efectiva dedemostraciones para la negacion. El enfoque inicial de estos trabajos es relativamentecercano al del marco CRWL del que partiremos nosotros.

1.3.3. Programacion logico-funcional

Las primeras propuestas de integracion logico-funcional datan de los anos 80, peroes a partir de la decada de los 90 cuando comienza su maximo desarrollo. A pesar de surelativa juventud, este estilo cuenta con una notable cantidad de documentos relacionados,que cubren desde los aspectos mas teoricos hasta tutoriales de estilo, incluyendo desarrollode implementaciones, estrategias de computo, etc. Entre las causas que motivan la rapidezde este avance, destaca el hecho de que cronologicamente su desarrollo comienza en unmomento en el que tanto PL como PF son ya estilos maduros y bien establecidos. En [55]se da una primera vision del estado del arte a mediados de los 80 y en [75] se cubre hastamediados de los 90. En [139] puede encontrarse una panoramica mas reciente centradaen el marco semantico CRWL (del que hablaremos mas adelante), nuestro formalismo departida.

El resultado de las investigaciones se ha plasmado en lenguajes logico-funcionales con-cretos como FUNLOG [154], K-LEAF [38, 68], Babel [121, 129] o Escher [100, 101]. Enla actualidad, los dos sistemas logico-funcionales mas desarrollados son Curry [79, 81, 20]y T OY [110, 44, 1], que ademas estan muy proximos entre sı en sus planteamientos debase. Curry tiene varias implementaciones disponibles en:

http://www.informatik.uni-kiel.de/~curry/implementations.html

como PACKS [78], UPV-Curry [13] o Munster Curry Compiler [103]. Por su parte,T OY tambien cuenta con una implementacion accesible en:

http://babel.dacya.ucm.es/rafa/

Hay otros lenguajes interesantes4 como Oz [146, 145]5 o Mercury6 [148, 147] o Maude [50]

3Sistema y documentacion disponibles en http://clip.dia.fi.upm.es/Software/Ciao/4En http://www.informatik.uni-kiel.de/~curry/implementations.html hay una amplia recopila-

cion de referencias a lenguajes relacionados con PLF.5Pueden consultarse multiples documentos en http://www.mozart-oz.org/6Vease la pagina web del proyecto http://www.cs.mu.oz.au/research/mercury/index.html

Page 20: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

20 1. Introduccion

que tambien incorporan caracterısticas de los estilos logico y funcional, pero estan masalejados de la lınea de Curry y T OY.

Tanto T OY como Curry toman Haskell [83, 37] como lenguaje funcional de referenciay Prolog [52, 130] como representante logico. De ellos heredan muchas de las caracterısticas,entre las que destacan:

sintaxis de estilo funcional proxima al lenguaje Haskell. Las funciones se definenmediante reglas de reescritura, condicionales en el caso de T OY, mientras que Curryutiliza guardas al estilo Haskell;

ademas de la sintaxis, incorporan distintas caracterısticas propias del estilo funcional,como la evaluacion perezosa, las funciones de orden superior, el sistema de tipos ylas primitivas de entrada-salida monadicas;

del estilo logico incorporan el indeterminismo con sus posibilidades de busqueda:admiten definicion de funciones indeterministas, i.e., funciones que pueden devolverdistintos valores con los mismos argumentos;

tambien heredan del estilo logico la reversibilidad en el uso de las funciones, i.e, lasfunciones pueden invocarse con variables en los argumentos, para las que el sistemahara una busqueda de valores;

Por su parte, Curry anade ademas otras posibilidades propias, como la residuacion[2, 77, 74] o la busqueda encapsulada [80] (vease tambien [141, 140]) y T OY admitedistintos tipos de restricciones: de igualdad y desigualdad [25, 96, 109], sobre los numerosreales [110, 82, 27] y de domino finito [64].

El mecanismo operacional de ambos lenguajes, y en general de los lenguajes logico-funcionales, resulta de la combinacion de los utilizados en PF y PL. En el caso de loslenguajes funcionales este mecanismo se basa en reescritura [33, 57, 94], mientras que paralos logicos se utiliza unificacion y resolucion [52]. Integrando reescritura y unificacion (parael paso de parametros) se obtiene el estrechamiento (“narrowing”) introducido en [85] yposteriormente orientado a la programacion en [136, 58]. Dentro de los distintos tipos deestrechamiento (en [75] se mencionan hasta 18 tipos distintos), la variante perezosa maseficiente conocida es el estrechamiento necesario (“needed narrowing”) [19, 102], que es elque utilizan Curry y T OY. En este tipo de estrechamiento la idea es retrasar la evaluacionde los argumentos de las funciones hasta que son realmente necesarios para calcular elresultado de la llamada a la funcion. En el caso de Curry este mecanismo se combinaademas con la residuacion [77]. Tambien se han propuesto mecanismos de estrechamientocon evaluacion parcial [3, 4] para mejorar el rendimiento, ası como herramientas de analisisy depuracion [5, 12].

Para algunos de los primeros lenguajes logico-funcionales con evaluacion perezosa co-mo K-LEAF [38, 68] o Babel [121, 129] se formalizaron semanticas de modelos y de puntofijo, por analogıa con PL. Pero la situacion se complica al considerar las funciones inde-terministas junto con la evaluacion perezosa (los programas pueden verse como sistemas

Page 21: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

1.4. El fallo en el contexto logico-funcional 21

de reescritura no confluentes y no terminantes). Esta combinacion sugiere una semanti-ca de eleccion en la invocacion (“call-time choice”) para el indeterminismo. En [70, 71]se desarrolla la logica de reescritura basada en constructoras CRWL (Constructor basedReWriting Logic) que constituye un marco teorico adecuado para PLF con indeterminis-mo y evaluacion perezosa. Ademas de la logica de reescritura, se estudia una semantica demodelos y una relacion de estrechamiento, para la que se prueba correccion y completitudcon respecto a la logica de reescritura. Estos trabajos se han extendido posteriormen-te en lıneas diversas: para orden superior [69], tipos polimorficos [72], tipos algebraicos[31, 30, 32], tipos ordenados [6, 7], sistemas de restricciones genericas y sobre multiconjun-tos [28, 29, 106], objetos [119], desigualdades sintacticas [109, 155] y depuracion declarativa[43, 45, 46, 42]. Como resumen de estas extensiones puede consultarse [139].

El tema especıfico de la negacion en PLF ya se planteo en [122], y se amplio en [124]con evaluacion perezosa. En estos trabajos se adapta la negacion constructiva de PL alparadigma logico-funcional (en concreto para el lenguaje Babel [121, 129]) en la forma dereglas por defecto. El planteamiento coincide con el nuestro en varios aspectos. De hecho,uno de los usos que daremos nosotros a la construccion fails es precisamente la posibilidadde introducir reglas por defecto. Pero tambien hay diferencias importantes. En concreto,la mas destacable es que esta propuesta esta disenada para programas logico-funcionalesdeterministas y como ya hemos visto, los sistemas actuales son indeterministas.

Hay algunos otros trabajos relacionados con nuestra investigacion, pero alejados denuestro planteamiento como [135, 134] que adaptan las ideas de la negacion constructiva ala programacion logica ecuacional, o [62, 63] que estan mas en el la lınea de los problemasde “disunification” [53].

1.4. El fallo en el contexto logico-funcional

Ya hemos esbozado una primera nocion de la semantica de la funcion fails, en terminosoperacionales. En esta Seccion perfilaremos esta nocion de acuerdo con las particularidadesdel marco logico-funcional.

La nocion de fallo que hemos introducido en la pagina 14 proporciona una intuicionvaliosa que clarifica nuestro proposito, pero necesita ciertas precisiones. En concreto, haytres elementos esenciales que no pueden obviarse en el marco logico-funcional:

indeterminismo: en nuestro lenguaje son admisibles funciones indeterministas quepueden producir distintas reducciones para los mismos argumentos. Por ejemplo, sisuponemos el tipo de datos de los naturales definidos con las constructoras z (cero)y s (sucesor), se puede definir la siguiente funcion:

f(z) = zf(z) = f(s(z))

La funcion f esta definida solo para el valor z y ademas, para este valor puedehacerse la reduccion con dos reglas distintas. Con la primera, la expresion f(z)

Page 22: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

22 1. Introduccion

puede reducirse al valor z, mientras que con la segunda regla se incurre en un casode no definicion (puesto que f(s(z)) no esta definido), i.e., un caso de fallo. Peroglobalmente la expresion f(z) no falla en la reduccion, ya que puede reducirse almenos al valor z, luego fails(f(z)) debe reducirse a false. En definitiva, fails debeconsiderar en principio todas las posibles vıas de reduccion;

pereza: nuestro lenguaje, al igual que Haskell, Curry y T OY , utilizara un modelode evaluacion perezosa, que basicamente sigue la siguiente idea: solo se reducen losargumentos necesarios para evaluar una funcion y solo hasta el punto que requierala misma. Esta forma de prosperar en la reduccion se controla operacionalmentemediante las formas normales de cabeza. Por ejemplo, consideremos las funciones:

g(X) = s(h(X))h(z) = z

y la expresion fails(g(s(z))). En este caso, la expresion g(s(z)), puede reducirse auna forma normal de cabeza con el aspecto s(. . .) con lo que no se produce fallo, i.e.,fails(g(s(z))) se reduce a false. Notese que g(s(z)) se reduce en realidad a s(h(s(z))),pero la expresion interna h(s(z)) (que producirıa un fallo) no ha tenido que reducirse,debido precisamente a la pereza;

no terminacion: en nuestro marco los programas son posiblemente no terminantesy esto tambien afecta a nuestra funcion fails. Por ejemplo, si consideramos la funcion:

loop → loop

es claro que loop queda indefinida, no porque no haya regla aplicable, sino porquese produce una divergencia en el computo. De acuerdo con la definicion que hemosdado a la funcion fails, como loop no puede reducirse a forma normal de cabeza,serıa tambien un caso de fallo. Pero capturar ese fallo serıa equivalente a probar lano terminacion del computo, que no es decidible en el caso general (es parcialmentedecidible). En consecuencia, el fallo tampoco es computable y solo podremos aspirara una aproximacion computable al fallo, i.e., una aproximacion a la funcion fails talcomo se ha definido en la pagina 14.

Nuestra aproximacion al fallo guarda pues cierta conexion con la negacion comofallo finito de PL, puesto que los fallos que podemos capturar son “fallos finitos”,i.e., fallos que no son debidos a divergencias en el computo (no terminacion).

Page 23: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 2

El uso del fallo en programacion

logico-funcional

En este Capıtulo trataremos de ilustrar el potencial expresivo de la construccion failsa traves de ejemplos concretos de programacion que muestran aplicaciones practicas de lamisma. Utilizaremos sintaxis Prolog estandar para los programas logicos y notacion fun-cional currificada (como en T OY, Curry y Haskell) para los programas logico-funcionalesy funcionales puros.

Por otro lado el lenguaje sobre el que versa este trabajo es de primer orden, pero en al-gunos ejemplos utilizaremos orden superior, que es comun en T OY o Curry. FormalmenteCRWL cuenta con estas extensiones y desde el punto de vista practico, tambien es sabidocomo implementarlo. Por ello, no debe resultar extrano que utilicemos estos recursos eneste capıtulo.

Las funciones se definen mediante reglas condicionales de la forma:

f t1 . . . tn → e⇐ C1, . . . , Cm

siendo t1, . . . , tn terminos construidos (sin sımbolos de funcion), e una expresion general yC1, . . . , Cm una secuencia opcional de restricciones de igualdad e1 == e′1 y/o desigualdade2/= e′2. El hecho de que las funciones puedan ser indeterministas quiere decir que parareducir una llamada a una funcion puede haber en general varias reglas aplicables. Lallamada se reduce entonces aplicando cualquiera de ellas de manera indeterminista.

Aunque en esta tesis no abordamos el tema de los tipos (como sucede en buena parte delos trabajos teoricos sobre PLF), por claridad, en las funciones mas complejas anadiremosdeclaracion de tipo al estilo Haskell:

f :: τ1 → . . .→ τn → τn+1

donde τ1, . . . , τn son los tipos de los argumentos y τn+1 es el tipo del resultado.Por uniformidad, utilizaremos la sintaxis de T OY, en la que los identificadores de

variable comienzan por mayuscula y todos los demas (incluidos los de constructora) conminuscula. Asumiremos el tipo de los booleanos con los valores true y false. Tambienutilizaremos las listas con la notacion Prolog habitual: [ ] representa la lista vacıa y [C|R]

Page 24: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

24 2. El uso del fallo en programacion logico-funcional

la lista de cabeza C y resto R. La definicion de un nuevos tipos de datos se hace como enHaskell. Por ejemplo, el tipo de los naturales representados con las constructoras z (cero)y s (sucesor) se define como:

data nat = z | s nat

Para facilitar la lectura, utilizaremos con libertad la predefinida if then else conla semantica habitual, ası como las funciones de igualdad (==) y desigualdad (/=). Ladiferencia entre la restriccion de igualdad y la funcion igualdad es que la primera puedesatisfacerse o no, mientras que la segunda produce un valor booleano (cabe senalar que esinmediato definir la funcion igualdad haciendo uso de las restricciones de igualdad y desi-gualdad). La distincion es la misma para la desigualdad (en la Seccion 3.1.3 formalizaremosla relacion entre restriccion y funcion de igualdad/desigualdad).

2.1. Fallo como contrapartida a la negacion en programa-

cion logica

La motivacion primaria para introducir el fallo en PLF es proveer un recurso similara la negacion en PL. En este primer ejemplo mostramos como interpretar la negacion enun programa logico en terminos de fallo en la version logico-funcional.

En un programa Prolog habitualmente se definen los casos positivos de los predicadosy el efecto de la negacion (como fallo finito) es completar esta definicion con los casosnegativos, que corresponden al fallo de las clausulas definidas. Por ejemplo, el predicadologico member para determinar si un elemento pertenece a una lista, puede definirse enProlog como:

member(X, [X|Ys ]).member(X, [Y |Ys ]) :− member(X,Ys).

De este modo queda definido un procedimiento de semi-decision, member(X,Xs), paracomprobar si X es un elemento de la lista Xs. Puede utilizarse la negacion para comprobarsi X no es un elemento de Xs y definir a su vez un predicado insert para insertar elementosen una lista evitando duplicados:

insert(X,Xs , [X|Xs ]) :− not member(X,Xs).insert(X,Xs ,Xs) :− member(X,Xs).

Para trasladar estos predicados al contexto logico-funcional, la forma “directa” esconvertir las clausulas en funciones condicionales que devuelvan el valor true. Ası memberquedarıa del siguiente modo:

member X [Y |Ys ] → true⇐ X == Ymember X [Y |Ys ] → true⇐ member X Ys == true

En programacion logico-funcional la linealidad (no repeticion de variables) en las cabezases un requisito habitual. De ahı que en la primera regla se utilice la condicion de igualdadX == Y , para evitar la repeticion de X de la version Prolog. Para el predicado insert

Page 25: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.2. Reglas por defecto 25

la traduccion no es tan directa debido a la negacion, pero utilizando la construccion failssı que es inmediata:

insert X Xs [Y |Ys ] → true⇐ fails (member X Xs) == true, X == Y, Xs == Ysinsert X Xs Ys → true⇐ member X Xs == true, Xs == Ys

La reinterpretacion de la negacion logica como fallo en PLF, que ilustra este ejemplo,es extrapolable al caso general: cualquier literal de la forma not p en un programa logicopuede expresarse como fails p==true en la version logico-funcional. En este sentido, elfallo es efectivamente la contrapartida directa a la negacion en PL. En particular, per-mitira convertir de manera inmediata algoritmos de semi-decision (programados para loscasos positivos) en algoritmos de decision (que tambien consideran los negativos), siempreque no haya involucrados problemas de no terminacion.

Tambien es cierto que el uso concreto que hacemos aquı del fallo corresponde a unacategorıa de “usos dispensables”: puede conseguirse el mismo efecto sin utilizar fallo,simplemente observando el significado de estas funciones y redefiniendolas para que seanexhaustivas en el tipo de los argumentos, de modo que el fallo quede capturado por elvalor false:

member X [ ] → falsemember X [Y |Ys] → if (X == Y ) then true else member X Ys

insert X Xs → if (member X Xs) then Xs else [X|Xs ]

En este caso, la simplicidad del programa permite prescindir del fallo a costa de reela-borar la version logico-funcional. Pero el hecho importante es que en general, la negacionen PL puede expresarse como fallo en PLF sin necesidad de redisenar los programas, sinode un modo bastante inmediato. En los siguientes ejemplos nos centramos en el ambitologico-funcional y mostramos usos del fallo “menos dispensables”, en los que el fallo es laforma natural de hacer las cosas, o cuando menos, una forma muy natural de hacerlas.

2.2. Reglas por defecto

En comparacion con la programacion logica, el fallo no tiene en principio tanta rele-vancia en el caso funcional. Sin embargo, en los lenguajes funcionales hay un elementoimplıcito estrechamente ligado al fallo: las reglas por defecto. En estos lenguajes, el ajustede patrones determina la regla de funcion aplicable a una llamada, y como las reglas seintentan de arriba abajo, en realidad las reglas por defecto estan sobreentendidas en ladefinicion. En otras palabras, la regla n-esima de una funcion solo se aplica si las n − 1anteriores no son aplicables porque falla el ajuste de patrones. Por ejemplo, supongamosla siguiente definicion para f :

f 0 → 0f X → 1

Page 26: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

26 2. El uso del fallo en programacion logico-funcional

La evaluacion de la expresion f 0 en un lenguaje funcional como Haskell producira elvalor 0 utilizando la primera regla. La segunda regla no se utiliza aun cuando el ajuste depatrones serıa posible considerando aisladamente dicha regla. Este tratamiento secuencialde las reglas es util en algunos casos, precisamente para escribir reglas que cubran el “casopor defecto”. Este uso es especialmente util cuando el caso por defecto es complicadode expresar mediante ajuste de patrones. Por otro lado, resaltemos que en los sistemasque hacen esta secuencia de pruebas, las reglas no tienen un significado declarativo ensı mismas, ya que su interpretacion depende tambien de las reglas previas (en el patronde la regla n+1-esima implıcitamente se excluyen los patrones de las n reglas anteriores).

En contraste, en PLF se intenta preservar la lectura declarativa de cada regla. Ası, conel programa anterior en PLF, la expresion f 0 es reducible aplicando de modo indetermi-nista cualquiera de las reglas, obteniendo los valores 0 y 1. No obstante, en PLF serıa utilpoder simular el comportamiento de PF en algunas situaciones. Para conseguir el efectode las reglas por defecto en PLF puede introducirse una nueva construccion sintacticadefault como ya se propuso en [122]. La funcion f podrıa definirse como:

f 0 → 0default f X → 1

Intuitivamente, el significado operacional pretendido es: para reducir una llamada a futilizar la primera regla; si la reduccion falla, entonces utilizar la regla por defecto.

El problema ahora es como conseguir este comportamiento y a la vez preservar elsignificado ecuacional de las reglas, i.e., no basta analizar el fallo en el ajuste de patrones.Y la solucion la proporciona la construccion fails, que permite reescribir la definicionanterior como:

f X → f ′ Xf X → 1 ⇐ fails (f ′ X) == true

f ′ 0 → 0

Ahora, para evaluar f 0, la primera regla de f invoca a f ′ 0 que produce el valor 0, yla segunda no se aplica puesto que no se cumple la condicion fails (f ′ 0) == true. Paraevaluar f 1, como f ′ 1 falla, solo se puede utilizar la segunda regla de f que produce elvalor 1. En definitiva, hemos conseguido el comportamiento esperado para f sin perder elsignificado declarativo de las reglas.

Naturalmente, esta transformacion es aplicable en el caso general. Supongamos unafuncion h definida como:

h t1 → e1 ⇐ C1

. . .

h tn → en ⇐ Cndefault h tn+1 → en+1 ⇐ Cn+1

La idea es considerar una nueva funcion h′ definida por las primeras n reglas de h. Lafuncion h original se define como h′ si esta tiene exito y segun la regla por defecto si h′

falla:

Page 27: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.3. El fallo en problemas de busqueda 27

h X → h′ X

h X → en+1 ⇐ fails (h′ X) == true, Cn+1

h′ t1 → e1 ⇐ C1

. . .

h tn → en ⇐ Cn

Las reglas por defecto tambien son utiles para convertir procedimientos de semi-decision en otros de decision en el sentido comentado en la Seccion 2.1. Por ejemplo,consideremos la definicion habitual de los naturales con las constructoras z y s. Paradecidir si un numero es multiplo de 5, podemos definir la funcion mult5 como:

mult5 z → truemult5 (s (s (s (s (s N))))) → mult5 Ndefault mult5 N → false

La regla por defecto en este caso facilita el analisis de casos (abrevia la escritura de cuatroreglas, para los casos s z, s (s z), s (s (s z)) y s (s (s (s z))), que se evaluarıan a false. Conuna filosofıa similar, definiendo la funcion substract para la resta de naturales, podemosdefinir una funcion mult N M para decidir si N es multiplo de M:

mult z M → truemult (s N) z → falsemult (s N) (s M) → mult (substract (s N) (s M)) (s M)default mult N M → false

substract N z → Nsubstract (s N) (s M) → substract N M

En este caso, no es tan inmediato prescindir de las reglas por defecto haciendo un anali-sis exhaustivo en los patrones de las reglas. Un posible uso reversible de esta funciones descubrir los multiplos de un numero dado. Por ejemplo, para el 6, la invocacionmult (s (s (s (s (s (s z)))))) N producirıa en N los valores 0, 1, 2, 3 y 6 (representadoscon z y s).

La construccion default es realmente comoda en la practica y la utilizaremos con li-bertad en algunos de los ejemplos que siguen. A la vista de la traduccion que hacemospara ella, en realidad su uso implica un uso enmascarado de la construccion fails, que esnuestro centro de atencion.

2.3. El fallo en problemas de busqueda

En este apartado veremos algunas aplicaciones del fallo en relacion con el indetermi-nismo, en concreto, en problemas de busqueda. La cantidad de problemas de este tipo esinmensa y los ejemplos que vienen a continuacion son solo una muestra de tal diversidad.

Page 28: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

28 2. El uso del fallo en programacion logico-funcional

2.3.1. Caminos en un grafo

Un problema tıpico que se exhibe con frecuencia en PL es el estudio de los caminosen un grafo. En nuestro ejemplo consideraremos un grafo dirigido (acıclico) definido sobrelos nodos a, b, c y d como se muestra a continuacion:

b

d

c

a

Para representar el grafo en PLF, en primer lugar definimos el tipo de los nodos:

data node = a | b | c | d

Para definir los arcos, una forma razonable es utilizar una funcion next X que devuelvalos sucesores del nodo X. En concreto, para nuestro grafo tendrıamos:

next a → bnext a → cnext b → cnext b → d

Observese que next es no determinista. Ahora, para determinar si existe un camino entredos nodos X e Y definirıamos una funcion path X Y que se evalue a true si existe talcamino (falla en otro caso):

path X Y → true ⇐ X == Ypath X Y → path (next X) Y ⇐ X/= Y

Notese que path se comporta como un procedimiento de “semi-decision”: solo funciona enlos casos positivos, i.e., en aquellos en los que efectivamente existe un camino entre losnodos X e Y . Ademas, en este caso, a diferencia de lo que ocurrıa en el primer ejemplo dela Seccion 2.1, no hay una forma evidente (en programacion logico-funcional “clasica”) decompletar esta definicion con los casos negativos. No se podrıa definir de manera directapor ejemplo una funcion safe con la siguiente especificacion:

safe X::= X no esta conectado con d (no hay camino desde X hasta d)

Para definir esta funcion habrıa que utilizar un estilo funcional “determinista”, cambiandola representacion de los grafos y redisenando el programa (es interesante en este sentido[159]). Tambien podrıa utilizarse la busqueda encapsulada de Curry [80] (limitando el usoreversible de la funcion). Sin embargo, utilizando el fallo, dicha definicion es inmediata:

safe X → fails (path X d)

De acuerdo a esta definicion, safe c se evaluarıa a true, mientras que para el resto denodos se evaluarıa a false. Tambien podrıa evaluarse una expresion con variables comosafe X, que producira el valor true con X = c, y false para el resto de valores de X.

Page 29: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.3.2 Automatas finitos 29

2.3.2. Automatas finitos

En procesamiento de lenguajes el fallo tambien presenta usos naturales que pueden fa-cilitar considerablemente la programacion. Para ilustrarlo consideraremos el caso concretode los automatas finitos, que aunque en un principio es similar al ejemplo anterior de losgrafos, sugiere usos muy distintos para el fallo. Un automata finito determinista puededefinirse [98] como una quıntupla:

M = (K,Σ, s, F, δ)

donde K es un conjunto de estados, Σ un alfabeto, s el estado inicial, F ⊆ K el conjuntode estados finales y δ : K × Σ → K es la funcion de transicion. De cara a programarlospodemos asumir algunas simplificaciones: los estados K seran enteros, Σ sera el conjuntode caracteres estandar representados entre comillas simples y δ sera una funcion parcialque determina solo transiciones para un subconjunto de ellos (para los demas podrıandefinirse transiciones a un estado especial de error). Las palabras seran listas de caracteresque, como es habitual, representaremos simplemente como cadenas de texto entre comillasdobles. Ası pues, en PLF tendrıamos las siguientes definiciones de alias de tipos:

type state = inttype symbol = chartype word = [char]

type automata = (state→ symbol → state, // deltastate, // estado inicial[state]) // estados finales

La funcion de transicion generalizada deltaGen para procesar palabras puede definirsecomo una funcion de orden superior que aplica reiteradamente δ hasta agotar los sımbolosde entrada:

deltaGen :: automata→ state→ word→ statedeltaGen (D, I, Fs) Q [ ] → QdeltaGen (D, I, Fs) Q [A|As] → deltaGen (D, I, Fs) (D Q A) As

La funcion de aceptacion para un automata determinista se define entonces compro-bando que tras reconocer la entrada el automata alcanza uno de los estados finales:

accept :: automata→ word→ boolaccept (D, I, Fs) W = member (deltaGen (D, I, F ) I W ) Fs

(Asumimos aquı la definicion de la pagina 25 para la funcion member).Como ejemplo concreto, consideremos un automata contains ab para reconocer cadenas

que contienen “ab” como subcadena (sobre el alfabeto {a, b}). Graficamente el automatasera (el sımbolo “>” marca el estado inicial y el doble cırculo el final):

1 2

a a,b

a b

0

b

Page 30: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

30 2. El uso del fallo en programacion logico-funcional

Para programar nuestro automata contais ab basta con definir la terna correspondientey la funcion de transicion δ:

contais ab→ (delta, 0, [2])

delta 0 ‘a‘ → 1delta 0 ‘b‘ → 0delta 1 ‘a‘ → 1delta 1 ‘b‘ → 2delta 2 ‘a‘ → 2delta 2 ‘b‘ → 2

Con este automata, la llamada accept contais ab “aba“ se reducirıa a true, mientrasque con la cadena “bba“ se reducirıa a false. Tambien serıa posible reducir una llamadacomo accept contains ab [‘a‘, X, Y ] para la que habrıa cuatro posibles reducciones:

true con X = ‘a‘, Y = ‘b‘

true con X = ‘a‘, Y = ‘a‘

true con X = ‘b‘, Y = ‘b‘

false con X = ‘a‘, Y = ‘a‘

En la practica, para procesar lenguajes es util considerar como alfabeto el conjuntocompleto de caracteres y considerar un estado especial de error. Por ejemplo, para reco-nocer la palabra reservada “end“ tendrıamos el automata:

1 20 3e n d

4

=d=n=e *

*

Las transiciones etiquetadas con ∗ son transiciones con cualquier caracter del alfabeto yla etiqueta 6= e representa cualquier caracter excepto ‘e‘ (analogo para otros caracteres).En este caso el estado 4 es el estado especial de error. La programacion de este automataes inmediata utilizando una regla por defecto:

end→ (delta, 0, [3])

delta 0 ‘e‘ → 1delta 1 ‘n‘ → 2delta 2 ‘d‘ → 3default delta S C → 4

Con este automata la llamada accept end “end“ se reducirıa a true, mientras que concualquier otra cadena producirıa false.

Page 31: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.4. Juegos bipersonales finitos 31

Sin hacer uso de las reglas por defecto (que implıcitamente involucran el fallo) habrıaque trabajar un poco mas la definicion de este automata. Pero la situacion se complicaaun mas en el caso de los automatas indeterministas. Formalmente lo que cambia es lafuncion δ que ahora puede alcanzar mas de un estado a partir de uno dado y consumiendoel mismo sımbolo.

Con respecto a la implementacion, la declaracion de tipos es la misma que para elcaso determinista. Pero al ser ahora delta una funcion indeterminista, la funcion acceptsera incorrecta tal como esta definida. Consideremos por ejemplo un automata ends abpara reconocer cadenas terminadas en “ab“, que podrıa ser el siguiente:

1 2a b

0

a,b

La funcion de transicion se podrıa programar como:

ends ab→ (delta, 0, [2])

delta 0 ‘a‘ → 0delta 0 ‘b‘ → 0delta 0 ‘a‘ → 1delta 1 ‘b‘ → 2

Utilizando la funcion de aceptacion anterior, la expresion accept ends ab “aab“ producirıalos valores true y false: es posible encadenar transiciones hasta el estado final 2, perotambien se puede quedar en 0. Y esto es obviamente incorrecto. La funcion de aceptacioncorrecta podrıa programarse sencillamente con una regla por defecto:

accept (D, I, Fs) → if (member (deltaGen (D, I, Fs) I W ) Fs) then truedefault accept (D, I, Fs) → false

La primera regla produce el valor true si existe una transicion desde el estado inicial a unfinal, mientras que la regla por defecto produce el valor false en caso contrario, i.e., si noexiste una secuencia de transiciones que lleven a un estado final. Este uso de la regla pordefecto, y de manera indirecta del fallo, no es facilmente prescindible. Y por otro lado,esta es una forma muy comoda de disenar el programa.

Ahora la expresion accept ends ab “aab“ produce solamente el valor true, como es deesperar. Para la expresion accept ends ab [a,X, Y ] se obtiene true con los valores X = a,Y = b, y el valor false con el resto de combinaciones de valores a, b para X,Y .

2.4. Juegos bipersonales finitos

Examinamos ahora un ejemplo presentado en [22, 67] en el contexto de la programacionlogica. Se trata de programar un juego bipersonal finito en el que los jugadores hacen susmovimientos alternativamente hasta que no es posible continuar el juego, en cuyo casopierde el jugador que tiene el turno, i.e., el ganador es el que realiza el ultimo movimiento.

Page 32: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

32 2. El uso del fallo en programacion logico-funcional

Para el caso logico-funcional asumimos una funcion move State que produce, si esposible, un nuevo estado mediante un movimiento legal a partir del estado State. Cabesuponer que para un estado del juego dado habra varios movimientos posibles en general,por lo que esta funcion sera indeterminista.

Ahora nos interesa una funcion winMove State para obtener un “movimiento ganador”a partir del estado State, i.e., un movimiento que eventualmente lleve a la victoria (seancuales sean los movimientos posteriores del adversario). Tal como esta planteado el juegola idea es simple: “yo gano si tu pierdes”. En otras palabras, un movimiento ganadorpara un jugador es aquel que produce un estado de juego en el que el adversario no tieneposibilidad de movimiento ganador, i.e., su busqueda de movimiento ganador es fallida.Utilizando nuestra funcion fails es inmediato materializar esta idea:

winMove State → State ′ ⇐ State ′ == move State,fails (winMove State ′) == true

Para este programa parece difıcil encontrar una codificacion tan simple y elegante a la vezsin el uso del fallo.

Hay muchos juegos que se adaptan a este esquema y que pueden programarse ahorasimplemente definiendo una funcion move que establezca los movimientos legales. Unejemplo que se ajusta a este esquema es el conocido juego de Nim que, en una versiongeneralizada, puede plantearse del modo siguiente: se tiene un conjunto de montones decerillas (cada monton puede contener cualquier numero de cerillas); cada jugador en suturno debe retirar una o mas cerillas de uno de los montones (las que quiera, pero todasdel mismo monton); un jugador pierde cuando no puede mover en su turno, i.e., cuandono quedan cerillas porque el otro jugador (el ganador) ha retirado la(s) ultima(s) en elultimo movimiento.

Los estados del juego pueden codificarse facilmente mediante una lista de naturales,que a su vez representan el numero de cerillas de cada monton. Por ejemplo, supongamosque los jugadores son A y B, y que iniciamos el juego con 3 montones de 3, 4 y 5 cerillascada uno. Si el primer turno es de A, el desarrollo de una partida podrıa ser el siguiente:

inicialmente tenemos: [3, 4, 5]

A elimina 2 cerillas del primer monton: [1, 4, 5]

B elimina 4 cerillas del segundo monton: [1, 0, 5]

A elimina 4 cerillas del tercer monton: [1, 0, 1]

B elimina 1 cerilla del primer monton: [0, 0, 1]

A elimina 1 cerilla del tercer monton: [0, 0, 0]

B no tiene movimiento posible, luego pierde y A es el ganador

Page 33: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.4. Juegos bipersonales finitos 33

Notese que cuando un monton queda vacıo se deja un 0 para conservar la estructuraoriginal de la lista y facilitar la interpretacion de las jugadas.

La funcion move seleccionara de modo indeterminista un monton para el que eliminara,mediante una funcion pick, un numero indeterminado (positivo) de cerillas. Representandolos naturales mediante las constructoras z y s estas funciones se pueden definir ası:

move [N |Ns] → [pick N |Ns]move [N |Ns] → [N |move Ns]

pick (s N) → Npick (s N) → pick N

Con este programa, por ejemplo para el estado inicial [s (s z), s (s z), s (s z)], lafuncion winMove proporcionara tres posibles estados [z, s (s z), s (s z)], [s (s z), z, s (s z)]y [s (s z), s (s z), z], i.e., el movimiento esencialmente consiste en eliminar todas lascerillas de uno de los montones. Por ejemplo, eliminado las 2 cerillas del segundo montonobtenemos el estado [s (s z), z, s (s z)], y es facil ver que efectivamente este movimientogarantiza la victoria:

si el adversario elimina las dos cerillas de uno de los montones, nosotros eliminaremoslas dos del otro monton y habremos ganado;

si elimina una sola cerilla de uno de los montones, nosotros eliminaremos una delotro monton obteniendo [s z, z, s z]; el adversario ahora tendra que eliminar una delas cerillas y nosotros la restante, con lo que tambien habremos ganado.

Naturalmente la funcion winMove proporcionara el movimiento que habremos de haceren cada situacion. Tambien es posible que para un estado dado, no exista un movimien-to que garantice la victoria y winMove fallara. Esto ocurre por ejemplo en el estado[s (s z), s (s z)], para el que la funcion winMove no puede determinar ningun movimientoganador porque no existe (para un analisis exhaustivo de la estrategia ganadora en estejuego puede consultarse por ejemplo [73]).

La funcion winMove tambien puede utilizarse en sentido inverso, por ejemplo paragenerar estados iniciales a partir de los cuales este garantizada la victoria. Un problemade este tipo serıa distribuir N cerillas en M montones generando un estado para el queexista movimiento ganador (para el jugador que empieza la partida). Para ello necesitamosla suma de naturales add definida como:

add z N → Nadd (s N) M → s (add N M)

Ahora, para distribuir por ejemplo 6 cerillas en 3 montones y obtener un estado [X,Y,Z]a partir del cual exista movimiento ganador Mov, habrıa que resolver las restricciones:

add X (add Y Z) == s (s (s (s (s (s z))))), winMove [X,Y,Z] == Mov

Ası se obtendrıan las siguientes soluciones (expresamos los naturales en notacion decimalpara facilitar la lectura):

Page 34: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

34 2. El uso del fallo en programacion logico-funcional

[X,Y,Z] = [6, 0, 0] con Mov = [0, 0, 0]

[X,Y,Z] = [5, 1, 0] con Mov = [0, 1, 1]

[X,Y,Z] = [4, 2, 0] con Mov = [0, 2, 2]

[X,Y,Z] = [4, 1, 1] con Mov = [1, 1, 0]

[X,Y,Z] = [2, 2, 2] con tres posibles movimientos Mov = [0, 2, 2], Mov = [2, 0, 2] yMov = [2, 2, 0]

tambien se obtendrıan todas las permutaciones de los estados anteriores con losmovimientos ganadores correspondientes.

Otro problema puede ser, si tenemos un monton con 3 cerillas, determinar el numerode cerillas que puede tener otro monton de modo que el estado sea ganador:

winMove [s (s (s z)), X]

En este caso se encontraran movimientos ganadores para X = z, X = s(z), X = s(s(z)),X = s(s(s(s(z)))), etc; pero se produce un fallo para X = s(s(s(z))), i.e., el estado [3, 3]es favorable al adversario.

2.5. Recoleccion de respuestas

El indeterminismo en un lenguaje de programacion es la herramienta idonea paraabordar algunos problemas en los que puede haber mas de una solucion, como en losanteriores de busqueda. Se habla entonces de conjunto de soluciones mas que de solucion.Es habitual que el sistema proporcione estas soluciones una a una, bajo demanda delusuario, como ocurre en Prolog, T OY o Curry. Pero tambien es comun que sea necesariotrabajar con el conjunto de soluciones de un subproblema para dar solucion a un problemamas general.

Los sistemas Prolog proporcionan distintos predicados de recoleccion de respuestas delestilo findall(T,P,L), que recolecta en la lista L todos los terminos T que satisfacen elpredicado P. En Curry tambien existe una version de findall ası como otras primitivas derecoleccion de soluciones, basadas todas ellas en la busqueda encapsulada [81]. En el casode Prolog este tipo de predicados se basan en el fallo finito, ası como otros predicadosimpuros o extra-logicos. A su vez, las implementaciones de Curry como PAKCS [78], sebasan en una traduccion a Prolog y su findall hace uso finalmente del de Prolog y otrospredicados extra-logicos.

En general, los predicados de recoleccion tienen el estatus de “extra-logicos” porqueno son definibles en el lenguaje (a no ser que se haga vıa otros predicados que a su vezson extra-logicos) y suelen estar estrechamente vinculados al mecanismo operacional.

Con el predicado fails es posible definir algunas recolecciones al nivel del lenguaje.Una forma de recoleccion en PLF es obtener el conjunto de soluciones para una funcion(indeterminista en general), y este conjunto podemos representarlo mediante una lista.Por ejemplo, en el programa de los caminos en un grafo de la Seccion 2.3.1 para recolectarlos adyacentes a un nodo dado se puede definir una funcion collectNexts N como:

Page 35: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.5. Recoleccion de respuestas 35

collectNexts X → collectNextsAc X [ ]

collectNextsAc X Ac→ collectNextsAc X [Y |Ac] ⇐ Y == next X,member Y Ac == false

default collectNextsAc X Ac→ Ac

La funcion collectNextsAc generaliza collectNexts con un argumento acumulador en elque se recolectan los adyacentes a X (asumimos member definido como en la pagina25). Notese que la funcion fails esta implıcita en la construccion default. Utilizando estadefinicion podrıamos reducir la expresion collectNexts a que se evaluarıa a [b, c] y [c, b](esta forma de recoleccion produce todas las permutaciones posibles).

Como ejemplo del uso de recolecciones hemos seleccionado un puzle llamado Pic-a-Pix B&W disenado por Conceptis1. El juego consiste en una cuadrıcula vacıa con unasecuencia de numeros asociada a cada fila y cada columna, como la siguiente:

11 2 2

1 1 ���2 ���2 ���

Los numeros asociados a una fila indican los cuadros negros consecutivos que tienedicha fila (analogamente con las columnas). Los bloques de cuadros negros han de colocarseen el orden indicado por la secuencia y han estar separados al menos por un blanco. Eljuego consiste en determinar el color de cada casilla. En general podrıa haber mas deuna solucion, pero en los puzles de Conceptis las condiciones se plantean de modo que lasolucion sea unica.

El metodo sugerido por Conceptis para resolver el puzle es analizar las posibles disposi-ciones en cada fila/columna por separado, fijando el color de aquellas casillas que coincidenen todas las disposiciones (las negras se colorean y las blancas se marcan por ejemplo con’·’). Por ejemplo, en una fila como:

2 1 3 ����������

los cuadrados negros pueden colocarse de diversas formas, como las dos siguientes:

2 1 3 ����������

2 1 3 ����������

Es facil ver (generando una disposicion con todos los bloques negros lo mas a la izquierdaposible y otra con todos lo mas a la derecha posible) que hay una casilla que necesariamentees negra en cualquier disposicion viable:

2 1 3 ����������

1Su pagina http://www.conceptispuzzles.com/products/index.html contiene informacion referentea estos puzles, ası como ejemplos concretos. En Espana, la revista Logic (de venta en kioskos de prensa)publica este tipo de puzles con el nombre de “puzle japones”

Page 36: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

36 2. El uso del fallo en programacion logico-funcional

Las casillas marcadas (negras o blancas) en una fila limitan las posibilidades de lascolumnas correspondientes y viceversa. Ası, iterando el proceso por filas y columnas even-tualmente se completa el coloreado del puzle. En el puzle anterior, empezando por las filas,obtendrıamos:

11 2 2

1 1 ���2 ���2 ���

Y ahora procediendo con las columnas tendrıamos la solucion:

11 2 2

1 1 ���2 ���2 ���

Nuestro objetivo es disenar un programa que resuelva este tipo de puzles. Asumimosque la informacion referente a las filas viene dada en una lista de listas de enteros al igualque la de las columnas. Ası en el puzle del ejemplo, la informacion de las filas serıa:

[[1, 1], [2], [2]]

Para la cuadrıcula utilizaremos tambien una lista de listas simulando una matriz. Ca-da elemento de la cuadrıcula sera un color, negro, blanco o desconocido aun. Definimosentonces:

data color = unknown | white | black

Para rellenar una fila de acuerdo con su informacion asociada definimos una funcionfill Info Ls que devuelve de modo indeterminista una disposicion de los bloques de negrosrepresentados por Info en la lista (fila o columna) Ls:

fill [ ] Ls → fillWhite Lsfill [0|Is] Ls → fill Is Lsfill [N |Is] [X|Xs] → [black | fillBlack [N−1|Is] Xs] ⇐ N>0, X/= whitefill [N |Is] [X|Xs] → [white | fill [N |Is] Xs] ⇐ N>0, X/= black

fillWhite [ ] → [ ]fillWhite [X|Xs] → [white | fillWhite Xs] ⇐ X/= black

fillBlack [0] [ ] → [ ]fillBlack [0|Is] [X|Xs] → if (Is == [ ]) then fillWhite [X|Xs]

else [white | fill Is Xs] ⇐ X/= black

fillBlack [N |Is] [X|Xs] → [black | fillBlack [N−1|Is] Xs] ⇐ N>0, X/= white

Page 37: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.5. Recoleccion de respuestas 37

Por ejemplo, la llamada fill [2] [unknown,unknown,unknown] producira dos resultados[black,black,unknown] y [unknown,black,black].

Ahora, para recolectar todas las posibles disposiciones definimos la funcion collectFillde modo analogo a la funcion collectNexts que vimos al principio de este apartado:

collectFill Is Ls→ collectFillAc Is Ls [ ]collectFillAc Is Ls Ac→ collectFillAc Is Ls [X|Ac] ⇐ X == fill Is Ls,

member X Ac == falsedefault collectFillAc Is Ls Ac→ Ac

Con esta definicion, la llamada collectFill [2] [unknown,unknown,unknown] producirıa lalista [[black,black,unknown], [unknown,black,black]] (tambien la lista con las disposicionesintercambiadas).

Lo que nos interesa realmente es determinar las casillas que tienen el mismo colorblanco o negro en la lista de disposiciones anteriores, i.e., una especie de interseccion delas disposiciones, dos a dos, que definimos como:

intersect [X] → Xintersect [X,Y |Y s] → intersect [intersectTwo X Y |Y s]

intersectTwo [ ] [ ] → [ ]intersectTwo [X|Xs] [Y |Y s] → [contrast X Y |intersectTwo Xs Y s]

contrast black black → blackcontrast white white → whitedefault contrast X Y → unknown

La funcion contrast comprueba si dos casillas tienen el mismo color definido, blanco onegro, y devuelve el mismo como resultado; en otro caso el color queda indefinido. Con estasintersecciones, la llamada intersect (collectFill [2] [unknown,unknown,unknown]) producela lista [unknown,black,unknown], que representa la informacion que puede inferirse segunel metodo expuesto.

Para anadir a la cuadrıcula la informacion de las secuencias correspondientes a las filasbasta con hacer “intersecciones de las recolecciones” anteriores:

addInfo [ ] [ ] → [ ]addInfo [I|Is][X|Xs] → [intersect (collectF ill I X)|addInfo Is Xs]

Notese que es esencialmente equivalente anadir informacion referente a filas o a colum-nas; para procesar las columnas bastara con definir una funcion traspose para trasponerla matriz que representa la cuadrıcula y utilizar la misma funcion addInfo. El procesode anadir informacion debe ir alternando entre filas y columnas hasta que la cuadrıculano varıe (si el planteamiento del puzle define una solucion unıvoca sera precisamente esacuadrıcula la solucion buscada). Ası podemos definir:

solve InfoRow InfoCol Grid→if (X == B) then B else solve InfoRow InfoCol X

⇐ X == traspose (addInfo InfoCol (traspose (addInfo InfoRow Grid)))

Page 38: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

38 2. El uso del fallo en programacion logico-funcional

Para resolver el puzle planteado anteriormente la expresion a reducir es:

solve [[1, 1], [2], [2]] [[1, 1], [2], [2]] [[unknown, unknown, unknown],[unknown, unknown, unknown],[unknown, unknown, unknown]]

obteniendo:

[[black, white, black],[white, black, black],[black, black, white]]

Graficamente este valor corresponde a la solucion buscada.

El metodo de resolucion propuesto es aplicable a puzles de tamano relativamente pe-queno en los que el numero de disposiciones para una fila o columna dada no es excesivo.En puzles mayores, tratar de recolectar todas las disposiciones puede resultar inviable enla practica. Esto ocurre por ejemplo en el siguiente puzle:

1 13 1 1 3 3 1 1 3 3 1 3 1 1 1

1 1 1 1 1 1 1 1 ������������������1 1 2 1 1 1 1 ������������������3 1 1 2 3 1 1 ������������������

En este caso, el numero de posibles disposiciones para las dos primeras filas es muyelevado y ademas, para empeorar las cosas, no permiten determinar el color de ningunacasilla. Por el contrario, para la tercera fila solo hay una disposicion posible y muchas delas columnas tambien quedan completadas en una sola pasada. Esto sugiere que cuandoel numero de disposiciones de una fila o columna sea elevado, quiza sea mas apropiadoabordar otra en primer lugar.

Para trasladar esta mejora al programa se puede definir una recoleccion acotada co-llectFillN N Is Ls que recolecte disposiciones de los bloques Is en la lista Ls hasta un valormaximo de N soluciones (puede haber menos de N disposiciones posibles). La forma deimplementar esta funcion es:

collectFillN N Is Ls→ collectFillNAc N Is Ls [ ]collectFillNAc N Is Ls Ac→ collectFillNAc Is Ls [X|Ac] ⇐

N>0, X == fill Is Ls, member X Ac == falsedefault collectFillNAc N Is Ls Ac→ Ac

La idea es utilizar un contador N que se ira decrementando al encontrar una nueva dispo-sicion, hasta alcanzar el valor 0, para el que opera la regla por defecto. Si hubiese menosde N disposiciones posibles tambien opera la regla por defecto devolviendolas.

Apoyandose en esta nueva funcion de recoleccion y trabajando con una cota N adecua-da, en el puzle anterior, el programa podrıa obviar las dos primeras filas en una primerapasada. Con la tercera fila y la informacion para las columnas obtendrıa:

Page 39: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.6. Fallo y falso 39

1 13 1 1 3 3 1 1 3 3 1 3 1 1 1

1 1 1 1 1 1 1 1 ������������������1 1 2 1 1 1 1 ������������������3 1 1 2 3 1 1 ������������������

Con esta nueva situacion, volviendo a la primera fila puede completar las casillas de lamisma y tambien las de la segunda fila, con lo que el puzle esta resuelto:

1 13 1 1 3 3 1 1 3 3 1 3 1 1 1

1 1 1 1 1 1 1 1 ������������������1 1 2 1 1 1 1 ������������������3 1 1 2 3 1 1 ������������������

El apendice B contiene un programa completo para resolver puzles que incorpora estetipo de mejoras. El codigo esta escrito para una extension de T OY que incluye fallo. Sehace tambien una breve discusion sobre la estrategia, unicidad de soluciones, etc.

2.6. Fallo y falso

En la Seccion 2.1 veıamos como utilizar la funcion fails para reinterpretar los falloscomo false en una funcion. Con ello conseguıamos transformar algunos metodos de semi-decision en otros de decision. En esta seccion veremos la utilidad de proceder al reves, i.e.,reinterpretar el valor false como fallo. Con ello podremos distinguir los exitos/fallos deuna reduccion, y de modo indirecto obtener mayor control sobre el indeterminismo.

Para manipular resultados de exito introducimos una nueva funcion success definidacomo:

success true → true

Esta funcion se comporta como la identidad con el valor true. Lo interesante es precisa-mente que no esta definida para el valor false, i.e., genera un fallo para este valor comopretendemos2.

Para ilustrar la utilidad de esta funcion, en el siguiente ejemplo construimos un eva-luador para formulas de la logica proposicional. Asumimos los sımbolos de proposicionp, q y r, y las conectivas habituales: negacion (neg), conjuncion (con), disyuncion (dis),implicacion (implies) y doble implicacion (iff). Ası, definimos el siguiente tipo de datos:

data formula = p | q | r | neg formula | con formula formula | dis formula formula |implies formula formula | iff formula formula

Con esta representacion, la formula (p∧ q) → r se escribirıa como implies (and p q) r.Para la funcion de evaluacion necesitamos las funciones de negacion, conjuncion y disyun-cion habituales:

not true → falsenot false → true

and true X → Xand false X → false

or true X → trueor false X → X

2En Curry existe una construccion similar para manipular el resultado de la evaluacion de las restric-ciones. El significado es muy parecido al que pretendemos aquı.

Page 40: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

40 2. El uso del fallo en programacion logico-funcional

La funcion de evaluacion eval F I calculara el valor veritativo de una formula F enuna interpretacion dada I, de acuerdo con la semantica habitual de las conectivas en lalogica proposicional. Una interpretacion es una terna de booleanos que proporcionan elvalor veritativo para p, q y r, respectivamente.

eval p (P,Q,R) → Peval q (P,Q,R) → Qeval r (P,Q,R) → Reval (neg F ) I → not (eval F I)eval (con A B) I → and (eval A I)(eval B I)eval (dis A B) I → or (eval A I)(eval B I)eval (implies A B) I → eval (dis (neg A) B) Ieval (iff A B) I → eval A I == eval B I

Por ejemplo, utilizando la formula anterior y la interpretacion (true, false, true), la ex-presion eval (implies (and p q) r) (true, false, true) se reduce a true.

Ahora estamos interesados en estudiar la satisfactibilidad de las formulas logicas, yen particular, pretendemos localizar tautologıas, contradicciones y contingencias. Paraello definiremos sendas funciones que lleven a cabo estos tests sobre una formula dada.Estos tests, en particular el de tautologıa y contradiccion, se apoyan en la evaluacion delas formulas sobre todas las posibles interpretaciones. Utilizando el indeterminismo dellenguaje es sencillo definir una funcion inter para obtener interpretaciones:

bval → truebval → false

inter → (bval, bval, bval)

Podemos evaluar la expresion eval (implies p (neg q)) inter que se reduce tanto a true(por ejemplo con una interpretacion que haga p = false , q = true), como a false (porejemplo con p = true, q = true). En este caso se tratarıa de una contingencia.

Para definir los tests de satisfactibilidad que buscamos, lo mas sencillo es comenzar conlas contradicciones. Una formula es una contradiccion si su valor veritativo en cualquierinterpretacion es falso, o de modo equivalente, si no existe ninguna valoracion que la hagacierta. Utilizando las funciones success y fails, el test de contradiccion puede definirsecomo:

isContradiction F → fails (success (eval F inter))

La lectura de esta regla es bastante intuitiva: una formula es contradictoria si la funcionde evaluacion no tiene exito sobre ninguna interpretacion. Los demas tests son sencilloshaciendo uso de propiedades logicas elementales:

isTautology F → isContradiction (neg F )isContigency F → and (not (isContradiction F )) (not (isTautology F ))isSatisfiable F → not (isContradiction F )

Page 41: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

2.6. Fallo y falso 41

Podemos ahora evaluar la expresion isSatisfiable (implies p (con q (neg p))) que devol-vera el valor true.

Tambien podemos plantearnos la generacion de formulas que cumplan un determinadotest. Para que esta busqueda proporcione respuestas de interes, en la practica hay quelimitar de algun modo la generacion de formulas. Una forma razonable de hacerlo esdefiniendo la complejidad de las mismas como el numero de conectivas que contienen yhaciendo la busqueda para formulas de una complejidad dada. Definimos la funcion decomplejidad como:

complexity p → zcomplexity q → zcomplexity r → zcomplexity (neg F ) → s (complexity F )complexity (con F G) → s (add (complexity F ) (complexity G))complexity (dis F G) → s (add (complexity F ) (complexity G))complexity (implies F G) → s (add (complexity F ) (complexity G))complexity (iff F G) → s (add (complexity F ) (complexity G))

Se puede utilizar esta funcion como generadora de formulas de una complejidad dadasobre las que hacer el test. Por ejemplo, tendremos un generador de contradicciones de 3conectivas evaluando las siguientes condiciones:

complexity F == s (s (s z)), isContradiction F

Algunas de las repuestas que obtendremos, en notacion estandar son:

¬(p ∨ ¬p), ¬(p ∨ (p→ q)), p ∧ ¬(q → q), (q ↔ ¬q) ∧ p, . . .

Del mismo modo pueden generarse tautologıas o contingencias, o simplemente formulassatisfactibles.

Page 42: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

42 2. El uso del fallo en programacion logico-funcional

Page 43: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 3

Semantica logica: la vision

conjuntista

El rasgo distintivo esencial entre un programa funcional puro y un programa logico-funcional, entendidos ambos como sistemas de reescritura, es la (posible) no confluencia oindeterminismo en la version logico-funcional. Por otra parte, una caracterıstica comun aambas versiones es la (posible) no terminacion. Estas dos cualidades, indeterminismo y noterminacion, son las que guıan la construccion del marco semantico para PLF propuestoen [70] y [71]. La idea central en dichos trabajos es una logica de reescritura basadaen constructoras CRWL (Constructor based ReWriting Logic) que incorpora de raız elindeterminismo y la evaluacion no estricta, en relacion a la no confluencia y no terminacionrespectivamente. Dicha logica se presenta en forma de calculo de pruebas que permitederivar aproximaciones a la semantica de las expresiones.

Ademas de la semantica denotacional en [70, 71] se desarrolla una semantica declara-tiva de modelos (en la que todo programa resulta tener un modelo libre) y tambien unasemantica operacional, que se presenta como calculo de estrechamiento para la resolucionde objetivos. El marco CRWL ha mostrado ser muy adecuado para el estudio formal dePLF como muestra la variedad de extensiones que se han llevado a cabo: orden supe-rior [69], tipos algebraicos y polimorficos [31, 30, 24], restricciones sobre multiconjuntos ynumeros reales [28, 29], desigualdades sintacticas [109, 155], etc. Desde el punto de vistade la implementacion, la mayorıa de las caracterısticas de CRWL estan incorporadas en elsistema T OY [110, 1, 44, 155]. La estrategia de estrechamiento de T OY esta basada en[102] y la adecuacion a CRWL ha sido formalmente justificada en [109, 155, 158].

Tomamos el calculo de pruebas CRWL de [70, 71] como punto de partida para eldesarrollo de un lenguaje logico-funcional de primer orden (el orden superior queda fueradel alcance de este trabajo). En primer lugar se hace una breve presentacion del marcoCRWL (en concreto, la logica de reescritura. A continuacion, presentamos una logica dereescritura alternativa SRL (Set Reduction Logic) basada en conjuntos, que hace explıcitala naturaleza conjuntista de muchas de las nociones implicadas en PLF. De hecho, comoveremos, es el indeterminismo el que sugiere esta reformulacion conjuntista. Por ultimo,se mostrara la equivalencia semantica de ambas logicas.

Page 44: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

44 3. Semantica logica: la vision conjuntista

La logica SRL, aunque interesante en sı misma, no introduce ninguna mencion al fallo,que es en definitiva nuestro objetivo. Sin embargo, como veremos en el capıtulo siguiente,con SRL hemos despejado el camino para introducir el fallo de forma natural.

3.1. El marco CRWL

3.1.1. Preliminares

Signaturas, expresiones y terminos

Partimos de una signatura Σ = CSΣ∪FSΣ en la que CSΣ =⋃n∈IN CSnΣ es un conjunto

de sımbolos de constructora y FSΣ =⋃n∈IN FSnΣ es un conjunto de sımbolos de funcion,

todos ellos con su aridad asociada (CSnΣ es el conjunto de sımbolos de constructora dearidad n y analogamente para FSnΣ) y tales que CSΣ ∩ FSΣ = ∅. Asumimos ademas unconjunto numerable V de sımbolos de variable. El conjunto de expresiones (totales) ExpΣ

se construye del modo habitual sobre Σ y V, i.e., una expresion e queda definida como:

e ::= X | c(e1, . . . , en) | f(e1, . . . , en)

siendo X ∈ V, c ∈ CSnΣ, f ∈ FSnΣ, y e1, . . . , en ∈ ExpΣ (siendo n ≥ 0).

Dentro del conjunto ExpΣ se considera un subconjunto distinguido de terminos cons-truidos o simplemente terminos (totales) que denotamos como TermΣ, cuya particularidades que utilizan solo sımbolos de CS y V, es decir, que no contienen sımbolos de funcion.En lo sucesivo la signatura se considerara sobreentendida por el contexto y omitiremos elsubındice Σ.

Los sımbolos de funcion de FS tendran asociadas reglas de reescritura que definenel comportamiento de las funciones en sı. Esto quiere decir que los elementos de Exprepresentan expresiones susceptibles de ser reducidas (pueden contener llamadas a funcionque pueden evaluarse utilizando las reglas de reescritura), mientras que los elementos deTerm representan datos o valores que no pueden reducirse.

Utilizaremos con frecuencia la signatura extendida Σ⊥ definida como Σ⊥ = Σ ∪ {⊥},donde ⊥ es una nueva constante (constructora de aridad 0) que juega el papel de valorindefinido. Sobre la signatura Σ⊥ se definen los conjuntos Exp⊥ y Term⊥, que llamaremosexpresiones parciales y terminos parciales (parcialmente definidos) respectivamente, encontraposicion a los anteriores que son totales (totalmente definidos). Los terminos par-ciales representan valores correspondientes a expresiones parcialmente evaluadas y puedeninterpretarse como aproximaciones al valor de las mismas.

Como notaciones habituales, utilizaremos los sımbolos X, Y , Z,. . . para variables; c,d para los sımbolos de constructora; f , g para los de funcion; e para expresiones y s, tpara terminos. Utilizaremos primas (′) y subındices con libertad en todos los casos. Paradenotar tuplas de terminos y variables (de aridad indeterminada o clara por el contex-to) utilizaremos las notaciones t y X respectivamente. El conjunto de variables de unaexpresion e se escribira como var(e).

Page 45: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.1 Preliminares 45

Orden de aproximacion, consistencia, posiciones y conflictos de terminos

De manera natural, se puede definir un orden de aproximacion v para expresionesparciales como el mınimo orden parcial sobre Exp⊥ que satisface:

⊥ v e, para todo e ∈ Exp⊥

e1 v e′1, . . . , en v e′n ⇒ h(e1, . . . , en) v h(e′1, . . . , e′n), para todo h ∈ CSn ∪ FSn y

ei, e′i ∈ Exp⊥.

El significado intuitivo de la relacion e v e′ es que e esta menos definido o tienemenos informacion que e′. En otras palabras, e v e′ si e resulta de sustituir en e′ algunassubexpresiones por ⊥. Diremos que dos expresiones e, e′ ∈ Exp⊥ son consistentes si puedenser refinadas para obtener la misma informacion, i.e., si existe e′′ ∈ Exp⊥ tal que e v e′′

y e′ v e′′. Por ejemplo, si consideramos c ∈ CS2, d ∈ CS0 y f ∈ FS1, las expresionese = c(f(d),⊥) y e′ = c(⊥, X) son consistentes porque ambas estan refinadas por e′′ =c(f(d), X).

Utilizaremos tambien estas nociones referidas a tuplas de terminos para las que tene-mos: t v t

′si ti v t′i para cada par (ti, t

′i) de las tuplas t y t

′; analogamente t y t

′son

consistentes si lo son dos a dos.Tambien haremos uso de las nociones habituales acerca de posiciones en las expresiones.

En general, una posicion en una expresion e es una secuencia de enteros positivos i1 · . . . ·inde modo que:

la posicion ε (secuencia vacıa) en una expresion e corresponde a la propia e;

en una expresion de la forma h(. . . , ej , . . .), siendo h ∈ CSm ∪ FSm y 1 ≤ j ≤ m,la posicion j · i1 · i2 · . . . · in, corresponde a la subexpresion que ocupa la posicioni1 · i2 · . . . · in en ej (si es que existe).

En nuestro caso, una posicion identificara tanto la subexpresion aludida en la definicionanterior, como el sımbolo (de constructora, funcion o variable) que hay en la raız de dichasubexpresion.

Dado un conjunto de sımbolos de constructora C ⊆ CS, diremos que dos terminos ty s presentan un C-conflicto si hay alguna posicion en la que t y s tienen sımbolos de Cdiferentes. Por ejemplo, si a, b ∈ CS0 y c ∈ CS2, los terminos t = c(X, a) y s = c(Y, b)presentan un {a, b}-conflicto (pero no un {a, c}-conflicto). Cuando el conjunto C coincidacon CS hablaremos simplemente de conflicto de constructoras o conflicto sin mas.

Sustituciones

Nuestras sustituciones seran aplicaciones del conjunto de variables V en el conjuntode terminos. Distinguimos dos tipos de sustituciones dependiendo de si el rango son losterminos totales Term o parciales Term⊥. Ası, el conjunto de sustituciones totales sedefine como Sust = {θ : V → Term} y el de sustituciones parciales como Sust⊥ = {θ :V → Term⊥}. En ambos casos utilizamos los sımbolos θ, σ, µ, . . . para representarlas.Notaremos por eθ al resultado de aplicar la sustitucion θ a la expresion e en el sentido

Page 46: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

46 3. Semantica logica: la vision conjuntista

habitual y θµ a la composicion de θ con µ tal que e(θµ) = (eθ)µ. Como es habitual,definimos el dominio de una sustitucion θ como Dom(θ) = {X ∈ V | Xθ 6≡ X}. Lanotacion [X1/t1, . . . , Xn/tn] representa la sustitucion θ que cumple Xiθ = ti para todoi ∈ {1, . . . , n} e Y θ = Y para todo Y ∈ V − {X1, . . . , Xn}. Una sustitucion θ se diceidempotente si θθ = θ.

El orden de aproximacion v definido sobre expresiones induce un orden natural deaproximacion sobre Sust⊥ definido como:

θ v θ′ si y solo si Xθ v Xθ′ para todo X ∈ V

Tambien utilizaremos el orden habitual � de subsuncion para terminos y para susti-tuciones:

dados dos terminos t y s diremos que t es mas general que s y lo notaremos comot � s, si existe una sustitucion θ tal que tθ = s;

dadas dos sustituciones θ y σ diremos que θ es mas general que σ, y lo notaremoscomo θ � σ, si existe otra sustitucion µ tal que θµ = σ.

Una sustitucion θ es un unificador para dos terminos t y s si tθ = sθ; en tal caso se diceque t y s son unificables. Es sabido que dos terminos unificables cualesquiera disponen deunificadores idempotentes y minimales para la relacion �, denominados unificadores masgenerales, u.m.g. en lo sucesivo (vease por ejemplo [118]).

Programas

Fijada una signatura Σ = CS ∪FS, un programa P es un conjunto finito de reglas dereescritura condicionales que definen el comportamiento de cada una de las funciones deFS. Estas reglas seran de la forma:

f(t1, . . . , tn)︸ ︷︷ ︸cabeza

→ e︸︷︷︸cuerpo

⇐ C1, . . . , Cm︸ ︷︷ ︸condicion

donde f ∈ FSn y se satisfacen las siguientes condiciones:

(t1, . . . , tn) es una tupla lineal con t1, . . . , tn ∈ Term (cada variable de la tupla tieneuna sola aparicion en la misma).

e ∈ Exp;

cada Ci de la condicion es una restriccion de la forma e′ ./ e′′ (igualdad estricta) obien e′ <> e′′ (desigualdad), donde e′, e′′ ∈ Exp. El significado de estas restriccionesquedara establecido con precision en la Seccion 3.1.2. No obstante, podemos anticiparinformalmente dicho significado: una restriccion de la forma e ./ e′ se verifica siambas expresiones e y e′ pueden reducirse a un termino total comun, mientras queuna desigualdad e <> e′ se satisface cuando ambas expresiones pueden reducirse asendos terminos que presentan conflicto de constructoras.

Page 47: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.1 Preliminares 47

La lectura de una regla de esta forma es: f(t1, . . . , tn) se reduce a e si se satisfacenlas restricciones C1, . . . , Cn. En ocasiones escribiremos Pf para referirnos al conjunto dereglas del programa P que definen la funcion f .

La condicion de linealidad es tıpica de los lenguajes funcionales puros como Haskell[84, 131] y en los logico-funcionales como T OY [110, 155, 1] o Curry [81]. Puede encon-trarse una justificacion para la linealidad de las cabezas en PLF en [121]. En nuestro casoconcreto, en el contexto CRWL, la razon concluyente es que no exigir linealidad destruirıael resultado de monotonıa del calculo de pruebas CRWL (Proposicion 1) que veremos enla siguiente Seccion. Es mas, se perderıa la monotonıa de todos los calculos de pruebasque presentaremos, y esta propiedad a su vez es esencial para las pruebas de correccion ycompletitud con respecto a las relaciones de estrechamiento.

Para ilustrar como afecta la no linealidad a la monotonıa consideremos las construc-toras z (cero) y s (sucesor) habituales para los numeros naturales y una regla con cabezano lineal como:

f(X,X) → z

El calculo de pruebas CRWL permitirıa demostrar f(⊥,⊥) → z. Que este calculo seamonotono significa que se puede refinar la informacion de la expresion f(⊥,⊥) y obtenerla misma aproximacion z. En concreto, se pueden reemplazar los terminos ⊥ por otrosmas definidos y probar por ejemplo f(z, s(z)) → z, pero evidentemente no es deseable queCRWL admita tal reduccion y para evitarlo se impone la condicion de linealidad.

La sintaxis de T OY admite reglas con cabeza no lineal, lo cual no significa que elsistema opere con este tipo de reglas: hace una sencilla transformacion de las reglas concabeza no lineal, eliminando la repeticion de las variables en la cabeza e insertando lasrestricciones de igualdad correspondientes en la condicion de la regla. Por ejemplo, lafuncion f anterior se transforma en:

f(X,Y ) → true⇐ X ./ Y

Este tipo de transformacion ya se propuso para algunos lenguajes funcionales como Mi-randa [156, 157].

Tanto la igualdad como la desigualdad han sido estudiadas en PLF en trabajos previosa CRWL. En algunos de ellos, como [19, 68, 120, 129], el tratamiento que se da a la igualdadimplica que una restriccion de la forma X ./ Y produce un numero infinito de sustitucionescerradas. En [102] la igualdad ya se hace apropiadamente, aunque solo a nivel operacional.En [70, 71], con la introduccion del marco CRWL, se da un tratamiento adecuado a laigualdad en PLF, tanto a nivel denotacional como operacional.

Por otra parte, el interes de las desigualdades en PLF es un hecho admitido [81] quese ha puesto de manifiesto en la practica en el sistema T OY . Sin embargo, en el marcoCRWL original presentado en [70, 71] aun no se consideraban estas restricciones, quese incorporaron posteriormente en [109, 155]. Aunque existen distintos trabajos teoricosprevios a CRWL que abordan en profundidad el problema de la no-unificacion (vease [53]y [93]), estos son adecuados en logica ecuacional, pero no en nuestro contexto. En [96] seintroducen las desigualdades en el contexto de PLF, pero para una clase restringida de

Page 48: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

48 3. Semantica logica: la vision conjuntista

programas BABEL [128, 129, 121]. Dichos trabajos estan orientados a la implementacion ylas desigualdades carecen de tratamiento teorico. En [26] se lleva a cabo una aproximacionteorica basada en el esquema CFLP(X ) [104, 105], que fue concebido para PLF conrestricciones siguiendo las lıneas de CLP(X ) (PL con restricciones, [88]). Este marco esmuy general en el sentido de que cubre muchos sistemas de restricciones, pero planteaproblemas para expresar la unificacion con patrones. Recientemente, en [106] se ha revisadoel esquema CLP(X ) para adaptarlo al enfoque CRWL y se han superado los problemasmencionados.

Estas restricciones suponen un recurso expresivo interesante en PLF, ya que aparecenen situaciones muy comunes, tanto en los programas como en las respuestas. El siguienteejemplo ilustra un uso sencillo, pero interesante de las desigualdades.

Ejemplo 1 Asumimos las constructoras habituales para listas [ ] y [ | ]. La funcion mem-ber para comprobar la pertenencia de un elemento a una lista puede definirse sin involucrarrestricciones (en estilo funcional) como:

member(X, [ ]) → falsemember(X, [Y |Ys]) → if (eq X Y ) then true else member X Ys

Utilizamos aquı la funcion eq como una funcion de igualdad, que puede definirse paratipos de datos concretos mediante reglas de programa. Por ejemplo, para los naturalesconstruidos con z y s se define como:

eq z z → trueeq z (s Y ) → falseeq (s X) z → falseeq (s X) (s Y ) → eq X Y

Una de las caracterısticas distinguidas de PLF es que pueden reducirse expresionesque contengan variables, como member (X, [Y ]). Una posible reduccion proporcionara elvalor true con la sustitucion [X/Y ]. Pero esta expresion tambien puede reducirse al va-lor false si X e Y se instancian a valores inconsistentes. Por ejemplo, obtenemos talinconsistencia con la sustitucion [X/z, Y/s(Z)]. De hecho hay infinitas sustituciones queposibilitan tal inconsistencia y por tanto habrıa infinitas reducciones a false para la expre-sion member (X, [Y ]). Entre otras, tendrıamos las sustituciones:

[X/z, Y/s(Z)], [X/s(Z), Y/z], [X/s(z), Y/s(s(Z))], [X/s(s(Z)), Y/s(z)],. . .

Ademas, es sencillo apreciar que esta coleccion de sustituciones no puede ser reemplazadapor un conjunto finito de sustituciones equivalente. La situacion cambia radicalmente aladmitir desigualdades, ya que una unica desigualdad, X <> Y , captura toda la informacionproporcionada por las sustituciones anteriores.

La version de CRWL con la que trabajamos aquı tambien proporciona el fundamentoteorico apropiado para el manejo de desigualdades. Y ademas permitira demostrar resul-tados de completitud mas generales que en [25, 26], en donde se obtenıan para soluciones

Page 49: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.2 El calculo de pruebas CRWL “estandar” 49

cerradas. Estos resultados de completitud se han generalizado aun mas en otra extensionde CRWL [106].

En el calculo de pruebas CRWL que presentaremos en la siguiente seccion utilizaremosel conjunto de instancias parciales con constructoras o simplemente instancias de las reglasde un programa P que se define como:

[P]⊥ = {(f(t) = e⇐ C1, . . . , Cn)θ | (f(t) = e⇐ C1, . . . , Cn) ∈ P, θ ∈ Sust⊥}

Por ejemplo, asumiendo la regla (f(X,Y ) → true ⇐ X ./ Y ) ∈ P y las constructorasz (cero) y s (sucesor) para los naturales, se puede obtener la instancia (f(z, s(Z)) →true ⇐ z ./ s(Z)) ∈ [P]⊥ utilizando la sustitucion θ = [X/z, Y/s(Z)]. Tambien sepuede obtener la instancia parcial (f(s(z),⊥) → true ⇐ s(z) ./ ⊥ ∈ [P]⊥ tomandoθ = [X/s(z), Y/⊥]. Si consideramos otra funcion h de aridad 1 una instancia general paraf serıa f(h(Z), Y ) → true ⇐ h(Z) ./ Y (reemplazando X por h(Z)), pero esta instanciano pertenece al conjunto [P]⊥ que hemos definido, puesto que claramente la sustitucionimplicada no es de Sust⊥. En definitiva el conjunto [P]⊥ recoge todas las instancias dereglas de programa que pueden obtenerse mediante sustituciones de variables por terminosconstruidos (posiblemente parciales). Estas instancias serviran para expresar el paso deparametros en el calculo CRWL y el hecho de no admitir instancias generales es debidoa la semantica de call-time choice como veremos en la siguiente Seccion. Notese que engeneral, para una regla de programa se podran obtener infinitas instancias (en el caso dela funcion f anterior X y Y pueden reemplazarse, en particular, por cualquier natural).

3.1.2. El calculo de pruebas CRWL “estandar”

En el enfoque de CRWL, la semantica de un programa viene expresada por un calculode pruebas que determina que sentencias pueden deducirse del programa. En concreto,dado un programa P el calculo CRWL permitira demostrar o derivar sentencias de trestipos:

aproximaciones de la forma e→ t con e ∈ Exp⊥ y t ∈ Term⊥. El significado de talessentencias es que la expresion e puede reducirse al termino (posiblemente parcial)t, donde las apariciones de ⊥ en t corresponden a subexpresiones no evaluadas. Eltermino t representa, como veremos, uno de los posibles valores de la denotacion dee;

igualdades estrictas de la forma e ./ e′, con e, e′ ∈ Exp⊥. En este caso el significadoes que e y e′ pueden ser reducidas a un termino comun totalmente definido, es decir,puede probarse e→ t y e′ → t, siendo t ∈ Term;

desigualdades de la forma e <> e′, con e, e′ ∈ Exp⊥. El significado es que las expresio-nes e y e′ se pueden reducir a terminos (posiblemente parciales) t y t′ respectivamenteque presentan un conflicto de constructoras (CS-conflicto).

En el Cuadro 3.1 se muestran las reglas de derivacion del calculo CRWL. Este calculotiene la propiedad de que, al construir una prueba, la regla de inferencia a utilizar en cada

Page 50: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

50 3. Semantica logica: la vision conjuntista

(1)e→ ⊥

(2)X → X

X ∈ V

(3)e1 → t1, . . . , en → tn

c(e1, . . . , en) → c(t1, . . . , tn)c ∈ CSn, ti ∈ Term⊥

(4)e1 → t1, . . . , en → tn C e→ t

f(e1, . . . , en) → tt 6= ⊥ y (f(t1, . . . , tn) → e⇐ C) ∈ [P]⊥

(5)e→ t e′ → t

e ./ e′si t ∈ Term

(6)e→ t e′ → t′

e <> e′si t, t′ ∈ Term⊥ y tienen un CS-conflicto

Cuadro 3.1: Calculo de pruebas CRWL

uno de los pasos de derivacion esta determinada por la estructura sintactica mas externade la sentencia. En concreto, la condicion t 6= ⊥ de la regla 4 para probar una sentenciade la forma f(t) → t, se exige para que todas las pruebas de la forma e → ⊥ se realicenmediante la regla 1. De hecho, la forma de una prueba completa esta determinada por laestructura sintactica de la sentencia inicial, excepto en el caso de la regla 4. Esta reglaen particular permite considerar cualquier regla de programa (pueden ser varias debido alindeterminismo) y ademas utilizar cualquier instancia de la misma.

A continuacion apuntamos otros detalles sobre las reglas del calculo:

en la regla 4 se utilizan instancias de reglas de programa de [P]⊥ para probar aproxi-maciones de llamadas a funcion. Una formulacion alternativa de la regla 4, que uti-lizaremos con frecuencia en las demostraciones es la siguiente:

e1 → t1θ, . . . , en → tnθ Cθ eθ → t

f(e1, . . . , en) → t

siendo t 6= ⊥, (f(t1, . . . , tn) → e⇐ C) ∈ P y θ ∈ Sust⊥.

notese que las instancias del apartado anterior pueden contener en particular el valorindefinido ⊥; es la regla 1 la encargada de probar cualquier sentencia de la formae→ ⊥. Esto permite que una expresion quede indefinida o sin evaluar y es aquı dondequeda reflejada la semantica no estricta;

una variable X solo puede reducirse a ella misma (regla 2) o a ⊥ (regla 1), de modoque el papel de las variables es similar al de las constantes en las derivaciones coneste calculo. Sin embargo, al utilizar reglas de funcion del programa, las variables de

Page 51: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.2 El calculo de pruebas CRWL “estandar” 51

dicha regla pueden tomar cualquier valor utilizando la instancia apropiada y en estesentido las variables se comportan como tales;

la regla 3 produce una sencilla descomposicion de terminos;

finalmente, las reglas 5 y 6 corresponden a las definiciones de ./ y <> respectivamen-te. Notese que en la regla 6 se pide un conflicto de constructoras de CS. Ası pues, unconflicto entre una constructora de CS y ⊥ no basta para probar <>. Por ejemplo,si a, b ∈ DC0 y c ∈ DC2, se puede probar c(a, b) <> c(b,⊥) por el conflicto entre ay b, pero no se puede probar c(a, b) <> c(a,⊥).

Escribiremos P `CRWL ϕ para expresar que la sentencia ϕ es demostrable en CRWLcon respecto al programa P. De acuerdo con este calculo, la denotacion o semantica deuna expresion e con respecto a un programa P se define como el conjunto de terminos alos que se puede reducir e, es decir, el conjunto de aproximaciones de e:

[[e]] = {t ∈ Term⊥|P `CRWL e→ t}

Una caracterıstica distinguida y esencial en el marco CRWL es que las funciones pue-den ser indeterministas. Por ejemplo, si asumimos las constructoras z y s para los numerosnaturales, podemos expresar los posibles resultados del lanzamiento de una moneda me-diante una funcion indeterminista coin definida como:

coin→ zcoin→ s(z)

Es sencillo ver que para la misma expresion coin el calculo CRWL puede derivar el valor z ytambien s(z) (la denotacion completa de coin es [[coin]] = {⊥, z, s(⊥), s(z)}). Para ilustrarla forma de las pruebas en CRWL presentamos a continuacion un ejemplo de derivacion:

Ejemplo 2 Utilizamos aquı un ejemplo tomado de [70]. Consideremos la funcion coinanterior junto las funciones add y double definidas como:

add(z, Y ) → Yadd(s(X), Y ) → s(add(X,Y ))

double(X) → add(X,X)

Es posible construir una CRWL-derivacion para la sentencia double(coin) → z y tam-bien para double(coin) → s(s(z)), pero no para double(coin) → s(z). De hecho, tenemos[[double(coin)]] = {⊥, z, s(⊥), s(s(⊥)), s(s(z))}. Veamos por ejemplo como puede derivarsedouble(coin) → s(s(z)); indicamos la regla de CRWL aplicada en cada paso con el numerode la misma a la derecha:

z → z (3)

s(z) → s(z)(3)

coin→ s(z)(4)∗

z → z (3)

s(z) → s(z)(3)

z → z (3)

s(z) → s(z)(3)

z → z (3)z → z (3)

s(z) → s(z)(3)

z → z (3)

s(z) → s(z)(3)

add(z, s(z)) → s(z)(4)∗∗∗

s(add(z, s(z)) → s(s(z))(3)

add(s(z), s(z)) → s(s(z))(4)∗∗

double(coin) → s(s(z))(4)

Page 52: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

52 3. Semantica logica: la vision conjuntista

Notese que en el paso marcado con (4)∗ se utiliza la segunda regla de coin (como notiene variables la unica instancia es ella misma), en el paso (4)∗∗ se utiliza la instanciaadd(s(z), s(z)) → s(add(z, s(z))) de la segunda regla para add, mientras que en el (4)∗∗∗

la instancia add(z, s(z)) → s(z) procede de la primera regla.

En este ejemplo (en el paso (4)∗) se ha utilizado la segunda regla de coin para hacer lareduccion que pretendemos. No obstante, la regla 4 de CRWL permite tomar en principiocualquier instancia de cualquier regla de programa con tal que la cabeza de dicha instanciacoincida con la llamada. Este es el modo de capturar las posibles reducciones de las fun-ciones indeterministas. Pero hay otra fuente de indeterminismo adicional: el cuerpo de lasreglas puede contener variables extra o locales, i.e., variables que no aparecen en la cabezade la funcion, y dichas variables pueden instanciarse a cualquier termino. Por ejemplo, sepuede definir la funcion f → s(X), en la que la variable X del cuerpo es una de estasvariables extra. Con esta regla se puede reducir f a cualquier termino de la forma s(. . .).Como veremos mas adelante este tipo de variables plantean una serie de dificultades ennuestro desarrollo y se restringira su uso.

En el paso de parametros en la regla 4 de CRWL se toman instancias de las reglasde programa debido a la semantica de call-time choice (reduccion del argumento antes deevaluar la llamada). Esta es una alternativa apropiada en un contexto indeterminista dePLF ([86, 87, 71]). Por ejemplo, para reducir la expresion double(coin), segun la semanticade call-time choice, primero ha de hacerse la reduccion del argumento coin a uno de losvalores z o s(z) y despues evaluar la llamada a double, con lo que los posibles valores quese obtienen son z y s(s(z)), pero no s(z). Desde el punto de vista operacional, la semanticade call-time choice esta estrechamente ligada al sharing o comparticion de valores, queredunda en la eficiencia tanto en PF como en PLF (permite la comparticion de valoresreducidos evitando reevaluacion de expresiones) y es de hecho la semantica adoptada porimplementaciones como T OY o Curry.

A pesar de lo expuesto, la semantica run-time choice es tambien una alternativa via-ble que se ha estudiado en el contexto de PLF [17]. De acuerdo con ella se admitirıaninstancias generales de reglas de funcion en la regla 4 de CRWL, con lo que podrıamostomar double(coin) → add(coin, coin) como instancia de la regla de double; despues en lallamada add(coin, coin), para el primer argumento podrıamos reducir coin → z y para elsegundo coin→ s(z), y entonces se podrıa derivar la sentencia double(coin) → s(z).

Por otra parte las instancias utilizadas en la regla 4 son parciales debido a la semanticano estricta que se asume para las funciones, i.e., los argumentos de una funcion puedenno ser totalmente reducidos para reducir la funcion en cuestion. Desde el punto de vistaoperacional esto se traduce en la evaluacion perezosa cuyas implicaciones son bien conoci-das de los lenguajes funcionales que la incorporan (como Haskell) y que tambien utilizanT OY y Curry.

Con respecto a las restricciones ./ y <> es interesante senalar que no son incompati-bles. Naturalmente sı son incompatibles para terminos (dos terminos no pueden ser igualesy presentar un conflicto de constructoras simultaneamente). Pero la situacion es completa-mente distinta en el caso de expresiones, debido al indeterminismo: dadas dos expresiones

Page 53: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.3 Eliminando restricciones en CRWL 53

e y e′ es posible que se puedan derivar ambas sentencias e ./ e′ y e <> e′. Por ejemplo, uti-lizando la funcion coin es sencillo construir derivaciones para coin ./ z y coin <> z. Estehecho no supone ningun obstaculo; sencillamente no se pretende que <> sea la negacionlogica de ./.

La siguiente Proposicion recoge algunas propiedades interesantes de CRWL:

Proposicion 1 Dadas e, e1, e2, e′1, e

′2 ∈ Exp⊥ y t, t′ ∈ Term⊥, se tiene:

transisitividad de →: si las sentencias e → t y t → t′ son derivables, entoncestambien es derivable e→ t′;

→ y orden de aproximacion: dados t, t′ ∈ Term⊥ se tiene que t→ t′ es derivable siy solo si t′ v t;

monotonıa:

• si e v e′, t′ v t y e → t es derivable entonces e′ → t′ tambien lo es (enparticular, si e v e′ y e→ t es derivable, entonces e′ → t tambien lo es);

• si e1 v e′1, e2 v e′2 y e1 ./ e2 es derivable, entonces e′1 ./ e′2 tambien lo es;

• si e1 v e′1, e2 v e′2 y e1 <> e2 es derivable, entonces e′1 <> e′2 tambien lo es;

cierre por sustituciones totales: dadas e, e′ ∈ Exp⊥, t ∈ Term⊥ y θ ∈ Sust, se tiene:

• si e→ t es derivable entonces tambien lo es eθ → tθ;

• si e ./ e′ es derivable entonces tambien lo es eθ ./ e′θ;

• si e <> e′ es derivable entonces tambien lo es eθ <> e′θ;

La demostracion de estos resultados, a excepcion del cierre por sustituciones, puedeconsultarse en [70, 71] para CRWL sin desigualdades y en [109] para la extension condesigualdades. La propiedad de cierre por sustituciones totales no se estudio en ningunode estos trabajos; en [111, 117] se muestra una propiedad de cierre para una extension deCRWL y la demostracion del resultado que nos ocupa sigue las mismas ideas. Muchas delas demostraciones referidas a CRWL se llevan a cabo por induccion (completa) sobre lalongitud de una prueba, que no es mas que el numero de pasos de inferencia (aplicacionesde reglas de CRWL) de dicha prueba. Del mismo modo muchas de las demostraciones quepresentaremos en este trabajo siguen este esquema de induccion sobre la longitud de laspruebas. Utilizaremos con frecuencia las siglas h.i. para abreviar “hipotesis de induccion”.

3.1.3. Eliminando restricciones en CRWL

En esta seccion nos interesamos por una presentacion alternativa de CRWL con aspectomas funcional. En concreto, buscamos una simplificacion del calculo prescindiendo de lasrestricciones ./ y <>, es decir, pretendemos reducir el repertorio de sentencias de modoque unicamente se trabaje con aproximaciones de la forma →. Naturalmente, no se trata

Page 54: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

54 3. Semantica logica: la vision conjuntista

simplemente de eliminar las restricciones y mermar la riqueza expresiva del lenguaje, sinode transformarlas en funciones que aporten la misma expresividad.

La idea es englobar ambas restricciones ./ y <> en una sola funcion bivaluada (==)de modo que:

probar la sentencia e ./ e′ es equivalente a probar la aproximacion e == e′ → true;

probar la sentencia e <> e′ es equivalente a probar la aproximacion e == e′ → false.

Eliminaremos tambien las restricciones de las reglas de programa. Ası, cada regla dela forma:

f(t) → e⇐ C1, . . . , Cn

se transforma en otra en la que la parte de la condicion C1, . . . , Cn pasa al cuerpo utilizandola funcion ’if then ’ habitual:

f(t) → if F1 then (if F2 then . . . (if Fm−1 then (if Fm then e)) . . .)

donde cada restriccion Ci de la forma ei ./ e′i se transforma en una llamada a funcion Fi

de la forma ei == e′i y cada restriccion Cj de la forma ej <> e′j se transforma en unallamada Fj de la forma (ej == e′j) == false.

Dado un programa P definimos su version sin condiciones P ′ como el conjunto dereglas resultante de transformar cada regla de P segun acabamos de ver.

Formalmente, asumimos que la signatura contiene las constantes booleanas true y false,es decir, true, false ∈ CS0. Asumimos tambien que la signatura contiene los sımbolos defuncion ′ifThen ′ y (==), de aridad 2. La funcion (==) quedara definida ‘ad hoc’ en lasreglas del calculo, mientras que la funcion ′ifThen ′ se define de forma infija mediante unaunica regla de programa:

if true then E → E

Por otra parte, extendemos la definicion de expresion de la Seccion 3.1.1 para incluiraquellas de la forma e == e′ siendo a su vez e y e′ expresiones.

En el Cuadro 3.2 se muestran las reglas de esta variante de CRWL. Los cambios conrespecto a las reglas del Cuadro 3.1 se aprecian en la regla 4, en la que ahora no es necesarioprobar las condiciones de las instancias de reglas utilizadas, y en las reglas 5 y 6 que definenel comportamiento de la funcion (==). Es facil intuir que tanto la igualdad estricta ./,como la desigualdad sintactica <> quedan capturadas en esta version de CRWL. De hecho,puede establecerse una equivalencia semantica plena entre ambas versiones, como muestrael siguiente resultado:

Teorema 1 (Equivalencia entre CRWL y CRWL’) Sea P un programa y P ′ su corres-pondiente transformado sin restricciones. Entonces se tiene:

a) P `CRWL e→ t⇔ P ′ `CRWL’ e→ t

b) P `CRWL e ./ e′ ⇔ P ′ `CRWL’ e == e′ → true

Page 55: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.1.3 Eliminando restricciones en CRWL 55

(1)e→ ⊥

e ∈ Exp⊥

(2)X → X

X ∈ V

(3)e1 → t1, . . . , en → tn

c(e1, . . . , en) → c(t1, . . . , tn)c ∈ CSn, ti ∈ Term⊥

(4)e1 → t1, . . . , en → tn e→ t

f(e1, . . . , en) → tsi t 6= ⊥ y (f(t1, . . . , tn) → e) ∈ [P]⊥

(5)e→ t e′ → t

e == e′ → truesi t ∈ Term

(6)e→ t e′ → t′

e == e′ → falsesi t, t′ ∈ Term⊥ y tienen un CS-conflicto

Cuadro 3.2: Calculo CRWL’

c) P `CRWL e <> e′ ⇔ P ′ `CRWL’ e == e′ → false

Demostracion: Las tres partes se demuestran simultaneamente por induccion sobre lalongitud l de la prueba en cuestion.l = 1 Las posibles pruebas son e → ⊥, X → X y c → c con c ∈ CS0 que claramentepueden hacerse en ambos calculos;l > 1 Estudiamos las distintas reglas aplicables:

el caso de la regla 3 es una aplicacion inmediata de la h.i.: P `CRWL ei → ti si y solosi P ′ `CRWL’ ei → ti para cada i ∈ {1, . . . , n};

si la prueba se hace por la regla 4 pero la regla de funcion que se utiliza, originalmenteno tenıa restricciones en la condicion, nuevamente es aplicacion inmediata de la h.i..

El caso interesante es precisamente cuando hay restricciones en la condicion de laregla original:

f(t) → e⇐ C1, . . . , Cm

En CRWL tendremos una prueba de la forma:

e1 → t1θ, . . . , en → tnθ Cθ eθ → t

f(e1, . . . , en) → t

siendo (f(t1, . . . , tn) → e ⇐ C) ∈ P y θ ∈ Sust⊥. Entonces la regla transformadasera:

f(t) → if F1 then . . . (if Fm then e) . . .

Page 56: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

56 3. Semantica logica: la vision conjuntista

en CRWL’ la prueba correspondiente sera:

e1 → t1θ, . . . , en → tnθ (if (F1θ) then . . . (if (Fmθ) then eθ) . . .) → t

f(e1, . . . , en) → t

Aplicando h.i. tenemos que las pruebas ei → tiθ son realizables en uno de los calculossi lo son en el otro. Por otro lado, para las restricciones C1, . . . , Cm, por h.i. y losapartados b) y c) tenemos que cada restriccion Ciθ se puede probar en CRWL si ysolo si en CRWL’ se puede probar la correspondiente Fiθ → true, y esto para cadai ∈ {1, . . . , n}. En definitiva

C1θ, . . . , Cnθ

se prueban en CRWL si y solo si en CRWL’ se prueba

F1θ → true, . . . , Fnθ → true

Entonces en CRWL’ se podra construir la prueba:

(if (F1θ) then . . . (if (Fmθ) then eθ) . . .) → t

Esta ultima prueba se realizara mediante m aplicaciones de la regla 4 de CRWL’utilizando la regla de funcion de ’if then ’. Ademas esta prueba requerira unaprueba para eθ → t que nuevamente se tiene por h.i.

las reglas 5 y 6 corresponden a los casos b) y c) del enunciado y nuevamente tenemosel resultado por aplicacion inmediata de h.i. �

Notese que para evitar la molestia de expresiones del tipo (e == e′) == false puededefinirse una funcion desigualdad (/=) de la forma:

e/= e′ → (e == e′) == false

de modo que la expresion anterior puede escribirse equivalentemente de manera mas simplecomo e/= e′. Esta definicion, no obstante, puede hacerse a nivel de programa sin necesidadde introducir reglas expresas para (/=) a nivel del calculo y preferimos mantener este lomas simple posible con el fin de facilitar las demostraciones posteriores.

Nota: dada la simplicidad de la transformacion expuesta y la equivalencia semanticaque acabamos de mostrar, en lo sucesivo hablaremos de CRWL sobreentendiendo CRWL’.Las restricciones ./ y <> desaparecen en el resto del trabajo y todas las reglas pasan a serincondicionales.

Page 57: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2. La vision conjuntista: el marco SRL 57

3.2. La vision conjuntista: el marco SRL

En este apartado construiremos la logica SRL (Set Reduction Logic) como alternativa aCRWL. Ambas logicas tienen muchos puntos en comun, puesto que en definitiva formalizanla semantica de un mismo lenguaje logico-funcional y como veremos, son equivalentes. Lamotivacion para construir una nueva logica no se hara patente en este capıtulo, sino en elsiguiente, al introducir el fallo en PLF. La novedad fundamental introducida por SRL esque prueba aproximaciones conjuntistas (o conjuntos de aproximaciones si se quiere) enlas que se apoyara la deteccion de fallos. El siguiente ejemplo ilustra la idea global queperseguimos:

Ejemplo 3 Supongamos las constructoras z y s para los naturales, la funcion coin de laSeccion 3.1.2 y una funcion f definida como:

f(s(s(X))) → z

De acuerdo con la nocion de fallo que pretendemos (vease la introduccion al Capıtulo 1)es claro que la expresion f(coin) debe fallar: coin se puede reducir a z y a s(z), y f noesta definida para ninguno de estos dos valores. Ahora bien, ninguno de los valores z o s(z)aisladamente provoca el fallo de f(coin). Para deducir este fallo es necesario considerarsimultaneamente ambas reducciones, es decir, el conjunto {z, s(z)} y comprobar que f fallasobre todos los elementos de dicho conjunto.

Las ideas referentes al fallo del ejemplo anterior son materia del capıtulo siguiente.Por el momento lo que nos interesa de este ejemplo es lo que concierne a la obtencion deconjuntos de aproximaciones para las expresiones en vez de aproximaciones aisladas.

Centrandonos en esta idea de obtener conjuntos, cabe decir que el paradigma PLFcon las funciones indeterministas, induce ya de manera natural una semantica conjuntistapara las expresiones. Tal como se define en la Seccion 3.1.2, la denotacion de una expresionen CRLW es un conjunto de valores. En general, algunos de estos valores corresponden adistintos grados de aproximacion de un mismo valor y por tanto seran consistentes. Porejemplo, para la funcion add de la Seccion 3.1.2 se tiene [[add(z, s(z))]] = {⊥, s(⊥), s(z)}.En este caso la expresion add(z, s(z)) puede reducirse de modo determinista y los valores dela denotacion corresponden simplemente a las distintas aproximaciones al valor maximalo mas refinado s(z) (y son todos consistentes).

La situacion cambia ligeramente al involucrar funciones indeterministas, puesto que lasdistintas vıas de reduccion pueden dar lugar a diferentes valores no necesariamente consis-tentes. Por ejemplo, para la funcion indeterminista coin se tiene [[coin]] = {⊥, z, s(⊥), s(z)}.En este caso, no es cierto que todos los valores sean aproximaciones de un mismo valormaximal, porque de hecho hay dos valores maximales, z y s(z), que no son consistentes.De modo grafico la relacion de orden parcial v entre estos terminos puede expresarse delmodo habitual:

s(z)

z s(⊥)

Page 58: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

58 3. Semantica logica: la vision conjuntista

donde los arcos corresponden a la relacion t v t′, siendo t el nodo de partida y t′ el dellegada.

Esta sutil diferencia en la procedencia de los valores en una denotacion no es capturadapor CRWL y sera crucial para la construccion semantica que nos proponemos. En lasemantica conjuntista que nos ocupa, para una expresion no se obtienen valores aislados,sino conjuntos de valores que reflejan las distintas formas de reducir la expresion. La nuevadenotacion para una expresion sera un conjunto de conjuntos de valores, donde cada unode dichos valores corresponde a una vıa de reduccion. Ası para coin la nueva denotacionsera:

{{⊥}, {z,⊥}, {z, s(⊥)}, {⊥, s(⊥)}, {⊥, s(z)}, {z, s(z)}}

El primer conjunto {⊥} siempre estara presente en cualquier denotacion y puede interpre-tarse como un conjunto en el que todas las vıas de reduccion han quedado indefinidas1. Elresto de conjuntos contiene dos valores que corresponden respectivamente a las posiblesreducciones de coin con cada una de las dos reglas de coin. Ası por ejemplo, el conjunto{z, s(⊥)} proviene de reducir coin → ⊥ haciendo uso de la primera regla y coin → s(⊥)utilizando la segunda. Ahora en la presentacion grafica la informacion de los nodos es unconjunto de terminos en vez de terminos aislados:

{z, s(z)}

{z, s(⊥)} {⊥, s(z)}

{z,⊥} {⊥, s(⊥)}

{⊥}

Tambien aquı los arcos expresan una nocion de refinamiento para conjuntos que forma-lizaremos en la Seccion 3.2.1. Con respecto a la nocion de consistencia que daremos paraconjuntos de terminos (Definicion 2, pagina 65), demostraremos que todos los conjuntos dela denotacion de una expresion son consistentes, es decir, contienen informacion, refinadahasta cierto punto, acerca de todas las posibles vıas de reduccion de la expresion (Teorema5).

Notese ademas que si “aplanamos este conjunto de conjuntos”, es decir, si construimosel conjunto formado por cada uno de los elementos de los conjuntos internos obtenemos{⊥, z, s(⊥), s(z)} que es exactamente la denotacion de coin en CRWL. Es decir, la nuevadenotacion que buscamos proporciona todos los valores de la correspondiente denotacionen CRWL (Teorema 3) y ademas, en cierto sentido, proporciona informacion acerca de losdistintos caminos de reduccion que los han producido.

1Este conjunto {⊥} podrıa representarse con un valor conjuntista especial ⊥set que denote el conjuntode valores totalmente indefinido. Notese que no es equivalente a {⊥}, que es un conjunto unitario con elelemento ⊥. El calculo SRL que presentaremos necesita hacer uso de los valores de los conjuntos (⊥set noproporciona ninguno) y con la representacion elegida se simplifica la construccion.

Page 59: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2. La vision conjuntista: el marco SRL 59

Diremos que cada uno de los conjuntos de la nueva denotacion es un Conjunto Su-ficiente de Aproximaciones o SAS (Sufficient Approximation Set). Ası, {z, s(⊥)} es unSAS para coin. No se precisa una definicion mas formal de este concepto a este nivel;sera el calculo de pruebas SRL el que determine los SAS’s para una expresion. En cuantoal calificativo “suficiente”, en nuestro contexto de semantica no estricta, hace referencia algrado de evaluacion de los argumentos de una funcion para poder evaluarla, o lo que es lomismo, el grado de refinamiento necesario de los valores del SAS correspondiente. Nueva-mente, un ejemplo esclarecera la situacion: supongamos un predicado pos que determinasi un natural es positivo; vista como funcion se define como:

pos(s(X)) → true

y una funcion f definida como:

f → s(f)

Es claro que la expresion pos(f) debe poder reducirse al valor true y es facil ver que dehecho en CRWL puede probarse la aproximacion pos(f) → true. Esto significa que enel contexto de los SAS debemos ser capaces de obtener un SAS que contenga el valortrue. Ahora bien, para reducir pos(f) es necesario reducir f . Para esta expresion podemosobtener una coleccion infinita de SAS’s {⊥}, {s(⊥)}, {s(s(⊥))}, . . . . Ademas en este casono hay uno maximal, es decir, uno con todos los elementos completamente definidos. Sinembargo, es facil intuir que el segundo SAS {s(⊥)} es suficiente para reducir pos(f). EsteSAS muestra que todas las posibles aproximaciones de f suficientemente definidas quedancapturadas por el valor s(⊥), es decir, todas son de la forma s(. . .). Utilizando este valores sencillo probar que pos(s(⊥)) se reduce a true, tal como esperabamos.

En este caso, dirıamos que {s(⊥)} es un conjunto suficiente de aproximaciones de f paraprobar que pos(f) se reduce a true. Ası pues, la nocion de suficiencia queda determinadapor el contexto, en particular, por la expresion a reducir. No obstante, nosotros llamaremosSAS a cualquier conjunto de aproximaciones que pueda obtenerse con el calculo SRL.

Nota: la nocion de SAS fue introducida por primera vez en [111, 117]. Los calculosdenotacionales que se presentan en estos trabajos permiten probar sentencias de la formae/C siendo e una expresion y C un conjunto de terminos, de hecho un SAS para e. A pesarde que desde el punto de vista denotacional estos calculos fueron plenamente satisfactorios,a la hora de intentar relacionarlos con posibles calculos de estrechamiento mostraron serinadecuados. El problema, basicamente es que la semantica de call-time choice quedaimplıcita en los calculos de [111, 117] (igual que en el propio CRWL), mientras que a niveloperacional se refleja en el sharing o comparticion de valores, que ha de ser manipuladoexplıcitamente. Por ello, en [113] se llevo aun mas lejos la vision conjuntista hasta llegar arepresentar las propias expresiones en un formato tambien conjuntista que hace explıcitoel sharing. En el presente trabajo, con el fin de simplificar la presentacion, omitimos loscalculos de [111, 117] y optamos por abordar directamente la version conjuntista en todasu extension.

Para ilustrar el problema del sharing recurrimos de nuevo a las funciones coin, addy double de la Seccion 3.1.2. Como ya apuntabamos en su momento, para la expresion

Page 60: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

60 3. Semantica logica: la vision conjuntista

double(coin) hay dos posibles reducciones en CRWL (aparte de las reducciones parciales)que corresponden a las dos posibles reducciones del argumento coin. De modo esquematicodichas reducciones pueden presentarse como:

double(coin) → double(z) → add(z, z) → zdouble(coin) → double(s(z)) → add(s(z), s(z)) → s(add(z, s(z))) → s(s(z))

Trabajando con SAS’s primero reducirıamos coin obteniendo el conjunto de valores{z, s(z)}2 y despues habrıa que evaluar double sobre dicho conjunto. Podemos expresarlocomo double({z, s(z)}) de manera informal (en rigor, no hemos proporcionado ningunsignificado a la aplicacion de una funcion a un conjunto de valores). Utilizando la definicionde add podrıamos reducir double({z, s(z)}) → add({z, s(z)}, {z, s(z)}). El significado deesta ultima expresion es aun mas difuso: podrıamos pensarlo como la evaluacion de addsobre cada una de las combinaciones de valores, entre los que se encontrarıan las parejasadd(z, s(z)) y add(s(z), z), que a su vez se reducen a s(z) y que es un valor incorrecto deacuerdo con la semantica de call time choice.

La clave esta en que dada una funcion definida sobre un dominio de valores, el signifi-cado natural de su aplicacion a un conjunto de valores de dicho dominio es la union de lasaplicaciones a cada uno de los valores del conjunto. Ası, el significado de double({z, s(z)})podrıa expresarse como {double(X) | X ∈ {z, s(z)}}, o bien

⋃X∈{z,s(z)} double(X)3.

Ademas, esto pone de relieve el hecho de que no todas las apariciones de aplicaciones defuncion tienen el mismo significado en un programa: las aplicaciones en las cabezas de lasreglas definicionales se aplican a valores, mientras que en los lados derechos, en general, seaplican a expresiones, que a su vez (en nuestro contexto indeterminista) denotan conjuntosde valores. De acuerdo con esto, en la expresion double(coin) el argumento coin representaun conjunto de valores y por tanto la expresion a reducir es

⋃X∈coin double(X). Dicha

reduccion se harıa del modo siguiente:

⋃X∈coin double(X) →

⋃X∈{z,s(z)} double(X) → double(z) ∪ double(s(z)) → . . .→ {z, s(s(z))}

En lıneas generales, las ideas intuitivas que hemos expuesto son las que guıan la cons-truccion del marco SRL que formalizamos a continuacion.

3.2.1. Preliminares tecnicos

Expresiones conjuntistas: c-expresiones

Una c-expresion no es mas que una construccion sintactica inspirada en la notacionclasica de conjuntos que proporciona una “semantica intuitiva” muy clara. El objetivo deesta construccion es expresar recoleccion de valores, que pueden aparecer explıcitamenteo bien, ser eventualmente obtenidos por reduccion. En particular, las c-expresiones son

2Ya justificamos en la Seccion 3.1.2 que reducir double(coin) → add(coin, coin) es incorrecto de acuerdocon la semantica de call-time choice. Debemos pues reducir el argumento coin antes de aplicar la definicionde double.

3Notese que ambas expresiones no son rigurosamente equivalentes: la primera denota un conjunto deconjuntos, mientras que la segunda es un conjunto de valores. Al nivel informal de esta Seccion no tienemayor relevancia y la formalizacion posterior no deja hueco a la ambiguedad.

Page 61: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.1 Preliminares tecnicos 61

especialmente adecuadas para expresar el sharing de forma explıcita. Utilizamos delibe-radamente la notacion conjuntista porque el significado de estas c-expresiones guarda unestrecho parecido con el significado de las construcciones conjuntistas habituales. De he-cho, muchos de los resultados formales que veremos en las siguientes secciones no hacenmas que confirmar que “las cosas son lo que aparentan ser”.

Para definir formalmente las c-expresiones consideramos un conjunto distinguido devariables Γ ⊆ V que utilizaremos como variables indexadas. Usualmente las notaremoscomo α, β, . . ., de modo que puedan diferenciarse claramente de las variables estandarX,Y, . . .. Una c-expresion (total) S se define como:

S ::= {t} | f(t) | t == t′ |⋃α∈S1

S2 | S1 ∪ S2

donde t, t′ ∈ Term, t ∈ Term× n. . . ×Term, f ∈ FSn, α ∈ Γ y S1,S2 son c-expresiones.Escribiremos CExp para referirnos al conjunto de c-expresiones totales que acabamosde definir. El conjunto CExp⊥ de las c-expresiones parciales se define de la misma for-ma, excepto que los terminos implicados pueden contener ⊥, esto es, t, t′ ∈ Term⊥,t ∈ Term⊥× n. . . ×Term⊥. Nos referiremos con frecuencia a las c-expresiones de la forma⋃α∈S1

S2 como uniones indexadas, en contraposicion a las uniones planas que son las dela forma S1 ∪ S2.

Dada una c-expresion S escribiremos var(S) para representar el conjunto de variablesque contiene su estructura. Dentro de var(S) hay dos subconjuntos distinguidos:

el conjunto PV (S) ⊆ Γ de variables producidas que contiene todas las variables delas uniones indexadas de S. Puede definirse inductivamente sobre la estructura deS:

• PV ({t}) = PV (f(t)) = PV (t == t′) = ∅

• PV (⋃α∈S1

S2) = {α} ∪ PV (S1) ∪ PV (S2)

• PV (S1 ∪ S2) = PV (S1) ∪ PV (S2)

el conjunto FV (S) de variables libres que contiene las variables no producidas de S.Puede definirse como:

• FV ({t}) = var(t)

• FV (f(t)) = var(t)

• FV (⋃α∈S1

S2) = (FV (S2) − {α}) ∪ FV (S1)

• FV (S1 ∪ S2) = FV (S1) ∪ FV (S2)

Es claro que PV (S) ⊆ Γ, pero en general no es cierto que FV (S) ∩ Γ = ∅, es decir,las variables de Γ tambien pueden aparecer como variables libres de una c-expresion. Estoocurrira con frecuencia al considerar sub-c-expresiones de una c-expresion. Consideremospor ejemplo una funcion f ∈ FS2 y una constructora c ∈ CS2. Una c-expresion sobre estasignatura puede ser:

S =⋃α∈

⋃β∈f(X,Y ){β}

{c(α,X)} ∪⋃γ∈{X} f(γ, Y )

Page 62: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

62 3. Semantica logica: la vision conjuntista

De acuerdo con las definiciones anteriores PV (S) = {α, β, γ} y FV (S) = {X,Y }. Siconsideramos la sub-c-expresion S ′ = {c(α,X)} aisladamente, tendremos PV (S ′) = ∅ yFV (S ′) = {α,X}. Notese que α ∈ Γ aparece como variable libre en S ′.

Las variables producidas de una c-expresion juegan un papel similar a las variablescuantificadas en una formula de la logica de primer orden: el equivalente al cuantificadorde la variable en la formula logica es la union que indexa la variable en la c-expresion.Siguiendo con esta analogıa, en logica de primer orden es habitual renombrar variablescuantificadas de una formula para evitar que una misma variable aparezca cuantificadamas de una vez dentro del mismo ambito. Por ejemplo, la formula ∀X.(∀X.ϕ∧ψ)∧∀X.φ,en la que X se cuantifica dos veces en el ambito de ϕ ∧ ψ, puede reescribirse de maneraequivalente como ∀X.(∀Y.ϕ[X/Y ] ∧ ψ) ∧ ∀X.φ, en la que se evitan las cuantificacionesmultiples en el mismo ambito, y de paso, se facilita su lectura. En las c-expresiones lasituacion es similar: el ambito o alcance de la variable producida α en una c-expresion dela forma

⋃α∈S1

S2 se limita a la subexpresion S2. Con el fin de simplificar el analisis decasos en definiciones y resultados posteriores, en lo sucesivo asumimos siempre que lasvariables producidas de una c-expresion son indexadas una unica vez en el mismo ambito.Por ejemplo, no utilizaremos c-expresiones del estilo

⋃α∈

⋃α∈... S1

S2 ∪⋃α∈... S3, en la que

la variable α tiene dos indexaciones en el mismo ambito. Reescribiremos esta c-expresion demodo equivalente como

⋃α∈

⋃β∈... S

′1S2 ∪

⋃α∈... S3, donde S ′

1 es el resultado de renombrar

las apariciones de α por β en S1. Notese que en una union plana de la forma S1 ∪ S2 noexigimos PV (S1) ∩ PV (S2) = ∅ porque los ambitos de S1 y S2 son distintos.

En realidad, estas condiciones de unicidad en la indexacion de variables producidasson simplemente un detalle tecnico que no afecta a la esencia del desarrollo teorico queharemos. No habrıa ningun problema en reformular dicho desarrollo prescindiendo de talescondiciones, salvo que habrıa que ser bastante mas cuidadosos en algunas definiciones. Porotro lado, tales condiciones son sencillas de mantener, poniendo atencion en introducirvariables producidas frescas (hay un conjunto infinito de ellas) tanto en la generacioncomo en la manipulacion de c-expresiones.

Hay un tipo especial de c-expresiones que no contienen uniones planas en la estructurasintactica mas externa, que llamaremos c-expresiones simples. Formalmente se definencomo:

S ::= {t} | f(t) | t == t′ |⋃α∈S1

S2

donde t, t′ ∈ Term , t ∈ Term× n. . . ×Term, f ∈ FSn, α ∈ Γ y S1,S2 son c-expresionescualesquiera. Notese que sı que pueden contener uniones planas en la estructura sintacticainterna; por ejemplo, una c-expresion de la forma

⋃α∈S1∪S2

{t} es simple.

Terminamos este apartado definiendo la transformacion de una expresion CRWL cual-quiera en su c-expresion correspondiente:

Definicion 1 Dada una expresion e ∈ Exp⊥ la c-expresion correspondiente e se defineinductivamente sobre la estructura de e como:

Page 63: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.1 Preliminares tecnicos 63

⊥ = {⊥}

X = {X}, para toda X ∈ V

c(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

{c(α1, . . . , αn)}, para todo c ∈ CSn, donde α1, . . . ,αn son variables frescas de Γ

f(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

f(α1, . . . , αn), para todo f ∈ FSn, donde α1, . . . ,αn son variables frescas de Γ

Es sencillo ver que en una c-expresion S resultante de esta transformacion las variablesproducidas y las libres forman una particion de var(S), i.e., PV (S) ∪ FV (S) = var(S)y PV (S) ∩ FV (S) = ∅. Tambien es sencillo conseguir las condiciones de unicidad sobrevariables producidas. Veamos un ejemplo de aplicacion de esta conversion:

Ejemplo 4 Para la expresion double(add(s(z), coin)) obtendremos paso a paso:

double(add(s(z), coin)) =⋃α∈ add(s(z),coin)

double(α) =⋃α∈

⋃β1∈s(z)

⋃β2∈coin

add(β1 ,β2)double(α) =

⋃α∈

⋃β1∈

⋃γ∈z s(γ)

⋃β2∈coin add(β1,β2)

double(α)⋃α∈

⋃β1∈

⋃γ∈{z} s(γ)

⋃β2∈coin add(β1 ,β2)

double(α)

Es facil intuir que la c-expresion resultante puede simplificarse prescindiendo de algunasindexaciones triviales, en concreto, las asociadas a terminos construidos que pueden reem-plazarse directamente, i.e.,

⋃α∈{t} S es equivalente a S[α/t]. En este caso, reemplazando

γ y despues β1 obtenemos:⋃α∈

⋃β2∈coin add(s(z),β2) double(α)

Formalmente, esta equivalencia semantica sera inmediata a la luz del calculo de pruebasSRL de la Seccion 3.2. Hay otra equivalencia semantica menos directa pero esencial: laequivalencia entre la expresion de partida double(add(s(z), coin)) y la c-expresion obtenida⋃α∈

⋃β2∈coin add(s(z),β2) double(α) (cada una con respecto al calculo correspondiente), que se

probara en el Teorema 3.

Notese que en este ejemplo no se hace uso de la union plana ∪. Este tipo de unionesno son necesarias en la transformacion de expresiones en c-expresiones, pero seran utilesen la transformacion de programas que veremos en la Seccion 3.2.2.

Un aspecto interesante de SRL es que con el uso de variables producidas, las funcio-nes solo se aplican a terminos y no a expresiones generales como en CRWL. Ası, en elejemplo anterior las invocaciones a add y double implicadas en la c-expresion resultanteson add(β1, β2) (o add(s(z), β2) tras la simplificacion) y double(α), a pesar de que en laexpresion original aparecen aplicadas a expresiones funcionales. La funcion (==) no es unaexcepcion en este sentido y siempre se invocara de la forma t == s siendo t, s ∈ Term⊥.

Page 64: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

64 3. Semantica logica: la vision conjuntista

A la vista de la transformacion de expresiones en c-expresiones podrıamos plantear-nos una transformacion inversa, i.e., dada una c-expresion obtener una expresion estandarcon la misma semantica (aunque por el momento dicha semantica este solo sugerida demodo intuitivo). Tal transformacion no es viable, al menos de forma directa. Hay un pri-mer problema inherente a la naturaleza conjuntista de las c-expresiones; por ejemplo, lac-expresion {z} ∪ {s(z)} serıa en todo caso equivalente a un “conjunto de expresiones”.Aun asumiendo una supuesta equivalencia semantica entre c-expresiones y conjuntos deexpresiones, hay otro problema mas incomodo debido al sharing. Por ejemplo, considere-mos las listas definidas con la notacion Prolog habitual mediante las constructoras [ ] y[ | ] y la c-expresion

⋃α∈coin[α, α]. Esta c-expresion tampoco tiene una conversion directa

a expresion. La expresion natural serıa [coin, coin], pero esta segunda puede reducirse alvalor [z, s(z)], que no aparecera en ningun SAS de la primera. Para salvar estos proble-mas habrıa que introducir funciones y/o construcciones auxiliares en CRWL (por ejemplo,una construccion let al estilo de los lenguajes funcionales puede servir para expresar elsharing).

No ahondamos mas en el problema puesto que tal conversion inversa no sera nece-saria para el desarrollo del trabajo. Simplemente recalcamos la riqueza expresiva de lasc-expresiones frente a las expresiones convencionales en el contexto indeterminista de PLF.

Orden de aproximacion y consistencia de conjuntos de terminos

Extendiendo el orden de aproximacion v de la Seccion 3.1.1 para conjuntos de terminos(no es necesario para conjuntos de expresiones en general) se obtiene el preorden de Egli-Milner (vease por ejemplo [138]): dados C,C ′ ⊆ Term⊥ diremos que C ′ es mas refinadoque C, y lo notaremos como C v C ′, si para todo t ∈ C existe t′ ∈ C ′ tal que t v t′ y paratodo t′ ∈ C ′ existe t ∈ C tal que t v t′. Por ejemplo, considerando los naturales construidoscon z y s, se tiene {⊥, s(⊥)} v {z, s(z), s(s(z))}. Utilizaremos el mismo sımbolo v parareferirnos a expresiones o a conjuntos de terminos, ya que cada uso particular quedara claropor el contexto.

Es inmediato ver que esta relacion es efectivamente un preorden: es reflexiva y tran-sitiva. Pero no es un orden porque no es antisimetrica: por ejemplo, consideremos lasconstructoras a, b ∈ CS0 y c ∈ CS2 y los conjuntos C = {c(⊥,⊥), c(a,⊥), c(a, b)} yC ′ = {c(⊥,⊥), c(a, b)}; es facil comprobar que C v C ′ y C ′ v C, y sin embargo C 6= C ′.

El siguiente hecho nos sera de utilidad mas adelante:

Proposicion 2 Dados los conjuntos de terminos C1, . . . , Cn, y C ′1, . . . , C

′m se tiene:

∀i ∈ {1, . . . , n}∃j ∈ {1, . . . ,m}.Ci v Cj∀j ∈ {1, . . . ,m}∃i ∈ {1, . . . , n}.Ci v Cj

}⇒ C1 ∪ . . . ∪Cn v C ′

1 ∪ . . . ∪ C′m

La implicacion inversa es falsa.

Demostracion: Si t ∈ C1 ∪ . . . ∪ Cn entonces t ∈ Ci para algun i ∈ {1, . . . , n}. Paraeste Ci existe j ∈ {1, . . . ,m} tal que Ci v C ′

j. Entonces existira t′ ∈ C ′j tal que t v t′ y

naturalmente t′ ∈ C ′1 ∪ . . . ∪ C

′m.

Page 65: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.1 Preliminares tecnicos 65

Por otro lado, si tomamos t′ ∈ C ′1 ∪ . . . ∪C

′m de manera analoga se concluye que debe

existir t ∈ C1 ∪ . . . ∪ Cn tal que t v t′.Para ver que la implicacion inversa es falsa basta con observar por ejemplo

{z, s(z)}︸ ︷︷ ︸C1

v {z}︸︷︷︸C′

1

∪{s(z)}︸ ︷︷ ︸C′

2

pero {z, s(z)} 6v {z} y {z, s(z)} 6v {s(z)}. �

Para nuestros propositos necesitamos extender la nocion de consistencia a conjuntosde terminos:

Definicion 2 Dos conjuntos C,C ′ ⊆ Term⊥ son consistentes si existe C ′′ ⊆ Term⊥ talque C v C ′′ y C ′ v C ′′.

De acuerdo con esta definicion, {⊥, s(z)} y {z, s(⊥)} son consistentes; un refinamiento deambos es {z, s(z)}.

La siguiente propiedad muestra una caracterizacion alternativa de consistencia paraconjuntos de terminos:

Proposicion 3 Dados C,C ′ ⊆ Term⊥ se tiene:

C y C ′ son consistentes ⇔

{(1) ∀t ∈ C. ∃t′ ∈ C ′ tal que t y t′ son consistentes, y(2) ∀t′ ∈ C ′. ∃t ∈ C tal que t y t′ son consistentes

Demostracion: El hecho de que C y C ′ sean consistentes, segun la Definicion 2 queacabamos de ver, significa que existe C ′′ tal que C v C ′′ y C ′ v C ′′. A su vez, C v C ′′ esequivalente a decir:

(a) ∀t ∈ C.∃t′′ ∈ C ′′ tal que t v t′′, y

(b) ∀t′′ ∈ C ′′.∃t ∈ C tal que t v t′′

y analogamente C ′ v C ′′ equivale a:

(c) ∀t′ ∈ C ′.∃t′′ ∈ C ′′ tal que t′ v t′′, y

(d) ∀t′′ ∈ C ′′.∃t′ ∈ C ′ tal que t′ v t′′

En definitiva se trata de probar:

∃C ′′ tal que (a), (b), (c) (d) ⇔ (1), (2)

Veamos por separado cada una de estas implicaciones:

(⇒) Para la parte (1): por (a) para todo t ∈ C existe t′′ ∈ C ′′ tal que t v t′′, y por (d)para este t′′ concreto existira t′ ∈ C ′ tal que t′ v t′′, i.e., para todo t ∈ C existe un t′ ∈ C ′

tal que t y t′ son consistentes, con lo que tenemos la parte (1).Para (2) con un razonamiento analogo, utilizando (c) y despues (b) se concluye que

para todo t′ ∈ C ′ existe t ∈ C tal que t y t′ son consistentes.

Page 66: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

66 3. Semantica logica: la vision conjuntista

(⇐) En este apartado haremos una construccion del un conjunto C ′′ que cumpla (a), (b),(c) y (d). La relacion consistencia para terminos es una relacion de equivalencia (reflexiva,simetrica y transitiva), luego podemos considerar el conjunto cociente de C ∪ C ′ definidopor dicha relacion de consistencia. Cada una de las clases de equivalencia E de este cocientesera un conjunto de terminos consistentes y es inmediato ver que todos ellos pueden serrefinados por un nuevo termino s. Definimos C ′′ como el conjunto formado por estosterminos s. Veamos que efectivamente C ′′ verifica (a), (b), (c) y (d):

(a) y (c) son inmediatos: si tomamos t ∈ C es claro que el termino t′′ ∈ C ′′ que refinaa todos los de la clase donde esta t verifica t v t′′, con lo que tenemos la parte (a);la parte (c) es similar tomando t′ ∈ C ′;

para las partes (b) y (d) observemos que cada una de las clases de equivalencia E delcociente ha de contener algun elemento de C y tambien alguno de C ′, en virtud de(1) y (2): si t ∈ C esta en la clase E, por (1) debe existir t′ ∈ C ′ consistente con t,luego t′ tambien estara en E; analogamente si t′ ∈ C ′ esta en E, por (2) debe existirt ∈ C que tambien este en E.

Entonces, si tomamos t′′ ∈ C ′′, como t′′ refina alguna clase E del conjunto cocienteC ∪ C ′, debe refinar algun elemento de C y tambien a algun elemento de C ′. Endefinitiva, si t′′ ∈ C ′′ existe t ∈ C tal que t v t′ y existe t′ ∈ C ′ tal que t v t′′.Ası tenemos (b) y (d). �

De acuerdo con las definiciones tambien es claro que si C v C ′ entonces C y C ′ sonconsistentes.

Orden de aproximacion para c-expresiones

El orden de aproximacion v para expresiones definido en la Seccion 3.1.1 puede exten-derse a c-expresiones obteniendo un preorden del siguiente modo:

Definicion 3 (Orden de aproximacion para c-expresiones) La relacion vCExp⊥es

la mınima relacion reflexiva y transitiva que satisface:

1. {⊥} vCExp⊥S, para cualquier S ∈ CExp⊥

2. {t} vCExp⊥{t′}, si t v t′

3. f(t) vCExp⊥f(t

′), si f(t) v f(t

′)

4.⋃α∈S1

S2 vCExp⊥

⋃α∈S′

1S ′

2, si S1 vCExp⊥S ′

1 y S2 vCExp⊥S ′

2

5. S1 ∪ . . . ∪ Sn vCExp⊥S ′

1 ∪ . . . ∪ S ′m con n,m ≥ 1, si para todo i ∈ {1, . . . , n} existe

algun j ∈ {1, . . . ,m} tal que Si v S ′j y viceversa, para todo j ∈ {1, . . . ,m} existe

algun i ∈ {1, . . . , n} tal que Si v S ′j

Page 67: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.2 SRL-Programas: obtencion a partir de CRWL-Programas 67

Esta definicion es esperable y sencilla en todos los casos, salvo quiza el ultimo, cuandose comparan uniones planas. El objetivo de esta relacion, por analogıa con los ordenesprecedentes, es comparar el grado de refinamiento de las c-expresiones. Las uniones planaspermiten concebir c-expresiones distintas desde el punto de vista estructural (con distintonumero y/o asociacion de uniones planas) y, no obstante, comparables desde el punto devista de la informacion que contienen. Ası por ejemplo, aplicando el ultimo caso tenemos:{s(⊥)}∪{s(s(⊥))} vCExp⊥

{s(s(z))}, que es claro desde el punto de vista intuitivo a pesarde la disparidad de estructuras.

En lo sucesivo el subındice de vCExp⊥se omitira y escribiremos simplemente v; que-

dara claro por el contexto el orden al que nos referimos. Teniendo este orden es directodefinir consistencia para c-expresiones, pero esta nocion no juega ningun papel relevanteen lo que sigue.

Sustituciones para c-expresiones

Las sustituciones para c-expresiones son aplicaciones de V en el conjunto de terminosconstruidos. Al igual que en la Seccion 3.1.1, consideraremos sustituciones totales y par-ciales, dependiendo de si los terminos del rango pueden contener ⊥ o no. Tambien en estepunto introducimos un detalle tecnico para simplificar el desarrollo del trabajo: al aplicaruna sustitucion de la forma θ = [. . . , Xi/ti, . . . , αj/sj, . . .] a una c-expresion S, asumimosque cumple dos condiciones de aplicabilidad:

no afecta a las variables producidas de S: {. . . , αj , . . .}∩PV (S) = ∅, o bien Dom(θ)∩PV (S) = ∅;

no captura variables producidas de S: (. . .∪var(ti)∪ . . .∪var(sj)∪ . . .)∩PV (S) = ∅,o bien Ran(θ) ∩ PV (S) = ∅.

Al igual que en el caso de las condiciones de unicidad impuestas a las c-expresiones,tambien con las sustituciones es muy sencillo garantizar estas dos condiciones, renom-brando adecuadamente las variables producidas de la c-expresion afectada. A lo largodel trabajo, las sustituciones explıcitas que manejaremos cumpliran estas condiciones porconstruccion y para las implıcitas asumiremos dichas condiciones (en realidad asumimosel renombramiento oportuno de las c-expresiones implicadas).

Utilizaremos tambien c-sustituciones para c-expresiones: dado un conjunto de terminosD = {s1, . . . , sn} ⊆ Term (o Term⊥ para las sustituciones parciales) escribimos S[Y/D]como abreviatura para la distribucion S[Y/s1]∪ . . .∪S[Y/sn]. Extendiendo esta notacionescribiremos S[X1/D1, . . . , Xn/Dn], siendo D1, . . . , Dn ⊆ Term (D1, . . . , Dn ⊆ Term⊥ pa-ra las sustituciones parciales) como abreviatura de (. . . (S[X1/D1]) . . .)[Xn/Dn]. Natural-mente, asumimos tambien las condiciones de aplicabilidad para todas estas sustituciones.

3.2.2. SRL-Programas: obtencion a partir de CRWL-Programas

Tal como hemos visto al principio de la Seccion 3.2, la obtencion de un SAS para unaexpresion requiere considerar todas las posibles vıas de reduccion de la misma. Partiendode un CRWL-programa, la obtencion de un SAS para una llamada a funcion (en general

Page 68: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

68 3. Semantica logica: la vision conjuntista

indeterminista) requiere considerar las distintas aportaciones producidas por las reglas dela misma, o mas exactamente, las aportaciones de las reglas aplicables, i.e., aquellas cuyascabezas casan (por ajuste de patrones) con la llamada. Esta recopilacion de reducciones sehizo “por fuerza bruta” en [111, 117], pero en [113, 114] se considero la posibilidad de uti-lizar otro tipo de programas con reglas adaptadas al marco conjuntista o SRL-programas.Por ejemplo, consideremos las constantes a, b y c, y el siguiente CRWL-programa:

f(a,X) → af(a, b) → bf(b, a) → c

para obtener un SAS para la expresion f(a, b) habrıa que considerar las dos primerasreglas (que son las aplicables) y uniendo sus resultados obtendrıamos {a, b}. Sin embargo,utilizando c-expresiones en los cuerpos podrıamos escribir este programa como:

f(a,X) � {a} ∪ f1(a,X)f(b, a) � {c}

f1(a, b) � {b}

Ahora, para reducir la misma expresion f(a, b) solo es aplicable la primera regla de f queproporciona el conjunto de valores buscado.

Para que esta idea funcione en general, ademas de utilizar c-expresiones en los cuerpos,se necesita que las reglas de los programas sean incompatibles entre sı (no unificables).Ası pues, definimos los SRL-programas como:

Definicion 4 Un SRL-programa es un conjunto finito de reglas de la forma:

f(t)� S

donde t es una tupla lineal de terminos, S es una c-expresion y ademas para todo par dereglas definitorias de una funcion, f(t1)� S1 y f(t2)� S2, se debe cumplir una condicionde no solapamiento: las cabezas f(t1) y f(t2) no son unificables, esto es, t1 y t2 presentanun CS-conflicto.

A pesar de que la nocion de SRL-programa no es excesivamente complicada, escribirdirectamente este tipo de reglas serıa una tarea tediosa debido a la condicion de no sola-pamiento de las cabezas y a la propia complejidad sintactica de las c-expresiones de loscuerpos. Sin embargo, cualquier CRWL-programa puede convertirse en un SRL-programaequivalente de forma automatica. En el resto de la seccion desarrollamos un algoritmo detransformacion (que es una adaptacion del presentado en [113]) y, una vez presentada lalogica SRL, se probara la equivalencia semantica de ambas versiones con relacion a loscalculos correspondientes en la Seccion 3.2.4.

El algoritmo de transformacion procede en dos pasos: primero se transforma el CRWL-programa en otro CRWL-programa en el que para todo par de reglas de una funcion se tieneque las cabezas f(t1) y f(t2) son unificables si y solo si son la misma salvo renombramientode variables. De hecho, lo que obtenemos en esta primera etapa es un CRWL-programa in-ductivamente secuencial con solapamiento OIS-CRWL-programa (Overlaping InductivelySequential, [16]). En una segunda etapa, a partir del OIS-CRWL-programa sera sencilloobtener el SRL-programa definitivo.

Page 69: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.2 SRL-Programas: obtencion a partir de CRWL-Programas 69

Algoritmo de transformacion de CRWL-programas en OIS-CRWL-programas

Originalmente, la definicion de programa inductivamente secuencial se apoya en lanocion de arbol definicional [16]. Estos arboles han resultado muy utiles para el desarrollode mecanismos operacionales y estrategias de reduccion eficientes (como en [102]) en PLF.El algoritmo de transformacion que presentamos aquı esta inspirado en la construccionde dichos arboles, en concreto en el que se presenta en [109], aunque no se hace mencionexpresa de ellos.

Lo que buscamos con esta transformacion es que para cualquier tupla cerrada (sinvariables) de terminos t ∈ Term×. . .×Term las reglas de programa aplicables para reducirla llamada f(t) tengan exactamente la misma cabeza salvo renombramiento de variables.El algoritmo esta guiado por la estructura de las cabezas de las reglas, en concreto porla demanda de constructoras. Necesitamos algunas nociones acerca de demanda en lascabezas de las funciones:

dada una expresion e definimos VP(e) como el conjunto de posiciones de e ocupadaspor variables;

una posicion u es demandada por una regla f(t) → e si la cabeza f(t) contiene unsımbolo de constructora de CS en la posicion u;

dado un conjunto de reglas Q diremos que u es demandada por Q si es demandadapor alguna de las reglas de Q, y diremos que u es uniformemente demandada por Qsi es demandada por todas las reglas de Q.

Definimos en primer lugar el algoritmo de transformacion para conjuntos de reglas queluego utilizaremos para transformar el programa completo:

Definicion 5 (Algoritmo de transformacion para conjuntos de reglas) Sea Q ={(f(t1) → e1), . . . , (f(tn) → en)} un conjunto de reglas (Q ⊆ Pf) y sea f(s) un patroncompatible con Q, i.e., s es una tupla lineal de terminos tal que f(s) � f(ti), para todoi ∈ {1, . . . , n}. La transformacion de Q para el patron de llamada f(s)), que notamos por∆(Q, f(s)), se define como sigue:

1. Alguna posicion u en VP(f(s)) es uniformemente demandada por Q (si hayvarias, elegir cualquiera).Sea X la variable de la posicion u en f(s) y C = {c1, . . . , ck} el conjunto de sımbolosde constructora en la posicion u en las cabezas de las reglas de Q. Definimos losnuevos patrones de las reglas como: sci = s[X/ci(Y )], donde Y es una m-tupla devariables frescas (siendo ci ∈ CSm).

Para cada i ∈ {1, . . . , k} definimos el conjunto Qci como el conjunto de reglas de Qque demandan la constructora ci en la posicion u.

Devolver ∆(Qc1 , f(sc1)) ∪ . . . ∪ ∆(Qck , f(sck))

2. Alguna posicion en VP(f(s)) es demandada por Q, pero ninguna es uni-formemente demandada.

Page 70: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

70 3. Semantica logica: la vision conjuntista

Sean u1, . . . , uk el conjunto de posiciones demandadas (ordenadas por cualquier cri-terio). Consideramos la siguiente particion (renombrando el sımbolo de funcion enlas cabezas) de Q:• Sea Q1 el subconjunto de reglas de Q que demandan la posicion u1, donde el sımbo-lo de funcion f de las cabezas se reemplaza por f1, y sea Q1 = Q−Q1.• Sea Q2 el subconjunto de reglas de Q1 que demandan la posicion u2, donde elsımbolo de funcion f de las cabezas se reemplaza por f2 y sea Q2 = Q1 −Q2.. . .• Sea Qk el subconjunto de reglas de Qk−1 que demandan la posicion uk, donde elsımbolo de funcion f de las cabezas se reemplaza por fk.• Finalmente sea Q0 el subconjunto de reglas de Q que no demandan ninguna posi-cion.

Devolver:

Q0 ∪ {f(s) → f1(s), . . . , f(s) → fk(s)} ∪ ∆(Q1, f1(s)) ∪ . . . ∪ ∆(Qk, fk(s))

3. Ninguna posicion de VP(f(s)) es demandada por Q, entonces devolver Q

Dada f ∈ FSn y su conjunto de reglas Pf , definimos ∆(Pf ) = ∆(Pf , f(X)) siendo Xuna n-tupla de variables frescas.

Ejemplo 5 Consideremos las constantes a, b y c y una funcion f del principio de laseccion, definida como:

f(a,X) → af(a, b) → bf(b, a) → c

Para obtener un conjunto de reglas inductivamente secuencial con solapamiento paraf , se hara la llamada ∆(Pf , f(Y,Z)) y el algoritmo procedera segun muestra el Cuadro3.3. El conjunto de reglas obtenido es el siguiente:

f(a,X) → af(a, Z) → f1(a, Z)f(b, a) → c

f1(a, b) → b

Es inmediato comprobar que este es un OIS-CRWL-programa: solo son unificables lascabezas de las dos primeras reglas de f , que de hecho son la misma salvo renombramientode variables.

Este algoritmo, aunque adaptado ya para incorporar fallo, aparecio en [113]. Un al-goritmo similar al nuestro puede encontrarse en [18]. La version descrita en [18], para elejemplo que acabamos de ver proporciona un conjunto distinto de reglas transformadas:

f(X,Y ) → f1(X,Y ) | f2(X,Y )f1(a, Y ) → af2(a, b) → b

f2(b, a) → c

Page 71: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.2 SRL-Programas: obtencion a partir de CRWL-Programas 71

∆({f(a,X) → a, f(a, b) → b, f(b, a) → c}, f(Y,Z))︸ ︷︷ ︸por aplicacion de (1)

=

∆({f(a,X) → a, f(a, b) → b}, f(a, Z))︸ ︷︷ ︸por aplicacion de (2)

∪ ∆({f(b, a) → c}, f(b, Z))︸ ︷︷ ︸por aplicacion de (1)

=

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

∆({f1(a, b) → b}, f1(a, Z))︸ ︷︷ ︸por aplicacion de (1)

∪∆({f(b, a) → c}, f(b, a))︸ ︷︷ ︸

por aplicacion de (3)

=

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

∆({f1(a, b) → b}, f1(a, b))︸ ︷︷ ︸por aplicacion de (3)

∪ {f(b, a) → c} =

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

{f1(a, b) → b}∪ {f(b, a) → c} =

{f(a,X) → a, f(a, Z) → f1(a, Z), f(b, a) → c, f1(a, b) → b}

Cuadro 3.3: Ejemplo de transformacion paso a paso

donde el sımbolo ’|’ representa la eleccion entre dos alternativas (en cierto modo similar anuestras uniones planas). Este conjunto de reglas es peor que el que proporciona nuestratransformacion a la hora de evaluar la funcion f : para evaluar una llamada a la funcion fempieza con una busqueda con dos alternativas f1 y f2, incluso aunque no sea necesaria.Por ejemplo, para evaluar f(b, a), intenta ambas alternativas, cuando esta reduccion co-rresponde de hecho a un computo determinista en el programa original y tambien con elprograma resultante de nuestra transformacion. La situacion es aun mas crıtica si en vezde b, consideramos una expresion e que tras una costosa reduccion produzca el valor b.

Una propiedad interesante de nuestra transformacion es que si el conjunto de reglas yaes inductivamente secuencial con solapamiento, entonces el conjunto resultante es el mismode entrada. En este caso el algoritmo va refinando el patron (con diferentes constructoras)por la primera alternativa hasta obtener las cabezas de las reglas originales, y entoncesla ultima alternativa (3) devuelve el conjunto de reglas intacto. En este caso nunca seaplicara la alternativa (2).

Sin embargo, es posible que las reglas del programa de partida tengan cabezas no uni-ficables y el algoritmo modifique el programa. Por ejemplo, consideremos las constructorasa y b, y el siguiente programa:

Page 72: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

72 3. Semantica logica: la vision conjuntista

f(a, b,X) → af(b,X, a) → af(X, a, b) → a

Es inmediato ver que las cabezas no unifican y de hecho, reemplazando las expresiones delos cuerpos por la c-expresion {a}, el programa resultante serıa un SRL-programa validosegun la Definicion 4 (pagina 68). Pero el programa no es inductivamente secuencial ynuestro algoritmo de transformacion producira el conjunto de reglas:

f(X,Y,Z) → f1(X,Y,Z)f(X,Y,Z) → f2(X,Y,Z)f1(a, b,X) → af1(b,X, a) → af2(X, a, b) → a

Desde el punto de vista formal hay que tener en cuenta que el algoritmo modifica lasignatura del programa original, en particular FS, ya que introduce sımbolos de funcionauxiliares. Esto implica que con respecto al programa transformado pueden construirseexpresiones que no tienen sentido en el programa original. Por ejemplo, en la transforma-cion anterior se han introducido las funciones auxiliares f1 y f2, y la expresion f2(X,Y )tiene perfecto sentido con respecto al conjunto transformado. Sin embargo, tal expresionesta mal construida con respecto a la signatura del programa original. Como es logico lasexpresiones que nos interesan son las construidas sobre la signatura original. Por ello en lossiguientes resultados de equivalencia hay que precisar la signatura a la que nos referimos.

Lema 1 (Correccion de ∆) Sea P un programa, Pf ⊆ P el conjunto de reglas defini-torias de f ∈ FSn y X una n-tupla de variables frescas. Se tiene:

a) la llamada inicial ∆(Pf ) termina tras un numero finito de llamadas recursivas a ∆.Dichas llamadas ∆(Q, fk(s)) estan bien definidas en el sentido siguiente:

• Q es un conjunto de reglas definicionales para fk;

• fk(s) es un patron compatible con Q.

b) las cabezas de las reglas del conjunto ∆(Pf ) son unificables si y solo si son igualessalvo renombramiento de variables. Por otra parte, si consideramos P ′ = (P−Pf )∪∆(Pf ), entonces P y P ′ son semanticamente equivalentes en el siguiente sentido:dada una expresion e ∈ Exp⊥ construida sobre la signatura del programa original P,se tiene:

P `CRWL e→ t⇔ P ′ `CRWL e→ t

Demostracion:

a) Para analizar la terminacion del algoritmo, observemos que en el patron inicial f(s),s es una tupla de variables que se van instanciando con las constructoras de lasreglas de Q a medida que prospera el algoritmo. Formalmente, podemos definir lacomplejidad de una llamada generica ∆(f(s),Q) como el numero de posiciones quequedan por analizar:

Page 73: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.2 SRL-Programas: obtencion a partir de CRWL-Programas 73

compl(∆(Q, f(s))) = |{u : u es demandada por alguna regla de Q yno esta definida en f(s) o bien u ∈ V P (f(s))}|

Inicialmente este cardinal es exactamente el numero de posiciones demandadas porlas reglas de Q (nosete que si una posicion u, no esta definida en f(s) no puedecorresponder a una constructora). La alternativa 1) del algoritmo genera llamadasrecursivas de la forma ∆(Qci , f(sci)), de complejidad menor que la original porquelos patrones f(sci) contienen una constructora mas, ci, en una posicion demandadapor las reglas de Qci , y el conjunto total de posiciones demandadas por las reglas deQci no aumenta con relacion al correspondiente en Q. Por otro lado, en la alternativa2) la complejidad de las llamadas recursivas puede no disminuir, pero estas llamadasse resuelven necesariamente por la alternativa 1) que sı que disminuye la complejidadcomo acabamos de ver. Por ultimo, la alternativa 3) corresponde al caso base queno hace ninguna llamada recursiva.

Es sencillo ver que las llamadas recursivas en las alternativas 1) y 2) estan biendefinidas y 3) no hace ninguna llamada.

b) En primer lugar, veamos que las cabezas de las reglas de ∆(Pf ) son iguales salvorenombramiento de variables. Notese que los argumentos de las cabezas de las re-glas producidas por el algoritmo son siempre una instancia del patron con el quese invoca al algoritmo. Por otro lado, las llamadas recursivas de la alternativa 1)utilizan patrones no unificables (por construccion), ası que las reglas resultantes deuna llamada no pueden unificar con las resultantes de otro conjunto. La alternativa2) produce inicialmente un conjunto de reglas con la misma cabeza f(s), pero a con-tinuacion invoca recursivamente al algoritmo cambiando el nombre de la funcion enlos patrones y las cabezas de las reglas utilizadas en cada llamada; entonces nueva-mente las reglas resultantes de una llamada no pueden unificar con las reglas de otrallamada. Finalmente, la alternativa 1) genera un conjunto de reglas cuyas cabezasson iguales al patron (salvo renombramiento de variables).

Para demostrar la equivalencia semantica entre el conjunto de reglas de entrada y elconjunto de reglas de salida probaremos en primer lugar que la siguiente condicionpermanece invariante en los sucesivos pasos del algoritmo: si una llamada ∆(Q, f(s))genera directamente (sin invocaciones recursivas) un conjunto de reglas R0 y las lla-madas recursivas ∆(R1, f1(s1)), . . . ,∆(Rk, fk(sk)), entonces los conjuntos de reglasQ y R0,R1, . . . ,Rk preservan la semantica en el sentido del enunciado. Razonamosahora sobre cada una de las alternativas:

• para la alternativa 1) el resultado es directo puesto que R0 = ∅ y los conjuntosR1, . . . ,Rk conforman una particion del de entrada Q;

• la alternativa 2) deja intacto el conjunto de reglas Q y para cada i, introduce unconjunto de reglas de paso f(s) → fi(s) y las llamadas recursivas ∆(Qi, fi(s)).En este caso, el resultado es consecuencia de un sencillo lema que podrıa enun-ciarse del siguiente modo: dada una regla R = (f(t) → e) ∈ P, si consideramosel programa P ′ = (P − R) ∪ {f(t) → f ′(t), f ′(t) → e}, entonces P y P ′ tienen

Page 74: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

74 3. Semantica logica: la vision conjuntista

la misma semantica en el sentido del enunciado. La demostracion de este lemaes inmediata teniendo en cuenta que una prueba para f(e) → t (con t 6= ⊥) conrespecto a P, que en CRWL se hace por aplicacion de la regla 4, al hacerla conrespecto a P ′ requerira dos aplicaciones sucesivas de la regla 4 de CRWL;

• la alternativa 3) es inmediata puesto que deja intacto el conjunto de reglas deentrada.

Teniendo en cuenta el invariante que acabamos de probar y que el algoritmo termina(apartado a) del enunciado), es claro que un programa y su transformado tienen lamisma semantica. �

Es inmediato generalizar la transformacion de conjuntos de reglas de la Definicion 5 yel Lema de equivalencia anterior para transformar programas completos.

Definicion 6 (Transformacion de CRWL-programas a OIS-CRWL-programas)

Dado un programa P definimos el programa transformado ∆(P) como la union de losconjuntos transformados para cada una de las funciones definidas en P, es decir:

∆(P) =⋃f∈FS ∆(Pf )

Teorema 2 (Correccion del algoritmo de transformacion) Dado un programa P,se tiene:

la transformacion ∆(P) esta bien definida y el resultado es un OIS-programa;

los programas P y ∆(P) son semanticamente equivalentes en el sentido siguiente: sie es una expresion construida sobre la signatura de P, entonces:

P `CRWL e→ t⇔ ∆(P) `CRWL e→ t

Demostracion: Es una consecuencia inmediata del Lema 1. �

Obtencion de SRL-programas a partir de OIS-CRWL-programas

Una vez conseguido un OIS-programa en CRWL, la obtencion del SRL-programa co-rrespondiente es sencilla. Se trata simplemente de reunir todas las reglas con la mismacabeza (salvo renombramiento de variables) en una sola, con lo que conseguimos la con-dicion de no solapamiento de los SRL-programas. La c-expresion del cuerpo de la regla seobtendra uniendo (union plana de c-expresiones) los cuerpos de dichas reglas. Mas exac-tamente se unen las c-expresiones que se obtienen de las expresiones de los cuerpos segunla transformacion vista en la Seccion 3.2.1.

Page 75: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.3 El calculo de pruebas SRL 75

Definicion 7 (Transformacion de OIS-CRWL-programas en SRL-programas)Dado un OIS-CRWL-programa P, definimos el SRL-programa P correspondiente del si-guiente modo:

P = {f(t)� e1 ∪ . . . ∪ en | {f(t1) → e1, . . . , f(tn) → en} ⊆ P

{f(t1), . . . , f(tn)} son variantes de f(t)}

Es inmediato ver que dado un CRWL-programa general, encadenando la transforma-cion a OIS-programa de la Definicion 6 con la transformacion anterior, tendremos unSRL-programa. Y naturalmente, una vez presentado el calculo de pruebas SRL en la si-guiente Seccion, probaremos que ambos programas son semanticamente equivalentes conrespecto a los calculos correspondientes.

3.2.3. El calculo de pruebas SRL

En esta seccion presentamos el calculo de pruebas SRL (Set Reduction Logic) quedefine formalmente la semantica de las c-expresiones, o lo que es lo mismo, determina losSAS que pueden obtenerse para una c-expresion dada, con respecto a un SRL-programaP. Al igual que en CRWL, tambien aquı el calculo de pruebas utilizara el conjunto deinstancias del SRL-programa:

[P ]⊥ = {(f(t)� S)θ | (f(t)� S) ∈ P , θ ∈ Sust⊥}

El Cuadro 3.4 muestra las reglas de derivacion de SRL. Las reglas 1, 2 y 3 son lacontrapartida evidente de las respectivas en CRWL. La regla 4, de modo analogo a lamisma en CRWL, utiliza una instancia de una regla del SRL-programa, con la particulari-dad de que ahora el cuerpo de dicha regla es una c-expresion. Ademas hay una diferenciaesencial con respecto a CRWL: en CRWL se pueden tomar instancias de distintas reglasde programa en la regla 4; SRL no lo impide explıcitamente, pero debido a la condicionde no-solapamiento de los SRL-programas no puede haber mas de una regla de la que sepueda obtener una instancia aplicable. Al igual que ocurrıa en CRWL, es posible que noexista tal instancia, i.e., que la funcion no este definida para determinados argumentos.No obstante, esto no quiere decir que la instancia, en caso de existir, sea unica, debido a laposible existencia de variables extra en el cuerpo de la regla. Por ejemplo, si tenemos unaregla como f(z, s(X))� {s(Y )} (en este caso Y es una variable extra), aunque la forma dela llamada determine que es esta la regla a utilizar, hay infinitas instancias posibles corres-pondientes a los distintos valores a los que puede instanciarse la variable Y . En definitiva,en SRL se acota el indeterminismo agrupando las posibles vıas de reduccion (procedentesde distinas reglas en CRWL) en una unica regla, pero no elimina el indeterminismo debidoa las variables extra.

Las reglas 5 y 6 se corresponden directamente con las mismas en CRWL (versionsin restricciones). Notese que en la regla 6 se requiere un conflicto con constructoras delconjunto CS. Por ultimo, las reglas 7 y 8 estan claramente inspiradas en equivalenciasconjuntistas clasicas y tienen una lectura natural; en el caso de la 5, recordemos que si

Page 76: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

76 3. Semantica logica: la vision conjuntista

(1)S / {⊥}

S ∈ CExp⊥

(2){X} / {X}

X ∈ V

(3){t1} / C1 . . . {tn} / Cn

{c(t1, . . . , tn)} / {c(t′) | t

′∈ C1 × . . .× Cn}

c ∈ CSn

(4)S / C

f(t) / Csi C 6= {⊥} y (f(t)� S) ∈ [P]⊥

(5)t == t′ / {true}

si t ≡ t′ y t ∈ Term

(6)t == t′ / {false}

si t y t′ tienen CS-conflicto

(7)S1 / C1 S2[α/C1] / C⋃

α∈S1S2 / C

(8)S1 / C1 S2 / C2

S1 ∪ S2 / C1 ∪ C2

Cuadro 3.4: Calculo SRL

C1 = {t1, . . . , tn}, la notacion S2[α/C1] abrevia una secuencia de uniones planas de la formaS2[α/t1]∪ . . .∪S2[α/tn], es decir, liga α en S2 con todos los valores del SAS obtenido paraS1.

Este calculo, al igual que CRWL, guıa la reduccion de c-expresiones de acuerdo conla estructura sintactica mas externa de dichas c-expresiones. En particular, dada una c-expresion, ademas de la reduccion trivial por medio de la regla 1, la estructura sintacticadetermina otra (y solo otra) regla aplicable. En el caso de la regla 4, segun hemos vistoantes, es posible que no exista ninguna instancia de regla de programa aplicable, con loque solo sera posible la reduccion trivial.

Notese que el sımbolo ∪ esta sobrecargado en SRL: se utiliza en la construccion sintacti-ca de las c-expresiones y tambien con su significado conjuntista habitual. Este doble usoqueda patente por ejemplo en la regla 8: en la c-expresion S1∪S2 a la izquierda de / juegael papel de construccion sintactica (cuya semantica es precisamente lo que se esta defi-niendo), mientras que en C1 ∪ C2, al lado derecho de /, juega el papel de union usual deconjuntos. En general, siempre ocurre ası: a la izquierda de / es pura sintaxis, a la derechaes la union habitual de conjuntos. Algo similar ocurre con el sımbolo

⋃en la sintaxis

de las uniones indexadas⋃α∈S1

S2. Esta sobrecarga de significado para los sımbolos deunion es deliberada y, lejos de plantear dificultades, ayudara a interpretar intuitivamenteel significado de las c-expresiones, ası como las manipulaciones tanto a nivel denotacional

Page 77: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.3 El calculo de pruebas SRL 77

como operacional.

Dado un SRL-programa P y S ∈ CExp⊥ escribiremos P `SRL S/C si S/C es derivable enSRL con respecto al programa P. La denotacion de una c-expresion se define del siguientemodo:

Definicion 8 (Denotacion de una c-expresion) La denotacion de una c-expresion Scon relacion a un SRL-programa P se define como:

[[S]]P = {C | P `SRL S / C}

Omitiremos usualmente el subındice P.

Notese que la denotacion de una c-expresion es un conjunto de SAS’s, es decir, un conjuntode conjuntos de terminos, tal como anticipamos en la Seccion 3.2 al introducir la visionconjuntista.

Al igual que en CRWL en algunas demostraciones utilizaremos una formulacion alter-nativa para la regla 4:

(4)Sθ / C

f(t) / Csiendo (f(s)� S) ∈ Py θ ∈ Sust⊥ tal que sθ = t

Por otro lado, con respecto a la regla 8, es inmediato probar la asociatividad y conmu-tatividad del sımbolo ∪, es decir, [[(S1∪S2)∪S3]] = [[S1∪ (S2∪S3)]] y [[S1∪S2]] = [[S2∪S1]].Por ello, en lo sucesivo evitaremos parentesis innecesarios y consideraremos equivalenteslas c-expresiones S1 ∪ . . . ∪ Sn y Si1 ∪ . . . ∪ Sin siendo (i1, . . . , in) cualquier permutacionde (1, . . . , n). Es mas, en algunas demostraciones utilizaremos la siguiente version genera-lizada de la regla 8:

(8)Si1 / Ci1 . . .Sin / Cin

S1 ∪ . . . ∪ Sn / Ci1 ∪ . . . ∪ Cin

siendo (i1, . . . , in) unapermutacion de (1, . . . , n)

A la vista de esta regla es facil ver que toda c-expresion S siempre puede descomponersede manera equivalente en una secuencia de uniones de c-expresiones simples (definidas enla pagina 62), i.e., S = S1 ∪ . . . ∪ Sn (n ≥ 1), siendo S1, . . . ,Sn c-expresiones simples.Esta descomposicion resultara puntualmente interesante en algunas demostraciones queinvolucran el punto 5 de la definicion del orden parcial para c-expresiones de la Definicion3, en particular en el Lema 4.

Ejemplo 6 Como ejemplo de la transformacion de programas en SRL-programas y deri-vacion en SRL, consideremos el programa P:

add(z, Y ) → Yadd(s(X), Y ) → s(add(X,Y ))

double(X) → add(X,X)coin→ Xcoin→ s(X)

Para obtener el SRL-programa procedemos en dos etapas: se obtiene primero el OIS-programa ∆(P) asociado y despues el SRL-programa P ′ correspondiente. Para la primeraparte, en este caso P ya es un OIS-CRWL-programa y el algoritmo de la Definicion 5 lodeja intacto, esto es, ∆(P) = P. En la segunda etapa, de acuerdo con la Definicion 7, elSRL-programa P ′ es:

Page 78: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

78 3. Semantica logica: la vision conjuntista

add(z, Y ) � {Y }add(s(X), Y ) �

⋃α∈

⋃β∈{X}

⋃γ∈{Y } add(β,γ)

{s(α)}

double(X) �⋃α∈{X}

⋃β∈{X} add(α, β)

coin � {z} ∪⋃α∈{z}{s(α)}

A la vista del cuerpo de las reglas se pueden hacer algunas simplificaciones tal comohicimos en el Ejemplo 4. Es inmediato en virtud de la regla 7 de SRL que todas lasuniones de la forma

⋃α∈{t} S (con t ∈ Term⊥) son semanticamente equivalentes a S[α/t].

Ası obtenemos una version mas manejable del programa:

add(z, Y ) � {Y }add(s(X), Y ) �

⋃α∈add(X,Y ){s(α)}

double(X) � add(X,X)

coin � {z} ∪ {s(z)}

Volviendo al razonamiento central del ejemplo, es facil ver que con respecto a CRWLlos dos unicos terminos totales que aproximan double(coin) son z y s(s(z)). Y es portanto esperable que en SRL podamos recoger estas dos aproximaciones en un SAS para

double(coin), es decir, que se pueda derivar:

⋃α∈coin double(α) / {z, s(s(z))}

(Tambien aquı hemos simplificado la c-expresion correspondiente a double(coin)). La de-rivacion formal se detalla a continuacion:

{z} / {z}(3)

{z} / {z}(3)

{s(z)} / {s(z)}(3)

{z} ∪ {s(z)} / {z, s(z)}(8)

coin / {z, s(z)}(4)

{z} / {z}(3)

add(z, z) / {z}(4)

double(z) / {z}(4)

{z} / {z}(3)

{s(z)} / {s(z)}(3)

add(z, s(z)) / {s(z)}(4)

{z} / {z}(3)

{s(z)} / {(z)}(3)

{s(s(z))} / {s(s(z))}(3)

⋃β∈add(z,s(z)){s(β)} / {s(s(z))}

(7)

add(s(z), s(z)) / {s(s(z))}(4)

double(s(z)) / {s(s(z))}(4)

double(α)[α/{z, s(z)}] / {z, s(s(z))}(8)∗

⋃α∈coin double(α) / {z, s(s(z))}

(7)

Notese que en la parte derecha de la demostracion, en el paso de inferencia marcadocon (8)∗, la notacion double(α)[α/{z, s(z)}] representa la union double(z) ∪ double(s(z)),que por aplicacion de la regla 8, se desglosa en dos subderivaciones para double(z) y paradouble(s(z)). En definitiva, lo que se hace es aplicar double sobre el conjunto de valores{z, s(z)} obtenido para su argumento coin.

Page 79: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.4 Equivalencia entre CRWL y SRL 79

3.2.4. Equivalencia entre CRWL y SRL

Una vez presentado el calculo de pruebas SRL nuestro objetivo es probar que ambosformalismos, CRWL (en su version sin restricciones CRWL’) y SRL, son equivalentes desdeel punto de vista semantico.

En primer lugar observemos que junto con la notacion conjuntista, en SRL se hanintroducido variables producidas que no se utilizaban en CRWL. Estas variables jueganel papel de variables auxiliares para la recoleccion de valores y no deben afectar a lasemantica, en el sentido de que no deben aparecer en ningun SAS que podamos derivarpara una c-expresion (es mas, ningun SAS debe contener variables producidas de Γ):

Proposicion 4 Si S / C entonces var(C) ∩ PV (S) = ∅.

Demostracion: Inmediata por induccion sobre la longitud l de la prueba S / C. �

Otra propiedad sencilla que utilizaremos para establecer la equivalencia entre CRWLy SRL es que para cualquier termino construido t, la denotacion de la c-expresion {t}esta compuesta por todos los conjuntos unitarios {s} tales que {s} v {t} (o lo que es lomismo, s v t):

Proposicion 5 Para todo t ∈ Term⊥ se tiene [[{t}]] = {{s} | s ∈ Term⊥ con s v t}.Ademas todos los SAS’s de la denotacion se obtienen con las reglas 1, 2 y 3 de SRL.

Demostracion: Por induccion sobre la estructura de t:

si t = ⊥ el resultado es trivial;

si t = {X} entonces [[t]] = {{⊥}, {X}} (utilizando las reglas 1 y 2 de SRL) y elresultado es claro;

si t = c ∈ CS0 entonces [[t]] = {{⊥}, {c}} (utilizando las reglas 1 y 3 de SRL) y denuevo el resultado es claro;

si t = c(t1, . . . , tn) entonces, como la estructura de cada ti es mas simple que la det, por h.i. tenemos [[{ti}]] = {{si} | si ∈ Term⊥, si v ti}. Es claro que todo SAS enla denotacion de {t} se obtiene con las reglas 1, 2 y 3 de SRL y [[c(t1, . . . , tn)]] ={{⊥}} ∪ {{c(t′1, . . . , t

′n)} | t′i ∈ [[{ti}]]}, que coincide con el conjunto de terminos del

enunciado de esta proposicion. �

Como corolario inmediato tenemos:

Corolario 1 Dado t ∈ Term⊥ se tiene {t} / {t} utilizando unicamente las reglas 1, 2 y 3de SRL.

Page 80: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

80 3. Semantica logica: la vision conjuntista

La equivalencia que pretendemos establecer entre CRWL y SRL es la que anticipamosen la introduccion de la Seccion 3.2: el conjunto de aproximaciones obtenidas por CRWLpara una expresion e coincide con la union de los SAS’s obtenidos para la c-expresion e enSRL. Naturalmente, en CRWL la prueba se refiere a un programa P mientras que en SRLse utilizara el SRL-programa obtenido por transformacion P de acuerdo con el algoritmode la Seccion 3.2.2. Casi todo el trabajo esta en un lema previo para CRWL-programasinductivamente secuenciales:

Lema 2 Dado un OIS-CRWL-programa P y una expresion e, y sus correspondientes SRL-programa P y c-expresion e (ver Definicion 1), tenemos:

P `CRWL e→ t⇔ existe C tal que P `SRL e / C y t ∈ C

Demostracion: Probamos ambas implicaciones por induccion sobre la longitud l de laspruebas. Estudiamos en primer lugar la implicacion ⇒:

l = 1 Las posibles pruebas en CRWL en un paso son: e → ⊥ por la regla 1, X → X porla regla 2 y c → c por la regla 3 (siendo c ∈ CS0). En SRL las correspondientes pruebasseran respectivamente e / {⊥} por la regla 1, {X} / {X} por la 2 y {c} / {c} por la 3;

l > 1 Las posibles pruebas en l > 1 pasos son:

por la regla 3, en CRWL se tiene:

e1 → t1 . . . en → tnc(e1, . . . , en) → c(t1, . . . , tn)

En el contexto de SRL la c-expresion correspondiente es

c(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

{c(α1, . . . , αn)}

Por h.i., para cada i ∈ {1, . . . , n}, como cada una de la pruebas ei → ti es de longitudmenor que l, entonces en SRL se puede probar ei /Ci siendo ti ∈ Ci. Podemos utilizarestas pruebas para obtener un SAS C para la c-expresion completa aplicando n vecesla regla 7 de SRL. Dicha prueba tendra la forma:

e1 / C1

en / Cn

· · ·{c(α1, . . . , αn)}[α1/C1, . . . , αn/Cn] / C

· · ·(⋃α2∈e2

. . .⋃αn∈en

{c(α1, . . . , αn)})[α1/C1] / C⋃α1∈e1

. . .⋃αn∈en

{c(α1, . . . , αn)} / C

La notacion {c(α1, . . . , αn)}[α1/C1, . . . , αn/Cn] representa una c-expresion de la for-ma . . . ∪ {c(s1, . . . , sn)} ∪ . . . donde cada si recorre el conjunto Ci. En particular,la c-expresion {c(t1, . . . , tn)} aparece en esa secuencia de uniones y para obtenerel SAS para la c-expresion completa, la regla 8 de SRL une los SAS’s corres-pondientes a las subexpresiones de la secuencia. Es decir, el SAS obtenido para{c(t1, . . . , tn)} es un subconjunto del SAS final C y por la Proposicion 5 tenemos{c(t1, . . . , tn)} / {c(t1, . . . , tn)} con lo que c(t1, . . . , tn) ∈ C;

Page 81: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.4 Equivalencia entre CRWL y SRL 81

por la regla 4, en CRWL se tiene:

e1 → t1 . . . en → tn e→ t

f(e1, . . . , en) → t

siendo (f(t1, . . . , tn) → e) ∈ [P]⊥. En el contexto de SRL trabajaremos con la c-expresion correspondiente

f(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

f(α1, . . . , αn))

De nuevo por h.i., para cada i ∈ {1, . . . , n}, como cada una de la pruebas ei → ti esde longitud menor que l, entonces en SRL se puede probar ei / Ci siendo ti ∈ Ci. Ası,aplicando n veces la regla 7 de SRL para la c-expresion completa tendremos:

e1 / C1

en / Cn

· · ·f(α1, . . . , αn)[α1/C1, . . . , αn/Cn] / C

· · ·(⋃α2∈e2

. . .⋃αn∈en

f(α1, . . . , αn))[α1/C1] / C⋃α1∈e1

. . .⋃αn∈en

f(α1, . . . , αn) / C

De modo analogo al caso anterior, la notacion f(α1, . . . , αn)[α1/C1, . . . , αn/Cn] repre-senta una secuencia de uniones que contiene, entre otras, la c-expresion f(t1, . . . , tn).Por lo tanto, a la vista de la regla 8 de SRL, el SAS C para la expresion completacontiene el SAS C ′ obtenido para f(t1, . . . , tn), i.e., C ′ ⊆ C.

Por otro lado, para la instancia de regla utilizada por CRWL, tenemos que si(f(t1, . . . , tn) → e) ∈ [P]⊥ es claro que (f(t1, . . . , tn) � . . . ∪ e ∪ . . .) ∈ [P ]⊥ deacuerdo con la Definicion 7. La prueba para f(t1, . . . , tn) / C

′ se obtiene por aplica-cion de la regla 4 de SRL, utilizando la instancia de regla anterior, es decir, el SASC′ proviene del cuerpo de la regla . . . ∪ e ∪ . . .. Y por la regla 8 es claro que si e / C ′′

entonces C ′′ ⊆ C′.

En este punto nuevamente podemos aplicar la h.i.: como la prueba e → t es delongitud menor que l, se puede conseguir e→ C ′′ con t ∈ C′′. De este modo tenemost ∈ C puesto que C ′′ ⊆ C′ ⊆ C;

por la regla 5, en CRWL tendremos:

e→ t e′ → t

e == e′ → true

En SRL la c-expresion correspondiente a e == e′ es⋃α∈e

⋃α′∈e′ α == α′. Para

obtener un SAS para esta c-expresion, aplicando dos veces la regla 7 de SRL laprueba serıa:

e / C e′ / C′ (α == α′)[α/C, α′/C′] / C⋃α∈e

⋃α′∈e′ α == α′ / C

Page 82: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

82 3. Semantica logica: la vision conjuntista

Por h.i. tenemos e / C1 con t ∈ C1 y e′ / C2 con t ∈ C2. Entre las sub-c-expresiones de(α == α′)[α/C1, α

′/C2] la descomposicion de la regla 8 de SRL obtendra en particulart == t y por la regla 5 de SRL podremos derivar el SAS {true} que formara partede C;

por la regla 6, en CRWL tendremos:

e→ t e′ → t′

e == e′ → false

de modo que t y t′ presentan un CS-conflito. Como antes, la c-expresion correspon-diente es

⋃α∈e

⋃α′∈e′ α == α′ y aplicando dos veces la regla 7 de SRL nos quedarıa

la prueba:

e / C e′ / C′ (α == α′)[α/C, α′/C′] / C⋃α∈e

⋃α′∈e′ α == α′ / C

Por h.i. tenemos e / C1 con t ∈ C1 y e′ / C2 con t′ ∈ C2. Entre las subexpresiones de(α == α′)[α/C1, α

′/C2] se encontrara en particular t == t′ y como t y t′ presentanun CS-conflicto, por la regla 6 de SRL podremos derivar el SAS t == t′ / {false}que formara parte del SAS C.

Probemos ahora la implicacion en el otro sentido ⇐:

l = 1 Las posibles pruebas en SRL en un paso son: e /{⊥} por la regla 1, {X}/{X} por laregla 2 y {c}/{c} por la regla 3 (siendo c ∈ CS0). En CRWL las correspondientes pruebasseran respectivamente e→ ⊥ por la regla 1, X → X por la 2 y c→ c por la 3;

l > 1 Para hacer una demostracion en SRL de la forma e / C en l pasos tiene que sere = c(e1, . . . , en) con c ∈ CSn, o bien e = f(e1, . . . , en) con f ∈ FSn. Estudiemos estosdos casos:

si e = c(e1, . . . , en) la c-expresion correspondiente sera

c(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

{c(α1, . . . , αn)}

y la prueba e / C, tras n aplicaciones de la regla 7, puede simplificarse a:

e1 / C1 . . . en / Cn {c(α1, . . . , αn)}[α1/C1, . . . , αn/Cn] / C⋃α1∈e1

. . .⋃αn∈en

{c(α1, . . . , αn)} / C

Supongamos t ∈ C y demostremos que CRWL puede probar e→ t. Si fuese t = ⊥ elresultado es obvio ya que en CRWL tenemos e→ ⊥ por la regla 1.

El caso interesante es t 6= ⊥. Si t ∈ C a la vista de la prueba, debe existir una tupla(t1, . . . , tn) ∈ C1× . . .×Cn tal que {c(α1, . . . , αn)}[α1/t1, . . . , αn/tn]/C

′ de modo queC′ forma parte del SAS final C y t ∈ C ′, es decir, {c(t1, . . . , tn)} / C

′ con t ∈ C′ ⊆ C.Como t 6= ⊥, esta prueba debe hacerse por la regla 3 de SRL y sera de la forma:

Page 83: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.4 Equivalencia entre CRWL y SRL 83

{t1} / C′1 . . . {tn} / C

′n

{c(t1, . . . , tn} / {c(t′) | t

′∈ C′

1 × . . .× C′n} = C′

Entonces debe ser t = c(t′1, . . . , t′n) con t

′∈ C′

1 × . . . × C′n. Por h.i. para todo i ∈

{1, . . . , n} tenemos:

• por un lado, si ei / Ci y ti ∈ Ci entonces en CRWL se puede probar ei → ti;

• por otro lado, si ti / C′i y t′i ∈ C′

i entonces en CRWL puede probarse ti → t′i

y por transitividad de → (Teorema 1) si ei → ti y ti → t′i, entonces ei → t′i. Conestas pruebas, en CRWL utilizando la regla 3 podemos construir una prueba parae→ t:

e1 → t′i . . . en → t′nc(e1, . . . , en) → c(t′1, . . . , t

′n) = t

si e = f(e1, . . . , en) la c-expresion correspondiente sera

f(e1, . . . , en) =⋃α1∈e1

. . .⋃αn∈en

f(α1, . . . , αn)

y la prueba e / C, tras n aplicaciones de la regla 7, puede simplificarse a:

e1 / C1 . . . en / Cn f(α1, . . . , αn)[α1/C1, . . . , αn/Cn] / C⋃α1∈e1

. . .⋃αn∈en

f(α1, . . . , αn) / C

Como antes, supongamos t ∈ C y demostremos que CRWL puede probar e → t. Sifuese t = ⊥ el resultado es directo, ası que supongamos t 6= ⊥. Igual que en el casoanterior debe existir una tupla (t1, . . . , tn) ∈ C1 × . . . × Cn tal que f(t1, . . . , tn) / C

con t ∈ C′ ⊆ C. Como t 6= ⊥, esta prueba debe hacerse por la regla 4 de SRL ytendra la forma:

S / C′

f(t1, . . . , tn) / C′

siendo (f(t1, . . . , tn)� S) ∈ [P]⊥. De acuerdo con la Definicion 7 el cuerpo de estaregla sera de la forma S = e′1 ∪ . . . ∪ e′k. Entonces, aplicando la regla 8 de SRL(version generalizada), la prueba S / C ′ se reduce a:

e′1 / C1 . . . e′k / C

′k

e′1 ∪ . . . ∪ e′k / C

′1 ∪ . . . ∪ C′

k = C′

Como t ∈ C′, debe ser t ∈ C ′j para algun j ∈ {1, . . . , k}.

Por otro lado, en [P]⊥ habra una instancia de una regla de la forma (f(t1, . . . , tn) →e′j). Ahora, por h.i. tenemos:

Page 84: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

84 3. Semantica logica: la vision conjuntista

• para cada i ∈ {1, . . . , n} como ei /Ci y ti ∈ Ci, entonces en CRWL se podra pro-bar ei → ti;

• por otro lado, si e′j / C′j y t ∈ C′

j , entonces en CRWL tendremos e′j → t;

Entonces en CRWL podemos construir una prueba para f(e1, . . . , en) → t:

e1 → t1 . . . en → tn e′j → t

f(e1, . . . , en) → t

utilizando la regla 4 de CRWL. �

El mismo resultado es cierto partiendo de un CRWL-programa general, ya que comohemos visto (Lema 1), podemos obtener la version inductivamente secuencial preservandola equivalencia semantica. Ası el teorema de equivalencia puede enunciarse como:

Teorema 3 Dado un CRWL-programa P y una expresion e, y sus correspondientes SRL-programa P y c-expresion e, tenemos:

[[e]]CRWLP =

⋃C∈[[e]]SRL

P

C

o de manera equivalente:

P `CRWL e→ t⇔ existe C con P `SRL e / C y t ∈ C

Demostracion: Es inmediata a partir de los Lemas 1 y 2. �

El problema de las variables extra

Con el ultimo resultado del apartado anterior queda probado que CRWL y SRL, salvopor diferencias sintacticas, son capaces de obtener los mismos valores para las expresiones.Sin embargo, como ya apuntabamos en la introduccion de la Seccion 3.2, hay otra preten-sion adicional en la construccion de SRL: que cada uno de los SAS’s aislado capture todaslas posibles vıas de reduccion de una expresion con distintos grados de refinamiento, i.e,que cada SAS sea una aproximacion a la CRWL-denotacion de la expresion. Este resultadose plasmara en la Proposicion 9, pero antes habra que profundizar en las propiedades deSRL y analizar un tema delicado: las variables extra.

Tal como entendemos un SAS para una c-expresion, los diferentes SAS’s de la mismahabrıan de ser conjuntos consistentes. Pero esto no se consigue en presencia de variablesextra. Por ejemplo, consideremos las constructoras z y s para los naturales y una funcionf de aridad 0 definida como f → X, que en el marco SRL serıa:

f � {X}

La variable extra X puede instanciarse a cualquier valor al tomar una instancia paraaplicar la regla 4 de SRL. Ası, es sencillo ver que para la c-expresion f se pueden hacerlas derivaciones:

Page 85: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.4 Equivalencia entre CRWL y SRL 85

f / {z} f / {s(z)}

y es obvio que los SAS’s {z} y {s(z)} no son consistentes. Es mas, en este caso ningunSAS (salvo {⊥}) puede ser una aproximacion a la semantica de la c-expresion.

No es este el unico efecto indeseado debido a las variables extra. Intuitivamente esesperable que no se pierda informacion en los SAS’s al refinar las c-expresiones. Esteresultado puede plasmarse de distintas maneras como veremos, pero una de las que nosinteresa particularmente es la monotonıa (Teorema 4):

dadas dos c-expresiones S y S ′ tales que S v S ′, si S / C, entonces existe C ′ con C v C′

tal que S ′ / C′

La monotonıa es una de las propiedades fundamentales en CRWL (vease la Proposicion 1),que tambien necesitaremos en SRL para probar la completitud del mecanismo operacionalen el Capıtulo 5. Pero en SRL este resultado tambien queda comprometido en presenciade variables extra; consideremos la funcion f anterior y definamos:

S = f ∪ f S ′ = f

Es claro que S v S ′ (vease el ultimo punto de la Definicion 3 en la pagina 66) y S/{z, s(z)},pero con S ′ = f es imposible derivar este SAS. Notese que la relacion v para c-expresionesno se basa unicamente en la estructura sintactica superficial como ocurrıa en CRWL.

La raız de todos estos problemas se encuentra en el uso de variables extra. Las dificulta-des que plantean son ya bien conocidas tanto en el ambito de PL al trabajar con negacion,como en PLF (en algunos trabajos se limita total o parcialmente su uso para evitarlas almenos en el cuerpo de las reglas, en particular en [122, 123]). En pocas palabras, en PL connegacion el problema surge por el hecho de que este tipo de variables estan implıcitamentecuantificadas existencialmente en el ambito de las clausulas que definen los predicados; alintroducir la negacion, la cuantificacion existencial se transforma en universal con lo quela busqueda de soluciones se complica considerablemente. Este problema es tan incomodoque incluso se han estudiado transformaciones de programas para eliminar las variablesextra [76].

No es anecdotico que en nuestro caso el problema haya surgido al construir un calculoque posteriormente ampliaremos para incluir el fallo, que es la contrapartida de la negacionen PL. Aun salvando las dificultades planteadas en esta Seccion, el problema volverıa aaparecer al introducir el fallo en el capıtulo siguiente; en nuestro caso tambien al interpretarlogicamente una regla de funcion este tipo de variables esta cuantificado existencialmente.

Por todo ello prescindiremos de este tipo de variables. Si pensamos en PL, esta res-triccion es sencillamente inadmisible [59]: no hay muchos programas logicos interesantessin variables extra. Por otro lado, si pensamos en programacion funcional pura, esta li-mitacion no supone ninguna novedad: los lenguajes funcionales tıpicos como Haskell noadmiten este tipo de variables. En PLF, a priori tenemos una merma en la expresividaddel lenguaje. En muchos casos el uso de variables extra puede reemplazarse por llamadas afuncion de una forma bastante natural. Tambien es planteable el uso de transformaciones

Page 86: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

86 3. Semantica logica: la vision conjuntista

automaticas para reemplazar las variables extra por llamadas a funciones generadoras devalores.

A partir de ahora, y en el resto del trabajo se impone la restriccion adicional a lasreglas de programa de no contener variables extra. Un CRWL-programa sera un conjuntode reglas de la forma:

f(t1, . . . , tn) → e

donde (t1, . . . , tn) es una tupla lineal de terminos, e ∈ Exp y var(e) ⊆ var(t1)∪. . .∪var(tn).Analogamente un SRL-programa sera un conjunto de reglas de la forma:

f(t1, . . . , tn)� S

donde (t1, . . . , tn) es una tupla lineal de terminos, FV (S) ⊆ var(t1)∪ . . .∪ var(tn) y todopar de reglas de una funcion cumplen la condicion de no solapamiento.

Es inmediato ver que el algoritmo de transformacion de CRWL-programas a SRL-programas estudiado no introduce variables extra, lo que quiere decir que si tomamosun CRWL-programa de partida que no las utilice, el SRL-programa obtenido tampococontendra variables extra. Notese que las variables producidas introducidas en la transfor-macion no son variables extra.

Prescindiendo de este tipo de variables, se verifican las propiedades de monotonıa yconsistencia anteriores, y otras tambien interesantes que se estudian a continuacion.

3.2.5. Propiedades de SRL

Presentamos en este apartado algunas de las propiedades mas relevantes del calculoSRL. Asumimos en toda la Seccion un SRL-programa P sin variables extra con respectoal cual se hacen las derivaciones.

En primer lugar, los resultados de monotonıa y cierre por sustituciones de la Proposi-cion 1 referentes a las restricciones de igualdad y desigualdad tambien son validos en SRL,pero ahora referidos a la funcion (==).

Proposicion 6 La funcion (==) satisface las dos propiedades siguientes:

Monotonıa: si t v t′ y s v s′ entonces t == s / C ⇒ t′ == s′ / C;

Cierre por sustituciones totales: si t == s / C entonces tθ == sθ / C para todaθ ∈ Sust.

Demostracion: Demostramos por separado ambas propiedades:

Monotonıa: es evidente que t == s / {⊥} y t′ == s′ / {⊥}. En el caso de quet == s/{true} tenemos que t y s son identicos y ademas totales, i.e., son maximalescon respecto al orden v. Entonces t y s no pueden refinarse y tiene que ser t′ = t ys′ = s, con lo que t′ == s′ / {true} por la regla 5. En el caso de que t == s / {false}sera porque t y s presentan un CS-conflicto; dicho conflicto permanece intacto bajocualquier refinamiento, luego t′ == s′ / {false} por la regla 6;

Page 87: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.5 Propiedades de SRL 87

Cierre por sustituciones totales: igual que antes, para el caso t == s / {⊥}el resultado es obvio. Si t == s / {true} es porque t y s son totales e identicos, yclaramente al aplicar una sustitucion θ total a ambos terminos obtendremos terminostotales e identicos, luego tθ == sθ / {true} por la regla 5. Si t == s / {false} esporque t y s presentan un CS-conflicto que permanece invariable al aplicar cualquiersustitucion θ, luego tθ == sθ / {false} por la regla 6. �

Para las sustituciones, no se puede garantizar el cierre de la relacion / si dichas susti-tuciones pueden introducir ⊥, i.e., para sustituciones parciales. El problema surge con lafuncion == en el caso de que se reduzca a true. Por ejemplo, se tiene X == X/{true}, pe-ro si aplicamos la sustitucion θ = [X/⊥] obviamente no podremos obtener el SAS {true}.Pero sı que se tiene el cierre de / para sustituciones totales:

Proposicion 7 Dadas S ∈ CExp⊥ y θ ∈ Sust, si S / C entonces Sθ / Cθ.

Demostracion: Procedemos por induccion sobre la longitud l de la prueba S / C:

l = 1 El resultado es inmediato para las pruebas S / {⊥} (por la regla 1) y {c} / {c} conc ∈ CS0 (por la 3). Para la prueba {X}/{X} (por la regla 2) la propiedad es consecuenciainmediata del Corolario 1. Para la prueba t == t′ / {true} (por la regla 5) el resultado esconsecuencia del cierre por sustituciones totales visto en la Proposicion 6. Para la pruebat == t′ / {false} (por la regla 6) tambien el resultado es claro por la misma propiedad decierre;

l > 1 Si la prueba se hace mediante una de las reglas 3, 7 u 8 se aplica la h.i. de maneradirecta. La otra posibilidad es que la prueba se haga por la regla 4:

S / Cf(t) / C

siendo C 6= ⊥ y (f(t)� S) ∈ [P]⊥. En este caso, es claro que tambien (f(t)� S)θ ∈ [P]⊥.Por otro lado, por h.i., tenemos Sθ / Cθ y entonces tenemos la prueba:

Sθ / Cθf(t)θ / Cθ

utilizando la regla 4 de SRL. �

Con respecto a la relacion de orden v definida para c-expresiones hay varios resultadosesperables en cuanto a la preservacion del orden y las sustituciones. La primera es esta:

Proposicion 8 Dadas S,S ′ ∈ CExp⊥ y t, t′ ∈ Term⊥ tales que S v S ′ y t v t′, se tieneS[X/t] v S ′[X/t′].

Demostracion: En general podemos considerar S = S1 ∪ . . . ∪ Sn y S ′ = S ′1 ∪ . . . ∪ S ′

m,donde cada Si y cada S ′

j es una c-expresion simple (vease definicion en la pagina 62),de modo que para cualquier i ∈ {1, . . . , n} existe algun j ∈ {1, . . . ,m} tal que Si v Sjy viceversa. A la vista del punto 5 de la Definicion 3 del orden de aproximacion parac-expresiones, es suficiente probar que si Si v S ′

j entonces Si[X/t] v S ′j [X/t

′]. Procedemospor induccion estructural sobre S:

Page 88: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

88 3. Semantica logica: la vision conjuntista

si S = {s} debe ser S ′ = {s′} con s v s′, y es facil ver que {s[X/t]} v {s[X/t′]};

si S = f(s) entonces debe ser S ′ = f(s′) con s v s′. Como antes, es facil ver ques[X/t] v s′[X/t′];

si S =⋃α∈S1

S2, entonces debe ser S ′ =⋃α∈S′

1S ′

2, con S1 v S ′1 y S ′

2 v S ′2. Por

h.i. S1[X/t] v S ′1[X/t

′] y S ′2[X/t] v S ′

2[X/t′]. Como S[X/t] =

⋃α∈S1[X/t]

S2[X/t] y

S ′[X/t′] =⋃α∈S′

1[X/t′] S

′2[X/t

′], el resultado es directo;

si S = (s1 == s2) entonces debe ser S ′ = (s′1 == s′2) con s1 v s′1 y s2 v s′2.Tendremos s1[X/t] v s′1[X/t

′] y s2[X/t] v s′2[X/t′], y entonces S[X/t] v S ′[X/t′].�

Este resultado es facilmente ampliable en dos sentidos. Por un lado:

Corolario 2 Dadas S,S ′ ∈ CExp⊥ y σ, σ′ ∈ Sust⊥ tales que S v S ′ y σ v σ′ entoncesSσ v S ′σ′.

Demostracion: Si Dom(σ) ∪Dom(σ′) = {X1, . . . , Xn}, las sustituciones σ y σ′ puedenexpresarse como [X1/X1σ, . . . ,Xn/Xnσ] y [X1/X1σ

′, . . . , Xn/Xnσ′] respectivamente. Es

claro que Xiσ v Xiσ′ para todo i ∈ {1, . . . , n}, por lo que este corolario resulta de

aplicar n veces la proposicion anterior con las sustituciones [Xi/Xiσ] y [Xi/Xiσ′] para

i ∈ {1, . . . , n}. �

Por otro lado:

Corolario 3 Dadas S,S ′ ∈ CExp⊥ y C, C′ ⊆ Term⊥ tales que S v S ′ y C v C′, se tieneS[X/C] v S ′[X/C′].

Demostracion: Si C = {t1, . . . , tn} entonces S[X/C] = S[X/t1] ∪ . . . ∪ S[X/tn]. Analoga-mente, si C ′ = {s1, . . . , sm} entonces S ′[X/C′] = S ′[X/s1] ∪ . . . ∪ S[X/sm]. Como C v C ′,por definicion tenemos que para todo i ∈ {1, . . . , n} existe j ∈ {1, . . . ,m} tales que ti v sjy por la Proposicion anterior tendremos S[X/ti] v S[X/sj]. Y tambien al contrario: paratodo j ∈ {1, . . . ,m} existe i ∈ {1, . . . , n} tales que S[X/ti] v S[X/sj]. Ası, es claro queS[X/C] v S ′[X/C′]. �

En cuanto a la semantica de las c-expresiones son esperables ciertos resultados sobrerefinamiento de la informacion: el hecho de refinar la informacion de una c-expresion SRLdebe permitir obtener, al menos, los mismos SAS’s que se obtenıan para la c-expresionoriginal. En otras palabras, el refinamiento de la informacion de una c-expresion no puedesuponer una perdida de informacion en la denotacion de la misma. Este refinamiento puedehacerse de distintas formas. Planteandolo en terminos de sustituciones lo que obtenemoses el siguiente lema de elevacion:

Lema 3 (Elevacion) Dadas S ∈ CExp⊥ y σ, σ′ ∈ Subst⊥ con σ v σ′, si Sσ / C entoncesSσ′ / C. Es mas, la prueba para la segunda sentencia se puede construir con la mismalongitud y estructura que la de la primera.

Page 89: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.5 Propiedades de SRL 89

Demostracion: Razonamos por induccion sobre la longitud l de la prueba para Sσ / C:

l = 1 La prueba puede ser:

Sσ / {⊥} por la regla 1: trivial;

{X}/{X} por la regla 2: si Sσ = {X} debe ser Sσ ′ = {X} y el resultado es directo;

{c} / {c} por la regla 3 con Sσ = {c} y c ∈ CS0: de nuevo debe ser Sσ′ = {c} y elresultado es claro;

para las pruebas (t == s)σ /{true} y (t == s)σ /{false} realizadas con las reglas 5y 6 de SRL el resultado es una consecuencia inmediata de la monotonıa de la funcion(==) estudiada en la Proposicion 6, ya que tσ v tσ ′ y sσ v sσ′.

l > 1 Estudiemos las posibles pruebas para Sσ / C:

si la prueba se hace por la regla 3 en l pasos, entonces Sσ = {c(t1, . . . , tn)} y tendra laforma:

{t1} / C1 . . . {tn} / Cn{c(t1, .., tn)} / {c(s) | s ∈ C1 × . . .× Cn}

Debe ser Sσ′ = {c(t′1, . . . , t′n)} con c(t1, . . . , tn) v c(t′1, . . . , t

′n). Por h.i. para cada i

tenemos una prueba {t′i} / Ci con la misma longitud y estructura que la prueba para{t′i} / Ci. Entonces por la regla 3 tambien se tiene:

{t′1} / C1 . . . {t′n} / Cn

{c(t′1, . . . , t′n)} / {c(s) | s ∈ C1 × . . .× Cn}

con la misma longitud y estructura que la anterior;

si la prueba se hace por la regla 4, debe ser Sσ = f(t) y Sσ ′ = f(t′) con f(t) v f(t

′).

La prueba para f(t) / C tendra la forma:

S ′θ / Cf(t) / C

siendo (f(s) � S ′) ∈ P y θ ∈ Sust⊥ tal que f(s)θ = f(t). Es facil ver que debeexistir θ′ con θ v θ′ tal que f(s)θ′ = f(t

′) y entonces la misma regla 4 es aplicable

con una instancia de regla de programa mas refinada:

S ′θ′ / C′

f(t′) / C′

Los SAS’s C y C ′ para ambas expresiones se derivan de las instancias del cuerpoS ′θ y S ′θ′ respectivamente. Como θ v θ′ tenemos S ′θ v S ′θ′ y por h.i. si S ′θ / Centonces tambien puede construirse una prueba para S ′θ′/C con la misma longitud yestructura, con lo que podemos conseguir C ′ = C. De modo que tenemos una pruebapara f(t

′) / C con la misma longitud y estructura que la prueba para f(t) / C;

Page 90: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

90 3. Semantica logica: la vision conjuntista

si la prueba se hace por la regla 7 debe ser S =⋃α∈S1

S2 y tendremos una pruebade la forma:

S1σ / C′ S2σ[α/C′] / C⋃α∈S1σ

S2σ / C

Por h.i. tenemos una prueba para S1σ′ / C′ con la misma longitud y estructura que

la de S1σ / C′. Si C′ = {t1, . . . , tn} la notacion S2σ[α/C′] abrevia S2σ[α/t1] ∪ . . . ∪

S2σ[α/tn] y S2σ′[α/C′] abrevia S2σ

′[α/t1]∪. . .∪S2σ′[α/tn]. Es facil ver que σ[α/ti] v

σ′[α/ti], y estas sustituciones satisfacen la h.i., es decir, si S2σ[α/t1]∪. . .∪S2σ[α/tn]/Centonces tambien se tienen pruebas para S2σ

′[α/t1]∪. . .∪S2σ′[α/tn]/C con la misma

longitud y estructura, y entonces por la misma regla 7 se puede construir la pruebapara

⋃α∈S1σ′

S2σ′ / C;

si la prueba se hace por la regla 8, debe ser S = S1∪S2 y la prueba para Sσ /C sera:

S1σ / C1 S2σ / C2

S1σ ∪ S2σ / C1 ∪ C2

Por h.i. tenemos pruebas para S1σ′/C1 y S2σ

′/C2 con la misma longitud y estructuray entonces por la misma regla 8 tenemos la prueba para S1σ

′ ∪ S2σ′ / C1 ∪ C2. �

Corolario 4 Sean t, t′ ∈ Term⊥ con t v t′; si S[X/t] / C entonces S[X/t′] / C.

Demostracion: Trivial a partir del lema anterior tomando σ = [X/t] y σ ′ = [X/t′]. �

Podemos generalizar aun mas, considerando c-sustituciones:

Corolario 5 Si t1 v t′1, . . . , tn v t′n y S[X/{t1, . . . , tn}]/C entonces S[X/{t′1, . . . , t′n}]/C.

Demostracion: Descomponiendo las pruebas con la regla 8 de SRL el resultado es unaaplicacion inmediata del corolario anterior. �

Otra forma de expresar la preservacion de la informacion por refinamiento es la mo-notonıa. Podrıamos enunciar este resultado por analogıa con la monotonıa de CRWL(Proposicion 1), diciendo que los SAS’s obtenidos para una c-expresion se preservan bajorefinamiento de la misma, i.e.:

si S / C y S v S ′ entonces S ′ / C

Pero esto no es cierto. Por ejemplo, si S = {⊥}∪{s(⊥)} y S ′ = {s(z)}, es claro que S v S ′.Por otra parte es inmediato ver que S /{⊥, s(⊥)} pero es imposible obtener este SAS paraS ′. El resultado de monotonıa para SRL que probaremos es ligeramente distinto:

si S / C y S v S ′ entonces existe C ′ con C v C′ tal que S ′ / C′

Page 91: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.5 Propiedades de SRL 91

Este resultado es tecnicamente mas complejo que los prececentes y requiere bastante ela-boracion debido a que el orden de aproximacion para c-expresiones (Definicion 3, pagina66) es capaz de relacionar c-expresiones muy dispares desde el punto de vista sintactico(como en el ejemplo anterior). Para demostrar la monotonıa necesitamos generalizar elresultado a n c-expresiones, como se muestra en el siguiente Lema, que es el resultadofundamental de esta seccion, ya que los demas se prueban de manera sencilla a partir deel.

Lema 4 (Monotonıa de SRL) Si S1, . . . ,Sn,S ∈ CExp⊥ se tiene:

S1 v S, . . . ,Sn v SS1 / C1, . . . ,Sn / Cn

}⇒ existe C ⊆ Term⊥ tal que S / C y C1 v C, . . . , Cn v C

Demostracion: El argumento central de esta demostracion es que si las pruebas S1 /C1, . . . ,Sn / Cn tienen longitudes l1, . . . , ln, es posible reducir dichas pruebas a otras S ′

1 /C′

1, . . . ,S′m /C

′m de longitudes l′1, . . . , l

′m tal que el multiconjunto {{l′1, . . . , l

′m}} es menor que

{{l1, . . . , ln}} en el orden habitual de multiconjuntos [56] (cierre transitivo de la relacionde precedencia < para multiconjuntos: A < B si A resulta de reemplazar una ocurrenciade un elemento x de B por algunas ocurrencias de elementos y < x). La demostracion sehara por induccion completa sobre el orden de dichos multiconjuntos.

Para simplificar el analisis de casos, observemos que S1, . . . ,Sn son c-expresiones con-sistentes, de hecho refinadas por S. En general, para alguna de ellas puede tenerse Si = {⊥}con lo que la unica prueba posible es Si/{⊥} por la regla 1; pero incluso aunque Si 6= {⊥},la prueba Si / Ci puede hacerse trivialmente por la regla 1 obteniendo tambien Ci = {⊥}.Estas pruebas no plantean ninguna dificultad, ya que el SAS {⊥} es refinado por cualquierotro, en particular por cualquier C obtenido para S.

Los casos mas interesantes corresponden a aquellas pruebas Si / Ci en las las queSi 6= {⊥} y no son hechas por la regla 1 (puede ser Ci = {⊥}, pero obtenido medianteun paso de derivacion posterior y no directamente por la regla 1). De modo que para elresto de la demostracion asumimos la siguiente hipotesis adicional, que refleja estos casosno triviales:

HH: todas las pruebas Si / Ci se llevan a cabo por una regla diferente de la regla 1 (enparticular, todas las c-expresiones Si han de ser diferentes de {⊥})

Ahora procederemos por induccion sobre el multiconjunto {{l1, . . . , ln}} de longitudesde las pruebas S1 / C1, . . . ,Sn / Cn:

l1 = . . . = ln = 1 Teniendo en cuenta HH, la prueba S1 / C1 puede tener las siguientesformas: {X} / {X}, {c} / {c} con c ∈ DC0, t1 == t′1 / {true} y t1 == t′1 / {false}. ComoS1, . . . ,Sn son consistentes y ninguna puede ser {⊥} por HH, deben compartir todas lamisma estructura sintactica externa. Por otro lado, como S refina a estas c-expresiones, deacuerdo con el orden de aproximacion para c-expresiones (ultimo caso de la Definicion 3)tiene que ser S = S ′

1∪. . .∪S′m con m ≥ 1, de modo que S1 v S ′

j para cada j ∈ {1, . . . ,m}, ylo mismo ocurre con S2, . . . ,Sn. Para cada uno de los S ′

j buscaremos un refinamiento de los

Page 92: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

92 3. Semantica logica: la vision conjuntista

Si y por aplicacion de la regla 8 (si m > 1) la union de los SAS’s obtenidos proporcionara elSAS buscado C.

Teniendo en cuenta esta observacion general, analicemos los pormenores de cada caso.En los tres primeros el razonamiento es muy similar:

si la prueba S1 / C1 es de la forma {X} / {X} (por la regla 2), {c} / {c} con c ∈ CS0

(por la regla 3) o t == t′ / {true} (por la regla 5), entonces S1 ha de ser maximalpara el orden v. Esto significa que para todo i ∈ {2, . . . , n} sera Si = S1 y teniendoen cuenta HH, todas las pruebas Si / Ci seran identicas a S1 / C1. Con respecto aS, ha de ser S ′

j = S1 para todo j ∈ {1, . . . ,m}, con lo que podemos obtener S / C1

por aplicacion de la regla 8 si m > 1, o bien, directamente si m = 1. El SAS C delenunciado sera el propio C1;

si la prueba S1 / C1 es de la forma t1 == t′1 / {false} (por la regla 6), la situacion esligeramente distinta. Todas las c-expresiones Si para i ∈ {2, . . . , n} seran de la formaSi = (ti == t′i) y las pruebas asociadas, teniendo en cuenta HH, seran Si / {false}.Por su parte, para S tendremos S = (s1 == s′1) ∪ . . . ∪ (sm == s′m) con ti v sj yt′i v s′j para cada i ∈ {1, . . . , n} y j ∈ {1, . . . ,m}. Entonces, por monotonıa de (==)(Proposicion 6) es inmediato ver que para cada j ∈ {1, . . . ,m} podremos obtenersj == s′j / {false}, y por la regla 8 si m > 1, o directamente si m = 1, tendremosC = {false} como se pretendıa;

li > 1 para algun i ∈ {1, . . . , n}. En general, las c-expresiones S1, . . . ,Sn y la propia S pue-den tener una estructura sintactica tan intrincada como se desee, con la dificultad anadidade que esa estructura no tiene porque ser comun entre ellas debido a las uniones planas.Tal como apuntabamos en la pagina 62, en relacion a la version generalizada de la regla8 del calculo, cualquier c-expresion puede interpretarse como una secuencia de unionesde c-expresiones simples (sin uniones planas en la estructura externa). Precisamente, elprimer caso de la induccion reduce el caso general del problema al caso de c-expresionessimples en virtud de esta observacion:

supongamos que alguna de las c-expresiones S1, . . . ,Sn no es simple, sino que con-tiene uniones planas en su estructura externa. Sin perdida de generalidad, podemossuponer por ejemplo que S1 no es simple. Entonces S,S1, . . . ,Sn pueden descompo-nerse como union de c-expresiones simples de la forma:

S = S01 ∪ . . . ∪ S0m0

S1 = S11 ∪ . . . ∪ S1m1

S2 = S21 ∪ . . . ∪ S2m2

. . .Sn= Sn1 ∪ . . . ∪ Snmn

donde m1 > 1 y mj ≥ 0 para j ∈ {0} ∪ {2, . . . , n} y por la regla 8 tendremos:

Page 93: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.5 Propiedades de SRL 93

S11 / C11, . . . ,S1m1 / C1m1 y C1 = C11 ∪ . . . ∪ C1m1

S21 / C21, . . . ,S2m2 / C2m2 y C2 = C21 ∪ . . . ∪ C2m2

. . .Sn1 / Cn1, . . . ,Snmn / Cnmn y Cn = Cn1 ∪ . . . ∪ Cnmn

De acuerdo con el orden de aproximacion para c-expresiones de la Definicion 3, sinos fijamos por ejemplo en la hipotesis del enunciado S1 v S, utilizando la des-composicion anterior para cada j ∈ {1, . . . ,m1} se tiene S1j v S0k para algunk ∈ {1, . . . ,m0}, y viceversa. Analogamente ocurre con S2, . . . ,Sn. En general tene-mos una coleccion de hipotesis de la forma:

(a) ∀i ∈ {1, . . . , n}.∀j ∈ {1, . . . ,mi}.∃k ∈ {1, . . . ,m0} tal que Sij v S0k

y tambien:

(b) ∀i ∈ {1, . . . , n}.∀k ∈ {1, . . . ,m0}.∃j ∈ {1, . . . ,mi} tal que Sij v S0k

Podemos agrupar aquellas c-expresiones Sij (i ∈ {1, . . . , n}, j ∈ {1, . . . ,mi}) queson refinadas por S01, tambien las que estan refinadas por S02 y ası hasta S0m0 .Formalmente estas agrupaciones corresponden a los siguientes conjuntos:

A1 = {Sij |i ∈ {1, . . . , n}, j ∈ {1, . . . ,mi}, Sij v S01}A2 = {Sij |i ∈ {1, . . . , n}, j ∈ {1, . . . ,mi}, Sij v S02}. . .Am0 = {Sij |i ∈ {1, . . . , n}, j ∈ {1, . . . ,mi}, Sij v S0m0}

Notese que por (a) todo Sij con i ∈ {1, . . . , n}, j ∈ {1, . . . ,mi} estara en algun Akde esta coleccion (puede que en mas de uno) y por (b) ninguno de estos Ak es vacıo(todo S0k refina algun Sij). Es mas, fijado i ∈ {1, . . . , n}, todas las c-expresionessimples Si1, . . . ,Simi estaran repartidas entre los conjuntos A1, . . . , Ak, aportando almenos un elemento a cada uno de ellos.

Ahora, para cada una de las colecciones de c-expresiones Sij de Ak (k ∈ {0, . . . ,m0})tenemos:

. . . ,Sij v S0k, . . .. . . ,Sij / Cij, . . .

Y estamos en las condiciones de la h.i. ya que por la construccion que hemos he-cho el multiconjunto de las longitudes de las pruebas Sij / Cij (i ∈ {1, . . . , n},j ∈ {1, . . . ,mi}) es menor que el original {{l1, . . . , ln}}: como m1 > 1, con seguridadla prueba S1/C1 se ha reemplazado por una o mas de las pruebas S11/C11, . . . ,S1m1 /C1m1 , i.e., la longitud l1 se reemplaza por otra u otras de menor longitud. Cada unade las restantes longitudes l2, . . . , ln pueden reemplazarse por otras menores o bienpermanecer intactas, pero con seguridad no se reemplazan por otra(s) mayor(es).

Entonces, por aplicacion de la h.i. a las colecciones A1, . . . , Am0 obtenemos:

∃C01 ⊆ Term⊥.S01 / C01 tal que Cij v C01 para cada i, j tal que Sij ∈ A1

. . .∃Cm0 ⊆ Term⊥.S0m0 / C0m0 tal que Cij v C0m0 para cada i, j tal que Sij ∈ Am0

Page 94: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

94 3. Semantica logica: la vision conjuntista

El SAS C que buscamos para S puede obtenerse por la regla 8:

S01 / C01 . . .S0m0 / C0m0

S = S01 ∪ . . . ∪ S0m0 / C01 ∪ . . . ∪ C0m0 = C

si m0 > 1, o bien directamente si fuese m0 = 1. Y ademas C es el refinamiento deC1, . . . , Cn que postula el enunciado: dado i ∈ {1, . . . , n}, decir Ci v C es equivalentea decir:

Ci1 ∪ . . . ∪ Cimi v C01 ∪ . . . ∪ C0m0

y esto es cierto, ya que para cada Cij con j ∈ {1, . . . ,mi}, por construccion existealgun C0k con k ∈ {1, . . . ,m0} tal que Cij v C0k y viceversa, para cada C0k conk ∈ {1, . . . ,m0} existe Cij con j ∈ {1, . . . ,mi}, tal que Cij v C0k. Por la Proposicion2 es inmediato entonces que Ci v C, y esto para cada i ∈ {1, . . . , n}.

Los casos que analizaremos a continuacion se refieren exclusivamente a c-expresionessimples en los que todas las c-expresiones Si y S comparten la misma estructurasintactica externa, ya que son consistentes. Ademas, puesto que son c-expresionessimples distintas de {⊥} todas deben ser de la forma {t} o f(. . .) o (. . . == . . .) o⋃α∈... . . . y, como veremos, todas las pruebas Si / Ci y S / C deben ser realizadas por

la misma regla de SRL y la hipotesis de induccion sera mas sencilla de aplicar puestoque disminuye en un paso la longitud de la prueba concreta que se analiza en cadacaso. Notese sin embargo, que aunque las c-expresiones de partida sean simples, laaplicacion de una regla de programa puede introducir una c-expresion que no lo sea,y que respondera al caso que acabamos de estudiar.

si alguna prueba Si / Ci es de la forma {c(ti)} / Ci por la regla 3, debe ser S = {c(t)}con ti v t. Para el resto de c-expresiones, como Sj v S y teniendo en cuenta HH,debe ser Sj = {c(tj)} con tj v t. Entonces, para las c-expresiones correspondientesal primer elemento de las tuplas tenemos {t11}, . . . , {t1n} v {t1} y analogo parael resto de elementos. Por h.i. los SAS’s obtenidos para {t11}, . . . , {t1n} pueden serrefinados a un unico SAS obtenido para {t1}, y lo mismo para el resto de elementosde las tuplas. Entonces, es claro que por la regla 3 podemos conseguir un SAS C parac(t) tal que Cj v C para j ∈ {1, . . . , n};

si alguna de las pruebas Si /Ci se hace por la regla 4, entonces Si = f(ti) y la pruebatendra la forma:

S ′θi / Cif(ti) / Ci

donde f(u) � S ′ es una regla de programa tal que uθi = ti, θi ∈ Sust⊥. Como Srefina a f(ti) debe ser S = f(t) con ti v t. Esto significa que existe θ ∈ Subst⊥ talque uθ = t: las posiciones de variable (ya que u no contiene ⊥) que θi reemplazapor ⊥ en u para obtener ti pueden ser reemplazadas por algo mas definido me-diante θ para obtener t. Ademas no hay ninguna perdida de generalidad en asumir

Page 95: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.5 Propiedades de SRL 95

Dom(θ), Dom(θi) ⊆ var(u)∪FV (S ′) (estas son las variables que pueden ser sustitui-das para conseguir la instancia apropiada, y en cualquier caso se pueden hacer exac-tamente las mismas pruebas restringiendo el dominio de θ y θi a var(u) ∪ FV (S ′)).

Por otro lado, para el resto de pruebas Sj / Cj tambien debe ser Sj = f(tj), contj v t. Tenemos en principio dos posibilidades:

• la tupla tj es una instancia de u, i.e., existe θj ∈ Sust⊥ tal que tj = uθj;

• la tupla tj no es una instancia de u (esta situacion es posible por ejemplo conti = t = s(s(z)), u = s(s(X)), θi = θ = [X/z] y tj = s(⊥)). Ahora bien,como tj v t, esto significa que tj puede tener ⊥ en algunas posiciones donde ttiene algo mas definido. Pero como las reglas de nuestro programa cumplen lacondicion de no solapamiento, no habrıa ninguna regla de programa utilizablepara reducir f(tj) (si la hubiese, esa misma regla serıa utilizable para reducirf(t), i.e., ambas reglas solaparıan). En este caso la unica derivacion posible paraSj serıa la trivial Sj / {⊥} por la regla 1, que ha quedado excluida por HH.

En este punto tenemos Sj = f(tj) = f(u)θj y S = f(t) = f(u)θ, tal que f(u)θj vf(u)θ, para j ∈ {1, . . . , n}, lo que significa θj v θ. Para las instancias del cuerpotenemos S ′θj v S ′θ por el Corolario 2. Ası, estamos en la h.i. y tenemos una pruebaS ′θ / C tal que Cj v C para j ∈ {1, . . . , n}. Y es inmediato ver que entonces se puedeconstruir una prueba para S / C con la regla 4;

si alguna de las pruebas se hace por la regla 7, entonces Si =⋃α∈S′

iS ′′i para i ∈

{1, . . . , n} y S =⋃α∈S′ S ′′, con S ′

i v S ′ y S ′′i v S ′′. Entonces, todas las pruebas

deben ser hechas por medio de la regla 7. Por ejemplo, la prueba para Si/Ci tendra laforma:

S ′i / {ti1, . . . , timi} S ′′

i [α/{ti1, . . . , timi}] / Ci⋃α∈S′

iS ′′i / Ci

Las pruebas para S ′′i [α/{ti1, . . . , timi}]/Ci en general se haran por la regla 8 (version

generalizada) de la forma:

S ′′i [α/ti1] / Ci1 . . . S ′′[α/timi ] / Cimi

S ′′i [α/{ti1, . . . , timi}] / Ci1 ∪ . . . ∪ Cimi = Ci

(Si mi = 1 la regla 8 no es necesaria y la prueba es simplemente S ′′i [α/{ti1}] / Ci. El

resto de la demostracion es la misma).

Para construir una prueba para S / C, primero por h.i. podemos conseguir S ′ /{t1, . . . , tk}, tal que {ti1, . . . , timi} v {t1, . . . , tk} para cada i ∈ {1, . . . , n}. Colec-cionando todos los terminos tij, esto es equivalente a decir: S ′ / {t1, . . . , tk} tal queC′ = {t11, . . . , t1m1 , . . . , tn1, . . . , tnmn} v {t1, . . . , tk}

Ahora aplicamos la h.i. reiteradamente del siguiente modo: consideramos t1 y to-dos los tij ∈ C′ tales que tij v t1. Por la Proposicion 8 tenemos S ′′

i [α/{tij}] vS ′′[α/{t1}] para cada uno de esos tij . Entonces por h.i. nuevamente podemos con-seguir S ′′[α/{t1}] / C

′1 tal que Cij v C′

1. Y ası para t2 hasta tk. Notese que en este

Page 96: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

96 3. Semantica logica: la vision conjuntista

proceso todo tij ∈ C′ debe seleccionarse al menos una vez porque C ′ v {t1, . . . , tk}lo que significa que cada tij debe satisfacer tij v tl para algun l ∈ {1, . . . , k}.

Uniendo las pruebas para S[α/{tl}] / C′l, obtenemos S ′′[α/{t1, . . . , tk}] / C

′1 ∪ . . .∪ C′

k

y con la regla 8 tedremos S / C ′1 ∪ . . . ∪ C′

k = C tal que C1, . . . , Cn v C. �

Ahora la motonıa surge como corolario del resultado anterior.

Teorema 4 (Monotonıa de SRL) Sean dos c-expresiones S y S ′ tales que S v S ′. SiS / C entonces existe C ′ con C v C′ tal que S ′ / C′.

Demostracion: Trivial a partir del Lema 4. �

El Lema 4 es crucial en el marco SRL. Ademas del resultado de monotonıa anterior,tambien encierra de manera inmediata el resultado de consistencia que anticipamos al finalde la Seccion anterior, que afirma que todos los SAS’s de una c-expresion son consistentes:

Teorema 5 (Consistencia de SRL) Si S / C y S / C ′ entonces C y C ′ son consistentes.

Demostracion: Basta observar que por el Lema 4 debe existir C ′′ tal que S /C ′′ y C, C′ vC′′, lo que significa precisamente (vease Definicion 2 en la pagina 65) que C y C ′ sonconsistentes. �

A la vista del grafico que muestra todos los SAS’s para coin de la Seccion 3.2 (pagina58), segun este teorema todos los SAS’s para coin, esto es, los conjuntos {⊥}, {z,⊥},{⊥, s(⊥)}, {z, s(⊥)}, {⊥, s(z)} y {z, s(z)} deben ser consistentes dos a dos. Es facil verque efectivamente es ası y que de hecho {z, s(z)} los refina a todos ellos.

El Lema de Elevacion 3 y el Teorema de Monotonıa 4 son similares hasta cierto punto.En las hipotesis del Lema de Elevacion, si σ v σ ′ por el Corolario 2 tenemos Sσ vSσ′; y a su vez, por el Teorema de Monotonıa, si Sσ / C entonces Sσ ′ / C′ con C v C′.No obstante, el Lema de Elevacion de hecho muestra que puede conseguirse C = C ′.La clave esta en que las c-expresiones que considera el Lema de Elevacion se obtienenmediante sustituciones a partir de una c-expresion comun, con lo que ambas compartiranuna misma estructura sintactica (hasta cierto punto). En el caso del Teorema de Monotonıano hay ninguna garantıa de tal similitud en la estructura de las c-expresiones y no puedeconseguirse la igualdad en los SAS’s obtenidos. Ambos resultados seran interesantes endistintos contextos.

3.2.6. Afinando la relacion entre CRWL y SRL

Con la construccion de SRL hemos buscado mayor control sobre el indeterminismoinherente a PLF. Cada uno de los SAS obtenidos para una c-expresion refleja la mismainformacion en distintos grados de refinamiento y esa informacion es obtenida teniendoen cuenta todas las posibles vıas de reduccion de la c-expresion. En definitiva, refleja la

Page 97: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.2.6 Afinando la relacion entre CRWL y SRL 97

denotacion completa de la c-expresion con cierto grado de refinamiento. Estas ideas noshan guiado en la construccion de SRL. Pero hasta ahora no hemos formalizado ningunresultado en ese sentido y este es el objeto de la siguiente Proposicion, que establece unarelacion entre CRWL y SRL mas elaborada que la de la Seccion 3.2.4 (Teorema 3 de lapagina 84). En este nuevo resultado se prueba que para cualquier termino de la CRWL-denotacion de una expresion se puede encontrar otro termino consistente en cualquier SASde la c-expresion correspondiente. Aunque por la tematica este resultado se podrıa incluiren la Seccion 3.2.4, su demostracion era inabordable en aquel punto, mientras que ahoraes sencilla.

Proposicion 9 Sean un CRWL-programa P y una expresion e, y sus correspondientesSRL-programa P y c-expresion e. Entonces se tiene:

t ∈ [[e]]CRWLP ⇒ para todo C ∈ [[e]]SRL

Pexiste s ∈ C tal que t y s son consistentes

Demostracion: Sean t ∈ [[e]]CRWLP y C ∈ [[e]]SRL

P. Sera entonces P `CRWL e → t y P `SRL

e / C. Por el Teorema 3 tenemos P `SRL e / C′ con t ∈ C′. A su vez, por el Teorema 5, C y

C′ son consistentes. Como t ∈ C ′, por la Proposicion 3 ha de existir s ∈ C tal que t y s sonconsistentes, como pretendıamos. �

Los SAS de SRL tambien capturan aspectos semanticos inadvertidos para CRWL. Porejemplo, permiten hacer distinciones entre programas que no refleja CRWL, como veremosa continuacion. De manera natural, la equivalencia ∼ entre programas en CRWL puededefinirse como:

P ∼CRWL P ′ si para toda e ∈ Exp⊥ y t ∈ Term⊥ se tiene(P `CRWL e→ t⇔ P ′ `CRWL e→ t)

Analogamente la equivalencia en SRL se define como:

P ∼ SRLP ′ si para toda S ∈ CExp⊥ y C ⊆ Term⊥ se tiene(P `SRL S / C ⇔ P ′ `SRL S / C)

Es facil ver que la equivalencia de programas en CRWL implica la equivalencia de losprogramas asociados en SRL, pero no a la inversa. Formalmente, tenemos:

Proposicion 10 Si P y P ′ son CRWL-programas, y P y P ′ son los respectivos transfor-mados entonces:

P ∼SRL P ′ ⇒6⇐ P ∼CRWL P ′

Demostracion: La implicacion (⇒) es sencilla de probar: si tomamos e ∈ Exp⊥, en SRLpor equivalencia de programas tendremos:

(∗) P `SRL e / C ⇔ P `SRL e / C

Page 98: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

98 3. Semantica logica: la vision conjuntista

Por otro lado, si P `CRWL e → t, por el Teorema 3 tendremos P `SRL e / C con t ∈ C; por(∗) P ′ `SRL e / C y de nuevo por el Teorema 3 se tiene P ′ `CRWL e→ t.

Siguiendo el mismo esquema de razonamiento si P ′ `CRWL e→ t tendremos que P `CRWL

e→ t. Luego P ∼CRWL P ′.

Para ver que no se da la implicacion contraria basta con presentar un contraejemplo.Consideremos las constructoras z y s para los naturales y sea P = {f → z} y P ′ = {f →

z, f → f}. Los SRL-programas asociados son P = {f � {z}} y P ′ = {f � {z} ∪ f}.Es sencillo ver que P y P ′ son CRWL-equivalentes (f se puede reducir a z y a ⊥), pero

P y P ′ no son SRL-equivalentes: P `SRL f / {z} mientras que P ′ `SRL f / {z,⊥}, pero

P ′ 6`SRL f / {z}. �

3.3. Contribucion de los SAS’s

En este capıtulo se ha introducido el calculo de pruebas SRL como alternativa a CRWL,pero ambos formalismos comparten un planteamiento similar y son esencialmente equi-valentes desde el punto de vista semantico como muestra el Teorema 3. En SRL lo quecambia (y se complica) es la estructura sintactica de las expresiones, los programas y lasdenotaciones, con el fin de adquirir un control mas fino del indeterminismo. Esta ganan-cia queda reflejada en las Proposiciones 9 y 10. Sin embargo, la justificacion real parala construccion de SRL se hara patente en el proximo capıtulo. El nuevo formalismo nospermitira introducir de manera natural la nocion de fallo en PLF, que es el objetivo prio-ritario en este trabajo. En cierto sentido, el fallo ahora no sera mas que un subproducto(y no el unico posible) de esta nueva vision conjuntista.

La idea de coleccionar los valores de las diferentes reducciones en un conjunto (SAS)tiene ciertas similitudes con la interpretacion abstracta [54], que en el contexto de PLF,se ha utilizado en [36] para detectar la insatisfactibilidad de ecuaciones e = e ′ (similar aal fallo de nuestra funcion ==). Sin embargo, hay diferencias entre nuestro planteamientoy el de [36]:

los programas en [36] son mucho mas restrictivos: han de ser confluentes, terminantes,satisfacer una propiedad de estratificacion en las condiciones y definir funcionestotales y estrictas;

en nuestro marco, dada una expresion e cada SAS para la c-expresion e contieneaproximaciones a la denotacion de e, y el conjunto de SAS’s para e determina en unsentido preciso (Teorema 3 y Proposicion 9) la denotacion de e. En interpretacionabstracta, para una expresion e se suele obtener un termino abstracto que representaun superconjunto de la denotacion de todas las instancias de e. Si adoptasemos lavision de la interpretacion abstracta en nuestros SAS’s, lo natural serıa interpretar ⊥como el conjunto de todos los terminos construidos (ya que ⊥ es refinable a cualquiervalor), y entonces se identificarıa un SAS como C = {⊥, z} con C ′ = {⊥}. Pero sie /C podemos demostrar e == z/{true}, mientras que no es correcto hacer lo mismo

Page 99: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

3.3. Contribucion de los SAS’s 99

para C′. Entonces, la relacion entre SRL y CRWL que hemos establecido se habrıaperdido.

Page 100: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

100 3. Semantica logica: la vision conjuntista

Page 101: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 4

Semantica logica para el fallo

En este capıtulo extenderemos el marco SRL para incluir el fallo. Aunque formalmentepartimos de SRL con su sintaxis conjuntista, para facilitar la presentacion en algunasocasiones nos remitiremos a la sintaxis de CRWL. A la vista de lo expuesto en el capıtuloanterior, puesto que todo CRWL es reinterpretable en SRL, podemos permitirnos estalicencia.

Abordamos a continuacion el grueso del tema que nos ocupa: el fallo en PLF. Recor-demos el significado que pretendemos para la funcion fails:

fails(e) =

{true si e no es reducible a forma normal de cabezafalse en otro caso

Esta funcion sera una primitiva del lenguaje y su semantica formal quedara fijada mediantereglas especıficas en el calculo de pruebas SRLF (SRL con fallo), que permitira construirdemostraciones efectivas de fallo. La nocion de reduccion a forma normal de cabeza tieneahora un significado preciso con relacion al calculo de pruebas CRWL del capıtulo anterior:una expresion e no puede reducirse a forma normal de cabeza, si e → ⊥ es la unicaaproximacion demostrable con respecto a CRWL; si admite cualquier otra aproximacione→ t con t 6= ⊥ necesariamente t estara en forma normal de cabeza.

En el nuevo marco, ademas de la funcion fails, se introduce la constante F (constructorade aridad 0) para representar explıcitamente el fallo en la reduccion. La conveniencia deesta constante puede ilustrarse con un ejemplo; consideremos las constructoras z y s paralos naturales y las dos funciones siguientes:

f(z) → f(z) g(s(s(z))) → z

Para reducir la expresion g(s(f(s(z)))), el paso de parametros deberıa ajustar el argumentode llamada, s(f(s(z))), con alguna instancia del parametro formal s(s(z)) de la regla deg. Como f(s(z)) falla en el sentido de la definicion anterior, el paso de parametros debetambien fallar. Si tomasemos {⊥} como SAS para f(s(z)) no habrıa suficiente informacionpara detectar este fallo: no se puede decir que falle el ajuste de s(⊥) y cualquier instancia des(s(X)). Pero tomando {F} como SAS para f(s(z)) sı que obtenemos suficiente informacionpara detectar el fallo al tratar de ajustar s(F) y cualquier instancia de s(s(X)).

Page 102: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

102 4. Semantica logica para el fallo

Notese que F se comporta como un termino mas, en particular en el ejemplo anterior seutiliza en la construccion s(F). Podrıa pensarse que la informacion de s(F) es esencialmentela misma que la de F, es decir, que la informacion del fallo se propaga “hacia fuera”; enel ejemplo anterior tambien es cierto que no puede hacerse el ajuste entre F y cualquierinstancia de s(s(X)). Pero esto no es ası en general: por ejemplo es facil ver que la ex-presion g(s(s(f(s(z))))) es reducible a z, pero si tomamos {F} como SAS para f(s(z))e identificamos la expresion s(s(f(s(z)))) con F, el ajuste con la regla para g no puedehacerse y la reduccion de g(s(s(f(s(z))))) fallarıa.

Tambien podrıa pensarse que esta constante F es innecesaria: el fallo en la reduccionde una expresion, en nuestro contexto conjuntista, podrıa expresarse con el SAS vacıo {}o ∅. Sin embargo, esto plantea problemas: si para la expresion f(s(z)) tenemos el SAS ∅,entonces para s(f(s(z))) el SAS razonable serıa tambien ∅ (de acuerdo con el productocruzado de la regla 3 del calculo SRL del Cuadro 3.4 en la pagina 76). Este problemapuede abordarse desde otras perspectivas, pero en nuestra construccion la introduccion dela constante F ha resultado muy comoda e intuitiva de manipular.

4.1. El marco SRLF

4.1.1. Preliminares

Signaturas, expresiones, terminos, sustituciones y c-expresiones

Partimos ahora de una signatura que incluye el sımbolo de funcion fails como prede-finida, i.e., Σ = CSΣ ∪ FSΣ ∪ {fails}. El conjunto de constructoras CS y el de funcionesdefinidas FS se interpretan como en la Seccion 3.1.1, asumiendo {true, false} ∈ CS 0 (estosvalores se necesitan para dar significado tanto a la funcion (==), como a la propia funcionfails) y naturalmente fails 6∈ FS.

Con respecto a las constantes especiales ⊥ y F, consideramos las signaturas extendidasΣ⊥ = Σ ∪ {⊥} y Σ⊥,F = Σ ∪ {⊥, F}. Estas constantes no se introducen directamente enla signatura porque no se contempla su uso explıcito en programas, es decir, no quedanaccesibles al nivel del lenguaje (a diferencia de la funcion fails).

Los conjuntos de expresiones con fallo totales ExpF y parciales Exp⊥,F, ası como losde terminos con fallo totales TermF y parciales Term⊥,F se definen de la manera natural.Tambien utilizaremos dos nuevos tipos de sustituciones con fallo: las totales SustF = {θ :V → TermF}, y las parciales Sust⊥,F = {θ : V → Term⊥,F}. Para las c-expresiones Sanadiremos una alternativa a la definicion de la Seccion 3.2.1 para la funcion fails; ası, lasintaxis de las nuevas c-expresiones es:

S ::= {t} | f(t) | fails(S1) | t == t′ |⋃α∈S1

S2 | S1 ∪ S2

donde t, t′ y t, ası como las c-expresiones S1 y S2 ahora pueden contener F. Denotamoscomo CExpF al conjunto de c-expresiones totales (sin ⊥) y como CExp⊥,F al conjuntode c-expresiones parciales (con ⊥). Notese que el argumento de la funcion fails sera unac-expresion y no un termino como en el resto de funciones. Esto es ası porque el falloen la reduccion de una expresion depende de los SAS’s de la misma y no de terminos

Page 103: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.1 Preliminares 103

individuales a los que pueda reducirse. En este sentido la funcion fails es muy especial yla transformacion de una expresion estandar en una c-expresion definida la Seccion 3.2.1en el caso de fails queda del siguiente modo:

fails(e) = fails(e)

Recordemos que una c-expresion puede descomponerse de manera equivalente en unasecuencia de uniones planas de c-expresiones simples (vease pagina 62). Pero ahora lasc-expresiones simples tambien pueden incluir llamadas a fails, luego seran de la forma:

S = {t} | f(t) | t == t′ |⋃

α∈S1

S2 | fails(S)

Los conjuntos de variables producidas y libres de una c-expresion definidos en la Seccion3.2.1 son tambien facilmente modificados para acomodarlos a la nueva extension sintactica.En concreto, se consideran variables producidas aquellas que aparecen en el ambito de lafuncion fails, es decir, PV (fails(S)) = PV (S); y con respecto a las variables libres tenemosFV (fails(S)) = FV (S).

En el nuevo marco SRLF que estamos construyendo, el fallo puede entenderse como unrefinamiento de informacion que no capturaba SRL. A la hora de establecer relaciones entreSRL y SRLF, como el sımbolo F no tiene sentido en SRL, necesitamos prescindir de estainformacion refinada, es decir, reinterpretar F como ⊥ en SRL. Con este fin introducimosla siguiente definicion:

Definicion 9 Dado un termino t construido sobre una signatura Σ⊥,F, el termino t[F/⊥]

correspondiente a la signatura Σ⊥ es el resultado de reemplazar todas las apariciones de F

por ⊥ en t.Se define el conjunto C [F/⊥] como el resultado de aplicar el reemplazamiento anterior

a cada uno de los terminos de C. Y de manera natural se define tambien la c-expresionS [F/⊥] como el resultado de reemplazar cada una de las apariciones de F por ⊥ en S.

Ordenes de aproximacion y consistencia con fallo

Con respecto al orden de aproximacion de expresiones, el sımbolo F se comporta comouna constante normal y la funcion fails como una funcion mas: el orden de aproximacionv es el mınimo orden parcial sobre Exp⊥,F que satisface:

⊥ v e, para todo e ∈ Exp⊥

e1 v e′1, . . . , en v e′n ⇒ h(e1, . . . , en) v h(e′1, . . . , e′n), para todo h ∈ CSn ∪ FSn ∪

{fails} ∪ {F} y ei, e′i ∈ Exp⊥,F.

De acuerdo con esta definicion, F es un elemento maximal. Esto es razonable desde elpunto de vista intuitivo, puesto que F expresa fallo en la reduccion de una expresion y estainformacion no es refinable. No obstante, este hecho contrasta con el tratamiento que sele da al fallo en [122, 124] en donde F es definido de modo que F v t para todo t 6= ⊥.

Page 104: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

104 4. Semantica logica para el fallo

Las nociones de orden de aproximacion para conjuntos de terminos y sustituciones,ası como las de consistencia para expresiones y conjuntos de terminos siguen siendo las mis-mas que en el capıtulo anterior. Con respecto al orden de aproximacion para c-expresiones,para la funcion fails debemos anadir un nuevo caso (6) a los de la Definicion 3 (pagina66):

6) fails(S) vCExp⊥,Ffails(S ′), si S vCExp⊥,F

S ′

Este nuevo caso no plantea ninguna dificultad.

SRLF-programas

En la Seccion 3.2.2 presentamos los SRL-programas y la forma de obtenerlos a partirde CRWL-programas generales. Para ello primero se obtenıan OIS-CRWL-programas (al-goritmos de las Definiciones 5 y 6 en las paginas 69 y 74 respectivamente). Al introducir elfallo necesitamos ademas que estos programas sean completos en el sentido de que los pa-trones de las reglas cubran todos los casos posibles de constructora, incluidos los casos defallo que corresponden a casos de “no definicion” en el CRWL-programa original. Tendre-mos entonces COIS-CRWL-programas (programas completos inductivamente secuencialescon solapamiento). Por ejemplo, si consideramos en CRWL la siguiente definicion para lafuncion if then :

if true then E → E

la version inductivamente secuencial completa debe incluir una regla de fallo para el ar-gumento false:

if false then E → F

y el SRLF-programa correspondiente quedarıa entonces:

if true then E � {E}if false then E � {F}

En este ejemplo hemos supuesto que el conjunto de constructoras CS de la signaturacontiene unicamente true y false. Formalmente la complecion de reglas se hara con todaslas constructoras de la signatura, lo que implica que el numero de reglas de fallo para estafuncion depende del conjunto CS. Naturalmente, desde el punto de vista practico (en unaimplementacion) se hara uso de informacion de tipos para hacer esta complecion correctadesde el punto de vista de los dichos tipos; como efecto lateral, el numero de reglas dela complecion queda sustancialmente reducido en general. Ası, en el ejemplo anterior, pormuy grande que sea CS, la transformacion serıa en cualquier caso la que hemos presentado.

Para la funcion if then else en CRWL tenemos la definicion:

if true then E1 else E2 → E1

if false then E1 else E2 → E2

En este caso las cabezas ya cubren todos los casos de constructoras y la transformacionsera simplemente:

Page 105: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.1 Preliminares 105

if true then E1 else E2 � {E1}if false then E1 else E2 � {E2}

Ası pues, el algoritmo para obtener un COIS-CRWL-programa a partir de un CRWL-programa sigue el mismo esquema que el presentado en la Definicion 5 (pagina 69), conla diferencia de que ahora se hace una complecion1 de las reglas de programa: los casos 2y 3 de dicha definicion quedan intactos y el caso 1 se reemplaza por el siguiente:

1. Alguna posicion u en V P (f(s)) es uniformemente demandada por Q (si hayvarias, elegir cualquiera).Sea X la variable de la posicion u en f(s) y C = {c1, . . . , ck} el conjunto de sımbo-los de contructora en la posicion u en las cabezas de las reglas de Q, y sea D ={d1, . . . , dl} el conjunto complementario de constructoras de C, esto es, D = CS−C.Definimos los nuevos patrones de las reglas como: sci = s[X/ci(Y )], donde Y unam-tupla de variables frescas (siendo ci ∈ CSm); y para las reglas de fallo definimossdj

= s[X/dj(Z)], donde Z es una m′-tupla de variables frescas (siendo dj ∈ CSm′).

Para cada i ∈ {1, . . . , k} definimos el conjunto Qci como el conjunto de reglas de Qque demandan la constructora ci en la posicion u.

Devolver ∆(Qc1 , f(sc1) ∪ . . . ∪ ∆(Qck , f(sck)) ∪ {f(sd1) → F, . . . , f(sdl) → F}

Es facil ver que el COIS-CRWL-programa P ′ obtenido con esta nueva version del algo-ritmo es una ampliacion del OIS-CRWL-programa P obtenido con el algoritmo original,es decir, P ⊆ P ′. Como consecuencia [P]⊥ ⊆ [P ′]⊥,F. Ademas, el conjunto de reglas nuevasque incorpora P ′ con respecto a P, i.e. P ′ − P corresponde a la complecion en sentidopropio: toda regla del conjunto P ′ − P corresponde a un caso de fallo y sera de la formaf(t) � {F}. Por ejemplo, si aplicamos ahora el algoritmo de transformacion al Ejem-plo 5 (pagina 70) tendremos la transformacion que muestra el Cuadro 4.1 y aplicando latransformacion de la Definicion 6 (pagina 74) obtenemos el SRLF-programa:

f(a,X) � {a} ∪ {f1(a,X)}f(b, a) � {c}f(b, b) � {F}f(b, c) � {F}f(c, Z) � {F}

f1(a, a) � {F}f1(a, b) � {b}f1(a, c) � {F}

Este conjunto de reglas es igual al que se obtendrıa para el Ejemplo 5 aplicando la Defi-nicion 6, pero ampliado con las reglas de fallo correspondientes a la complecion (que sontodas las que devuelven F como resultado).

En cuanto a la correccion de esta transformacion, el Teorema 2 sigue siendo cierto. Enparticular, el programa transformado ∆(P) proporciona la misma semantica que P conrespecto a CRWL para expresiones construidas sobre la signatura original. Notese que la

1La complecion, en el sentido indicado, no debe confundirse con la nocion de complecion de Clark [49]en el estudio de la negacion en PL [23].

Page 106: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

106 4. Semantica logica para el fallo

∆({f(a,X) → a, f(a, b) → b, f(b, a) → c}, f(Y,Z))︸ ︷︷ ︸por aplicacion de (1)

=

∆({f(a,X) → a, f(a, b) → b}, f(a, Z))︸ ︷︷ ︸por aplicacion de (2)

{f(c, Z) → F}∪

∆({f(b, a) → c}, f(b, Z))︸ ︷︷ ︸por aplicacion de (1)

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

∆({f1(a, b) → b}, f1(a, Z))︸ ︷︷ ︸por aplicacion de (1)

{f(c, Z) → F}∪

{f(b, b) → F} ∪ {f(b, c) → F}∪

∆({f(b, a) → c}, f(b, a))︸ ︷︷ ︸por aplicacion de (3)

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

{f1(a, a) → F} ∪ {f1(a, c) → F}∪

∆({f1(a, b) → b}, f1(a, b))︸ ︷︷ ︸por aplicacion de (3)

{f(c, Z) → F}∪

{f(b, b) → F} ∪ {f(b, c) → F}∪

{f(b, a) → c} =

{f(a,X) → a} ∪ {f(a, Z) → f1(a, Z)}∪

{f1(a, a) → F} ∪ {f1(a, c) → F}∪

{f1(a, b) → b}

{f(c, Z) → F}∪

{f(b, b) → F} ∪ {f(b, c) → F}∪

{f(b, a) → c} =

{f(a,X) → a, f(a, Z) → f1(a, Z), f1(a, a) → F, f1(a, c) → F, f1(a, b) → b,

f(c, Z) → F, f(b, b) → F, f(b, c) → F, f(b, a) → c}

Cuadro 4.1: Ejemplo de transformacion paso a paso

signatura original no contiene ninguno de los sımbolos de funcion auxiliares introducidospor la transformacion, ni tampoco fails , ni F (el fallo carece de sentido en el programaoriginal).

A partir de un COIS-CRWL-programa es inmediato obtener el SRLF-programa corres-pondiente aplicando la Definicion 7 (pagina 75). Si aplicamos la nueva transformacion alprograma del Ejemplo 6 obtenemos exactamente el mismo programa que en dicho ejemplo(la complecion no anade reglas en este caso). Veamos un ejemplo mas ilustrativo para lacomplecion:

Page 107: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.1 Preliminares 107

Ejemplo 7 Si consideramos el programa de los caminos en un grafo de la Seccion 2.3.1(pagina 28), el SRLF-programa obtenido mediante transformacion es el siguiente:

next(a) � {b} ∪ {c}next(b) � {c} ∪ {d}next(c) � {F}next(d) � {F}

path(X,Y ) �⋃α∈X==Y

⋃β∈

⋃γ∈next(X) path(γ,Y ) ifThenElse(α, true , β)

safe(X) � fails(path(X, d))

La funcion next agrupa todos los casos de definicion en las dos primeras reglas, quecorresponden a los arcos que parten de a y b. Las dos reglas de fallo corresponden a nodosde los que no parten arcos, i.e., c y d. Por otro lado, las funciones path y safe resultansencillamente de convertir a c-expresion el cuerpo de las originales.

La funcion (==) y el fallo

Recordemos la funcion (==) que vimos en la Seccion 3.1.3. En el marco SRL estafuncion devuelve true si se verifica la igualdad (sintactica) entre los terminos implicados yfalse si se verifica la desigualdad (conflicto de constructoras). En el nuevo marco con falloen el que estamos trabajando hay un posible valor mas, F, que correspondera al caso enque ni la igualdad, ni la desigualdad son demostrables. Para ser mas precisos y siguiendocon nuestra idea de “fallo constructivo”, la funcion (==) devolvera F cuando podamosdemostrar que ni la igualdad ni la desigualdad son demostrables. Esto ocurre, por ejemplocon la expresion s(z) == s(F). Ahora el fallo complica considerablemente la definicion dela funcion (==). Para clarificar la nueva semantica de esta funcion y establecer algunaspropiedades conviene introducir relaciones sobre terminos que, en particular, capturenaproximaciones a la negacion logica de la igualdad y la desigualdad.

Definicion 10 (Relaciones sobre TermV ,⊥,F) Dados t, t′ ∈ Term⊥,F definimos las si-guientes relaciones:

t ↓ t′ ⇔def t ≡ t′, t total y var(t) ∩ Γ = ∅

t ↑ t′ ⇔def t y t′ tienen un CS-conflicto

t 6↓ t′ ⇔def t o t′ contienen F como subtermino, o presentan un CS-conflicto

6↑ se define como la relacion simetrica mas pequena sobre Term⊥,F que satisface:

i) X 6↑ X, para todo X ∈ V − Γ

ii) F 6↑ t, para todo t ∈ Term⊥,F

iii) si t1 6↑ t′1, . . . , tn 6↑ t′n entonces c(t1, . . . , tn) 6↑ c(t′1, . . . , t

′n), siendo c ∈ CSn

Page 108: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

108 4. Semantica logica para el fallo

En primer lugar, notese que las relaciones son puramente sintacticas (atanen exclusi-vamente a la estructura sintactica de los terminos), y por tanto, decidibles. Por otro lado,el uso de variables de Γ en las relaciones ↓ y en 6↑ esta limitado2. En realidad, el calculo depruebas SRLF de la Seccion 4.1.2, que es el que hace uso de estas relaciones, garantizara laaplicacion de las mismas sobre terminos sin variables de Γ.

La relacion ↓ no es mas que la igualdad estricta o confluencia ./ que veıamos en laSeccion 3.1.1, pero ahora restringida a terminos totales. Analogamente, la relacion ↑ esla desigualdad <> restringida a terminos (posiblemente parciales). Ambas relaciones sonindiferentes a la presencia de F, que a todos los efectos se comporta como ⊥. Formaliza-remos este punto en el apartado a) i) de la Proposicion 11. Las otras dos relaciones 6↓ y 6↑son, como veremos, aproximaciones a la negacion logica de las primeras. Su definicion, quepuede parecer caprichosa en algunos aspectos, se justifica por la necesidad de que estasrelaciones verifiquen las propiedades recogidas en la Proposicion 11. Antes de formalizarestas propiedades trataremos de motivarlas de modo intuitivo.

En primer lugar, observemos que la relacion ↑ es una aproximacion a la negacion logicade ↓, que notaremos como (¬ ↓): si se tiene t ↑ t′, entonces ¬(t ↓ t′). Tambien la relacion 6↓es una aproximacion a (¬ ↓), pero en este caso se utiliza la informacion referente al fallo,i.e., los valores F: la relacion 6↓ puede leerse como “fallo de ↓”. De modo analogo, la relacion6↑ es una aproximacion a la negacion logica de ↑ que representa “fallo de ↑”. En ambos casoshablamos de aproximaciones puesto que capturan solo parcialmente las correspondientesnegaciones logicas. Por ejemplo, tenemos ¬(⊥ ↓ true): “no es cierto que ⊥ ↓ true”; pero nose tiene ⊥ 6↓ true. Formalizamos la conexion entre las distintas relaciones en los apartadosa) ii) y iii) de la Proposicion 11.

A la vista del parrafo anterior, podrıamos intentar extender la relacion 6↓ de modo que⊥ 6↓ true, pero entonces tenemos otro problema: se pierde la monotonıa. En terminos deinformacion la monotonıa significa que si hay suficiente informacion para decidir t 6↓ t ′,entonces cualquier refinamiento de la informacion de t y/o t′ debe preservar la relacion. Enconcreto, si en la expresion anterior, ⊥ 6↓ true, refinamos el indefinido ⊥, reemplazandolopor true deberıamos tener true 6↓ true. Pero esto es incompatible con el hecho de que 6↓aproxime (¬ ↓) puesto que se tiene true ↓ true. El apartado b) de la Proposicion 11 muestraque todas las relaciones ↓, 6↓, ↑ y 6↑ se preservan bajo refinamientos de informacion, i.e.,son monotonas. Es mas, en este mismo apartado se muestra que 6↓ y 6↑ son las “mejoresaproximaciones” a (¬ ↓) y (¬ ↑) respectivamente, al menos para terminos cerrados (sinvariables).

En el caso de terminos con variables hay que proceder con cautela. Por ejemplo, setiene ¬(X ↓ true), pero no se satisface X 6↓ true. El hecho de tener X 6↓ true violarıa unaintuicion basica acerca de las variables libres en las sentencias logicas: si X 6↓ true es cierto,deberıa serlo para cualquier valor (tomado del rango apropiado) por el que sustituyesemossus variables libres. En particular, sustituyendo X por true tendrıamos true 6↓ true, queevidentemente no es deseable (6↓ no aproximarıa (¬ ↓)). El apartado c) de la Proposicion 11muestra que efectivamente todas las relaciones ↓, 6↓, ↑ y 6↑ satisfacen este principio acerca

2El sentido que pudiera darse por ejemplo a la relacion α ↓ α, siendo α ∈ Γ es un tanto difuso, teniendoen cuenta que en general α aparecera en una indexacion de la forma

⋃α∈S1

S2, es decir, α esta asociada aun conjunto de valores que no esta garantizado que sean totales.

Page 109: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.1 Preliminares 109

de las sustituciones (totales para ↓ y ↑, y cualesquiera para 6↓ y 6↑).

Proposicion 11 Las relaciones ↓, ↑, 6↓, 6↑ satisfacen las siguiente propiedades:

a) Relaciones entre ↓, ↑, 6↓, 6↑: para todo t, t′, s, s′ ∈ Term⊥,F

i) t ↓ s⇔ t[F/⊥] ↓ s[F/⊥] y t ↑ s⇔ t[F/⊥] ↑ s[F/⊥]

ii) t ↑ s⇒ t 6↓ s⇒ ¬(t ↓ s)

iii) t ↓ s⇒ t 6↑ s⇒ ¬(t ↑ s)

b) Monotonıa: ↓, ↑, 6↓, 6↑ son monotonas, i.e., si t v t′ y s v s′ entonces: t < s⇒ t′ < s′,donde < ∈ {↓, ↑, 6↓, 6↑}. Ademas 6↓G y 6↑G son las mayores aproximaciones monotonasa ¬(↓G) y ¬(↑G) respectivamente, siendo <G la restriccion de < al conjunto determinos cerrados (i.e., sin variables) de Term⊥,F.

c) Sustituciones: ↓ y 6↑ son cerradas por sustituciones de Sust; 6↓ y ↑ son cerradas porsustituciones de Sust⊥,F, es decir:

• si < ∈ {↓, 6↑} se tiene t < s⇒ tθ < sθ para todo θ ∈ Sust;

• si < ∈ {↑, 6↓} se tiene t < s⇒ tθ < sθ para todo θ ∈ Sust⊥,F.

Demostracion: Probamos cada apartado por separado:

a) i) ◦ t ↓ s⇔ t[F/⊥] ↓ s[F/⊥]: dos terminos que satisfacen la relacion ↓ no puedencontener ⊥ ni F. Luego t = t[F/⊥] y s = s[F/⊥], y la equivalencia es trivial.

◦ t ↑ s⇔ t[F/⊥] ↑ s[F/⊥]: la relacion ↑ se satisface cuando los terminos tienenun CS-conflicto en alguna posicion p; como t y t[F/⊥] (s y s[F/⊥] respectiva-mente) tienen el mismo sımbolo de constructora en las mismas posiciones,la equivalencia es clara.

ii) La implicacion t ↑ s ⇒ t 6↓ s es clara a partir de las definiciones de ↑ y 6↓. Parat 6↓ s ⇒ ¬(t ↓ s) se tiene: si t 6↓ s, entonces o bien t o s contienen F, o t y stienen un CS-conflicto. En ambos casos se verifica t ↓ s.

iii) Para t ↓ s⇒ t 6↑ s: si t ↓ s entonces t = s con t ∈ Term y se tiene t 6↑ s aplicandorepetidamente i) y iii) de la definicion de 6↑. Para t 6↑ s⇒ ¬(t ↑ s) supongamost 6↑ s y razonemos por induccion sobre la profundidad p de t:

p = 0: si t = ⊥ o t = F entonces t y s no pueden tener un CS-conflicto, luegono se verifica t ↑ s. Si t = X o t = c ∈ CS0 entonces t 6↑ s implica que s = F

o s = t; en cualquier caso t y s no pueden tener ningun CS-conflicto y t ↑ s nopuede ser cierto.

p⇒ p+ 1: si t = c(t1, . . . , tn), entonces, o bien s = F y t ↑ s no se cumple, obien s = c(s1, . . . , sn), con ti 6↑ si para todo i ∈ {1, . . . , n}; en este caso, por h.i.no hay un par (ti, si) con CS-conflicto, luego t y s no presentan CS-conflictoalguno, y entonces no puede ser t ↑ s.

b) Probamos la monotonıa para cada una de las relaciones:

Page 110: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

110 4. Semantica logica para el fallo

• para ↓: por definicion de ↓, si t ↓ s entonces t, s ∈ Term; esto quiere decir queson maximales con respecto a v, luego t = t′ y s = s′, y claramente t′ ↓ s′;

• para ↑: si t ↑ s entonces t y s tienen un CS-conflicto en alguna posicion. Comot v t′ y s v s′, entonces t′ y s′ tendran el mismo CS-conflicto en la mismaposicion, luego t′ ↑ s′;

• para 6↓: si t y s tienen un CS-conflicto, t′ y s′ tendran el mismo CS-conflicto,como en ii). Si alguno de ellos contiene F como subtermino, por definicion dev es claro que t′ o s′ tambien contendran F, luego t′ 6↓ s′;

• para 6↑: aquı procedemos por induccion sobre la profundidad p del termino t:

p = 0: veamos las posibilidades para t. Si t = X o t = c ∈ CS0, entonces t 6↑ simplica t = s o s = F; como t y s son maximales con respecto a v, entoncest′ = t y s′ = s, de modo que tambien tenemos t′ 6↑ s′. Si t = F entonces t′ = F yes claro que t′ 6↑ s′. Si t = ⊥ entonces tiene que ser s = s′ = F y es obvio quet′ 6↑ s′.

p⇒ p+ 1: en este caso t = c(t1, . . . , tn) y tambien s = F, que implica s′ = F yentonces t′ 6↑ s′, o bien s = c(s1, . . . , sn) con ti 6↑ si para todo i ∈ {1, . . . , n}.Como t v t′ y s v s′ se tiene t′ = c(t′1, . . . , t

′n) y s′ = c(s′1, . . . , s

′n), y por h.i.

t′i 6↑ s′i para todo i ∈ {1, . . . , n}, lo que implica t′ 6↑ s′.

Queda por probar que 6↓G y 6↑G son las mayores aproximaciones monotonas a ¬(↓G)y ¬(↑G) respectivamente. Denotaremos como GTerm⊥,F al conjunto de todos losterminos cerrados t ∈ Term⊥,F. Ahora estudiamos cada relacion por separado:

• para 6↓G, supongamos una relacion < ⊆ (GTerm⊥,F × GTerm⊥,F) que verifica

t < s⇒ ¬(t ↓G s)t v t′, s v s′, t < s⇒ t′ < s′

Debemos probar que < esta incluida en 6↓G, es decir: (t < s ⇒ t 6↓G s), paratodo t, s ∈ GTerm⊥,F. Razonamos por reduccion al absurdo: supongamos t < sy ¬(t 6↓G s). Entonces, por definicion de 6↓G, t y s no pueden contener F y nopueden presentar un CS-conflicto. Entonces, o bien t = s, o t y s son diferentesporque en algunas posiciones uno de ellos contiene ⊥, mientras que el otrotiene un subtermino distinto de ⊥. En ambos casos es facil ver que existe unu ∈ GTerm (totalmente definido) que refina a ambos, es decir, t v u y s v u.Por monotonıa de < se tiene u < u que implica ¬(u ↓G u), lo cual es unacontradiccion puesto que u ∈ Term;

• para 6↑G se procede de manera similar al apartado anterior: se asume una rela-cion < ⊆ (GTerm⊥,F × GTerm⊥,F) que satisface:

t < t′ ⇒ ¬(t ↑G t′)

t @ s, t′ v s′, t < t′ ⇒ s < s′

Debemos probar (t < s ⇒ t 6↑G s). Pero si t < s entonces ¬(t ↑G s), luego t ys no pueden tener ningun CS-conflicto. Podrıan contener F como subtermino,pero entonces por los ıtems ii) y iii) de la definicion de 6↑, se tendrıa t 6↑G s.

Page 111: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.2 El calculo de pruebas SRLF 111

c) El resultado es claro para ↓: si en un termino se sustituyen todas las ocurrencias deuna variable por un termino totalmente definido, el resultado es un termino total-mente definido. Para ↑, dicha sustitucion preserva los CS-conflictos de los terminosoriginales (de hecho, en este caso el resultado sigue siendo cierto con sustitucionesparciales).

Para 6↓, si alguno e los terminos originales contiene F como subtermino, es claroque la sustitucion preserva esas ocurrencias de F. Por otro lado, si presentan unCS-conflicto, es claro que ese conflicto se mantiene por aplicacion de la sustitucion.

Para 6↑, supongamos t 6↑ s y θ ∈ Sust⊥,F; procedemos por induccion sobre la profun-didad p del termino t:

p = 0: si t = F, entonces tθ = F y es claro que tθ 6↑ sθ. Para los casos t = X yt = c ∈ CS0 hay dos posibilidades para s: s = F o s = t; si s = F el resultadoes inmediato. Para el caso s = t, si t = s = X es sencillo ver que Xθ 6↑ Xθ poraplicacion repetida de i) y iii) de definicion de 6↑. El ultimo caso, si t = s ≡ c ∈ CS 0

es trivial porque θ no cambia los terminos.

p⇒ p+ 1: en este caso se tiene t = c(t1, . . . , tn). Si s = F la demostracion es comoen la base de la induccion; en otro caso s = c(s1, . . . , sn) con ti 6↑ si para todoi ∈ {1, . . . , n}. Por h.i. se tiene tiθ 6↑ siθ y entonces, por el apartado iii) de ladefinicion de 6↑ se tiene tθ 6↑ sθ. �

4.1.2. El calculo de pruebas SRLF

Estamos ya en disposicion de extender el calculo SRL de la Seccion 3.2.3 para manipularel fallo. En el Cuadro 4.2 se muestra dicha extension, SRLF. Comentamos algunos detallesde este nuevo calculo en relacion con el precedente:

las reglas 1 y 2 son identicas a las de SRL;

en la regla 3 tenemos que considerar el conjunto de constructoras extendido CS∪{F}(para poder demostrar {F} / {F});

en la regla 4, ahora las instancias de reglas de funcion pueden contener F;

las reglas 5 y 6 se han reformulado en funcion de ↓ y ↑ pero tienen el mismo signifi-cado;

las reglas 7 y 8 tambien son identicas. Al igual que hicimos en SRL aquı tambienpodemos considerar una version generalizada de la regla 8:

(8)Si1 / Ci1 Sin / Cin

S1 ∪ . . . ∪ Sn / Ci1 ∪ . . . ∪ Cin

siendo (i1, . . . , in) unapermutacion de (1, . . . , n)

Page 112: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

112 4. Semantica logica para el fallo

(1)S / {⊥}

S ∈ CExp⊥

(2){X} / {X}

X ∈ V

(3){t1} / C1 . . . {tn} / Cn

{c(t1, . . . , tn)} / {c(t′) | t

′∈ C1 × . . . × Cn}

c ∈ CS ∪ {F}

(4)S / C

f(t) / Csi C 6= {⊥} y (f(t)� S) ∈ [P]⊥,F

(5)t == t′ / {true}

si t ↓ t′

(6)t == t′ / {false}

si t ↑ t′

(7)S1 / C1 S2[α/C1] / C⋃

α∈S1S2 / C

(8)S1 / C1 S2 / C2

S1 ∪ S2 / C1 ∪ C2

(9)f(t) / {F}

para toda (f(s)� S ′) ∈ P,t y s tienen un CS ∪ {F}-conflicto

(10)t == t′ / {F}

si t 6↓ t′ y t 6↑ t′

(11)S / {F}

fails(S) / {true}

(12)S / C

fails(S) / {false}

si existe algun t ∈ Ccon t 6= ⊥, t 6= F

Cuadro 4.2: Calculo SRLF

la regla 9 es nueva y sirve para detectar el fallo en el paso de parametros de una lla-mada a funcion. Hay aquı un detalle sutil que conviene aclarar: los SRLF-programasque hemos definido en la Seccion 4.1.1 son completos, lo que significa que las cabezasde las reglas cubren todos los casos posibles de constructoras de CS; pero F quedaexcluido en dicha complecion. Entonces aun es posible que el paso de parametrosfalle debido a un fallo en los argumentos de llamada. Por ejemplo, consideremos el

Page 113: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.2 El calculo de pruebas SRLF 113

SRLF-programa:

f(z) � {z}f(s(z)) � {F}

g(z) � {F}g(s(z)) � {s(z)}

Consideremos la expresion f(g(z)), que en formato conjuntista sera:

⋃α∈g(z)f(α)

Es claro que g(z) / {F}, y entonces la c-expresion a reducir sera f(F). Esta llamadano encaja con ninguna cabeza del SRLF-programa y ası, mediante esta regla 9,obtendremos el fallo esperado para la expresion original f(g(z)).

De hecho, con SRLF-programas, todos los fallos en el paso de parametros se producenpor la presencia de un fallo en el patron de llamada, i.e., en la regla 9 el CS ∪ {F}-conflicto entre t y s se produce en una posicion en la que t contiene F y s unaconstructora de CS. Con este tipo de programas se consigue que, dejando a unlado la reduccion trivial por la regla 1, la regla de programa utilizada para reduciruna llamada a funcion sea unica (por ser programas inductivamente secuenciales) siexiste, y si no, se reducira a fallo por la regla 9. En cualquier caso, las distintas vıasde reduccion indeterminista de CRWL quedan capturadas en una sola reduccion yen este sentido SRLF es determinista.

Este tecnicismo en la regla 9 sugiere otra posible solucion: completar los progra-mas utilizando F como una constructora mas, de modo que la regla 4 del calculocapture los fallos de la regla 9. Sin embargo, esta solucion plantearıa problemas enla construccion de la semantica operacional (narrowing) que veremos en la Seccion5.2 porque permitirıamos ligar las variables de una expresion con F, lo que se deseaevitar. Volveremos sobre esta cuestion en la Seccion 5.2;

la regla 10 recoge el caso del fallo de la funcion (==) expresado como conjuncionde las relaciones 6↓ y 6↑, que aproximan la negacion de ↓ y ↑ respectivamente. Elsignificado logico es claro: se puede probar que no se dan las relaciones ↓ ni ↑. Desdeel punto de vista de la estructura de los terminos, el significado es mas complejo:la conjuncion de t 6↓ s y t 6↑ s significa que t y s son identicos excepto posiblementeen las posiciones (de las que debe haber al menos una) en las que t o s contienen elsımbolo F;

finalmente, las reglas 11 y 12 establecen la semantica de la funcion fails(S): en primerlugar se reduce S; si se consigue el SAS {F} para ella significa que todo intento dereducir S efectivamente falla. Por el contrario si se obtiene un SAS con un terminoen forma normal de cabeza (un termino de la forma c(. . .) o X), entonces S puedereducirse a algun termino (no falla). Notese que los unicos SAS’s para S que noproporcionan suficiente informacion para reducir fails(S) son {⊥} y {F,⊥}.

Ejemplo 8 Como ejemplo de derivacion con este calculo consideremos de nuevo el ejem-plo de la Seccion 2.3.1 (pagina 28) y el SRLF-programa obtenido para el en el Ejemplo 7

Page 114: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

114 4. Semantica logica para el fallo

(pagina 106). Es facil ver que el nodo c es seguro de acuerdo con las definiciones, luego debepoder demostrarse la sentencia safe(c)/{true}. Mostramos a continuacion una derivacionpara esta sentencia. Por razones de espacio representamos la funcion if then elseen el formato prefijo iTe( , , ).

c == d / {false}(6)

next(c) / {F}(9)

· · ·path(F, d) / {F}⋃

γ∈next(c) path(γ, d) / {F}(7)

iTe(false, true, F) / {F}(4)

⋃β∈

⋃γ∈next(c) path(γ,d) iTe(false , true, β) / {F}

(7)

⋃α∈(c==d)

⋃β∈

⋃γ∈next(c) path(γ,d) iTe(α, true, β) / {F}

(7)

path(c, d) / {F}(4)

fails(path(c, d)) / {true}(11)

safe(c) / {true}(4)

Los pasos son suficientemente autoexplicativos. Para probar que c es seguro hay que probarque no hay camino de c a d, para lo cual se aplica la funcion path mediante la regla 4 deSRLF. Al final, la prueba se reduce a probar un fallo para la invocacion path(F, d) comomostramos a continuacion:

F == d / {F}(10)

⋃γ′∈next(F) path(γ

′, d) / {⊥}(1)

iTe(F, true,⊥) / {F}(9)

⋃β′∈

⋃γ′∈next(F) path(γ′ ,d) iTe(F, true, β ′) / {F}

(7)

⋃α′∈(F==d)

⋃β′∈

⋃γ′∈next(F) path(γ′ ,d) iTe(α′, true, β′) / {F}

(7)

path(F, d) / {F}(4)

Notese que en esta parte de la prueba se obtiene un fallo para la igualdad F == d mediantela regla 10. Tambien se deja indefinida la c-expresion

⋃γ′∈next(F) path(γ

′, d) por medio dela regla 1, puesto que al ser F el primer argumento de la llamada a iTe, la regla 9 produceun fallo con independencia del valor de dicho argumento.

De modo analogo a lo que hacıamos para SRL (Definicion 8), definimos ahora la de-notacion de una c-expresion en SRLF:

Definicion 11 (Denotacion de una c-expresion) La denotacion de una c-expresionS con relacion a un SRLF-programa P se define como:

[[S]] = {C | P `SRLF S / C}

Ademas, para establecer relaciones semanticas entre c-expresiones, nos resultara utilposteriormente una nocion mas afinada que tenga en cuenta la aplicacion de sustituciones:

Definicion 12 (Hiper-semantica de una c-expresion) Dado un programa P la hiper-semantica de una c-expresion S ∈ CExp⊥,F es una funcion [[[ ]]] que toma una sustituciontotal σ, y devuelve [[Sσ]]:

Page 115: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.3 Propiedades de SRLF 115

[[[S]]] = λσ ∈ Sust.[[Sσ]]

Algunas notas acerca de esta definicion:

en primer lugar, refleja mejor la equivalencia semantica entre c-expresiones que lasemantica habitual [[ ]]. Por ejemplo, consideremos las funciones f y g definidas como:

f(true) � {true} g(true) � {true}f(false) � {false} g(false) � {true}

Con la semantica habitual tenemos [[f(X)]] = [[g(X)]] = {⊥}, mientras que la hiper-semantica captura la diferencia entre ambas c-expresiones: tomando la sustitucionσ = [X/false ] tenemos [[f(false)]] = {⊥, false}, mientras que [[g(false)]] = {⊥, true};

la condicion σ ∈ Sust implica que σ no puede introducir ⊥ ni F y garantiza lapreservacion de la hiper-semantica en c-expresiones que incluyan ==. Por ejemplo,es deseable que [[[X == X]]] = {⊥, true}, pero si σ pudiese introducir ⊥ o F nopodrıamos garantizar Xσ == Xσ / {true} (el unico SAS que se puede obtener para⊥ == ⊥ o F == F es {⊥}).

4.1.3. Propiedades de SRLF

Presentamos a continuacion algunas de las propiedades mas importantes de SRLF.Muchas de ellas son esencialmente iguales a las que vimos para SRL en la Seccion 3.2. Lasdemostraciones de estas propiedades han sido completamente reconstruidas para el nuevomarco, pero por simplicidad solo expondremos aquellos detalles en los que difieren de lasdel marco SRL.

Proposicion 12 Si S /C entonces var(C)∩PV (S) = ∅ (y en particular var(C)∩PV (S) =∅).

Demostracion: La demostracion sigue el mismo esquema de induccion sobre la longitudl de la prueba S / C que en la Proposicion 4. En el caso base hay que considerar tambienlas pruebas f(t) / {F} y t == t′ / {F} por aplicacion de las reglas 9 y 10 de SRLF respec-tivamente, que no plantean ningun problema. Para el paso inductivo hay que considerarlas reglas 11 y 12, para las que el resultado es inmediato puesto que el SAS obtenido nocontiene variables. �

Proposicion 13 Para todo t ∈ Term⊥,F se tiene [[t]] = {{s} | s ∈ Term⊥,F con s v t}.Ademas todos los SAS’s de la denotacion se obtienen con las reglas 1, 2 y 3 de SRL.

Demostracion: La demostracion es analoga a la de la Proposicion 5, por induccion es-tructural sobre el termino t. En el caso base tenemos ahora la posibilidad t = F, queno supone ninguna traba. En el paso inductivo, para t = c(t1, . . . , tn), consideraremosti ∈ Term⊥,F en vez de t ∈ Term⊥ y la induccion se hace igual. �

Page 116: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

116 4. Semantica logica para el fallo

Corolario 6 Dado t ∈ Term⊥,F se tiene {t} / {t} utilizando unicamente las reglas 1, 2 y3 de SRL.

El resultado de cierre por sustituciones (Proposicion 7), tambien sigue siendo ciertopara c-expresiones con fallo. No obstante, la sustitucion aplicada continua siendo totaly sin fallo debido a la funcion (==): por ejemplo se tiene X == X / {true}, pero sireemplazamos X por un termino que contenga F no se podrıa obtener el valor true parala igualdad resultante.

Proposicion 14 Dadas S ∈ CExp⊥,F y θ ∈ Sust, si S / C entonces Sθ / Cθ.

Demostracion: Se procede por induccion sobre la longitud l de la prueba S / C como enla Proposicion 7. En el caso base l = 1 ahora tenemos algunas posibilidades mas que enSRL:

{F} / {F} por la regla 3: no plantea ninguna dificultad;

t == t′ / {F} por la regla 10: el resultado es consecuencia del apartado c) de laProposicion 11;

f(t) / {F} por la regla 11: t presenta CS ∪ {F}-conflicto con todas las cabezas delas reglas de programa, y es evidente que el conflicto se preserva bajo cualquiersustitucion.

El paso inductivo (l > 1) sigue siendo una aplicacion directa de la h.i. en el caso lasreglas 3, 7, 8, y tambien es directo el caso de las reglas 11 o 12. En el caso de la regla 4,la diferencia con respecto a la Propiedad 7 es que ahora la instancia de la regla aplicadaes de [P]⊥,F en vez de [P]⊥; por lo demas la demostracion es identica. �

Si tanto la c-expresion S como la derivacion S / C estuviesen libres de invocacionesa la funcion (==), la propiedad anterior sigue siendo valida para sustituciones generalesθ ∈ Sust⊥,F.

Otro resultado sobre sustituciones que nos interesa es el siguiente:

Proposicion 15 Dadas S,S ′ ∈ CExp⊥,F y t, t′ ∈ Term⊥,F tales que S v S ′ y t v t′, setiene S[X/t] v S ′[X/t′].

Demostracion: La demostracion es analoga a la de la Proposicion 8. La introduccionde la constante F tanto en la estructura de las c-expresiones como en las sustituciones nosupone ningun cambio sustancial en la demostracion. Pero la funcion fails sı que introduceun nuevo caso en la induccion estructural:

S = fails(S1), por lo que sera S ′ = fails(S ′1) con S1 v S ′

1. Por h.i. S1[X/t] v S ′1[X/t

′]y entonces fails(S1)[X/t] v fails(S ′

1)[X/t′]. �

Las dos extensiones de esta proposicion que expresamos en sendos Corolarios 2 y 3 enel capıtulo anterior siguen siendo validas en el marco SRLF:

Page 117: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.3 Propiedades de SRLF 117

Corolario 7 Dadas S,S ′ ∈ CExp⊥,F y σ, σ′ ∈ Sust⊥,F tales que S v S ′ y σ v σ′ entoncesSσ v S ′σ′.

Corolario 8 Dadas S,S ′ ∈ CExp⊥,F y C, C′ ⊆ Term⊥,F tales que S v S ′ y C v C′, setiene S[X/C] v S ′[X/C′].

Tambien se tiene el Lema de Elevacion analogo al del capıtulo anterior (Lema 3):

Lema 5 (Elevacion) Dadas S ∈ CExp⊥,F y σ, σ′ ∈ Sust⊥,F con σ v σ′, si Sσ / Centonces Sσ′ / C. Es mas, la prueba para la segunda sentencia se puede construir con lamisma longitud y estructura que la de la primera.

Demostracion: La prueba sigue el esquema de induccion sobre la longitud l de la pruebapara Sσ / C utilizado en el Lema 3. En el caso base hay que considerar la prueba {F} / {F}por la regla 3, que no plantea problema y tambien las pruebas:

f(t)/{F} por la regla 9: como σ no puede introducir ningun sımbolo de funcion, debeser S = f(s). Entonces f(s)σ v f(t)σ′ y si f(s)σ tiene conflicto con cualquier reglade programa tambien tiene conflicto con f(s)σ. Ası, tenemos la prueba f(s)σ ′ / {F}por la misma regla 9;

(t == s)σ / {F} por la regla 10 de SRLF: el resultado es una consecuencia inmediatade la monotonıa de las relaciones sobre terminos estudiada en la parte b) de laProposicion 11, ya que tσ v tσ′ y sσ v sσ′, luego (tσ == sσ) v (tσ′ == sσ′).

Para el paso inductivo, en el caso de la regla 4 el hecho de tomar las instancias dereglas de programa de [P]⊥,F en vez de [P]⊥ no supone ningun cambio sustancial en lademostracion. Para las reglas de la funcion fails tenemos dos nuevos casos:

si la prueba se hace por la regla 11 en l > 1 pasos, entonces debe ser S = fails(S ′)y Sσ = fails(S ′σ), con S ′σ / {F}. Por h.i. tambien se tiene una prueba para S ′σ′ /{F} con la misma longitud y estructura, y claramente tendremos una prueba parafails(S ′σ′) / {true} con la misma longitud y estructura que la de fails(S ′σ) / {true};

si la prueba se hace por la regla 12 en l > 1 pasos, de nuevo tenemos S = fails(S ′),Sσ = fails(S ′σ) y Sσ′ = fails(S ′σ′). Si fails(S ′σ) / {true} entonces debe ser S ′σ / Ccon t ∈ C, t 6= ⊥ y t 6= F. Por h.i. existe una prueba para S ′σ′ / C con la mismalongitud y estructura y entonces tambien existe una prueba para fails(S ′σ′)/{true}con la misma longitud y estructura que fails(S ′σ) / {true}. �

El Corolario 5 (pagina 90) de este Lema que obtenıamos en el capıtulo anterior per-manece intacto en el nuevo contexto.

El Lema de Monotonıa 4 queda igual, salvo que enunciado para c-expresiones con fallo:

Page 118: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

118 4. Semantica logica para el fallo

Lema 6 (Monotonıa de SRLF) Si S1, . . . ,Sn,S ∈ CExp⊥,F se tiene:

S1 v S, . . . ,Sn v SS1 / C1, . . . ,Sn / Cn

}⇒ existe C ⊆ Term⊥ tal que S / C y C1 v C, . . . , Cn v C

Demostracion: La demostracion sigue el mismo esquema que la del Lema 4 (pagina 91),utilizando la hipotesis adicional HH y por induccion sobre el multiconjunto de longitudes{{l1, . . . , ln}} de las pruebas S1 / C1, . . . ,Sn / Cn. Anotamos unicamente aquellos casos quese ven afectados por la introduccion del fallo:l1 = . . . = ln = 1 Tenemos los siguientes casos nuevos:

si alguna de las pruebas es de la forma {F} / {F}, por la regla 3, entonces debe serSi = S = {F}, y Ci = {F} por la misma regla 3. Y tambien por la misma reglaobtenemos C = {F};

si alguna de las pruebas es f(ti) / {F}, por la regla 9, esto significa que ti tiene unCS∪{F}-conflicto con todas las cabezas de las reglas del programa. Como f(ti) v S,S tiene la forma f(t), con ti v t, entonces t tiene el mismo conflicto. Por la mismaregla 9 podemos conseguir el SAS C = {F} para S.

Por otro lado, para el resto de c-expresiones Sj, como Sj v S debe ser Sj = f(tj),con tj v t. Podrıamos tener, en principio dos posibilidades:

• la tupla tj tiene el mismo sımbolo de constructora en la posicion del conflicto.Entonces el conflicto esta tambien presente en dicha tupla, y como nuestroprograma es inductivamente secuencial, la regla 9 es la unica aplicable, y Cj ={F}. Entonces Cj v C;

• la tupla tj podrıa contener ⊥ en la posicion del conflicto o en algun antepasado(prefijo de la posicion). Pero este caso no es posible utilizar la misma instanciade la regla de programa. De hecho, no es posible utilizar ninguna instancia delas reglas del SRLF-programa: todas las cabezas de las reglas tienen un sımbolode constructora diferente en esa posicion. En esta situacion, el SAS para f(tj)solo podrıa ser el trivial obtenido por la regla 1, pero esto contradice HH.

alguna de las pruebas es de la forma Si = ti == t′j / {F}, por la regla 10, es decir,ti 6↓ t

′i y ti 6↑ t

′i. Para todo j ∈ {1, . . . , n} debe ser Sj = tj == t′j y S = t == t′ con

tj v t y t′j v t′. Entonces, por monotonıa de las relaciones entre terminos (parte b)de la Proposicion 11 es sencillo ver que Cj = {F} para todo j ∈ {1, . . . , n} y C = {F}.

li > 1 para algun i ∈ {1, . . . , n}. Tenemos los siguientes casos afectados por la introducciondel fallo:

si alguna de las pruebas Si / Ci se hace por la regla 4 en la forma:

S ′θi / Cif(ti) / Ci

siendo Si = f(ti) la demostracion se hace igual que en el Lema 4 pero considerandola sustitucion θi ∈ Sust⊥,F.

Page 119: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.1.3 Propiedades de SRLF 119

si alguna de las pruebas Si/Ci se hace por la regla 11, entonces debe ser Si = fails(S ′i)

y tal prueba sera de la forma:

S ′i / {F}

fails(S ′i) / {true}

Entonces debe ser S = fails(S ′) con S ′i v S ′. Por h.i. S ′ / {F}, luego se puede

conseguir C = {true} por la regla 11. El resto de c-expresiones Sj’s deben ser dela forma fails(S ′

j), con S ′j v S ′. Por h.i. tenemos C ′

j v {F}. Entonces debe serC′j = {F}, lo que implica que la unica prueba posible para fails(S ′

j) proporciona elSAS Cj = {true} y claramente Cj v C para j ∈ {1, . . . , n}.

si alguna de las pruebas Si / Ci se hace por la regla 12, entonces Si = fails(S ′i) y

dicha prueba tendra la forma:

S ′i / C

′i

fails(S ′i) / {false}

tal que C′i contiene t 6∈ {⊥, F}. Debe ser S = fails(S ′) con S ′

i v S ′. Por h.i. S ′ / C′,con C′

i v C′. Entonces C ′ contiene un refinamiento t′ de t, i.e., t′ 6∈ {⊥, F}. Ası, parafails(S) podemos obtener el SAS C = {false} por la regla 12.

El resto de c-expresiones Sj’s deben ser de la forma fails(S ′j), con S ′

j v S ′. Por h.i.tenemos C ′

j v C′, y entonces la prueba para fails(S ′j) debe hacerse mediante la regla

12 y Cj = {false}. Ası, Cj v C para j ∈ {1, . . . , n}. �

Nota: la monotonıa, tal como se establece en este resultado se refiere al grado de evaluacionde las expresiones y no contradice el hecho de que la negacion como fallo finito en PL res-ponde a un razonamiento no monotono. En nuestro contexto, tambien es claramente ciertoque si “definimos mas” las funciones (i.e., si refinamos el programa anadiendole nuevasreglas), una expresion puede no producir fallo cuando previamente lo hacıa. Por ejemplo,dado un CRWL-programa unicamente con la regla f(z) → z, la expresion fails(f(s(z)))producira el valor true; pero si anadimos la regla f(s(z)) → s(z), la misma expresion ahorase reducira a false.

Los resultados de monotonıa y consistencia de los Teoremas 4 y 5 tambien quedanigual:

Teorema 6 (Monotonıa de SRLF) Sean dos c-expresiones S y S ′ tales que S v S ′. SiS / C entonces existe C ′ con C v C′ tal que S ′ / C′.

Teorema 7 (Consistencia de SRLF) Si S /C y S /C ′ entonces C y C ′ son consistentes.

Page 120: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

120 4. Semantica logica para el fallo

4.2. Relacion entre SRL y SRLF

Es evidente que no se tiene la equivalencia entre SRL y SRLF: las signaturas son distin-tas en ambos marcos debido a la introduccion del fallo en SRLF, en particular porque enSRLF hemos introducido la funcion fails. Pero incluso aunque considerasemos programassin fails, la diferencia de fondo es que SRLF es capaz de detectar fallos: algunos de los⊥ de las denotaciones de c-expresiones en SRL apareceran como F en la correspondientesdenotaciones de SRLF. De hecho, lo que ocurre es que SRLF refina las denotaciones conrespecto a SRL: SRLF es mas expresivo que SRL.

En esta seccion exploramos la relacion entre las denotaciones de las c-expresionesobtenidas con uno y otro calculo. Presentamos los resultados de correccion y completitudde SRLF con respecto a SRL y por ultimo un resultado que muestra formalmente que lasemantica del fallo es precisamente la que pretendıamos desde un principio: el fallo de unaexpresion significa que no puede obtenerse ninguna reduccion para esa expresion distintade la trivial ⊥ (tambien puede formularse en terminos de formas normales de cabeza).

Para simplificar la presentacion de estos resultados asumimos un CRWL-programa ylos correspondientes SRL-programa P obtenido por transformacion en SRL (algoritmo dela Seccion 3.2.2) y Pc obtenido por transformacion con complecion en SRLF (algoritmomodificado de la Seccion 4.1.1). Recordemos ademas que P ⊆ P c.

El siguiente resultado muestra que todos los SAS’s obtenidos en SRL pueden tambienobtenerse en SRLF.

Teorema 8 (Correccion de SRLF con respecto a SRL) Dada una c-expresion S de-finida sobre la signatura de P, tenemos:

P `SRL S / C ⇒ Pc `SRLF S / C

Demostracion: Se procede por induccion sobre la longitud l de la prueba P `SRL S / C:

l = 1 Las posibles pruebas en SRL son, en primer lugar: S / {⊥}, {X} / {X} y {c} / {c}(con c ∈ CS0), mediante las reglas 1, 2 y 3 respectivamente. Es claro que estas pruebaspueden hacerse exactamente igual en SRLF. Ademas, tambien pueden hacerse en un pasolas pruebas t == t′ / {true} siendo t ≡ t′ por la regla 7 y t == t′ / {false} por la regla 8si t y t′ presentan un CS-conflicto. Es obvio que la primera de ellas puede replicarse enSRLF con la regla 7; la segunda tambien puede hacerse con la regla 8 puesto que si t y t ′

tienen un CS-conflicto, entonces t ↑ t′.

l > 1 las posibles pruebas en l > 1 pasos en SRL son:

por la regla 3:

{t1} / C1 . . . {tn} / Cn{c(t1, . . . , tn)} / {c(t

′) | t

′∈ C1 × . . .× Cn}

Por h.i., para cada i ∈ {1, . . . , n} en SRLF podemos probar {ti} / Ci. Entonces porla regla 3 de SRLF podemos construir la prueba:

Page 121: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.2. Relacion entre SRL y SRLF 121

{t1} / C1 . . . {tn} / Cn{c(t1, . . . , tn)} / {c(t

′) | t

′∈ C1 × . . .× Cn}

por la regla 4 tendremos:

S / C

f(t) / C

utilizando la instancia (f(t) � S) ∈ [P]⊥. Como P ⊆ Pc esta misma instancia seencuentra tambien en [Pc]⊥,F. Entonces por h.i., en SRLF se puede probar S / C ycon la regla 4 de SRLF se puede construir la prueba f(t) / C ′.

por la regla 5:

S1 / C1 S2[α/C1] / C⋃α∈S1

S2[α/C1] / C

Por h.i. en SRLF tenemos S1 / C1 y utilizando tambien la regla 5 se construye laprueba

⋃α∈S1

S2 / C.

por la regla 6 en SRL tenemos:

S1 / C1 S2 / C2

S1 ∪ S2 / C1 ∪ C2

Por h.i. en SRLF podemos probar S1 / C1 y S2 / C2, y por la regla 6 de SRLF seconstruye la prueba S1 ∪ S2 / C1 ∪ C2. �

El resultado de completitud es esencialmente la implicacion inversa del teorema pre-vio, con algunos matices. Como ya se apunto en la Seccion 4.1.1 el sımbolo F de SRLFpuede reinterpretarse como ⊥ en la logica SRL. Esto quiere decir que una sentencia dela forma S / C en SRLF debe ser demostrable tambien en SRL al reemplazar los F por⊥. Por supuesto, para que lo anterior tenga sentido, la c-expresion S no debe contenerinvocaciones a la funcion fails (que carece de sentido en SRL). En realidad, el resultadoque nos interesa es para c-expresiones construidas sobre la signatura del SRL-programaP. Pero aunque inicialmente una c-expresion S construida sobre esta signatura no conten-ga sımbolos F, estos pueden obtenerse en subderivaciones posteriores y propagarse a lasc-expresiones mediante sustitucion al aplicar la regla 7 de SRLF. Por ello, para el resulta-do de completitud necesitamos un lema previo de caracter bastante tecnico que tenga encuenta este hecho.

Lema 7 Dada una c-expresion S construida sobre la signatura de P extendida con laconstructora F, se tiene:

Pc `SRLF S / C ⇒ P `SRL S [F/⊥] / C[F/⊥]

Page 122: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

122 4. Semantica logica para el fallo

Demostracion: Por induccion sobre la longitud l de la prueba S / C:

l = 1 Utilizando las reglas 1, 2 y 3 podemos construir las pruebas S/{⊥}, {X}/{X} y {c}/{c} (con c ∈ CS0) respectivamente, y el resultado es obvio puesto que el reemplazamiento[F/⊥] deja intacto el SAS. Por la regla 3 tambien podemos construir la prueba {F} / {F};aplicando el reemplazamiento [F/⊥] en ambos miembros tenemos {⊥}/{⊥} que se pruebapor la regla 1.

Por la regla 7 tenemos t == t′ / {true} siendo t ≡ t′ ∈ Term y en este caso, como F noesta involucrado, el resultado es directo. Por la regla 8 tenemos t == t′ / {false} siendot ↑ t′; en este caso t y/o t′ pueden contener F pero el CS-conflicto permanece inalteradopor el reemplazamiento [F/⊥] y se puede probar (t == t′)[F/⊥] / {false}.

Por la regla 9 tenemos f(t) / {F} y al aplicar el reemplazamiento la prueba que-dara f(t)[F/⊥] / {⊥}, que puede hacerse por la regla 1. Para la regla 10 el razonamiento estotalmente analogo.

l > 1 Las posibles pruebas en SRLF en l > 1 pasos son:

por la regla 3:

{t1} / C1 . . . {tn} / Cn{c(t1, . . . , tn)} / {c(t

′) | t

′∈ C1 × . . .× Cn}

Por h.i. en SRL tenemos {t1}[F/⊥] /C

[F/⊥]1 , . . . , {tn}

[F/⊥] /C[F/⊥]n y por la misma regla

3 se tiene {c(t1, . . . , tn)}[F/⊥] / {c(t

′) | t

′∈ C

[F/⊥]1 × . . . × C

[F/⊥]n }. Por otra parte, es

claro que

{c(t′) | t

′∈ C1 × . . .× Cn}

[F/⊥] = {c(t′) | t

′∈ C

[F/⊥]1 × . . .× C

[F/⊥]n }[F/⊥]

por la regla 4 tendremos en SRLF:

Sθ / C

f(t) / C

siendo f(s) � S ∈ P y θ ∈ Sust⊥,F tal que f(t) = f(s)θ. En primer lugar, por h.i.tenemos (Sθ)[F/⊥] / C[F/⊥].

Razonemos la forma de conseguir la instancia de regla apropiada para construir laprueba en SRL: como la cabeza de la regla f(s) no contiene F, es la sustitucion θla que introduce los sımbolos F necesarios para unificar con f(t); por otro lado, enla llamada f(t)[F/⊥] los sımbolos F se han reemplazado por ⊥. Consideremos θ [F/⊥]

definida de manera natural como Xθ[F/⊥] = (Xθ)[F/⊥] para toda variable X. Es claroque f(t)[F/⊥] = f(s)θ[F/⊥], luego la instancia que buscamos es f(t)[F/⊥] � S [F/⊥]

obtenida mediante la sustitucion θ[F/⊥]. Si la regla f(t) � S de la que tomamos lainstancia pertenece a P, entonces mediante la regla 4 y utilizando dicha instanciapodemos construir la prueba:

Page 123: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.2. Relacion entre SRL y SRLF 123

Sθ[F/⊥] / C[F/⊥]

f(t)[F/⊥] / C[F/⊥]

Por otra parte, si la regla f(t) � S no esta presente en P, debe ser porque es unaregla de fallo obtenida por complecion, es decir, S = {F}. Pero entonces, el SAS queobtenemos en SRLF es C = {F}, luego C [F/⊥] = {⊥} y es obvio que en SRL tenemosf(t)[F/⊥] / {⊥} por la regla 1.

por la regla 5 tenemos en SRLF la prueba:

S1 / C1 S2[α/C1] / C⋃α∈S1

S2 / C

En primer lugar, en SRL por h.i. se tiene S[F/⊥]1 /C

[F/⊥]1 . Por otro lado es facil ver que

S[F/⊥]2 [α/C

[F/⊥]1 ] = (S2[α/C1])

[F/⊥] y nuevamente por h.i. tendremos (S2[α/C1])[F/⊥] /

C[F/⊥]. Ası pues, la prueba que buscamos en SRL se hace por la regla 5 y es:

S[F/⊥]1 / C

[F/⊥]1 S

[F/⊥]2 [α/C

[F/⊥]1 ] / C[F/⊥]

⋃α∈S

[F/⊥]1

S[F/⊥]2 / C[F/⊥]

por la regla 6 en SRLF tenemos:

S1 / C1 S2 / C2

S1 ∪ S2 / C1 ∪ C2

Por h.i. en SRL tenemos S[F/⊥]1 /C

[F/⊥]1 y S

[F/⊥]2 /C

[F/⊥]2 , de donde es directo construir

la prueba (S1 ∪ S2)[F/⊥] / (C1 ∪ C2)

[F/⊥]. �

El siguiente teorema muestra el resultado de completitud que buscamos, en el que seconsidera una c-expresion construida sobre la signatura del SRL-programa P.

Teorema 9 (Completitud de SRLF con respecto a SRL) Dada una c-expresion Sconstruida sobre la signatura de P, tenemos:

Pc `SRLF S / C ⇒ P `SRL S / C[F/⊥]

Demostracion: Es una consecuencia directa del lema anterior puesto que simplementese ha restringido la signatura de la c-expresion S y ahora se tiene S [F/⊥] = S. �

Los dos siguientes resultados establecen formalmente el significado del fallo que hemosintroducido en PLF. En primer lugar el sımbolo F expresa una reduccion fallida en elsentido de que {⊥} es el unico SAS que podemos obtener en SRL.

Teorema 10 Dada una c-expresion S construida sobre la signatura de P, tenemos:

Page 124: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

124 4. Semantica logica para el fallo

Pc `SRLF S / {F} ⇒ (P `SRL S / S ⇔ C = {⊥})

Demostracion: Es consecuencia del Teorema 9 y del Teorema de Consistencia 7. �

La interpretacion formal de la funcion fails tambien es inmediata ahora, como conse-cuencia del teorema anterior:

Corolario 9 Dada una c-expresion S construida sobre la signatura de P, tenemos:

Pc `SRLF fails(S) / {true} ⇒ P `SRL S / {⊥}, es el unico SAS para S en SRL;

Pc `SRLF fails(S) / {false} ⇔ ∃C.P `SRL S / C, con t ∈ C − {⊥}

De acuerdo con la equivalencia entre CRWL y SRL del Teorema 3 estos resultados sig-nifican que los fallos que demuestra SRLF son en definitiva pruebas de indemostrabilidaden CRWL. La relacion del fallo con CRWL queda expresada en los resultados siguientes:

Proposicion 16 Dado un CRWL-programa P y su correspondiente SRLF-programa P,una expresion e y su correspondiente c-expresion e, se tiene:

P `SRLF e / {F} ⇒ P `CRWL e→ ⊥ es la unica aproximacion demostrable en CRWL.

Demostracion: Inmediata a partir de los Teoremas 10 y 3. �

Teorema 11 Dado un CRWL-programa P y su correspondiente SRLF-programa P, unaexpresion e y su correspondiente c-expresion e, se tiene:

P `SRLF fails(e) / {true} ⇒ P `CRWL e → ⊥, es la unica aproximacion para e enCRWL;

P `SRLF fails(e) / {false} ⇔ ∃t ∈ Term⊥.P `CRWL e→ t, con t 6= ⊥

Demostracion: Inmediata a partir del Corolario 9 y el Teorema 3. �

Con este ultimo resultado queda establecida formalmente la relacion semantica delfallo y la logica CRWL de partida, desde el punto de vista denotacional.

Terminamos el capıtulo con una pequena reflexion sobre la aproximacion al fallo quehemos llevado a cabo.

Page 125: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

4.3. Fallo finito y aproximaciones computables 125

4.3. Fallo finito y aproximaciones computables

Podrıamos plantearnos la implicacion inversa de la segunda parte del Teorema 11, quese enunciarıa como: dado un CRWL-programa P y su correspondiente SRLF-programa P,si P `CRWL e → ⊥ es la unica aproximacion demostrable para e entonces P `SRLF e / {F},es decir, [[e]]SRLF

P= {{⊥}, {F}}. Pero este resultado es falso. Como contraejemplo basta

tomar la funcion

loop → loop

Es obvio que loop → ⊥ es la unica aproximacion demostrable para loop en CRWL, perono se puede demostrar loop / {F} en SRLF.

En la Seccion 4.1.1 argumentamos que las relaciones 6↓ y 6↑ eran aproximaciones a lanegacion de ↓ y ↑ respectivamente, y que de hecho, no puede ser de otro modo (solopodemos conseguir aproximaciones). Con nuestro fallo ocurre algo similar a lo que sucedecon la hipotesis del mundo cerrado (vease la Seccion 1.3.2) en PL, que no es decidible y solopodemos aspirar a obtener una aproximacion computable del mismo como ya comentamosen la Seccion 1.4.

Incidimos nuevamente en este aspecto porque, a la vista de la semantica formal quehemos construido para el fallo, la situacion cambiarıa radicalmente si los programas, enten-didos como sistemas de reescritura, fuesen terminantes, i.e., si cualquier expresion pudiesereducirse a forma normal en un numero finito de pasos de reescritura. En este caso, notendrıamos una aproximacion al fallo sino el fallo: partiendo de un CRWL-programa ter-minante, el SRLF programa obtenido por transformacion tambien serıa terminante; siconsideramos la logica SRLF sin la regla 1, cualquier c-expresion puede reducirse a formanormal y ⊥ no interviene en ningun punto de la reduccion (SRLF sin la regla 1 exigeevaluacion estricta, se comporta de modo impaciente); la forma normal obtenida es unSAS maximal (sus elementos no contienen ⊥) y entonces que la c-expresion falle o noresulta ser una propiedad decidible.

En cierto modo esto no es decir mucho, ya que la terminacion es una propiedad muyrestrictiva en nuestro contexto. Pero si esta observacion no fuese cierta, intuitivamente “al-go irıa mal” en nuestra aproximacion. De alguna manera, la observacion anterior muestrala bondad de la aproximacion que hemos llevado a cabo.

Pero ni tan siquiera podemos afirmar que sea la mejor aproximacion. Por ejemplo,para la funcion loop anterior se podrıa incluir una regla especıfica en SRLF del siguientemodo:

loop / {F}

Esta nueva aproximacion serıa mejor que la nuestra: captura un caso mas de fallo. Ytambien es obvio que este tipo de extensiones pueden hacerse con todos los casos de no-terminacion que puedan deducirse con independencia de la logica SRLF. ¿Que quiere decirtodo esto?. Que nuestra aproximacion no es la mejor, pero que de hecho no existe la me-jor aproximacion. Nuestra aproximacion es razonablemente buena, lo suficiente como paracapturar todos los fallos producidos en ajuste de patrones. En el calculo SRLF se puedeapreciar que la raız del fallo esta en el ajuste de patrones de una llamada a funcion (regla9) o al resolver una igualdad entre terminos que ya contienen un fallo en su estructura

Page 126: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

126 4. Semantica logica para el fallo

sintactica (regla 10). En definitiva, los fallos se producen inicialmente en el ajuste de pa-trones y lo que hace nuestro calculo es propagarlos “coherentemente” al resto del computo.SRLF es capaz de detectar explıcitamente los posibles fallos en cualquier ajuste de pa-trones que desencadene una reduccion y darlos un tratamiento adecuado en el computoglobal.

Page 127: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 5

Semantica operacional: primer

acercamiento

Al igual que en [70, 71], ademas del calculo de pruebas, nos interesa ahora desarrollar unmodelo operacional o relacion de estrechamiento (“narrowing”) asociado al calculo SRLF.La necesidad del modelo operacional se debe a que SRLF es incapaz de ligar variables.Por ejemplo, dado el programa:

f(true) � {true}f(false) � {false}

pretendemos que la c-expresion f(X) sea reducible a {true} con la sustitucion [X/true] ytambien a {false} con la sustitucion [X/false ]. Pero SRLF no esta concebido para encontrartales sustituciones y para f(X) solo sera capaz de obtener el SAS {⊥}.

La relacion de estrechamiento que vamos a construir contiene un repertorio considera-ble de detalles tecnicos y para facilitar la comprension desglosamos esta construccion endos pasos. En este capıtulo descartamos la funcion (==): las c-expresiones no contienen(==) y en el calculo SRLF del Cuadro 4.2 de la pagina 112 prescindimos de las reglas quedefinen el comportamiento de la funcion (==), a saber, las reglas 5, 6 y 10. El contenidode este capıtulo es esencialmente el mismo que el de [114]. Despues, en el capıtulo siguienteextenderemos la relacion SNarr para tratar (==).

5.1. Preliminares

En el mecanismo operacional que vamos a estudiar necesitaremos hacer reducciones lo-cales, es decir, reducir sub-c-expresiones dentro de una c-expresion general. Esto es comunen programacion funcional en donde las subexpresiones sobre las que se opera en un pasolocal se denominan redex.

Una de las formas de plantear las reducciones locales en el ambito funcional es pormedio de contextos: la idea es asimilar la expresion a una aplicacion funcional cuyo argu-mento es la sub-expresion a reducir. Entonces, si se hace una reduccion sobre el redex y seaplica dicha funcion, el resultado es la expresion original donde se ha reemplazado el redex

Page 128: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

128 5. Semantica operacional: primer acercamiento

por el resultado de su reduccion. Este es el planteamiento que seguiremos nosotros y queformalizaremos en breve. La ventaja del mismo en nuestro caso es que, por un lado sirve anuestro proposito de expresar las reducciones locales; pero ademas, nos permitira probarla correccion y completitud del mecanismo operacional frente a la semantica denotacionalque proporciona SRLF.

Para establecer estos resultados, en particular la completitud, necesitaremos profun-dizar en esta idea de los contextos y obtener varios resultados puramente tecnicos. El usoque se hara de algunos de ellos es puntual al demostrar el Lema 9 y no nos extenderemosen su planteamiento, puesto que desde el punto de vista intuitivo no son muy sugerentes.

5.1.1. Contextos

La nocion de contexto que manejamos es analoga a la habitual en programacion fun-cional, pero en nuestro caso un contexto puede tener cualquier numero de argumentos.De manera informal, un contexto es una c-expresion que contiene huecos en los lugaresde ciertas sub-c-expresiones. Representaremos tales huecos como “[ ]”. Formalmente, lasintaxis de un contexto es:

C ::= S | [ ] | fails(C1) |⋃α∈C1

C2 | C1 ∪ C2

donde S es una c-expresion, y C1 y C2 son contextos. La primera alternativa correspondea una c-expresion completa (sin huecos), la segunda es un hueco en sı misma, y el resto esfacilmente comprensible a la vista de la sintaxis de las c-expresiones de la Seccion 4.1.1.

La mayorıa de las nociones asociadas a las c-expresiones que presentamos en la Sec-cion 3.2.1 son aplicables de manera inmediata a los contextos. Ası, hablaremos de con-textos totales o parciales, dependiendo de si contienen ⊥ (parciales) o no (totales). Dadoun contexto C los conjuntos de variables producidas y libres se notaran como PV (C) yFV (C) respectivamente. Las condiciones de unicidad en la indexacion de variables queimponıamos a las c-expresiones tambien son heredadas por los contextos.

Una caracterıstica interesante de los contextos es que pueden entenderse como funcio-nes aplicables a c-expresiones. Para perfilar esta idea necesitamos definir previamente laaridad |C| de un contexto C como el numero de huecos que contiene; formalmente:

|S| = 0

|[ ]| = 1

|fails(C1)| = |C1|

|⋃α∈C1

C2| = |C1| + |C2|

|C1 ∪ C2| = |C1| + |C2|

Interpretado como funcion, un contexto C de aridad n es una funcion que toma ncontextos C1, . . . , Cn como argumentos y devuelve otro contexto, resultante de rellenar los

Page 129: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.1.1 Contextos 129

huecos con los argumentos. Formalmente, la aplicacion de un contexto C de aridad n auna tupla de argumentos C1, . . . , Cn se notara como C [C1, . . . , Cn] y se define como1:

[ ] [C] = C

fails(C) [C1, . . . , Cn] = fails(C [C1, . . . , Cn])

(⋃α∈C C

′) [C1, . . . , Cn, C′1, . . . , C

′m] =

⋃α∈C [C1,...,Cn]C

′ [C ′1, . . . , C

′m], donde |C| = n

y |C ′| = m

(C∪C ′) [C1, . . . , Cn, C′1, . . . , C

′m] = (C [C1, . . . , Cn])∪(C ′ [C ′

1, . . . , C′m]), donde |C| =

n y |C ′| = m

Es facil ver que mediante renombramientos de variables en el contexto y en sus argumen-tos se puede conseguir que el contexto resultante cumpla las condiciones de unicidad devariables indexadas (vease la Seccion 3.2.1). En realidad, en todas las aplicaciones queharemos dichos renombramientos no seran necesarios y no insistiremos en esta cuestion.Notese que la aplicacion de un contexto C de aridad n a la tupla de contextos C1, . . . , Cnde aridades m1, . . . ,mn produce otro contexto de aridad m1 + . . . + mn. Naturalmente,si aplicamos este contexto C a una n-tupla de c-expresiones (contextos de aridad 0) elcontexto resultante tiene aridad 0, i.e., es una c-expresion.

La aplicacion de sustituciones a contextos tambien sigue las mismas pautas que paralas de c-expresiones (Seccion 3.2.1), con las mismas condiciones de aplicabilidad. Unapropiedad sencilla de la aplicacion de sustituciones es la siguiente:

Proposicion 17 Dado un contexto C de aridad n, las c-expresiones S1, . . . ,Sn y σ ∈Sust⊥,F se tiene:

(C [S1, . . . ,Sn])σ = Cσ [S1σ, . . . ,Snσ]

Demostracion: Se prueba facilmente por induccion sobre la estructura de C. �

Como apuntabamos en los preliminares, nuestro interes en los contextos se debe alas facilidades que proporcionan a la hora de manipular sub-c-expresiones dentro de c-expresiones. En este sentido serıa deseable que al reemplazar una sub-c-expresion por otracon la misma semantica dentro de una c-expresion, la c-expresion resultante tenga la mismasemantica que la original. Expresandolo con contextos: si tenemos dos c-expresiones S yS ′ tales que [[S]] = [[S ′]] y un contexto C de aridad 1, entonces [[C [S]]] = [[C [S ′]]]. Peroesta propiedad no es cierta en general. Por ejemplo, si consideramos un programa con lasreglas:

f(z) � {z}g(z) � {s(z)}

es facil ver que para las c-expresiones f(α) y g(α) se tiene [[f(α)]] = [[g(α)]] = {⊥}. Sinembargo, si consideramos ahora el contexto C =

⋃α∈{z}[ ] entonces tenemos C [f(α)] =

1Aquı se define la aplicacion total de contextos. Es posible generalizar la definicion para consideraraplicaciones parciales de los mismos; sin embargo, no necesitaremos tales aplicaciones y nos centramos enlas totales por simplicidad.

Page 130: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

130 5. Semantica operacional: primer acercamiento

⋃α∈{z} f(α) y C [g(α)] =

⋃α∈{z} g(α), cuyas denotaciones son respectivamente {{⊥}, {z}}

y {{⊥}, {s(z)}}.El mismo ejemplo sugiere que la solucion esta en reforzar las hipotesis: se necesita una

equivalencia semantica mas profunda entre S y S ′: la equivalencia de las hiper-semanticas(vease Definicion 12 en la pagina 114). Notese que en el ejemplo anterior no se da laigualdad [[[f(α)]]] = [[[g(α)]]], tomando por ejemplo θ = [α/z].

En definitiva, la propiedad de equivalencia semantica en contextos que buscamos es lasiguiente:

Lema 8 (Contextualizacion) Sean S y S ′ dos c-expresiones tales que [[[S]]] = [[[S ′]]].Entonces para todo contexto C de aridad 1 se tiene [[[C [S]]]] = [[[C [S ′]]]].

Demostracion: De acuerdo con la definicion de hiper-semantica, lo que debemos probares (C [S])σ / C ⇔ (C [S ′])σ / C para todo σ ∈ Sust⊥,F. Razonamos por induccion sobre laestructura del contexto C. Las posibles formas de C, teniendo en cuenta que |C| = 1 son:

C = [ ]: directo por las hipotesis del lema;

C = fails(C1): directo por h.i. y las reglas 11 y 12 de SRLF;

C =⋃α∈C1

S2: la prueba para (C [S])σ / C debe realizarse por la regla 7 de SRLFde la forma:

(C1 [S])σ / C1 S2σ[α/C1] / C⋃α∈(C1 [S])σ S2σ / C

Por h.i. (C1 [S])σ / C1 ⇔ (C1 [S ′])σ / C1, para todo σ y entonces la prueba para(⋃α∈C1 [S′] S2)σ / C tambien puede hacerse por la regla 7 con la misma forma;

C =⋃α∈S1

C1: la prueba para (C [S])σ / C debe realizarse por las reglas 7 y 8 deSRLF de la forma:

S1σ / {t1, . . . , tn}

(C1 [S])σ[α/t1] / C1 . . . (C1 [S])σ[α/tn] / Cn(C1 [S])σ[α/t1] ∪ . . . ∪ (C1 [S])σ[α/tn] / C1 ∪ . . . ∪ Cn⋃α∈S1σ

(C1 [S])σ / C1 ∪ . . . ∪ Cn = C

Por h.i. para todo σ se tiene (C1 [S])σ[α/ti]/Ci ⇔ (C1 [S ′])σ[α/ti]/Ci. Ası, la pruebapara

⋃α∈S1σ

(C1 [S ′])σ / C1 ∪ . . . ∪ Cn = C tiene la misma forma;

C = C1 ∪ S2 (el caso C = S1 ∪ C2 es similar): directo por la regla 8 de SRLF y lah.i. �

Este resultado es generalizable a contextos de aridad n: dado un contexto C de aridadn y las c-expresiones S1, . . . ,Sn,S

′1, . . . ,S

′n tales que [[[Si]]] = [[[S ′

i]]] para todo i ∈ {1, . . . , n},se tiene [[[C [S1, . . . ,Sn]]]] = [[[C [S ′

1, . . . ,S′n]]]. La demostracion puede hacerse por induccion

sobre la aridad n del contexto. El caso base es justo el lema anterior y el paso inductivono ofrece especial dificultad (no nos detenemos en los detalles porque este resultado nojuega ningun papel relevante en el desarrollo ulterior).

Page 131: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.1.2 Formas contextuales principales 131

La siguiente proposicion recoge otro resultado de contextualizacion, pero esta vez re-ferido al orden de aproximacion de c-expresiones: si en una c-expresion reemplazamos unade sus sub-c-expresiones por otra mas definida, entonces la c-expresion resultante esta masdefinida que la original. En terminos de contextos tenemos:

Proposicion 18 Dadas dos c-expresiones S y S ′ y un contexto C de aridad 1, si S v S ′

entonces C [S] v C [S ′].

Demostracion: Por induccion sobre la estructura de C, teniendo en cuenta que su aridades 1:

si C = [ ] entonces el resultado es directo;

si C =⋃α∈C′ S1, entonces C [S] v C [S ′] como consecuencia directa de h.i. y el caso

4 en el orden v para c-expresiones (Definicion 3, pagina 66);

si C =⋃α∈S1

C ′, entonces C [S] v C [S ′] nuevamente por h.i. y la definicion de delorden v para c-expresiones (parte 4);

si C = C ′ ∪ S1 entonces C [S] v C [S ′] por h.i. y la definicion del orden v parac-expresiones (parte 5). �

Tambien este resultado es susceptible de generalizacion a contextos de aridad n apli-cados a n c-expresiones, pero no lo utilizaremos en lo que viene.

5.1.2. Formas contextuales principales

Hay un tipo especial de contextos llamados contextos principales, cuya particularidades que no tienen huecos indexados, esto es, tienen todos los huecos al nivel mas alto de laestructura sintactica. Formalmente, la sintaxis de un contexto principal es:

C ::= [ ] |⋃α∈S C1 | C1 ∪ C2

donde S es una c-expresion, y C1 y C2 son contextos principales.La utilidad de este tipo de contextos es que permiten establecer un formato alternativo

para las c-expresiones como aplicacion de contextos a tuplas de terminos, de modo quetales tuplas reflejen la parte construida de las mismas. Dada una c-expresion S definimossu forma contextual principal (abreviado como f.c.p.) como2:

si S = {t}, la f.c.p. es [ ] [{t}];

si S = f(t), la f.c.p. es (⋃α∈f(t)[ ]) [{α}];

2Las nociones de contexto principal y forma contextual principal se presentaron por primera vez en[114] con ligeras diferencias con respecto a las expuestas aquı. En [114] una c-expresion en sı misma seadmite como contexto principal de aridad 0 y la forma contextual principal de una c-expresion funcionalf(t) o fails(S) era ella misma. La version expuesta aquı es mas sencilla de manejar y simplificara el trabajoen algunos puntos.

Page 132: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

132 5. Semantica operacional: primer acercamiento

si S = fails(S ′), la f.c.p. es (⋃α∈fails(S′))[ ])[{α}];

si S =⋃α∈S1

S2, suponiendo la f.c.p. para S2 es CS2 [{t1}, . . . , {tn}], entoncessera (

⋃α∈S1

CS2) [{t1}, . . . , {tn}];

si S = S1 ∪ S2, suponiendo las f.c.p.’s CS1 [{t1}, . . . , {tn}] y CS2 [{s1}, . . . , {sm}], setiene (CS1 ∪CS2) [{t1}, . . . , {tn}, {s1}, . . . , {sm}].

Es facil ver que en todos los casos el contexto CS es efectivamente un contexto principalde aridad n > 0 y que los argumentos son terminos construidos. Notese que, dada una c-expresion S, puede haber distintos contextos principales C y tuplas de terminos s1, . . . , smtales que S = C [{s1}, . . . , {sm}]. Sin embargo, la forma contextual principal de S, talcomo la hemos definido, determina unıvocamente un contexto principal CS y una tuplade terminos t1, . . . , tn. Por otra parte, la igualdad S = CS [{t1}, . . . , {tn}], vista comoaplicacion contextual, es una identidad trivial.

Representaremos frecuentemente una c-expresion por medio de su f.c.p. en lo suce-sivo. Por abuso de notacion, prescindiremos de las llaves ’{’ y ’}’ de los argumentos yescribiremos CS [t1, . . . , tn] o en ocasiones simplemente CS [t].

Una propiedad interesante para contextos principales y f.c.p.’s es la composicionalidad:

Proposicion 19 (Composicion de Contextos Principales) Dado un contexto prin-cipal C de aridad n y las c-expresiones S1, . . . ,Sn con f.c.p.’s CS1 [s1],. . . , CSn [sn] res-pectivamente, se tiene:

C [CS1 [s1], , . . . , CSn [s1]] = (C [CS1 , . . . , CSn ]) [s1 . . . sn]

Ademas, la expresion resultante (C [CS1 , . . . , CSn ]) [s1 . . . sn] es una f.c.p.

Demostracion: Por induccion sobre la estructura de C:

para el caso C = [ ], por definicion de aplicacion de contextos tenemos la secuenciade equivalencias: [ ] (CS1 [s1]) = CS1 [s1] = ([ ] [CS1 ]) [s1];

para el caso C = (⋃α∈S′ C1) tenemos la siguiente cadena de equivalencias:

C [CS1 [s1], , . . . , CSn [sn]] = (definicion de C)(⋃α∈S′ C1) [CS1 [s1], , . . . , CSn [sn]] = (h.i.)⋃α∈S′((C1 [CS1 , . . . , CSn ]) [s1, . . . , sn]) = (aplicacion de contextos)

(⋃α∈S′(C1 [CS1 , . . . , CSn ]) [s1, . . . , sn]) = (aplicacion de contextos)

((⋃α∈S′ C1) [CS1 , . . . , CSn ]) [s1, . . . , sn] = (definicion de C)

(C [CS1 , . . . , CSn ]) [s1, . . . , sn]

para el caso C = C1 ∪ C2 se tiene:

Page 133: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.1.3 Conjunto informacion de una c-expresion 133

C [CS1 [s1], . . . , CSn [sn], C′S′

1[s′1], . . . , CS′

m[s′m]] = (def. de C)

(C1 ∪ C2) [CS1 [s1], . . . , CSn [sn], C′S′

1[s′1], . . . , CS′

m[s′m]] = (apl. de cont.)

(C1 [CS1 [s1], . . . , CSn [sn]]) ∪ (C2 [C ′S′

1[s′1], . . . , CS′

m[s′m]]) = (h.i.)

(C1 [CS1 , . . . , CSn ]) [s1, . . . , sn] ∪ (C2 [CS′1, . . . , CS′

m]) [s′1, . . . , s

′m] = (apl. de cont.)

((C1 ∪ C2)[CS1 , . . . , CSn , C′S′

1, . . . , CS′

m]) [s1, . . . , sn, s

′1, . . . , s

′m] = (def. de C)

(C [CS1 , . . . , CSn , C′S′

1, . . . , CS′

m]) [s1, . . . , sn, s

′1, . . . , s

′m]

Y con esto han quedado cubiertos todos los casos. �

5.1.3. Conjunto informacion de una c-expresion

La informacion en nuestro ambito hace referencia a la parte construida de las expre-siones. De manera informal podemos decir que en el marco CRWL la informacion de untermino queda expresada por el termino mismo (de hecho, en CRWL no se proporciono unadefinicion formal de “informacion” de un termino). La informacion de una expresion podrıaobtenerse reemplazando las invocaciones a funcion por el indefinido ⊥. En contraste, enSRLF la complejidad de la estructura sintactica de las c-expresiones hace que tengamosque elaborar un poco mas esta idea de informacion. En nuestro marco conjuntista habla-remos de conjunto informacion: el conjunto informacion S ∗ de una c-expresion S es unconjunto de terminos que reflejan el esqueleto o parte construida de la misma. Formal-mente, definimos:

Definicion 13 Dada una c-expresion S, su conjunto informacion S ∗ ⊆ Term⊥,F se definecomo:

(f(t))∗ = (fails(S))∗ = {⊥}

({t})∗ = {t}

(⋃α∈S′ S)∗ = (S[α/⊥])∗

(S1 ∪ S2)∗ = S∗

1 ∪ S∗2

El primer caso responde a la idea conservadora de dejar indefinidas las llamadas afuncion (el SAS {⊥} esta siempre presente en cualquier denotacion). El tercer caso res-ponde a la misma idea, solo que ahora se dejan indefinidas las indexaciones. En rea-lidad tambien tiene perfecto sentido afinar un poco mas y reformular este caso como(⋃α∈S′ S)∗ = (S[α/(S ′)∗])∗; sin embargo, la definicion expuesta es suficiente para el uso

que haremos de esta nocion y es claramente mas sencilla de manejar.

Ejemplo 9 Para ilustrar esta nocion supongamos una funcion f de aridad 2, una cons-tructora c tambien de aridad 2 y la c-expresion siguiente:

S =⋃α∈{X} f(α, Y ) ∪

⋃β∈

⋃γ∈f(X,Y ){γ}

{c(β,X)}

Page 134: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

134 5. Semantica operacional: primer acercamiento

Aplicando la definicion anterior es facil ver que S ∗ = {⊥, c(⊥, X)}. El primer valor ⊥proviene de la llamada a funcion f(α, Y ) y el segundo c(⊥, X) es el resultado de reem-plazar la variable producida β por ⊥ en c(β,X). Notese que efectivamente refleja la parteconstruida de la c-expresion.

Hay una estrecha relacion entre el conjunto informacion y la f.c.p. de una c-expresion:dada una c-expresion S y su f.c.p. CS [t1, . . . , tn], el conjunto informacion S∗ es exacta-mente el conjunto resultante de reemplazar en {t1, . . . , tn} las variables producidas de Spor ⊥. En el ejemplo anterior, la f.c.p. para S es:

((⋃α∈{X}

⋃ψ∈f(α,Y )[ ]) ∪ (

⋃β∈

⋃γ∈f(X,Y ){γ}

[ ])) [ψ, c(β,X)]

Tomando el conjunto de argumentos {ψ, c(β,X)} y reemplazando las variables producidaspor ⊥ obtenemos {⊥, c(⊥, X)}, que efectivamente coincide con el conjunto informacion S ∗

obtenido en el ejemplo. Formalizando esta idea tenemos la siguiente caracterizacion parael conjunto informacion3:

Proposicion 20 Dada una c-expresion S y su f.c.p. CS [t1, . . . , tn] tenemos:

S∗ = {t1τ, . . . , tnτ}

donde τ queda definida como: ατ = ⊥ para toda α ∈ PV (S) y Xτ = X para todaX 6∈ PV (S).

Demostracion: Procedemos por induccion estructural sobre S:

si S = {t} con t ∈ Term⊥,F entonces S∗ = {t}. Por otro lado, la f.p.c. es [ ] [t] ycomo t no contiene variables producidas es claro que {tτ} = {t};

si S = f(t) entonces S∗ = {⊥} y la f.p.c. es⋃α∈f(t){α}, i.e., el conjunto de argu-

mentos es {α} y {ατ} = {⊥};

si S = fails(S) entonces S∗ = {⊥}, la f.p.c. es⋃α∈fails(S){α} y como antes {ατ} =

{⊥};

si S =⋃α∈S1

S2 entonces S∗ = (S2[α/⊥])∗. La f.c.p. de S ha de tener la forma(⋃α∈S1

CS2) [t1, . . . , tn] siendo CS2 [t1, . . . , tn] la f.c.p. de S2. Para la c-expresionS2[α/⊥], por la Proposicion 17 su f.c.p. es (CS2 [α/⊥]) [t1[α/⊥], . . . , tn[α/⊥]]. Aho-ra, por h.i. tenemos (S2[α/⊥])∗ = {t1[α/⊥]τ, . . . , tn[α/⊥]τ}, pero de hecho por ladefinicion de τ tenemos [α/⊥]τ = τ . Entonces es claro que S ∗ = {t1τ, . . . , tnτ};

3En [114], por limitaciones de espacio, se definıa el conjunto informacion segun esta caracterizacion.Posteriormente detectamos un error porque la definicion de f.c.p.’s ofrecida allı no era adecuada parahacer dicha caracterizacion. En concreto, el conjunto informacion no capturaba algunos terminos ⊥. Enel Ejemplo 9 visto arriba, segun las definiciones de [114] el conjunto informacion serıa {c(⊥, X)} (noincluye ⊥). No obstante, este lapsus no tuvo mayor trascendencia en el resto del citado trabajo (que sedesarrollo teniendo en mente la nocion correcta de conjunto informacion), ni en los siguientes, donde sesubsano el problema.

Page 135: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.1.3 Conjunto informacion de una c-expresion 135

si S = S1 ∪S2 tenemos S∗ = S∗1 ∪S∗

2 y la f.c.p. es (CS1 ∪CS2) [t1, . . . , tn, s1, . . . , sm]siendo CS1 [t1, . . . , tn] y CS2 [s1, . . . , sm] las f.c.p.’s de S1 y S2 respectivamente. Porh.i. tenemos que S∗

1 = {t1τ, . . . , tnτ} y S∗2 = {s1τ, . . . , smτ}, de donde es claro que

S∗ = {t1τ, . . . , tnτ, s1τ, . . . , smτ}. �

En la proposicion anterior es obvio, a la vista de la definicion de τ que el conjunto{t1, . . . , tn} esta mas refinado que {t1τ, . . . , tnτ}. Entonces tenemos el siguiente corolario:

Corolario 10 Dada una c-expresion S y su f.c.p. CS [t1, . . . , tn] tenemos:

S∗ v {t1, . . . , tn}

Demostracion: Inmediata a partir de la Proposicion anterior. �

Es facil intuir que el conjunto informacion S ∗ es un caso especial de SAS para S, enel sentido de que puede obtenerse sin evaluar ninguna llamada a funcion. Esto es lo quemuestra el resultado siguiente:

Proposicion 21 Dada una c-expresion S, se tiene S / S ∗. Es mas, este SAS puede ob-tenerse utilizando unicamente las reglas 1, 2, 3, 7 y 8 de SRLF, i.e., sin reducir ningunallamada a funcion.

Demostracion: Procedemos por induccion sobre la estructura de S:

si S = {t}, entonces S∗ = {t} y por el Corolario 6 se tiene S / {t} utilizando lasreglas 1, 2 y/o 3 de SRLF;

si S = f(t) o S = fails(S) tenemos S∗ = {⊥}, y obviamente S / {⊥} por la regla 1de SRLF;

si S =⋃α∈S1

S2 se tiene S∗ = (S2[α/⊥])∗; por h.i. S2[α/⊥] / (S2[α/⊥])∗ y entoncespor la regla 7 de SRLF se puede derivar:

S1 / {⊥} S2[α/⊥] / (S2[α/⊥])∗⋃α∈S1

S2 / (S2[α/⊥])∗

En definitiva⋃α∈S1

S2 / (⋃α∈S1

S2)∗ como pretendıamos;

si S = S1 ∪ S2 tenemos S∗ = S∗1 ∪ S∗

2 ; por h.i. S1 / S∗1 y S2 / S

∗2 y claramente por la

regla 8 de SRLF tenemos S1 ∪ S2 / (S1 ∪ S2)∗. �

Otra propiedad esperable es que el orden de aproximacion entre c-expresiones seatrasladable a los correspondientes conjuntos informacion:

Proposicion 22 Dadas dos c-expresiones S y S ′, si S v S ′ entonces S∗ v S ′∗.

Page 136: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

136 5. Semantica operacional: primer acercamiento

Demostracion: Probamos en primer lugar el resultado para c-expresiones simples (in-troducidas en la pagina 62) y lo extendemos despues a c-expresiones generales. Para c-expresiones simples procedemos por induccion sobre la estructura de S apoyandonos enla definicion del orden de aproximacion para c-expresiones (Definicion 3, pagina 66):

S = {⊥}: tenemos S∗ = {⊥} y el resultado es directo a partir del primer caso de ladefinicion del orden de aproximacion para c-expresiones;

S = {t}: debe ser S ′ = {t′} con t v t′ (segundo caso de la definicion) y el resultadoentonces es inmediato;

S = f(t) o S = fails(S ′): el resultado es trivial puesto que S∗ = {⊥};

S =⋃α∈S1

S2: debe ser S ′ =⋃α∈S′

1S ′

2 con S1 v S ′1 y S2 v S ′

2. Tenemos S∗ =

(S2[α/⊥])∗ y S ′∗ = (S ′2[α/⊥])∗. Por la Propiedad 15 se tiene S2[α/⊥] v S ′

2[α/⊥] ypor h.i. (S2[α/⊥])∗ v (S ′

2[α/⊥])∗ como pretendıamos.

Ahora extendemos el resultado para c-expresiones generales S = S1 ∪ . . . ∪ Sn y S ′ =S ′

1 ∪ . . .∪S ′m (siendo Si, S

′j c-expresiones simples): si S v S ′ entonces, por la definicion de

orden de c-expresiones, para todo i ∈ {1, . . . , n} existe j ∈ {1, . . . ,m} tales que Si v S ′j y

viceversa. Por otra parte, S∗ = S∗1 ∪ . . . ∪ S∗

n y (S ′)∗ = (S ′1)

∗ ∪ . . . ∪ (S ′m)∗, con lo que es

facil probar S∗ v (S ′)∗. �

Los conjuntos informacion tambien se comportan bien por contextualizacion en elsentido de la Proposicion 18:

Proposicion 23 Dadas dos c-expresiones S y S ′, y un contexto C de aridad 1, si S∗ v S ′∗

entonces (C [S])∗ v (C [S ′])∗.

Demostracion: Es un corolario inmediato de las Proposiciones 18 y 22. �

5.2. Estrechamiento de c-expresiones: la Relacion SNarr

En esta Seccion presentamos una relacion de estrechamiento para c-expresiones, es de-cir, una transformacion de c-expresiones que eventualmente proporcione una forma normalo resuelta para la c-expresion de partida. Ademas, dicha relacion debe calcular los valoresoportunos para las variables de la c-expresion inicial.

En primer lugar, una c-expresion en forma normal es una c-expresion de la forma:

{t1} ∪ . . . ∪ {tn}, donde t1, . . . , tn ∈ TermF

Recordemos que esta notacion es solo una construccion sintactica, un caso particular dec-expresion (en rigor no es una union de conjuntos como tal). Pero trivialmente puedereinterpretarse como el conjunto {t1, . . . , tn} en sentido propio (y aquı la sintaxis sı es lahabitual de conjuntos).

Al igual que en programacion funcional, una forma normal no contiene invocaciones afuncion y, en nuestro caso, tampoco uniones indexadas. Solo contiene terminos construidos,

Page 137: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.2. Estrechamiento de c-expresiones: la Relacion SNarr 137

que ademas deben ser totales, i.e., el valor indefinido ⊥ no puede aparecer en una formanormal. De hecho el valor ⊥ no tiene ningun sentido al nivel operacional que estamosdesarrollando. Por el contrario, F sı que puede formar parte de tales terminos; es mas, {F}es en sı mismo una forma normal lıcita (y muy interesante para nosotros).

El objetivo de un computo es evaluar una c-expresion S no cerrada en general (i.e.,que puede contener variables libres) y obtener como respuesta un par (S ′, θ), donde S ′ esuna forma normal (en definitiva un SAS) y θ establece las ligaduras oportunas para lasvariables libres de S.

Cntx C [S] θ

Cθ [S ′] si S θ

S ′

Nrrw1 f(t) θ |var(t)

Sθsi (f(s)� S) ∈ P , θ ∈ SustF es unu.m.g. para s y t con Dom(θ) ∩ Γ = ∅

Nrrw2 f(t) ε

{F}si para toda regla (f(s)� S) ∈ Ps y t tienen un CS ∪ {F}-conflicto

Fail1 fails(S) ε

{true} si S∗ = {F}

Fail2 fails(S) ε

{false} si existe t ∈ S∗ t 6= ⊥, t 6= F

Flat⋃α∈

⋃β∈S1

S2S3

ε

⋃β∈S1

⋃α∈S2

S3

Dist⋃α∈S1∪S2

S3 ε

⋃α∈S1

S3 ∪⋃α∈S2

S3

Bind⋃α∈{t} S ε S[α/t]

Elim⋃α∈S′ S

εS si α 6∈ FV (S)

Cuadro 5.1: Reglas de SNarr

Fijado nuestro objetivo, definimos un paso de estrechamiento del siguiente modo: dadoun SRLF-programa P, dos c-expresiones totales S y S ′, y una sustitucion θ ∈ Sust, unpaso de estrechamiento tiene la forma:

S θ′

S ′

donde θ

es la relacion de estrechamiento SNarr para c-expresiones definida segun

las reglas del Cuadro 5.1 y θ es la sustitucion respuesta (ε denota la sustitucion identidad,definida como Xε = X, para todo X ∈ V).

El cierre transitivo S∗ θ

S ′ de la relacion SNarr se define de la manera habitual

Page 138: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

138 5. Semantica operacional: primer acercamiento

como:

S = S0 θ1

S1 θ2

. . . θn

Sn = S ′

siendo θ = θ1θ2 . . . θn la sustitucion respuesta de la derivacion.

A continuacion comentamos las reglas de la relacion SNarr:

la regla Cntx permite seleccionar como redex cualquier sub-c-expresion de la c-expresion de partida, para dar un paso de estrechamiento. Para ello, la c-expresionoriginal se expresa como una aplicacion contextual de la forma C [S], donde S esla sub-c-expresion que se toma como redex. La sustitucion θ calculada en la sub-derivacion debe aplicarse tambien al contexto C.

En principio, nada impedirıa obtener una nueva sub-c-expresion de la sub-c-expresionS utilizando la propia regla Cntx (y ası tantas veces como se quiera). Sin embargo,es inmediato ver que la sub-c-expresion sobre la que finalmente se da un paso deestrechamiento en sentido propio (utilizando una de las otras reglas) podrıa obtenersemediante una unica aplicacion de Cntx. Por ejemplo, utilizando las funciones doubley coin del Ejemplo 4 (pagina 63) consideremos la c-expresion:

⋃α∈coin

⋃β∈coin add(α, β)

Para estrechar la segunda llamada a coin, utilizando la regla Cntx podemos consi-derar la aplicacion contextual:

(⋃α∈coin)︸ ︷︷ ︸C

[⋃β∈coinadd(α, β)

︸ ︷︷ ︸S

]

Ahora, dentro del argumento S utilizando nuevamente Cntx podemos expresar Scomo:

(⋃β∈[ ]add(α, β)

︸ ︷︷ ︸C′

) [coin︸︷︷︸S′

]

y a continuacion aplicar otra regla para reducir coin. Estas dos aplicaciones de Cntxpueden abreviarse a una sola aplicacion interpretando la c-expresion de partida como:

(⋃α∈coin

⋃β∈[ ]add(α, β)

︸ ︷︷ ︸C

) [coin︸︷︷︸S

]

En lo sucesivo, en especial en algunas demostraciones, asumimos que la regla Cntxno se aplica mas de una vez consecutiva al dar un paso de estrechamiento (o bien,que las aplicaciones sucesivas se reemplazan por una unica aplicacion, como en elejemplo anterior);

Page 139: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.2. Estrechamiento de c-expresiones: la Relacion SNarr 139

la regla Nrrw1 esta asociada a la regla 4 del calculo SRLF y su cometido es estrecharuna llamada a funcion utilizando una regla de programa. Para ello se utiliza un u.m.g.θ que unifica la cabeza de la llamada con la de la regla. La notacion θ |var(t) se lee

como “θ restringida a las variables de t” y denota una sustitucion que se comportacomo θ sobre var(t) y como la identidad en otro caso. Esto es un detalle tecnico paraque la sustitucion respuesta obtenida solo refleje las ligaduras de las variables libresde la c-expresion original (el u.m.g. puede contener ligaduras para variables frescasde la cabeza de la regla de programa utilizada que no interesan en la respuesta final).

Hay otros dos matices importantes en este unificador θ:

• por un lado, no puede afectar a variables de Γ (condicion Dom(θ) ∩ Γ = ∅).Estas variables juegan un papel muy distinto del de las variables libres como sevio en la Seccion 3.2.1 y estan protegidas frente a la unificacion. De hecho, launica regla que puede aplicar sustituciones sobre ellas es Bind;

• por otro lado, el unificador θ en principio puede introducir fallos (θ ∈ SustF).Estos fallos pueden estar presentes en la cabeza de la llamada f(t), pero no enla de la regla f(s) y al utilizar reglas de cabeza lineal, es facil probar que lasustitucion respuesta θ|var(t) (que es la que nos interesa en ultima instancia)

esta libre de fallos4.

En este punto tiene interes retomar la discusion que iniciamos en la Seccion4.1.2 referente a la complecion de programas. En concreto, al comentar la regla9 de SRLF (pagina 112) decıamos que la complecion de programas no consi-deraba F como una constructora mas. Si lo hiciesemos, la regla Nrrw1 podrıaligar variables libres de las c-expresiones con F (y la sustitucion respuesta noestarıa libre de fallos). Por ejemplo, si partimos de un programa con la funcionf(true) → true; f(false) → false, la complecion serıa:

f(true) � {true}f(false) � {false}f(F) � {F}

y al reducir la llamada f(X), utilizando la ultima regla obtendrıamos la formanormal {F} con la sustitucion [X/F]. El significado que hemos buscado paraF desde el principio en este trabajo es “fallo en la reduccion”, sin embargo,en esta sustitucion el termino F al que se liga X no proviene de ningun fallode reduccion. Entonces, ¿que interpretacion o que intuicion podrıamos aportaren este caso?. Admitir sustituciones de este tipo no plantea una incorreccionen sentido riguroso, pero oscurece el comportamiento de los programas: en elejemplo anterior, con el programa original en CRWL no hay ningun fallo enla reduccion de f(X) y no tiene mucho sentido “inventar” fallos artificiales ennuestro marco.

4Si las cabezas de las reglas no fuesen lineales la sustitucion θ|var(t) podrıa introducir fallos. Por ejemplo,con una cabeza no lineal como f(X, X) y la llamada f(F, Y ), el u.m.g. tendrıa que ligar X = F.

Page 140: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

140 5. Semantica operacional: primer acercamiento

Por ultimo, observemos que al ser θ un u.m.g., su dominio queda restringido a lasvariables de t y las de s, y estas ultimas se pueden siempre tomar frescas (ajenas alcomputo en curso);

la regla Narr2 juega aquı el mismo papel que la regla 9 de SRLF: como el programase completa sin la constante F, si la llamada contiene F puede no existir ningunaregla de programa con la que hacer la reduccion;

las reglas Fail1 y Fail2 son contrapartidas directas de las reglas 11 y 12 de SRLF. Enla regla Fail1 podrıamos haber prescindido del conjunto informacion amparandonosen la siguiente propiedad (que no demostramos puesto que no es relevante en lo quesigue): si el conjunto informacion de una c-expresion es {F} entonces tal c-expresiones reducible a F. Sin embargo, el hecho de utilizar el conjunto informacion permiteanticipar el fallo por simple analisis de la estructura de la c-expresion, evitandoposiblemente pasos de reduccion.

En la regla Fail2 la situacion es distinta, ya que no utilizar el conjunto informacion nosolo danarıa la pereza del mecanismo de computo, sino que producirıa incompletitudde SNarr con respecto a SRLF. Por ejemplo, consideremos la funcion:

g �⋃α∈g{s(α)}

(la definicion correspondiente en CRWL serıa g → s(g)). Es claro que la c-expresiong no produce fallo de acuerdo con nuestra construccion y en SRLF es sencillo probarla sentencia fails(g) / {false}. Para conseguir que el calculo operacional pueda hacerla reduccion correspondiente tenemos que utilizar el conjunto informacion, ya queno podemos esperar un SAS totalmente definido para g (la denotacion de g es[[g]] = {s(⊥), s(s(⊥)), s(s(s(⊥))), . . .});

por ultimo las reglas Flat, Dist, Bind y Elim reflejan directamente algunas pro-piedades de los conjuntos en el sentido matematico usual. Intuitivamente es facil verque todas ellas reducen la complejidad estructural de la c-expresion.

Un aspecto elegante de esta relacion es que el calculo de la sustitucion θ se haceexclusivamente en la regla Nrrw1; en todas las demas reglas la sustitucion es vacıa. Unaprimera propiedad sencilla es que si S se estrecha a S ′ con sustitucion respuesta θ, entoncesS ′ ya tiene aplicada la sustitucion θ, i.e., S ′θ = S ′. Formalmente:

Proposicion 24 Si S θ

S ′ entonces S ′θ = S ′.

Demostracion: La unica regla que introduce una sustitucion no trivial es Narr1 (la reglaCntx puede propagar la sustitucion, pero no introducirla), y en este caso, el resultado esinmediato puesto que θ es idempotente. �

Como corolario inmediato tenemos:

Page 141: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 141

Corolario 11 Si S∗ θ

S ′ entonces S ′θ = S ′.

Veamos ahora un ejemplo de derivacion con la relacion SNarr:

Ejemplo 10 Para ilustrar la forma de una derivacion con SNarr consideremos de nuevoel Ejemplo 7 de la pagina 106. Antes de nada, recordemos que por ahora no disponemosde la funcion (==); en su lugar utilizamos una funcion de igualdad para nodos definida’ad hoc’ en el programa de manera natural como:

eq(a, a) � {true} eq(a, b) � {false} . . . eq(a, d) � {false}

· · ·eq(d, a) � {false} eq(d, b) � {false} . . . eq(d, d) � {true}

El nodo c es seguro de acuerdo con las definicion de safe, luego la c-expresion safe(X)deberıa producir la respuesta {true} con la sustitucion [X/c], entre otras. Mostramos lasecuencia de pasos de esta derivacion en el Cuadro 5.2 numerando las c-expresiones que sevan obteniendo en cada uno de ellos. El redex seleccionado en cada paso aparece subrayadoy anotamos a la derecha la regla de SNarr utilizada. Por simplicidad hemos omitido lasaplicaciones de la regla Cntx y utilizamos la funcion iTe (con notacion prefija) comoabreviatura de la funcion if then else habitual.

La sustitucion [X/c] se encuentra en el paso 3 por aplicacion de la regla Nrrw1 utili-zando la regla de programa eq(c, d)� {false}. Despues, la regla Bind reemplaza la variableproducida α por este valor false, con lo que puede evaluarse la funcion iTe. Observemostambien como en el paso 12 se produce un fallo por la regla Nrrw2 al evaluar eq(F, d),ya que no existe ninguna regla de programa cuya cabeza case con esta llamada. Lo mismoocurre en el paso 14 con la invocacion a iTe(F, true,E).

Hemos mostrado una de las cuatro posibles reducciones que pueden hacerse para la c-expresion safe(X), pero la relacion SNarr permite tambien encontrar el resto de respuestasesperadas: ({false}, [X/a]), ({false}, [X/b]) y ({false}, [X/d]).

5.3. Correccion y completitud de la relacion SNarr con res-

pecto a SRLF

Siguiendo el esquema de [70, 71], en esta seccion abordamos la relacion entre el calculode pruebas SRLF y la relacion de estrechamiento SNarr.

En el resultado de correccion basicamente queremos mostrar que la relacion SNarrpreserva la semantica de las c-expresiones, naturalmente teniendo en cuenta la sustitucion

utilizada en el paso de derivacion: si S θ

S ′ entonces Sθ y S ′ son semanticamente

equivalentes. Este resultado se probara por induccion sobre la regla de SNarr aplicada,pero para ello necesitamos reforzar la hipotesis de induccion y en consecuencia el resultadode correccion en sı. En este punto es donde queda plenamente justificada la nocion dehiper-semantica de la Definicion 12 (pagina 114). Lo que probaremos de hecho es que se

Page 142: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

142 5. Semantica operacional: primer acercamiento

(1) safe(X) ε

(Nrrw1)

(2) fails(path(X, d)) ε

(Nrrw1)

(3) fails(⋃α∈eq(X,d)

⋃β∈

⋃γ∈next(X) path(γ,d) iTe(α, true , β))

[X/c](Nrrw1)

(4) fails(⋃α∈{false}

⋃β∈

⋃γ∈next(c) path(γ,d) iTe(α, true , β))

ε(Bind)

(5) fails(⋃β∈

⋃γ∈next(c) path(γ,d) iTe(false , true, β))

ε(Nrrw1)

(6) fails(⋃β∈

⋃γ∈next(c) path(γ,d){β}) ε (Flat)

(7) fails(⋃γ∈next(c)

⋃β∈path(γ,d){β}) ε (Nrrw1)

(8) fails(⋃γ∈next(c)

⋃β∈

⋃τ∈eq(γ,d)

⋃µ∈

⋃ν∈next(γ) path(ν,d) iTe(τ,true,µ){β}) ε (Flat)

(9) fails(⋃γ∈next(c)

⋃τ∈eq(γ,d)

⋃β∈

⋃µ∈

⋃ν∈next(γ) path(ν,d) iTe(τ,true,µ){β}) ε (Flat)

(10) fails(⋃γ∈next(c)

⋃τ∈eq(γ,d)

⋃µ∈

⋃ν∈next(γ) path(ν,d)

⋃β∈iTe(τ,true,µ){β}) ε (Nrrw1)

(11) fails(⋃γ∈{F}

⋃τ∈eq(γ,d)

⋃µ∈

⋃ν∈next(γ) path(ν,d)

⋃β∈iTe(τ,true,µ){β}) ε (Bind)

(12) fails(⋃τ∈eq(F,d)

⋃µ∈

⋃ν∈next(F) path(ν,d)

⋃β∈iTe(τ,true,E){β}) ε (Nrrw2)

(13) fails(⋃τ∈{F}

⋃E∈

⋃ν∈next(F) path(ν,d)

⋃β∈iTe(τ,true,E){β}) ε (Bind)

(14) fails(⋃E∈

⋃ν∈next(F) path(ν,d)

⋃β∈iTe(F,true,E){β}) ε (Nrrw2)

(15) fails(⋃E∈

⋃ν∈next(F) path(ν,d)

⋃β∈{F}{β}) (Elim)

(16) fails(⋃β∈{F}{β}) ε (Bind)

(17) fails({F}) (Fail1)

(18) {true}

RESPUESTA: ({true}, [X/c])

Cuadro 5.2: Una derivacion para safe(X)

Page 143: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 143

preserva la hiper-semantica. El resultado que exponemos es una version mas elaborada delque proporcionabamos en [114].

Teorema 12 (Correccion de SNarr) Dadas S,S ′ ∈ CExp y θ ∈ Sust se tiene:

S∗ θ

S ′ ⇒ [[[Sθ]]] = [[[S ′]]] (y por tanto [[Sθ]] = [[S ′]])

Demostracion: Es suficiente probar el resultado para un paso simple de derivacion; la ex-tension a n pasos de derivacion es una sencilla induccion sobre n. Para probar la correccionde un paso procedemos por distincion de casos sobre la regla de SNarr aplicada:

Cntx Como ya se apunto en la Seccion 5.2 en relacion a esta regla, su aplicacion reitera-da puede simplificarse a una sola aplicacion de la misma. Ası pues, asumimos una

derivacion de la forma C [S] θ

C [S ′] de modo que la regla aplicada para la

reduccion S θ

S ′ es otra diferente de Cntx y estaremos en alguno de los casos

posteriores. Entonces tenemos [[[Sθ]]] = [[[S ′]]] y por el Lema 8 directamente se tiene[[[Cθ [Sθ]]]] = [[[Cθ [S ′]]]].

Nrrw1 Asumimos f(t) θ|var(t)

Sθ utilizando una regla f(s) � S del programa tal que θ

es un u.m.g. para s y t con Dom(θ) ∩ Γ = ∅. Entonces tenemos f(t)θ = f(s)θ ytambien f(t)θσ = f(s)θσ para cualquier σ ∈ SustF,⊥. Por la regla 4 de SRLF laprueba f(t)θσ / C se reduce a Sθσ / C, ası que es claro que la denotacion de f(t)θσes la misma que la de Sθσ para cualquier σ, esto es, [[[f(t)θ]]] = [[[Sθ]]]. Por otra parte,tambien es obvio que f(t)θ|var(t) = f(t)θ, luego [[[f(t)θ|var(t)]]] = [[[Sθ]]], que es lo quequerıamos probar.

Nrrw2 Asumimos f(t) ε

{F} y que f(t) tiene un CS ∪ {F}-conflicto con todas las

cabezas de las reglas de P. Entonces cualquier σ preserva el conflicto y por la regla 4de SRLF podemos derivar f(t)σ / {F}. De hecho, por consistencia (Teorema 7) estees el unico SAS no trivial para f(t)σ, el mismo que para la c-expresion {F} (σ noafecta a F), luego [[[f(t)]]] = [[[{F}]]].

Fail1 Si fails(S) ε

{true} con S∗ = {F}, por la Proposicion 21 tenemos S / {F} y a su

vez, por la Proposicion 14 dada cualquier σ ∈ Sust tenemos Sσ / {F}. Por la regla11 de SRLF podremos construir la prueba:

Sσ / {F}

fails(Sσ) / {true}

Por consistencia (Teorema 7) se tiene [[fails(Sσ)]] = {{⊥}, {true}}, y esto para cual-quier σ ∈ Sust, luego claramente [[[fails(S)]]] = [[[{true}]]].

Page 144: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

144 5. Semantica operacional: primer acercamiento

Fail2 Asumimos fails(S) ε

{false} con t ∈ S∗−{⊥, F}. Por la Proposicion 21 tenemos

S / S∗ y a su vez, por la Proposicion 14 dada cualquier σ ∈ Sust tenemos Sσ / S ∗σ.Ahora bien, si tenemos t ∈ S∗ −{⊥, F}, como σ no puede introducir ⊥ ni F, es claroque tσ ∈ S∗σ − {⊥, F}. Ası pues, por la regla 12 de SRLF podremos construir laprueba:

Sσ / S∗σfails(Sσ) / {false}

siendo t ∈ S∗σ−{⊥, F}. Ademas, por consistencia (Teorema 7) se tiene [[fails(Sσ)]] ={{⊥}, {false}}, y esto para cualquier σ ∈ Sust, luego [[[fails(S)]]] = [[[{false}]]] comose pretendıa.

Flat Para una derivacion de la forma⋃α∈

⋃β∈S1

S2S3

ε

⋃β∈S1

⋃α∈S2

S3 debemos

probar que para cualquier σ ∈ Sust se tiene la equivalencia:

⋃α∈

⋃β∈S1σ S2σ

S3σ / C ⇔⋃β∈S1σ

⋃α∈S2σ

S3σ / C

Para empezar, el SAS {⊥} puede obtenerse trivialmente para ambas c-expresiones.Veamos la forma de una derivacion no trivial en SRLF en ambos casos. Para laprimera, por la regla 7 aplicada dos veces tenemos:

S1σ / C1 S2σ[β/C1] / C2⋃β∈S1σ

S2σ / C2 S3σ[α/C2] / C3⋃α∈

⋃β∈S1σ S2σ

S3σ / C3

Mientras que para la segunda, podemos obtener el mismo SAS tambien mediantedos aplicaciones de la regla 7:

S1σ / C1

S2σ[β/C1] / C2 S3σ[α/C2] / C3

(⋃α∈S2σ

S3σ)[β/C1]) / C3⋃β∈S1σ

⋃α∈S2σ

S3σ / C3

Dist Para una derivacion de la forma⋃α∈S1∪S2

S3 ε

⋃α∈S1

S3 ∪⋃α∈S2

S3, de nuevo

estudiamos la forma de una derivacion no trivial en SRLF para ambas c-expresionesafectadas de una sustitucion σ cualquiera. Para la primera, por la regla 7 y despuesla 8 tenemos:

S1σ / C1 S2σ / C2

S1σ ∪ S2σ / C1 ∪ C2 S3σ[α/C1 ∪ C2] / C3,1−2⋃α∈S1σ∪S2σ

S3σ / C3,1−2

Page 145: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 145

Para la segunda, por aplicacion de la regla 8 y despues dos aplicaciones de la regla7 tenemos:

S1σ / C1 S3σ[α/C1] / C3,1⋃α∈S1σ

S3σ / C3,1

S2σ / C2 S3σ[α/C2] / C3,2⋃α∈S2σ

S3σ / C3,2⋃α∈S1σ

S3σ ∪⋃α∈S2σ

S3σ / C3,1 ∪ C3,2

Es inmediato identificar C3,1−2 = C3,1 ∪ C3,2.

Bind Consideremos una derivacion de la forma⋃α∈{t} S ε S[α/t]. Debemos probar

que para cualquier sustitucion σ se tiene la equivalencia:

⋃α∈{tσ} Sσ / C ⇔ S[α/t]σ / C

Naturalmente debe ser α 6∈ Dom(σ) para que σ cumpla las condiciones de aplicabi-lidad con respecto a la c-expresion de la izquierda. Como ademas es idempotente, laprueba del lado derecho es equivalente a Sσ[α/tσ] / C. Aparte de la prueba trivial,una prueba para el lado izquierdo debera realizarse por la regla 7 de SRLF:

{tσ} / C′ Sσ[α/C′σ] / C⋃α∈{tσ} Sσ / C

Ahora, para probar la implicacion de izquierda a derecha, por la Proposicion 13 debeser C′ = {t′}, con t′ v tσ. Entonces Sσ[α/C ′σ] = Sσ[α/t′] y [α/t′] v [α/tσ]. Por elLema 5 tenemos Sσ[α/tσ] / C.

Para la implicacion de derecha a izquierda, por la Proposicion 13 se tiene {tσ}/{tσ},y como Sσ[α/tσ] / C, por la regla 7 de SRLF podemos construir la prueba:

{tσ} / {tσ} Sσ[α/tσ] / C⋃α∈{tσ} Sσ / C

Elim Si⋃α∈S1

S2 ε

S, siendo α 6∈ FV (S), entonces por la regla 7 de SRLF la

denotacion de⋃α∈S1σ

S2σ es claramente la misma que la denotacion de S2σ porquela sustitucion [α/ . . .] no tiene ningun efecto. �

De acuerdo con este resultado, en el Ejemplo 10 de la pagina 141 si aplicamos lasustitucion [X/c] a todas las c-expresiones obtenidas en el proceso de derivacion, enton-ces todas ellas comparten la misma hiper-semantica. Y claramente, como consecuencia,tambien comparten la misma semantica.

Como es habitual en este tipo de calculos, el resultado de completitud es mas intrin-cado. En primer lugar abordamos un resultado preliminar que, en cierto sentido, permite“aplanar” las c-expresiones utilizando la relacion SNarr:

Page 146: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

146 5. Semantica operacional: primer acercamiento

Proposicion 25 (Aplanamiento) Sea C un contexto principal de aridad n y las c-expresiones S1, . . . ,Sn,S ∈ CExp. Es posible derivar:

⋃α∈C [S1,...,Sn] S

∗ ε

C [⋃α∈S1

S, . . . ,⋃α∈Sn

S]

utilizando unicamente las reglas Cntx, Flat y Dist de la relacion SNarr.

Demostracion: Procedemos por induccion estructural sobre el contexto C; dependiendode su estructura la c-expresion

⋃α∈C [S1,...,Sn] S puede tener las siguientes formas:

si es de la forma

⋃α∈[ ] [S1]

S

entonces es equivalente a

[ ]⋃α∈S1

S

y en 0 pasos de derivacion tenemos el formato buscado;

si es de la forma

⋃α∈

⋃β∈S′ C′

︸ ︷︷ ︸C

[S1,...,Sn] S

entonces por la regla Flat podemos derivar

⋃β∈S′

⋃α∈C′ [S1,...,Sn] S

Y por la regla Cntx y utilizando la h.i. podemos derivar

⋃β∈S′C ′

︸ ︷︷ ︸C

[⋃α∈S1

S, . . . ,⋃α∈Sn

S]

para el caso

⋃α∈(C1 ∪ C2)︸ ︷︷ ︸

C

[S1,...,Sn,Sn+1,...,Sm] S

esta c-expresion es equivalente a

⋃α∈(C1 [S1,...,Sn])∪(C2 [Sn+1,...,Sm]) S

(suponiendo |C1| = n y |C2| = m− n+ 1). Por la regla Dist obtenemos

Page 147: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 147

(⋃α∈C1 [S1,...,Sn] S) ∪ (

⋃α∈C2 [Sn+1,...,Sm] S)

Y ahora, por Cntx e h.i. obtenemos

(C1 [⋃α∈S1

S, . . . ,⋃α∈Sn

S]) ∪ (C2 [⋃α∈Sn+1

S, . . . ,⋃α∈Sm

S])

que es equivalente a

(C1 ∪ C2)︸ ︷︷ ︸C

[⋃α∈S1

S, . . . ,⋃α∈Sn

S,⋃α∈Sn+1

S, . . . ,⋃α∈Sm

S]

como se pretendıa. �

Como consecuencia obtenemos otro resultado tecnico:

Corolario 12 Sea CS [t1, . . . , tn] la f.c.p. de una c-expresion S y S ′ otra c-expresion.Entonces es posible derivar:

⋃α∈CS [t1,...,tn] S

′ ∗ ε

CS [S ′[α/t1], . . . ,S′[α/tn]]

utilizando unicamente las reglas Cntx, Flat, Dist y Bind de la relacion SNarr.

Demostracion: Utilizando la proposicion anterior, la c-expresion del lado izquierdo puedereducirse a CS [

⋃α∈{t1}

S ′, . . . ,⋃α∈{tn}

S ′] y ahora por Cntx y Bind podemos obtener la

c-expresion buscada CS [S ′[α/t1], . . . ,S′[α/tn]]. �

El resultado de completitud se ha dividido en dos lemas auxiliares, cada uno de loscuales tiene interes en sı mismo. En el primero nos olvidamos de las sustituciones, i.e.,es un resultado puro de reescritura (no de estrechamiento). Este resultado garantiza quecualquier SAS obtenido con SRLF es capturado por SNarr, no directamente, sino en formade conjunto informacion. En general, no podemos esperar que SNarr obtenga exactamenteel mismo SAS, ya que este puede contener terminos ⊥ que no pueden aparecer en ningunac-expresion derivada por SNarr. Lo que sı permite obtener es una c-expresion cuyo conjuntoinformacion refina el SAS obtenido con SRLF.

Para ilustrar la situacion supongamos las constructoras z y s para los naturales y lafuncion f → s(f), que en formato conjuntista sera f �

⋃α∈f{s(α)}. Con SRLF se puede

derivar f /{s(s(⊥))}, pero no podemos obtener este termino parcial con SNarr. Sin embar-go, tras unos pasos de derivacion para f podemos obtener la c-expresion

⋃α∈f{s(s(α))},

cuyo conjunto informacion es {s(s(⊥))}.Formalmente, este lema es:

Lema 9 Sea P un SRLF-programa y S una c-expresion. Si P `SRLF S /C, entonces existe

una SNarr-derivacion S∗ ε

S ′ tal que C v (S ′)∗.

Page 148: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

148 5. Semantica operacional: primer acercamiento

Demostracion: Procedemos por induccion sobre la longitud l de la derivacion SRLFS / C:

l = 1 En un paso las posibles derivaciones son S / {⊥} (regla 1), {X} / {X} (regla 2),{c}/{c} con c ∈ CS0∪{F} (regla 3) y f(t)/{F} donde f(t) tiene un CS∪{F}-conflicto contodas las reglas de f (regla 9). El primer caso es trivial; para los dos siguientes como {X}y {c} son formas normales, en 0 pasos de derivacion de SNarr se obtiene la c-expresion S ′

requerida; y para el ultimo caso, SNarr2 permite obtener la c-expresion {F}.

l > 1 Las posibles derivaciones son:

por la regla 3 la prueba es {c(t)} / {c(t′)}, siendo c(t

′) v c(t) por la Proposicion 13.

Con SNarr, en 0 pasos de derivacion y con θ = ε se obtiene la c-expresion {c(t)} querefina al SAS y obviamente {c(t

′)} v {c(t)};

por la regla 4 tenemos:Sσ / Cf(t) / C

siendo (f(s) � S) ∈ P y σ ∈ SustF (σ no introduce ningun ⊥ porque f(t) nocontiene ⊥) tal que f(s)σ = f(t). Es claro que σ |var(s) es un u.m.g. para f(t) y f(s),

y ademas Dom(σ) ∩ Γ = ∅. Entonces, por Nrrw1 podemos derivar f(t) ε

Por h.i., como Sσ / C entonces Sσ∗ ε

S ′ con C v (S ′)∗;

por la regla 11 tenemos:S / {F}

fails(S) / {true}

Por h.i. tenemos S∗ ε

S ′ tal que {F} v (S ′)∗, lo que significa que (S ′)∗ = {F}.

Por aplicacion (o aplicaciones) de Cntx tenemos fails(S)∗ ε

fails(S ′) y entonces

por la regla Fail1 obtenemos la c-expresion {true} como esperabamos;

por la regla 12 tenemos:S / {C}

fails(S) / {false}

siendo t ∈ C − {⊥, F}. Por h.i. podemos derivar S∗ ε

S ′ con C v (S ′)∗. Entonces

debe existir algun t′ ∈ (S ′)∗ tal que t v t′, lo que en particular significa que t′ 6∈{⊥, F}. Por otro lado, mediante (posiblemente varias aplicaciones) de la regla Cntx

podemos derivar fails(S)∗ ε

fails(S ′) y entonces por la regla Fail2 tenemos

fails(S ′)∗ ε

{false};

Page 149: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 149

por la regla 7 la derivacion sera:

S1 / C1 S2[α/C1] / C⋃α∈S1

S2 / C

Por h.i., como S1 / C1 podemos derivar S1∗ ε

S ′1 tal que C1 v (S ′

1)∗. Si la f.c.p.

de S ′1 es CS′

1[t1, . . . , tn] entonces por un lado, por el Corolario 10 tenemos (S ′

1)∗ v

{t1, . . . , tn}, luego C1 v {t1, . . . , tn}; por otro lado, por la regla Cntx podemosderivar:

⋃α∈S1

S2 ε

⋃α∈S′

1S2 =

⋃α∈CS′

1[t1,...,tn] S2

Esta c-expresion, por la Proposicion 25 puede aplanarse como:

CS′1

[S2[α/t1], . . . ,S2[α/tn]]

Por otra parte, en la SRLF-derivacion de partida se prueba S2[α/C1] / C y comoC1 v {t1, . . . , tn}, por el Corolario 8 se tiene S2[α/C1] v S2[α/{t1, . . . , tn}]; entoncespor el Teorema de Monotonıa 6 tenemos S2[α/{t1, . . . , tn}] / C′ con C v C′. Estaderivacion puede descomponerse mediante la regla 8 generalizada en n derivacionesde la forma S2[α/ti] / C

′i tales que C ′ = C′

1 ∪ . . .∪C′n. Nuevamente por h.i., para cada

i ∈ {1, . . . , n} tenemos:

S2[α/ti]∗ ε

Si2

tal que C′i v (S i2)

∗. Por la caracterizacion del conjunto informacion de la Proposicion20, si la f.c.p. de S i2 es CSi

2[si] tenemos (S i2)

∗ = {siτ} (donde τ reemplaza variables

producidas por ⊥), luego C ′ii v {siτ}. Por otro lado, utilizando Cntx podemos

integrar estos pasos de derivacion en la c-expresion completa para obtener S ′ delmodo siguiente:

CS′1[S2[α/t1], . . . ,S2[α/tn]]

∗ ε

CS′1[S1

2 , . . . ,Sn2 ] = CS′

1[CS1

2[s1], . . . , CSn

2[sn]] = S ′

De este modo S ′ es una composicion de contextos principales, que esta en las hipotesisde la Proposicion de Composicionalidad 19 y entonces podemos expresarla como lasiguiente f.c.p.:

(CS′1

[CS12, . . . , CSn

2])

︸ ︷︷ ︸CS′

[s1, . . . , sn]

Page 150: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

150 5. Semantica operacional: primer acercamiento

Nuevamente por la Proposicion 20 tenemos (S ′)∗ = {s1τ, . . . , snτ}. Ahora bien, paracada i ∈ {1, . . . , n} tenemos C ′

i v {siτ}, luego, uniendo conjuntos es claro que:

C′1 ∪ . . . ∪ C′

n︸ ︷︷ ︸C′

v {s1τ, . . . , snτ}︸ ︷︷ ︸(S′)∗

y como C v C ′ tenemos C v (S ′)∗ como pretendıamos;

por la regla 8 la derivacion tendra la forma:

S1 / C1 S2 / C2

S1 ∪ S2 / C1 ∪ C2

Por h.i. S1∗ ε

S ′1 tal que C1 v (S ′

1)∗ y S2

∗ ε

S ′2 tal que C2 v (S ′

2)∗. Entonces

por la regla Cntx podemos derivar:

S1 ∪ S2∗ ε

S ′1 ∪ S ′

2 = S ′

El conjunto informacion de esta c-expresion es (S ′)∗ = (S ′1)

∗ ∪ (S ′2)

∗ que claramenterefina a C1 ∪ C2 = C. �

Como complemento a este resultado, el siguiente se centra en las sustituciones obtenidaspor SNarr (sin referencia a SRLF). Esencialmente afirma que cualquier sustitucion θ quehaga reducible una c-expresion S es capturada o generalizada por otra sustitucion θ ′

obtenida de una derivacion a partir de S. Debemos matizar un par de aspectos: en primerlugar las sustituciones θ y θ′ a las que nos referimos deben ser totales y no introducir F (dehecho son estas las sustituciones relevantes en este punto). Por otro lado, la sustitucionθ′ generalizara a θ en todo el dominio V, salvo quiza en el conjunto de variables nuevasintroducidas en la derivacion, que denotaremos como Π. Tales variables provienen de lascabezas de las reglas de programa utilizadas para la derivacion (que se toman siemprefrescas) y el valor que tomen solo tiene interes local en el paso de derivacion concreto,pero no en la reduccion global, donde nos interesa exclusivamente lo que ocurre con lasvariables libres de la c-expresion de partida. Es mas, θ es la identidad sobre Π. En definitivalo que importa es que θ′ generaliza a θ sobre todas las variables excepto quiza las de Π,que expresamos como θ′ |V−Π � θ y que significa que existe una sustitucion µ tal que(θ′µ)|V−Π= θ. Ademas, la c-expresion S ′′ obtenida con la sustitucion θ′ tambien debegeneralizar a S ′, obtenida con θ.

El punto crıtico de este resultado es en los pasos de derivacion que se hacen con laregla Nrrw1, que son los susceptibles de generar una sustitucion θ no trivial. Veamos unejemplo para ilustrar la situacion:

Ejemplo 11 Asumimos las constructoras habituales z y s para los naturales y un pro-grama con la regla de funcion f(s(X), Y ) � {X}. Supongamos la invocacion f(A, s(B))

Page 151: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 151

afectada de la sustitucion θ = [A/s(s(C)), D/z] (en general el dominio de θ no tiene porque restringirse a las variables de la c-expresion a la que se aplica; por eso incluimos laligadura D/z), es decir, consideramos la c-expresion f(s(s(C)), s(B)). Por la regla Nrrw1

y utilizando la regla para f podemos reducir:

f(s(s(C)), s(B)) ε

{s(C)} = S ′

utilizando el u.m.g. σ = [X/s(C), Y/s(B)] para unificar las cabezas. Es evidente queDom(σ) ∩ Γ = ∅ como exige Nrrw1 y tambien que σ|var(f(s(s(C)),s(B)))= ε.

Ahora pretendemos generalizar la sustitucion θ con una derivacion para f(A, s(B)).Para esta c-expresion se puede reducir:

f(A, s(B)) [A/s(X)]

{X}S ′′

utilizando la sustitucion θ′ = [A/s(X), Y/s(B)] de modo que θ′|var(f(A,s(B)))= [A/s(X)].En este caso tenemos Π = {X,Y }. Para estudiar las generalizaciones pretendidas tomamosµ = [X/s(C), D/z]:

en primer lugar tenemos las equivalencias

(θ′µ)|V−Π= ([A/s(s(C)), Y/s(B), X/s(C), D/z])|V−Π= [A/s(s(C)), D/z]

por otro lado, S ′′µ = {X}[X/s(C), D/z] = {s(C)} = S ′

Luego, efectivamente se verifican las generalizaciones buscadas.

Formalmente el resultado que tenemos es el siguiente:

Lema 10 Sea S ∈ CExpF y θ ∈ Sust. Si Sθ∗ ε

S ′, entonces existe una derivacion

S∗ θ′

S ′′ con variables nuevas Π tal que para algun µ ∈ Sust se tiene:

θ = (θ′µ)|V−Π y

S ′ = S ′′µ,

Demostracion: Es suficiente probar el resultado para un paso de derivacion (la extensiona n pasos es una sencilla induccion sobre n). Razonamos entonces sobre la regla utilizadapara dar ese paso:

Cntx asumimos un paso de la forma Cθ [Sθ] ε

Cθ [S ′] de modo que la sub-derivacion

Sθ ε

S ′ se lleva a cabo mediante una regla de SNarr distinta de Cntx. Para esta

sub-derivacion (como probaremos en los puntos siguientes) se pueden determinar θ ′

Page 152: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

152 5. Semantica operacional: primer acercamiento

y µ tales que S θ′

S ′′ con θ = (θ′µ)|V−Π y S ′ = S ′′µ. Entonces por la propia

regla Cntx tenemos C [S] θ′

Cθ′ [S ′′]. Ahora tenemos que probar (Cθ′ [S ′′])µ =

Cθ [S ′]. La parte izquierda, por la Proposicion 17 es equivalente a Cθ ′µ [S ′′µ]. ComoC no contiene ninguna variable de Π se tiene Cθ ′µ = C(θ′µ)|V−Π= Cθ y por otrolado tenemos S ′′µ = S ′, luego Cθ′µ [S ′′µ] = Cθ [S ′] como esperabamos;

Nrrw1 suponemos una derivacion de la forma f(t)θ ε

Sσ = S ′, donde (f(s)� S) ∈ P

y σ es un u.m.g. para s y tθ, con Dom(σ) ∩ Γ = ∅. Entonces tenemos:

sσ = tθσ (i)

Es mas, como el paso de derivacion procede con la sustitucion ε, esto significa queσ|var(tθ)= ε. De hecho, Dom(σ) ⊆ var(s) = Π y como las variables de s son todasfrescas tenemos Dom(σ) ∩ (Ran(θ) ∪ var(t)) = ∅. Ası:

tθσ = tθ (ii)

Por otro lado, como las variables de s son frescas debe ser Dom(θ) ∩ var(s) = ∅,luego sθ = s, y tenemos:

sθσ = sσ (iii)

Uniendo los resultados (i), (ii) y (iii) tenemos tθσ = sθσ, i.e., θσ es un unificadorpara t y s. Entonces debe existir un u.m.g., θ ′, para ellos. Ası tenemos tθ′ = sθ′ yθ′ � θσ, lo que significa que existe µ tal que

θ′µ = θσ (iv)

Podemos utilizar este θ′ para dar un paso de derivacion de la forma:

f(t) θ′ |var(t)

Sθ′ = S ′′

Veamos que µ satisface las dos condiciones del enunciado:

• (θ′µ) |V−Π= θ: si tomamos X ∈ Π es obvio que X(θ′µ) |V−Π= X y como Xes fresca no puede pertenecer a Dom(θ), luego Xθ = X. Por otro lado, siX 6∈ Π tenemos X(θ′µ)|V−Π= Xθ′µ que es equivalente por (iv) a Xθσ y comoDom(σ) ⊆ Π y var(Xθ) ∩ Π = ∅ tenemos que Xθσ = Xθ como pretendıamos;

• S ′ = S ′′µ, es decir, Sσ = Sθ′µ: para el segundo miembro por (iv) tenemosSθ′µ = Sθσ y como θ no puede afectar a las variables de S que son frescastenemos Sθσ = Sσ;

Page 153: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

5.3. Correccion y completitud de la relacion SNarr con respecto a SRLF 153

Nrrw2 supongamos f(t)θ θ

{F}, de modo que f(t)θ tiene un CS∪{F}-conflicto con to-

das las cabezas de las reglas de f . Como el SRLF-programa es completo y las cabezascubren todos los casos de constructoras de CS, el conflicto debe producirse porquetθ tiene F en una posicion donde las cabezas de las reglas tienen una constructorade CS. La sustitucion θ no puede introducir este F, luego ya debe estar presente enf(t). Entonces f(t) presentara exactamente el mismo conflicto y se puede derivar:

f(t) ε

{F}

En este caso tenemos θ′ = ε, µ = θ y S ′ = S ′′ = {F};

Fail1 supongamos fails(S)θ ε

{true}, de modo que (Sθ)∗ = {F}. Como θ ∈ Sust no

puede introducir F ha de ser S∗ = {F}, y entonces claramente fails(S) ε

{true}.

En este caso tenemos S ′ = S ′′ = {true} y θ′ = ε, µ = θ;

Fail2 supongamos fails(S)θ ε

{false}, tal que existe t ∈ (Sθ)∗ − {⊥, F}. Entonces es

claro que debe existir t′ ∈ S∗ tal que t′ = tθ, luego t′ 6∈ {⊥, F} y se podra derivar

fails(S) ε

{false}. En este caso tenemos S ′ = S ′′ = {false} y θ′ = ε, µ = θ;

Flat este caso es inmediato tomando θ ′ = ε y µ = θ;

Dist igual que el anterior;

Bind si⋃α∈{tθ} Sθ ε Sθ[α/tθ], entonces tambien se deriva

⋃α∈{t} S ε S[α/t].

En este caso tenemos θ′ = ε y µ = θ. Por otro lado S ′ = Sθ[α/tθ] y S ′′ = S[α/t], ycomo θ es idempotente tendremos S ′′µ = Sθ[α/tθ];

Elim supongamos⋃α∈S′θ Sθ ε Sθ, con α 6∈ FV (S). Entonces, como θ no afecta a α,

esta variable no puede aparecer en S, luego se puede derivar⋃α∈S′ S

εS. En

este caso θ′ = ε y µ = θ. �

Uniendo los Lemas 9 y 10 obtenemos el resultado de completitud que buscamos: dadauna c-expresion S y una sustitucion θ, si SRLF permite probar Sθ / C entonces SNarrgeneraliza esta derivacion en dos sentidos. Por un lado generaliza la θ y por otro el conjuntoinformacion de la c-expresion obtenida generaliza a C. Formalmente:

Page 154: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

154 5. Semantica operacional: primer acercamiento

Teorema 13 (Completitud de SNarr) Sea un SRLF-programa P, S ∈ CExpF y θ ∈

Sust. Si P `SRLF Sθ / C entonces existe una SNarr-derivacion S∗ θ′

S ′ con variables

nuevas Π tal que para algun µ ∈ Sust se tiene:

θ = (θ′µ)|V−Π y

C v (S ′µ)∗

Demostracion: Si Sθ / C entonces por el Lema 9 podemos derivar Sθ∗ ε

S1 tal que

C v S∗1 . Por el Lema 10 existe una derivacion S

∗ θ′

S ′ con variables nuevas Π tal que

θ = (θ′µ)|V−Π y S1 = S ′µ para algun µ ∈ Sust. Entonces tenemos C v (S ′µ)∗ = S∗1 . �

Este resultado, a pesar de su caracter tecnico muestra la capacidad deductiva de SNarr.Por ejemplo, consideremos de nuevo los Ejemplos 8 y 10 de las paginas 113 y 141 respec-tivamente. El primero muestra una derivacion para safe(c) / {true} en SRLF. Si tomamosθ = [X/c] tenemos safe(X)θ / {true}. El teorema de completitud que acabamos de ver,afirma que SNarr puede generalizar esta derivacion, tanto en la sustitucion como en lainformacion obtenida. Esto es precisamente lo que muestra el Ejemplo 10, que obtiene lasustitucion θ′ = θ (en este caso µ = ε) y el mismo valor true.

Ademas, como consecuencia de este resultado obtenemos un corolario de lectura sen-cilla y de importancia capital para nosotros: SNarr captura los fallos de SRLF; de hechogeneraliza las sustituciones que permiten deducir fallos en SRLF:

Corolario 13 Sea P un SRLF-programa, S ∈ CExpF y θ ∈ Sust. Si P `SRLF Sθ / {F}

entonces existe una SNarr-derivacion S∗ θ′

{F} con variables nuevas Π tal que para

algun µ ∈ Sust se tiene θ = (θ′µ)|V−Π.

Demostracion: Inmediata a partir del Teorema 13. �

Nuestra idea de fallo constructivo queda capturada en este corolario ya que SNarrpermite obtener fallos para c-expresiones con variables, para las que encuentra los valoresoportunos.

Page 155: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 6

Semantica Operacional con

Igualdad

En este capıtulo extendemos la relacion SNarr que presentamos en el precedente, paraincluir la funcion (==). El contenido de este capıtulo corresponde basicamente al de lostrabajos [115] y [116].

Con respecto al calculo de pruebas SRLF, como es natural, recuperamos las reglas refe-rentes a la funcion (==); esto es, recuperamos las reglas 5, 6 y 10 en el calculo del Cuadro4.2 (pagina 112). Hay otros aspectos a reconsiderar, que no ofrecen mayor dificultad:

las c-expresiones con las que trabajamos ahora son las generales definidas en laSeccion 4.1.1 incluyendo la funcion (==) que excluimos en el capıtulo anterior;

la nocion de contexto de la Seccion 5.1.1 no se ve afectada;

en las formas contextuales principales que definimos en la Seccion 5.1.2 tenemos queconsiderar la forma contextual principal de una c-expresion de la forma t == s quesera

⋃α∈t==s{α}

el conjunto informacion asociado a una c-expresion que definimos en la Seccion 5.1.3en el caso de una c-expresion de la forma t == s es {⊥}.

Es facil ver que todos los resultados sobre contextos y conjunto informacion de lasSecciones 5.1.1, 5.1.2 y 5.1.3 siguen siendo validos con estos cambios.

Hasta aquı la inclusion de la funcion (==) no supone ninguna traba. El problema sepresenta al advertir que a nivel operacional, dar un tratamiento adecuado a dicha funcionimplica la manipulacion explıcita de desigualdades [25, 1, 109, 108, 96] como veıamos enel Ejemplo 1 (pagina 48). De hecho, manipularemos conjuntos de desigualdades como yase hacıa en [109] y como de hecho implementa en la practica el sistema T OY [155].

Ası pues, en la siguiente Seccion introducimos los conjuntos de desigualdades, el con-cepto de solucion y algunos resultados asociados. En la Seccion 6.2 presentamos un me-canismo de reduccion especıfico para la funcion (==), que en principio es independiente

Page 156: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

156 6. Semantica Operacional con Igualdad

del mecanismo de reduccion general SNarr. Y finalmente en la Seccion 6.3 integramos lafuncion (==) en la relacion SNarr y probamos los resultados de correccion y completitudcon respecto al calculo de pruebas SRLF.

6.1. Desigualdades

Un conjunto de desigualdades δ es un conjunto de la forma:

δ = {t1 6= s1, . . . , tn 6= sn}

donde t1, . . . , tn, s1, . . . , sn ∈ Term⊥,F. En realidad, en los conjuntos de desigualdadescon los que trabajaremos a nivel operacional no tiene sentido el elemento ⊥, es decir,t1, . . . , tn, s1, . . . , sn ∈ TermF. Sin embargo, en la definicion anterior se admite ⊥ paraestablecer una nocion general de solucion y algunas relaciones posteriores con SRLF.

Definicion 14 (Solucion de δ) Dado δ = {t1 6= s1, . . . , tn 6= sn} diremos que σ ∈Sust⊥,F es una solucion de δ y escribimos σ ∈ Sol(δ), si t1σ ↑ s1σ, . . . , tnσ ↑ snσ.

En la siguiente Proposicion recogemos algunas propiedades sencillas acerca de esteconcepto:

Proposicion 26 Las soluciones de un conjunto de desigualdades satisfacen:

1. Sol(δ ∪ δ′) = Sol(δ) ∩ Sol(δ′)

2. Sol({c(t1, . . . , tn) 6= c(s1, . . . , sn)}) = Sol({t1 6= s1}) ∪ . . . ∪ Sol({tn 6= sn})

3. σ ∈ Sol(δ) ⇔ ε ∈ Sol(δσ) (ε denota la sustitucion identidad)

4. si Sol(δ) ⊆ Sol(δ′) entonces Sol(δσ) ⊆ Sol(δ′σ) para cualquier σ ∈ Sust⊥,F

Demostracion: Probamos cada parte por separado:

1. inmediata a partir de la Definicion 14;

2. directa a partir de la Definicion 14 y la definicion de ↑ (segundo apartado de laDefinicion 10, pagina 107);

3. si δ = {t1 6= s1, . . . , tn 6= Sn}, σ ∈ Sol(δ) es equivalente por definicion a t1σ ↑s1σ, . . . , tnσ ↑ snσ, que equivale a su vez a decir ε ∈ Sol(δσ);

4. supongamos θ ∈ Sol(δσ); por el apartado anterior esto significa que ε ∈ Sol(δσθ)y tambien σθ ∈ Sol(δ). Entonces tambien tenemos σθ ∈ Sol(δ ′) y por el apartadoanterior ε ∈ Sol(δ′σθ) y tambien θ ∈ Sol(δ′σ) como se pretendıa. �

Los conjuntos de desigualdades en forma resuelta tienen el aspecto:

δ = {X1 6= t1, . . . , Xn 6= tn}

Page 157: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.1. Desigualdades 157

con Xi ∈ V yXi 6≡ ti para todo i ∈ {1, . . . , n}, ti ∈ TermF y tal que ({Xi}∪var(ti))∩Γ = ∅para todo i ∈ {1, . . . , n} (es decir, no contienen variables producidas). Dado un conjunto dedesigualdades, nos interesara una funcion solve para obtener formas resueltas asociadasdel mismo, i.e., formas resueltas cuyas soluciones sean tambien soluciones del conjuntode partida. En general puede haber varias formas resueltas para un mismo conjunto dedesigualdades. Por ejemplo, asumiendo c ∈ CS2, para el conjunto {c(X,Y ) 6= c(A,B)}tenemos las dos formas resueltas {X 6= A} y {Y 6= B}. Por ello, la funcion solve quedefinimos en el Cuadro 6.1 esta definida de modo que permite obtener el conjunto detodas las formas resueltas posibles asociadas a un conjunto de desigualdades.

solve(∅) = {∅}

solve({X 6= X} ∪ δ) = ∅

solve({c 6= c} ∪ δ) = ∅, para toda c ∈ CS0

solve({c(t) 6= d(s)} ∪ δ) = solve(δ), siendo c, d ∈ CS, c 6= d

solve({X 6= t} ∪ δ) = {{X 6= t} ∪ δ′ | δ′ ∈ solve(δ)}, si X 6≡ t

solve({c(t1, . . . , tn) 6= c(s1, . . . , sn)} ∪ δ) =

{δi ∪ δ′ | δi ∈ solve({ti 6= si}), i ∈ {1, . . . , n}, δ′ ∈ solve(δ)}

Cuadro 6.1: Funcion solve

Con respecto a las reglas que definen solve, notese que en el primer caso el conjunto deformas resueltas del conjunto vacıo es el conjunto unitario que contiene el conjunto vacıo,i.e., cualquier sustitucion es solucion para el conjunto de desigualdades vacıo. En contras-te, en los dos casos siguientes, como el conjunto de partida no tiene ninguna solucion, noobtenemos ninguna forma resuelta, i.e., solve devuelve un conjunto vacıo de formas re-sueltas. En el tercer caso se elimina una desigualdad trivial y en los dos ultimos las formasresueltas se obtienen por union de formas resueltas de subconjuntos del conjunto original.Es inmediato ver que esta definicion recursiva de solve es terminante ya que las llamadasrecursivas se efectuan sobre subconjuntos propios del conjunto original.

Esta funcion solve es correcta en el sentido ya expuesto: las soluciones de las formasresueltas tambien son soluciones del conjunto de partida. Ademas es completa: toda so-lucion del conjunto de partida se encuentra entre las soluciones de las formas resueltasobtenidas. Ambos resultados pueden expresarse de manera concisa como sigue:

Proposicion 27 (Correccion y completitud de solve) Dado un conjunto δ de des-igualdades, si solve(δ) = {δ1, . . . , δn} (con n ≥ 0) entonces:

Sol(δ) = Sol(δ1) ∪ . . . ∪ Sol(δn)

Demostracion: Por induccion sobre el cardinal l del conjunto δ:

l = 0 Si δ = ∅, entonces solve(δ) = {∅}, y trivialmente tenemos Sol(∅) = Sust⊥,F.

Page 158: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

158 6. Semantica Operacional con Igualdad

l > 1 Tenemos los siguientes casos para δ:

Si δ = {X 6= X} ∪ δ′ o δ = {c 6= c} ∪ δ′ entonces claramente Sol(δ) = ∅, y pordefinicion solve(δ) = ∅. En este caso n = 0 y la parte derecha de la igualdad delenunciado es ∅;

si δ = {c(t) 6= d(t′)} ∪ δ′ entonces claramente Sol(δ) = Sol(δ ′) y por h.i. el resultado

es directo;

si δ = {X 6= t} ∪ δ′, supongamos (i) solve(δ′) = {δ1, . . . , δn}. Entonces solve(δ) ={{X 6= t} ∪ δ1, . . . , {X 6= t} ∪ δn} y tenemos que probar Sol(δ) = Sol({X 6= t} ∪δ1) ∪ . . . ∪ Sol({X 6= t} ∪ δn)

Se tiene la siguiente secuencia de equivalencias:

Sol(δ) = (def. de δ)Sol({X 6= t} ∪ δ′) = (Prop. 26-1)Sol({X 6= t}) ∩ Sol(δ′) = (h.i. y (i))Sol({X 6= t}) ∩ (Sol(δ1) ∪ . . . ∪ Sol(δn)) = (distr. de ∩)(Sol({X 6= t}) ∩ Sol(δ1)) ∪ . . . ∪ (Sol({X 6= t}) ∩ Sol(δn)) = (Prop. 26-1)(Sol({X 6= t} ∪ δ1)) ∪ . . . ∪ (Sol({X 6= t} ∪ δn))

si δ = {c(t1, . . . , tn) 6= c(t′1, . . . , t′n)} ∪ δ

′, supongamos

(i) solve({ti 6= t′i}) = {δi1, . . . , δimi} y (ii) solve(δ′) = {δ1, . . . , δm}

Entonces solve(δ) =⋃i∈{1,...,n},j∈{1,...,mi},k∈{1,...,m} δij ∪ δk y hay que probar que

Sol(δ) =⋃i∈{1,...,n},j∈{1,...,mi},k∈{1,...,m} Sol(δij ∪ δk)

Ahora tenemos la siguiente cadena de equivalencias:

Sol(δ) = (def. de δ)Sol({c(t1, . . . , tn) 6= c(t′1, . . . , t

′n)} ∪ δ

′) = (Prop. 26-1)Sol({c(t1, . . . , tn) 6= c(t′1, . . . , t

′n)}) ∩ Sol(δ

′) = (Prop. 26-2)(Sol({t1 6= t′1}) ∪ . . . ∪ Sol({tn 6= t′n})) ∩ Sol(δ

′) = (h.i. y (ii))(Sol({t1 6= t′1}) ∪ . . . ∪ Sol({tn 6= t′n})) ∩ (Sol(δ1)∪. . .∪Sol(δm)) = (distr. de ∩)⋃i∈{1,...,n},j∈{1,...,mi},k∈{1,...,m} Sol(δij) ∩ Sol(δk)= (Prop. 26-1)⋃i∈{1,...,n},j∈{1,...,mi},k∈{1,...,m} Sol(δij ∪ δk) �

Como consecuencias inmediatas de esta propiedad tenemos:

Corolario 14 Si δ′ ∈ solve(δ) entonces Sol(δ′) ⊆ Sol(δ).

Corolario 15 Si solve(δ) = {δ1, . . . , δn} (n ≥ 0) y σ ∈ Sol(δ) entonces σ ∈ Sol(δi) paraalgun i ∈ {1, . . . , n}.

Page 159: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2. Mecanismo operacional de (==) 159

6.2. Mecanismo operacional de (==)

El mecanismo para evaluar la funcion (==) esta definido por medio de la relacion� que se muestra en el Cuadro 6.2. En principio esta relacion esta pensada para re-solver una invocacion de la forma t == s, pero por descomposicion de terminos, en ge-neral tendremos un conjunto de llamadas de la forma {t1 == s1, . . . , tn == sn}, siendot1, . . . , tn, s1, . . . , sn ∈ TermF. Por abuso de notacion escribimos t1 == s1, . . . , tn == sn, Rpara representar el conjunto {t1 == s1, . . . , tn == sn}∪R, donde R es a su vez un conjun-to de invocaciones a (==). El orden de las llamadas no es relevante y la funcion (==) esconmutativa (vista como relacion es simetrica). Notaremos como Rσ al conjunto R afec-

tado de la sustitucion σ. Notaremos por∗� al cierre reflexivo y transitivo de la relacion

�.

(1) ∅ �ε

true

(2) X == X,C �ε

C si X 6∈ Γ

(3) X == t, C �[X/t]

C[X/t]

si X 6= t, X 6∈ Γ ∪ var(t), Γ ∩ var(t) = ∅ y t no contiene F

(4) c(t1, . . . , tn) == c(s1, . . . , sn), C �ε

t1 == s1, . . . , tn == sn, C

(5) c(t) == d(s), C �ε

false

(6) X == t, C �ε

false |X 6=t

si X 6= t, X 6∈ Γ, Γ ∩ var(t) = ∅ y t no contiene F

(7) X == c(t1, . . . , tn), C �[X/c(Y )]

(Y1 == t1, . . . , Yn == tn, C)[X/c(Y )]

si X 6∈ Γ y var(t) ∪ Γ 6= ∅ o t contiene F; Y son variables frescas

(8) X == c(t1, . . . , tn), C �[X/d(Y )]

false

si X 6∈ Γ y var(t) ∪ Γ 6= ∅ o t contiene F; Y son variables frescas

(9) F == t1, . . . , F == tn �ε

F

Cuadro 6.2: Reglas para (==)

A la vista de las reglas del Cuadro 6.2 (y de acuerdo con la semantica de (==)) haycuatro posibles resultados para una derivacion con �: true, false (false incondicional),false |X 6=t (false condicional) y F. Ademas, como ahora se trata de estrechamiento tambien

Page 160: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

160 6. Semantica Operacional con Igualdad

se obtiene una sustitucion computada θ. Para generalizar, podemos considerar que tambiense obtiene un conjunto de desigualdades δ, que es vacıo en todos los casos salvo en la regla6, en cuyo caso contiene solo una desigualdad en forma resuelta X 6= t. Para simplificarlos resultados de correccion y completitud utilizaremos un formato unificado para lasreducciones de la relacion �:

t == s,R∗

�θ

(ω, δ)

donde θ ∈ Sust es la sustitucion computada, ω ∈ {true, false , F} y δ ∈ {∅, {X 6= t}} (conseguridad sera δ = ∅ si ω ∈ {true, F}).

Comentamos a continuacion las reglas del Cuadro 6.2:

algunas de las reglas son especıficas para obtener true, otras para obtener false (con-dicional o incondicional) y otras para F. Hay tambien reglas inespecıficas o generalesque simplifican el conjunto de expresiones sin comprometer el resultado final. Estasreglas son: la 2 para eliminar identidades triviales entre variables, la 3 que liga unavariable, la 4 para descomponer terminos y la 7 que es una regla de imitacion de es-tructura. Ası pues, un valor concreto se obtiene por la (posible) aplicacion de reglasgenerales y finalmente una de las reglas especıficas que comentamos seguidamente;

true se obtiene por aplicacion de la regla 1, que opera sobre el conjunto vacıo;

false se obtiene por la regla 5 que detecta un conflicto de constructoras, o bien porla regla 8 que provoca dicho conflicto mediante una ligadura;

false |X 6=t se obtiene por la regla 6 que garantiza un conflicto de constructoras bajola condicion X 6= t. Este es el unico punto donde se anade una desigualdad explıcitaa la respuesta;

F se obtiene por la regla 9 cuando todas las invocaciones a (==) son de la formaF == t. En este caso se hace palpable que ninguno de los valores true o false(condicional o incondicional) pueden obtenerse.

Ademas de los posibles resultados que proporciona esta relacion, es posible que no hayaninguna regla aplicable en algun paso de la derivacion. Esto sucede cuando hay variablesproducidas de Γ que bloquean el computo. Para ilustrar esta situacion hemos de fijarnos enel uso que haremos de esta relacion. La evaluacion de una llamada t == s vendra solicitadadesde la relacion de estrechamiento general SNarr que veremos en la Seccion 6.3.2 y estainvocacion t == s sera una sub-c-expresion dentro de una c-expresion, de manera quees perfectamente posible que contenga variables producidas. Por ejemplo, utilizando lafuncion next de la Seccion 2.3.1 (pagina 28) la expresion next(a) == b vista como c-expresion es

⋃α∈next(a) α == b. Y esta invocacion α == b no puede reducirse por ninguna

de las reglas del Cuadro 6.2 porque α bloquea dicha reduccion. La razon intuitiva essencilla de explicar: α esta asociada a la expresion next(a) que requiere evaluacion.

Page 161: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 161

Otro aspecto a comentar acerca de la relacion que nos ocupa es la cantidad de inde-terminismo que tiene. Aparte de la seleccion del elemento ti == si del conjunto {t1 ==s1, . . . , tn == sn}, para uno concreto puede haber distintas reglas aplicables: por ejemplolas reglas 3 y 6 pueden aplicarse bajo unas condiciones casi identicas (la unica diferenciaes que la 3 hace un occur-check), y lo mismo ocurre con las reglas 7 y 8. Sin embargo,este tipo de indeterminismo es natural y deseable, ya que produce distintas sustitucionescomputadas o desigualdades que corresponden a distintas respuestas. Estudiemos un parde ejemplos para ilustrarlo (utilizamos las constructoras z y s para los naturales y otrac ∈ CS2):

la expresion X == s(Y ) puede reducirse a true con θ = [X/s(Y )] mediante lasreglas 3 y despues la 1; pero tambien podemos derivar false |X 6=s(Y ) por la regla 6;

para la expresion c(s(X), s(α)) == c(s(F), Y ) (con α ∈ Γ), primero por la regla 4aplicada dos veces obtenemos X == F, s(α) == Y . En este punto podemos utilizarla regla 8 para obtener false con θ = [Y/z], pero tambien la regla 7 obteniendoX == F, α == Z con θ = [Y/s(Z)] y esta derivacion queda bloqueada porquerequiere la evaluacion de α.

6.2.1. Correccion y completitud de la relacion�

En esta seccion, con el fin de facilitar la presentacion en algunos puntos introducimoslocalmente una nueva notacion ↑X 6=u: dados X ∈ V y u ∈ TermF con X 6≡ u definimos:

t ↑X 6=u s ⇔t y s no presentan CS-conflicto y existe una posicionen la que t contiene X y s contiene u o viceversa

En estas condiciones es evidente que tσ ↑ sσ para todo σ ∈ Sol({X 6= u}).La correccion de � con respecto a SRLF muestra que toda derivacion con � esta

respaldada por una prueba en SRLF aplicando las sustituciones pertinentes. Probamosun lema previo:

Lema 11 Sean t, s ∈ TermF, entonces:

1. t1 == s1, . . . , tn == sn∗

�θ

true ⇒ t1θ ↓ s1θ, . . . , tnθ ↓ snθ

2. t1 == s1, . . . , tn == sn∗

�θ

false ⇒ tiθ ↑ siθ para algun i ∈ {1, . . . , n}

3. t1 == s1, . . . , tn == sn∗

�θ

false |X 6=u ⇒ tiθ ↑X 6=u siθ para algun i ∈

{1, . . . , n}

4. t1 == s1, . . . , tn == sn∗

�θ

F ⇒ t1θ 6↑ s1θ, . . . , tnθ 6↑ snθ y tiθ 6↓ siθ para

algun i ∈ {1, . . . , n}

Page 162: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

162 6. Semantica Operacional con Igualdad

Demostracion: Procedemos en todos los casos por induccion sobre el numero de pasos l

de la derivacion de la izquierda de las implicaciones. Utilizamos la notacionl

�θ

para

denotar una derivacion de l pasos. Probemos cada apartado por separado:

1. para el caso de una reduccion a true:

l = 1 La unica derivacion posible es por la regla 1 con θ = ε y este caso es trivial;

l > 1 Las posibles derivaciones son:

X == X,R �ε

Rl

�θ

true, por la regla 2: directo por h.i.;

X == t, R �[X/t]

R[X/t]l

�θ′

true por la regla 3, siendo X 6= t, X 6∈

Γ∪var(t), Γ∩var(t) = ∅ y t no contiene F. Tenemos θ = [X/t]θ ′ y por h.i. paracada invocacion t′ == s′ ∈ R tenemos t′θ ↓ s′θ. Consideremos la invocacionX == t: para X tenemos Xθ = X[X/t]θ′ = tθ′ y para t, tθ = t[X/t]θ′ que esequivalente a tθ′ porque X 6∈ var(t), ası que Xθ ↓ tθ como se pretendıa;

c(t1, . . . , tn) == c(s1, . . . , sn), R �ε

t1 == s1, . . . , tn == sn, Rl

�θ′

true

por la regla 4: directo a partir de la h.i.;

el resto de reglas no pueden producir true por CS-conflictos o por la presenciade F;

2. para el caso de una reduccion a false (incondicional):

l = 1 En un solo paso las posibles derivaciones son:

c(t) == d(s), R �ε

false por la regla 5: el resultado es directo porque

c(t) ↑ d(s);

X == c(t1, . . . , tn), R �[X/d(Y )]

false por la regla 8: en este caso X[X/d(Y )] ↑

t[X/d(Y )]

l > 1 Las posibles derivaciones en l > 1 pasos son:

X == X,R �ε

Rl

�θ

false, el primer paso por la regla 2: por h.i. debe

existir t == s ∈ R tal que tθ ↑ sθ, ası que el resultado es directo;

X == t, R �[X/t]

R[X/t]l

�θ′

false por la regla 3: en este caso θ = [X/t]θ ′

por h.i. debe existir t′[X/t] == s[X/t]′ ∈ R[X/t] tal que t′[X/t]θ′ ↑ s′[X/t]θ′.Tenemos t′ == s′ ∈ R, luego t′θ ↑ s′θ;

Page 163: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 163

c(t1, . . . , tn) == c(s1, . . . , sn), R �ε

t1 == s1, . . . , tn == sn, Rl

�θ

false

por la regla 4: por h.i. existe t == s ∈ {t1 == s1, . . . , tn == sn} ∪ R tal quetθ ↑ sθ. Si t == s ∈ R el resultado es directo, en otro caso debe ser t = ti y s = sipara algun i ∈ {1, . . . , n}, y entonces claramente c(t1, . . . , tn)θ ↑ c(s1, . . . , sn)θ;

X == c(t1, . . . , tn), R �[X/c(Y )]

(Y1 == t1, . . . , Yn == tn, R)[X/c(Y )]l

�θ′

false por la regla 7: en este caso, por h.i. existe t[X/c(Y )] == s[X/c(Y )] ∈{t1 == s1, . . . , tn == sn} ∪R tal que t[X/c(Y )]θ′ ↑ s[X/c(Y )]θ′. Si t == s ∈ Rel resultado es directo, si no, debe ser t = Yi y s = ti para algun i ∈ {1, . . . , n},y entonces claramente X[X/c(Y )]θ′ ↑ c(s1, . . . , sn)[X/c(Y )]θ′;

3. para el caso de una reduccion a false |X 6=u:

l = 1 En un paso simple la unica derivacion posible es:

X == t, R �ε

false |X 6=t por la regla 6 y claramente X ↑X 6=t t.

l > 1 Las posibles derivaciones en l > 1 pasos son:

X == X,R �ε

. . .l

�θ

false |Y 6=u por la regla 2: por h.i. debe existir

t == s ∈ C tal que tθ ↑Y 6=u sθ, ası que el resultado es inmediato;

X == t, R �[X/t]

C[X/t]l

�θ′

false |Y 6=u por la regla 3: en este caso θ =

[X/t]θ′ y por h.i. debe existir t′[X/t] == s[X/t]′ ∈ R[X/t] tal que t′[X/t]θ′ ↑Y 6=u

s′[X/t]θ′. Tenemos t′ == s′ ∈ R, luego t′θ ↑Y 6=u s′θ;

c(t1, . . . , tn) == c(s1, . . . , sn), R �ε

t1 == s1, . . . , tn == sn, Rl

�θ

false |Y 6=u por la regla 4: por h.i. existe t == s ∈ {t1 == s1, . . . , tn == sn} ∪Rtal que tθ ↑Y 6=u sθ. Si t == s ∈ R el resultado es directo, si no, debe ser t = tiy s = si para algun i ∈ {1, . . . , n}, y entonces claramente c(t1, . . . , tn)θ ↑Y 6=u

c(s1, . . . , sn)θ;

X == c(t1, . . . , tn), R �[X/c(Y )]

(Y1 == t1, . . . , Yn == tn, R)[X/c(Y )]l

�θ′

false |Y 6=u por la regla 7: por h.i. existe t[X/c(Y )] == s[X/c(Y )] ∈ {t1 ==s1, . . . , tn == sn} ∪ R tal que t[X/c(Y )]θ′ ↑Y 6=u s[X/c(Y )]θ′. Si t == s ∈ Rel resultado es directo, en otro caso, debe ser t = Yi y s = ti para algun i ∈{1, . . . , n}, y entonces claramente X[X/c(Y )]θ ′ ↑Y 6=u c(s1, . . . , sn)[X/c(Y )]θ′.

4. para el caso de una reduccion a F:

Page 164: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

164 6. Semantica Operacional con Igualdad

l = 1 La derivacion debe ser F == t1, . . . , F == tn �ε

F por la regla 9, y clara-

mente F 6↓ ti, F 6↑ ti para todo i ∈ {1, . . . , n}

l > 1 Las posibles derivaciones en l > 1 pasos son:

X == X,R �ε

Rl

�θ

F por la regla 2: por h.i. debe existir t == s ∈ R

tal que tθ 6↓ sθ. Por otra parte, todas las invocaciones t == s ∈ C cumplentθ 6↑ sθ, ası que solo queda comprobar la invocacion X == X del conjuntooriginal. Pero es claro que Xθ 6↑ Xθ;

X == t, R �[X/t]

R[X/t]l

�θ′

F por la regla 3: en este caso θ = [X/t]θ ′

y por h.i. existe t′[X/t] == s′[X/t] ∈ R[X/t] tal que t′[X/t]θ′ 6↓ s′[X/t]θ′.Tenemos t′ == s′ ∈ R y t′θ 6↓ s′θ. Por otro lado, por h.i. todas las invocacionest′[X/t] == s′[X/t] ∈ R[X/t] cumplen t′[X/t]θ′ 6↑ s′[X/t]θ′, luego en el conjuntoinicial t′θ 6↑ s′θ. Para X == t es claro que Xθ 6↑ tθ;

c(t1, . . . , tn) == c(s1, . . . , sn), R �ε

t1 == s1, . . . , tn == sn, Rl

�θ

F

por la regla 4: por h.i. existe t == s ∈ {t1 == s1, . . . , tn == sn} ∪ R tal quetθ 6↓ sθ. Si t == s ∈ R tenemos el resultado para 6↓, si no, debe ser t = ti y s = sipara algun i ∈ {1, . . . , n}, y entonces es claro que c(t1, . . . , tn)θ 6↓ c(s1, . . . , sn)θ.Por otro lado, por h.i. todas las invocaciones t == s ∈ {t1 == s1, . . . , tn ==sn}∪R cumplen tθ 6↑ sθ, ası que, en particular, en el conjunto original tambientendremos c(t1, . . . , tn)θ 6↑ c(s1, . . . , sn)θ;

X == c(t1, . . . , tn), R �[X/c(Y )]

(Y1 == t1, . . . , Yn == tn, R)[X/c(Y )]l

�θ′

F

por la regla 7: por h.i. existe t[X/c(Y )] == s[X/c(Y )] ∈ R[X/c(Y )] tal quet[X/c(Y )]θ′ 6↓ s[X/c(Y )]θ′. Si t == s ∈ R tenemos el resultado para 6↓, en otrocaso debe ser t = Yi y s = ti para algun i ∈ {1, . . . , n}, y entonces es claro queX[X/c(Y )]θ′ 6↓ c(t1, . . . , tn)[X/c(Y )]θ′. Por otro lado, por h.i. Yi[X/c(Y )]θ′ 6↑ti[X/c(Y )]θ′ para todo i ∈ {1, . . . , n}, ası queXθ 6↑ c(t1, . . . , tn)θ. Para cualquierinvocacion t[X/c(Y )] == s[X/c(Y )] ∈ R[X/c(Y )], por h.i. tambien tenemost[X/c(Y )]θ′ 6↑ s[X/c(Y )]θ′, i.e., tθ 6↑ sθ. �

Como consecuencia inmediata de este lema tenemos el resultado de correccion quebuscamos.

Teorema 14 (Correccion de �) Sean t, s ∈ TermF, entonces se tiene:

t == s∗

�θ

true ⇒ tθ ↓ sθ

t == s∗

�θ

false ⇒ tθ ↑ sθ

Page 165: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 165

t == s∗

�θ

false|X 6=u ⇒ tθ ↑X 6=u sθ

t == s∗

�θ

F ⇒ tθ 6↓ sθ y tθ 66↑ sθ

Utilizando la notacion generalizada t == s∗

�θ

(ω, δ) introducida al principio de

Seccion (pagina 160), tenemos una version simplificada como corolario inmediato:

Corolario 16 Sean t, s ∈ TermF, entonces se tiene:

t == s∗

�θ

(ω, δ) ⇒ (t == s)θσ / {ω}, para todo σ ∈ Sust ∩ Sol(δ)

Con el fin de probar la completitud de � con respecto a SRLF necesitaremos queesta relacion sea terminante. A su vez, para mostrar esta terminacion hay que probarque las reglas del Cuadro 6.2 hacen disminuir la complejidad de los conjuntos sobre losque operan. La clave esta en definir adecuadamente esta nocion de complejidad para unconjunto de la forma {t1 == s1, . . . , t1 == sn}. Explorando las reglas de la relacion �observamos que, o bien finalizan la derivacion (reglas 1, 5, 6, 8 y 9), o hacen disminuir elnumero n de elementos de los conjuntos (reglas 2 y 3), o hacen alguna descomposicion osimplificacion de estructura (reglas 4 y 7). Sin embargo, las regla 3 y 7 pueden incrementarla complejidad estructural de los terminos mediante la sustitucion y en las regla 4 y 7 seincrementa el cardinal n del conjunto. La medida de complejidad que estamos buscando sebasa en estas observaciones y una mas: la regla 7 hace “aflorar” las variables producidasy los terminos F de los terminos: disminuye la profundidad en la que aparecen dichoselementos. Apoyandonos en esta idea podemos definir la complejidad |t| de un termino tcomo:

|X| = |c| = 0, para toda X ∈ V − Γ, c ∈ CS0

|α| = |F| = 1, para toda α ∈ Γ

|c(t1, . . . , tn)| =∑n

i=1 2 ∗ |ti|, para todo c ∈ CSn y t1, . . . , tn ∈ TermF

Y ahora, definimos la complejidad de un conjunto {t1 == s1, . . . , tn == sn} como unacuaterna (d, nv, nc, n), donde d =

∑ni=1 |ti|+|si|, el segundo parametro nv es el cardinal del

conjunto de variables no producidas del conjunto, el tercero nc es el numero de sımbolos deCS contenidos en los terminos t1, . . . , tn, s1, . . . , sn (cada aparicion de un mismo sımbolose contabiliza una vez), y el ultimo parametro n es simplemente el cardinal del conjunto.El orden de complejidad entre conjuntos viene dado por el orden lexicografico habitualsobre sus cuaternas de complejidad asociadas.

Antes de probar la terminacion de �, un detalle mas: como ya se ha explicado an-teriormente es posible que la derivacion quede bloqueada por variables producidas. Esta

Page 166: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

166 6. Semantica Operacional con Igualdad

situacion se detecta cuando ninguna de las reglas del Cuadro 6.2 es aplicable y se consi-dera como una derivacion terminada. Ası pues la relacion � puede terminar con uno delos valores true, false (condicional o incondicional) o F, o tambien con una situacion debloqueo1. Todos estos resultados podran ser interpretados adecuadamente en la relacionSNarr cuando utilice la relacion�. Ası pues, lo que hemos de probar es que no es posibleuna derivacion infinita con �.

Proposicion 28 (Terminacion de �) Dado un conjunto {t1 == s1, . . . , tn == sn}toda derivacion con � termina:

produciendo uno de los valores true, false (condicional o incondicional) o F, o bien

produciendo un conjunto irreducible (bloqueado por variables producidas).

Demostracion: Esencialmente lo que hay que probar es que cada una de las reglas dela relacion � o bien acaba la derivacion, o bien disminuye la complejidad. Las reglas 1,5, 6, 8 y 9 acaban la derivacion; veamos que las demas hacen disminuir la complejidad(d, nv , nc, n) del conjunto:

en la regla 2 n disminuye mientras que d se mantiene y nc puede disminuir o man-tenerse;

en la regla 3 d no se modifica puesto que la sustitucion [X/t] no introduce ningunavariable de Γ y tampoco F, y nv disminuye puesto que desaparece la variable X(notese que se hace occur-check);

en la regla 4 nc se decrementa en dos unidades mientras que d puede disminuir o no,pero nunca incrementarse y nv se mantiene;

en la regla 7 d disminuye porque la profundidad de las variables producidas y/o F’sde c(t1, . . . , tn) se decrementa, y con seguridad contiene alguna variable produciday/o algun F. Por otra parte, observemos que la sustitucion [X/c(Y )] no introduceninguna variable producida ni F. �

Probamos ahora un lema previo que muestra la completitud de un paso de derivacioncon �. El enunciado es extenso porque hay que considerar todos los posibles resultadosde ese paso, pero lo que tienen todos en comun es que generalizan la sustitucion utilizadaen la SRLF-derivacion, excepto quiza sobre las variables frescas Π introducidas por larelacion � en la regla de imitacion 7.

Lema 12 Sean t, s ∈ TermF y θ ∈ Sust⊥ con Dom(θ) ∩ Γ = ∅. Entonces:

si (t ↓ s)θ entonces existen θ′ y µ con θ = (θ′µ)|V−Π tal que:

1Puesto que esta situacion es decidible, podrıamos devolver tambien un valor especial de fallo (otrodistinto de F) para caracterizarla y homogeneizar los resultados de la relacion �, pero no tiene mayorinteres.

Page 167: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 167

• t == s �θ′

t1 == s1, . . . , tn == sn (n ≥ 0), y (t1 ↓ s1)µ, . . . , (tn ↓ sn)µ

si (t ↑ s)θ entonces existen θ′ y µ con θ = (θ′µ)|V−Π tal que:

• t == s �θ′

false, o bien

• t == s �θ′

false|Z 6=w, y µ ∈ Sol({Z 6= w}), o bien

• t == s �θ′

t1 == s1, . . . , tn == sn, y (ti ↑ si)µ para algun i ∈ {1, . . . , n}

si (t ↑Y 6=v s)θ entonces existen θ′ y µ con θ = (θ′µ)|V−Π tal que:

• t == s �θ′

false|Z 6=w, y Sol({Y 6= v}) ⊆ Sol({Z 6= w}µ), o bien

• t == s �θ′

t1 == s1, . . . , tn == sn, y (ti ↑Z 6=w si)µ para algun

i ∈ {1, . . . , n}, Sol({Y 6= v}) ⊆ Sol({Z 6= w}µ)

si tθ 6↓ sθ, tθ 6↑ sθ entonces existen θ′ y µ con θ = (θ′µ)|V−Π tal que:

• t == s �ε

F, o bien

• t == s �θ′

t1 == s1, . . . , tn == sn, y (ti 6↓ si)µ para algun i ∈ {1, . . . , n} y

(ti 6↑ si)µ para todo i ∈ {1, . . . , n}

donde Π es en todos los casos el conjunto de variables nuevas introducidas por �.

Demostracion: Analizamos cada caso por separado:

si tθ ↓ sθ, en primer lugar observemos que t y s no pueden contener F. Entoncesasumiendo que t y s son unificables tenemos las siguientes alternativas para t == s:

• X == X: por la regla 2 obtenemos el conjunto vacıo con θ ′ = ε, y el resultadoes claro;

• X == u con u 6= X: si X ∈ var(u) o var(u) ∩ Γ 6= ∅, entonces no es posibleXθ ↓ uθ; en otro caso, por la regla 3 obtenemos el conjunto vacıo con θ ′ = [X/u].Este θ′ es un u.m.g. para X y t, luego debe ser θ ′ � θ, i.e., θ = θ′µ para algunµ;

• c(t1, . . . , tn) == c(s1, . . . , sn): por la regla 4 obtenemos t1 == s1, . . . , tn == sncon θ′ = ε; entonces µ = θ y es claro que t1µ ↓ s1µ,. . . , tnµ ↓ snµ;

Page 168: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

168 6. Semantica Operacional con Igualdad

para el caso tθ ↑ sθ analicemos los posibles casos para t == s; en primer lugarobservemos que si alguno de los terminos t o s es simplemente una variable Xentonces no puede ser X ∈ Γ porque entonces θ no podrıa introducir el CS-conflicto:

• X == X no es posible porque claramente θ no puede introducir el CS-conflicto;

• X == u, con X 6= u y u sin variables producidas ni F: entonces por la regla 6podemos derivar falseX 6=u con θ′ = ε y µ = θ, y entonces µ ∈ Sol({X 6= u});

• X == u con X 6= u y u conteniendo alguna variable producida o F. No puedeser u = α ∈ Γ ni u = c ∈ CS0 ni u = F porque θ no podrıa introducir el CS-conflicto. El caso u = Y 6∈ Γ ya ha sido estudiado en el punto anterior. Ası quedebe ser u = c(u1, . . . , un). La sustitucion θ puede introducir el CS-conflicto dedos modos, dependiendo del valor de Xθ:

◦ Xθ = d(v) con d ∈ CSm y c 6= d; en este caso por la regla 8 se puedederivar:

X == c(u1, . . . , un) �[X/d(Y )]

false

con Y una m-tupla de variables nuevas. Entonces θ ′ = [X/d(Y )] y podemosdefinir µ de modo que Yiµ = vi para todo i ∈ {1, . . . ,m} y Zµ = Zθ paraZ 6∈ {Y1, . . . , Yn}. Entonces claramente θ = (θ′µ)|V−Π;

◦ Xθ = c(u′): debe ser uiθ ↑ u′i para algun i ∈ {1, . . . , n}; en este caso por la

regla 7 podemos derivar:

X == c(u1, . . . , un) �[X/c(Y )]

(Y1 == u1, . . . , Yn == un)[X/c(Y )]

donde Y es una n-tupla de variables frescas. En este caso θ ′ = [X/c(Y )]y podemos definir µ como Yjµ = u′j para todo j ∈ {1, . . . , n} y Zµ = Zθpara Z 6∈ {Y1, . . . , Yn}. Entonces θ = (θ′µ)|V−Π. Ahora, para el ındice i deacuerdo con las definiciones tenemos uiθ

′µ = uiθ, y por otro lado Yiθ′µ = u′i

(θ′ no afecta a Yi y Yiµ = u′i por definicion de µ). Por hipotesis uiθ ↑ u′iası que Yiθ

′µ ↑ uiθ′µ;

• c(u) == d(v): por la regla 5 obtenemos false con θ ′ = ε, y µ = θ;

• c(u1, . . . , un) == c(u′1, . . . , u′n): debe ser uiθ ↑ u′iθ para algun i ∈ {1, . . . , n}.

Por la regla 4 podemos derivar:

c(u1, . . . , un) == c(u′1, . . . , u′n) �

εu1 == u′1, . . . , un == u′n

En este caso θ′ = ε y µ = θ. Por hipotesis tenemos uiµ ↑ u′iµ;

para tθ ↑Y 6=u sθ analizaremos los posibles casos para t == s. Como antes observemosque si alguno de los terminos t o s es una variable simple X, entonces no puede serX ∈ Γ porque θ no podrıa introducir el CS-conflicto. Ahora los casos para t == sson:

• X == X no es posible porque θ no podrıa introducir ningun CS-conflictoincluso condicional;

Page 169: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 169

• X == u, con X 6= u y u sin variables producidas ni F: por la regla 6 obtenemosfalse |X 6=u, con θ′ = ε y µ = θ. Tambien tenemos Sol({Y 6= v}) ⊆ Sol({X 6=u}µ) porque Xθ ↑Y 6=v uθ significa que Xθ y uθ no tienen CS-conflicto perocontienen Y y v en alguna posicion comun. Luego es claro que cualquier σ ∈Sol({Y 6= v}) es tambien una solucion para {X 6= u}µ;

• X == u con X 6= u y u con alguna variable producida o F. Como en un casoanterior debe ser u = c(u1, . . . , un). Entonces el conflicto condicional podrıaproducirse de dos modos, dependiendo del valor de Xθ:

◦ Xθ = d(v) con d ∈ CSm y c 6= d; este caso no es posible porque solo laregla 8 serıa aplicable y obtendrıamos un false incondicional;

◦ Xθ = c(u′): debe ser uiθ ↑Y 6=u u′i para algun i ∈ {1, . . . , n}; en este caso

por la regla 7 podemos derivar:

X == c(u1, . . . , un) �[X/c(Y )]

(Y1 == u1, . . . , Yn == un)[X/c(Y )]

donde Y es una n-tupla de variables frescas. Entonces θ ′ = [X/c(Y )] ypodemos definir µ como Yjµ = u′j para todo j ∈ {1, . . . , n} y Zµ = Zθpara Z 6∈ {Y1, . . . , Yn}. Entonces es claro que θ = (θ′µ)|V−Π. Ahora, parael ındice i tenemos uiθ

′µ = uiθ, y por otro lado Yiθ′µ = u′i (θ′ no afecta

a Yi y Yiµ = u′i por definicion de µ). Por hipotesis uiθ ↑Y 6=u u′i ası que

Yiθ′µ ↑Y 6=u uiθ

′µ;

• c(u) == d(v): no es posible porque solo serıa aplicable la regla 5 y obtendrıamosfalse incondicional;

• c(u1, . . . , un) == c(u′1, . . . , u′n): debe ser uiθ ↑Y 6=u u

′iθ para algun i ∈ {1, . . . , n}.

Por la regla 4 podemos derivar:

c(u1, . . . , un) == c(u′1, . . . , u′n) �

εu1 == u′1, . . . , un == u′n

En este caso θ′ = ε y µ = θ. Por hipotesis tenemos uiµ ↑Y 6=u u′iµ;

para el caso (t 6↓ s)θ, (t 6↑ s)θ de nuevo analicemos los posibles casos para t == s:

• X == X: no es posible;

• X == t, con X 6= t y t sin F tampoco es posible;

• X == c(t1, . . . , tn), con ti conteniendo F para algun i. En este caso debe serXθ = c(s1, . . . , sn), tal que si 6↓ tiθ para algun i ∈ {1, . . . , n} y si 6↑ tiθ paratodo i ∈ {1, . . . , n}.

Por la regla 7 obtenemos Y1 == t1[X/c(Y )], . . . , Yn == tn[X/c(Y )] con θ′ =[X/c(Y )], Y variables frescas. Definimos µ como Yiµ = si para todo i ∈{1, . . . , n} y Zµ = Zθ para el resto de variables Z. Entonces θ = θ ′µ y lasexpresiones (Yi == ti[X/c(Y )])µ son equivalentes a si == ti, luego el resultadoes claro;

• c(t) == d(s) no es posible;

Page 170: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

170 6. Semantica Operacional con Igualdad

• c(t1, . . . , tn) == c(s1, . . . , sn): en este caso por la regla 4 obtenemos t1 ==s1, . . . , tn == sn con θ′ = ε y µ = θ, y el resultado es claro;

• F == t: por la regla 9 obtenemos F. �

Apoyandonos en este lema y en la terminacion de la Proposicion 28 podemos ya probarla completitud de la relacion � con respecto a SRLF.

Teorema 15 (Completitud de � con respecto a SRLF) Dados t, s ∈ TermF y θ ∈Sust⊥ con Dom(θ) ∩ Γ = ∅, se tiene:

si tθ ↓ sθ entonces ∃θ′, µ ∈ Sust⊥ tales que t == s∗

�θ′

true y θ = (θ′µ)|V−Π;

si tθ ↑ sθ entonces:

• ∃θ′, µ ∈ Sust⊥ tales que t == s∗

�θ′

false y θ = (θ′µ)|V−Π;

• ∃θ′ ∈ Sust⊥ y µ ∈ Sust⊥ ∩ Sol({Y 6= v}) tales que t == s∗

�θ′

false|Y 6=v y

θ = (θ′µ)|V−Π;

si tθ ↑X 6=u sθ entonces ∃θ′, µ ∈ Sust⊥ tales que t == s∗

�θ′

false|Y 6=v con

θ = (θ′µ)|V−Π y Sol({X 6= u}) ⊆ Sol({Y 6= v}µ);

si tθ 6↓ sθ y tθ 6↑ sθ entonces ∃θ′, µ ∈ Sust⊥ tales que t == s∗

�θ′

F y θ =

(θ′µ)|V−Π

siendo Π el conjunto de variables frescas introducidas por � en cada caso.

Demostracion: Analizamos cada caso por separado:

si tθ ↓ sθ por el Lema 12 podemos derivar:

t == s∗

�θ1

t1 == s1, . . . , tn == sn

con θ = θ1µ1 tal que t1µ1 ↓ s1µ1, . . . , tnµ1 ↓ sn. Por el mismo lema, fijandonos ent1 == s1 existiran θ2 y µ2 tal que µ1 = θ2µ2 tal que podemos derivar:

�θ2

t11 == s11, . . . , t1m == s1m, . . . , tn == sn∗

�θ3

. . .

Page 171: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.2.1 Correccion y completitud de la relacion� 171

con t11µ1 ↓ s11µ1, . . . , t1mµ1 ↓ s1mµ1, . . . , tnµ1 ↓ snµ1. Podemos iterar este procesorepetidas veces, pero por la Proposicion 28 debe terminar despues de k ≥ 1 pasosy el ultimo debera realizarse con la regla 1 obteniendo el valor true. Por otro ladose tienen las siguientes equivalencias: θ = θ1µ1 = θ1θ2µ2 = . . . = θ1θ2 . . . θkµk, luegotendremos θ′ = θ1θ2 . . . θk, µ = µk y en este caso, de hecho la igualdad θ = θ ′µ;

si tθ ↑ sθ por el Lema 12 tenemos tres posibilidades. Podemos obtener directamentefalse con θ = (θ′µ)|V−Π; podemos obtener false |Y 6=v con θ = (θ′µ)|V−Π y µ ∈Sol({Y 6= v}); o podemos construir una cadena de derivaciones de la forma:

t == s∗

�θ1

t1 == s1, . . . , tn == sn∗

�θ2

. . .

con θ = (θ1µ1) |V−Π de modo que para algun i ∈ {1, . . . , n} se tenga tiµ1 ↑ siµ1. Denuevo por la Proposicion 28 este proceso debe terminar despues de k ≥ 1 pasos y elunico modo de terminarlo es obtener false o false |Y 6=v. En cualquier caso tenemosθ′ = θ1θ2 . . . θk y µ = µk, ası que (θ′µ) |V−Π= θ. En el segundo caso tambien se tieneµ ∈ Sol({Y 6= v});

si tθ ↑X 6=u sθ por el Lema 12 tenemos dos posibilidades. Podemos obtener false |Y 6=v

con θ = (θ′µ)|V−Π y µ ∈ Sol({Y 6= v}) o podemos construir una cadena de deriva-ciones de la forma:

t == s∗

�θ1

t1 == s1, . . . , tn == sn∗

�θ2

. . .

con θ = (θ1µ1) |V−Π de modo que para algun i ∈ {1, . . . , n} se tenga tiµ1 ↑ siµ1.Por la Proposicion 28 este proceso debe terminar despues de k ≥ 1 pasos y el unicomodo de terminarlo es obtener false |Y 6=v. En cualquier caso tenemos θ′ = θ1θ2 . . . θky µ = µk, ası que (θ′µ) |V−Π= θ. Y tambien tenemos Sol({X 6= u}) ⊆ Sol({Y 6= v});

si tθ 6↓ sθ y tθ 6↑ sθ por el Lema 12 podemos obtener directamente F con θ ′ = ε, opodemos obtener una cadena de derivaciones:

t == s �θ1

t1 == s1, . . . , tn == sn �θ2

. . . �θk

t′1 == s′1, . . . , t′m == s′m

tal que θ = θ1θ2 . . . θkµk y tiµk 6↓ siµk para algun i ∈ {1, . . . ,m}, tiµk 6↑ siµk paratodo i ∈ {1, . . . , n}. Esta cadena debe terminar por la Proposicion 28 y el unicomodo de terminar bajo estas condiciones es con la regla 9 obteniendo F. Como antes,tenemos θ′ = θ1θ2 . . . θk y µ = µk. �

El siguiente corolario engloba todos los apartados del resultado anterior en uno generi-co. En realidad debilita el anterior teorema, pero sera util posteriormente para simplificarotras demostraciones que no necesitan afinar tanto, como la Correccion de SNarr.

Page 172: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

172 6. Semantica Operacional con Igualdad

Corolario 17 Dados t, s ∈ TermF y θ ∈ Sust⊥ con Dom(θ) ∩ Γ = ∅, se tiene:

si (t == s)θ / {ω} entonces t == s∗

�θ′

(ω, δ);

tal que existe µ ∈ Sust que cumple:

θ = (θ′µ)|V−Π donde Π es el conjunto de variables frescas introducidas por �;

µ ∈ Sol(δ)

Demostracion: Inmediata a partir del teorema anterior. �

6.3. Estrechamiento de c-expresiones con (==)

En esta Seccion extendemos la relacion de estrechamiento anadiendo la funcion (==).La nueva relacion SNarr incluye una regla especıfica para dicha funcion, cuyo cometi-do es simplemente conectar SNarr con la relacion �, en la que delegara la reduccionpropiamente dicha.

La extension serıa realmente simple si no fuese porque al estrechar una llamada a(==), ademas de la sustitucion computada, pueden generarse desigualdades en forma re-suelta que proporcionan informacion acerca de los posibles valores de las variables. Lasdesigualdades X 6= t de δ son restricciones impuestas sobre las variables. Tambien lassustituciones pueden interpretarse de este modo, pero a diferencia de estas que se aplican‘in situ’, las desigualdades deben arrastrase de manera explıcita durante la reduccion. Dehecho, lo que haremos es asociar un conjunto de desigualdades a las c-expresiones invo-lucradas en la reduccion. En el siguiente apartado damos forma a esta idea y estudiamoslas consecuencias asociadas; en concreto reelaboramos algunas definiciones y resultadosprevios para adecuarlos a estos cambios.

6.3.1. C-expresiones con desigualdades y contextos

Una c-expresion con conjunto de desigualdades asociado es una estructura de la formaS2δ, siendo S una c-expresion y δ un conjunto de desigualdades en forma resuelta. Todaslas nociones asociadas a las c-expresiones de la Seccion 3.2.1 y las extensiones de la Seccion4.1.1 siguen vigentes ahora. La nocion de hiper-semantica de la Definicion 12 (pagina 114)debe ser ampliada para c-expresiones con conjunto de desigualdades asociado:

Definicion 15 (Hiper-semantica de una c-expresion con desigualdades)Dado un programa P la hiper-semantica de una c-expresion con desigualdades S2δ es unafuncion [[[ ]]] que toma una sustitucion total σ ∈ Sol(δ), y devuelve [[Sσ]]:

[[[S2δ]]] = λσ ∈ Sust ∩ Sol(δ).[[Sσ]]

El cambio esencial con respecto a la Definicion 12 es que ahora la sustitucion σ ademasde ser total, debe ser solucion de δ. Para motivar esta nueva condicion retomemos elejemplo que ilustraba la Definicion 12; sean f y g dos funciones definidas como:

Page 173: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.3.1 C-expresiones con desigualdades y contextos 173

f(true) � {true} g(true) � {true}

f(false) � {false} g(false) � {true}

Si consideramos δ = {X 6= false} es razonable que [[[f(X)2δ]]] = [[[g(X)2δ]]] porque f yg solo difieren sobre el valor false que es precisamente el que excluye la desigualdad. Porotro lado, esta nocion de hiper-semantica sera la que nos permita expresar los resultadosque buscamos acerca de correccion y completitud.

La nocion de contexto de la Seccion 5.1.1 no necesita modificaciones, pero sı quereforzaremos el Lema de Contextualizacion 8 del siguiente modo:

Lema 13 (Contextualizacion con Desigualdades) Sean dos c-expresiones con desi-gualdades S2δ y S ′

2δ′ tales que [[[S2δ]]] = [[[S ′2δ′]]]. Entonces para todo contexto C de

aridad 1 se tiene [[[(C [S])2δ]]] = [[[(C [S ′])2δ′]]].

Demostracion: No podemos obtener este resultado como corolario del Lema 8, porquelos dominios de la hiper-semantica son diferentes (en este caso esta restringido a Sol(δ)).Sin embargo, la demostracion es muy similar.

Debemos probar (C [S])σ / C ⇔ (C [S ′])σ / C para cualquier σ ∈ Sol(δ). Razonamospor induccion sobre la estructura del contexto C. Las posibles formas para C con |C| = 1son:

C = [ ]: directo a partir de las hipotesis;

C = fails(C1): directo por h.i. y por las reglas 11 y 12 de SRLF;

C =⋃α∈C1

S2: la prueba para (C [S])σ / C debe llevarse a cabo por la regla 7 deSRLF de la forma:

(C1 [S])σ / C1 S2σ[α/C1] / C⋃α∈(C1 [S])σS2σ / C

Por h.i. (C1 [S])σ/C1 ⇔ (C1 [S ′])σ/C1 y entonces la prueba para (⋃α∈C1 [S′] S2)σ/C

puede tambien realizarse por la regla 7 con la misma forma;

C =⋃α∈S1

C1: la prueba para (C [S])σ / C debe hacerse con la regla 7 de SRLF dela forma:

S1σ / {t1, . . . , tn} (C1 [S])σ[α/t1] ∪ . . . ∪ (C1 [S])σ[α/tn] / C′1 ∪ . . . ∪ C′

n⋃α∈S1σ

(C1 [S])σ / C′1 ∪ . . . ∪ C′

n = C

donde cada C ′i es un SAS para (C1 [S])σ[α/ti]. Consideremos las sustituciones σi =

σ[α/ti]: si σ ∈ Sol(δ), para cualquier elemento α 6= t de δ tenemos ασ ↑ tσ; porla parte c) de la Proposicion 11, como ↑ es cerrada bajo sustituciones de Sust⊥,Ftenemos que ασi ↑ tσi para todo i ∈ {1, . . . , n}. Esto significa que σi ∈ Sol(δ) paratodo i, y entonces por h.i. (C1 [S])σ[α/ti]/C

′i ⇔ (C1 [S ′])σ[α/ti]/C

′i. Luego la prueba

para⋃α∈S1σ

(C1 [S ′])σ / C′1 ∪ . . . ∪ C′

n = C tiene la misma forma;

C = C1 ∪ S2 (el caso C = S1 ∪ C2 es por completo analogo): directo a partir de laregla 8 de SRLF y la h.i. �

Page 174: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

174 6. Semantica Operacional con Igualdad

6.3.2. La relacion SNarr con (==)

El Cuadro 6.3 muestra las reglas de la relacion SNarr con (==), como extension delas del Cuadro 5.1 (pagina 137). Los comentarios a las reglas del capıtulo anterior siguenvigentes ahora. Los cambios esenciales son los siguientes:

todas las c-expresiones llevan asociado un conjunto de desigualdades δ que debemanipularse adecuadamente en los pasos de reduccion. Esta manipulacion es trivialen todos los casos, salvo en las reglas de estrechamiento Nrrw que comentamosseguidamente;

Cntx C [S]2δ θ

Cθ [S ′]2δ′ si S2δ θ

S ′2δ′

Nrrw1 f(t)2δ θ |var(t)

Sθ2δ′si (f(s)� S) ∈ P, θ ∈ SustF es un u.m.g.para s y t con Dom(θ) ∩ Γ = ∅ y δ′ ∈ solve(δθ)

Nrrw2 f(t)2δ ε

{F}2δsi para toda regla (f(s)� S) ∈ Ps y t tienen un CS ∪ {F}-conflicto

Eq t == s2δ θ |var(t)∪var(s)

{ω}2δ′si t == s

�θ

ω|δ′′ y

δ′ ∈ solve(δθ ∪ δ′′)

Fail1 fails(S)2δ ε

{true}2δ si S∗ = {F}

Fail2 fails(S)2δ ε

{false}2δ si ∃t ∈ S∗ t 6= ⊥, t 6= F

Flat⋃α∈

⋃β∈S1

S2S32δ

ε

⋃β∈S1

⋃α∈S2

S32δ

Dist⋃α∈S1∪S2

S32δ ε

⋃α∈S1

S3 ∪⋃α∈S2

S32δ

Bind⋃α∈{t} S2δ

εS[α/t]2δ

Elim⋃α∈S′ S2δ

εS2δ si α 6∈ FV (S)

Cuadro 6.3: Reglas para SNarr con (==)

la regla Nrrw1 opera igual que su antecesora, pero con un detalle adicional. Lasustitucion respuesta θ puede destruir la forma resuelta del conjunto de desigualdadesδ. Esto ocurre por ejemplo con una desigualdad de la forma X 6= c(. . .) afectada deuna sustitucion [X/d(. . .)]. Como pretendemos que el conjunto de desigualdadesasociado a las c-expresiones este siempre en forma resuelta, utilizamos la funcionsolve para obtener de modo indeterminista una de las posibles formas resueltas.

Page 175: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.3.2 La relacion SNarr con (==) 175

Notese tambien que es posible que solve devuelva el conjunto vacıo, i.e., es posibleque no haya forma resuelta. En este caso sencillamente la regla Nrrw1 no serıa deaplicacion;

la regla Nrrw2 funciona esencialmente igual que antes. Como la sustitucion respuestaes ε no debemos preocuparnos de formas resueltas;

la regla Eq reduce una c-expresion de la forma t == s y es la unica completamen-te nueva con respecto a la version anterior de SNarr. En este caso se invoca a larelacion � y se incorpora el resultado al calculo general. La notacion ω|δ′′ es unanotacion para generalizar los posibles resultados de �; el conjunto δ ′′ sera vacıo siω ∈ {true, F} y si ω = false entonces puede ser vacıo o contener una unica desigual-dad resuelta X 6= u. En cualquier caso el valor ω se incorpora como resultado de lareduccion por SNarr, el conjunto de desigualdades δ ′ se obtiene agregando la posibledesigualdad (contenida en δ′′) a las anteriores afectadas de la sustitucion computadaθ y la sustitucion respuesta es la propia θ restringida a las variables de t y s, i.e.,las variables libres de la c-expresion original (la relacion � no producira ningunaligadura para variables producidas de Γ). Al igual que ocurrıa en Nrrw1, la aplica-bilidad de esta regla depende de que solve efectivamente determine la existencia dealguna forma resuelta para el conjunto de desigualdades. Y naturalmente tambiendepende de que la propia relacion � no quede bloqueada por variables producidas,i.e., por requerir la evaluacion de alguna funcion.

Ejemplo 12 El Ejemplo 10 (pagina 141) puede considerarse ahora sin necesidad de de-finir la igualdad especıfica para nodos eq, sino utilizando la igualdad generica (==). ElCRWL-programa de partida sera el de la Seccion 2.3.1 (pagina 28).

Naturalmente ahora tambien es posible derivar safe(X)2∅∗ [X/c]

{true}2∅. Sin em-

bargo, para ilustrar el manejo de desigualdades vamos a estudiar una expresion que lasinvolucre en la respuesta. Por ejemplo, consideremos la llamada fails(path(X,Y )) con laque pretendemos encontrar dos nodos X e Y tales que no existe camino de X a Y . Porejemplo, si tomamos X = d, como de d no parte ningun arco, no habra ningun caminoentre X e Y ; esto, claro esta, siempre que Y no sea el propio d. En definitiva debe ser

posible derivar fails(path(X,Y ))2∅∗ [X/d]

{true}2{Y 6= d}. Mostramos esta derivacion

en el Cuadro 6.4.Como en ejemplos precedentes, por motivos de espacio iTe abrevia ifThenElse. Comen-

tamos brevemente algunos de los pasos de estrechamiento. En el paso (2) se invoca a larelacion� para reducir X == Y y se obtiene (false, {X 6= Y }) con sustitucion computadaε. Esta desigualdad X 6= Y se guarda en el conjunto de desigualdades. En el paso (9) seestrecha la llamada next(X) utilizando la regla de programa next(d) � {F}, que producela sustitucion [X/d]. Notese que esta sustitucion se aplica a toda la c-expresion en cursoy tambien al conjunto {X 6= Y }. En la propia regla Nrrw1 se invoca a solve({d 6= Y })que en este caso produce una unica forma resuelta {Y 6= d}, el nuevo conjunto asociadoa la c-expresion. En el paso (11) vuelve a utilizarse la relacion �, esta vez para reducir

Page 176: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

176 6. Semantica Operacional con Igualdad

(1) fails(path(X,Y ))2∅ ε (Nrrw1)

(2) fails(⋃

α∈X==Y

⋃β∈

⋃γ∈next(X) path(γ,Y ) iTe(α, true , β))2∅ ε (Nrrw3)

X == Y �ε false |X 6=Y (regla (6) de �)

(3) fails(⋃

α∈{false}

⋃β∈

⋃γ∈next(X) path(γ,Y ) iTe(α, true, β))2{X 6= Y } ε (Bind)

(4) fails(⋃

β∈⋃

γ∈next(X) path(γ,Y ) iTe(false , true, β))2{X 6= Y } ε (Nrrw1)

(5) fails(⋃

β∈⋃

γ∈next(X) path(γ,Y ){β})2{X 6= Y } (Flat)

(6) fails(⋃

γ∈next(X)

⋃β∈path(γ,Y ){β})2{X 6= Y } ε (Nrrw1)

(7) fails(⋃

γ∈next(X)⋃β∈

⋃τ∈γ==Y

⋃µ∈

⋃ν∈next(γ) path(ν,Y ) iTe(τ,true,µ){β})2{X 6= Y } ε (Flat)

(8) fails(⋃

γ∈next(X)

⋃τ∈γ==Y⋃

β∈⋃

µ∈⋃

ν∈next(γ) path(ν,Y ) iTe(τ,true,µ){β})2{X 6= Y } ε (Flat)

(9) fails(⋃

γ∈next(X)

⋃τ∈γ==Y

⋃µ∈

⋃ν∈(next(γ) path(ν,Y )

⋃β∈(iTe(τ,true,(µ){β})2{X 6= Y } [X/d] (Nrrw1)

(10) fails(⋃

γ∈{F}

⋃τ∈γ==Y

⋃µ∈

⋃ν∈next(γ) path(ν,Y )

⋃β∈iTe(τ,true,µ){β})2{Y 6= d} ε (Bind)

(11) fails(⋃

τ∈Y ==F

⋃µ∈

⋃ν∈next(F)

path(ν,Y )

⋃β∈iTe(τ,true,µ){β})2{Y 6=d} ε (Nrrw3)

Y == F �ε F (regla (9) de �)

(12) fails(⋃

τ∈{F}

⋃µ∈

⋃ν∈next(F)

path(ν,Y )

⋃β∈iTe(τ,true,µ){β})2{Y 6= d} ε (Bind)

(13) fails(⋃

µ∈⋃

ν∈next(F)path(ν,Y )

⋃β∈iTe(F,true,µ){β})2{Y 6= d} ε (Elim)

(14) fails(⋃

β∈iTe(F,true,µ){β})2{Y 6= d} ε (Nrrw2)

(15) fails(⋃

β∈{F}{β})2{Y 6= d} ε (Bind)

(16) fails({F})2{Y 6= d} ε (Fail1)

(17) {true}2{Y 6= d}

RESPUESTA: ({true}, [X/d], {Y 6= d})

Cuadro 6.4: Una derivacion para fails(path(X,Y ))

Page 177: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.3.3 Correccion y completitud de SNarr con (==) 177

Y == F, obteniendo (F, ∅) con sustitucion respuesta ε. En el paso (14) se obtiene F para lallamada iTe(F, true, µ) mediante Nrrw2, i.e., por conflicto entre la llamada y las reglas deprograma. Notese que el conflicto se produce entre un sımbolo F de la llamada y construc-toras de CS en las cabezas de las reglas de programa segun decıamos en los comentarios dela regla 9 de SRLF en la Seccion 4.1.2 (pagina 112). Finalmente la derivacion concluyecon la respuesta ({true}, [X/d], {Y 6= d}), que incluye la desigualdad Y 6= d como partede la respuesta.

La derivacion expuesta es una de las posibles, pero fails(path(X,Y )) tambien puedeestrecharse obteniendo otras respuestas como ({false}, [X/Y ], ∅), ({false}, [X/a, Y/b], ∅) o({false}, [X/b, Y/d], ∅).

Al igual que en la version precedente de SNarr, la actual tiene la virtud de encapsularo asilar en cierta medida las distintas manipulaciones de las c-expresiones: la eleccion delredex se hace en Cntx; la obtencion de ligaduras para variables (sustituciones respues-ta) se hace exclusivamente en las reglas propias de estrechamiento, en concreto en lasreglas Nrrw1 y Eq; la evaluacion de (==) se realiza en Eq, que invoca a una relacionindependiente �; la evaluacion de fails se hace mediante dos reglas exclusivas; y de lamanipulacion puramente sintactica de c-expresiones se encargan las reglas Flat, Dist,Bind y Elim. En la construccion de este modelo de computo hemos tratado de conseguiresta division de tareas para facilitar la comprension y tambien los razonamientos para laobtencion de los resultados de correccion y completitud de la siguiente seccion.

6.3.3. Correccion y completitud de SNarr con (==)

En este apartado se reconstruyen los resultados de correccion y completitud siguiendoel mismo esquema que en la Seccion 5.3. Las demostraciones son en muchos casos comple-tamente analogas a las de dicha Seccion y solo exhibimos en detalle los puntos en los quehay diferencias sustanciales.

Teorema 16 (Correccion de SNarr) Dadas S,S ′ ∈ CExp, θ ∈ Sust y δ, δ′ conjuntosde desigualdades en forma resuelta, se tiene:

S2δ∗ θ

S ′2δ′ ⇒

{[[[Sθ2δ′]]] = [[[S ′

2δ′]]]

Sol(δ′) ⊆ Sol(δθ)

Demostracion: Al igual que en la demostracion del Teorema 12 basta con hacer el ra-zonamiento para un paso de derivacion (para n pasos es una induccion inmediata sobren).

Para probar [[[Sθ2δ′]]] = [[[S ′2δ′]]] se sigue el mismo esquema que en la demostracion

del Teorema 12. Adaptamos dicho esquema para considerar desigualdades: para la reglaCntx el razonamiento es en todo similar excepto que ahora aplicamos el Lema 13 decontextualizacion con desigualdades en vez del Lema 8. Para el resto de reglas, exceptoEq la adaptacion tambien es inmediata considerando σ ∈ Sust∩Sol(δ ′) en vez de σ ∈ Sust.

Page 178: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

178 6. Semantica Operacional con Igualdad

La regla Eq es propia de la extension de SNarr y debemos estudiarla con detalle,

pero tampoco plantea problemas: supongamos t == s2δ θ

{ω}2δ′ siendo t ==

s∗

�θ

ω|δ′′ y δ′ ∈ solve(δθ ∪ δ′′). Por el Corolario 16 para todo σ′ ∈ Sust ∩ Sol(δ′′)

tenemos (t == s)θσ′ / {ω}. Si tomamos σ ∈ Sust ∩ Sol(δ′) es claro que tambien σ ∈Sust ∩ Sol(δ′′) y tendremos (t == s)θσ / {ω}. Por otro lado, como ω ∈ {true, false , F}tenemos ωσ = ω para todo σ ∈ Sust ∩ Sol(δ ′), de donde [[[(t == s)θ2δ′]]] = [[[ω2δ′]]];

Fijemonos ahora en la segunda parte, Sol(δ ′) ⊆ Sol(δθ), y estudiemos las distintasreglas de SNarr. En muchas de ellas δ ′ = δ, con lo que el resultado es trivial, ası que noscentramos en las tres en las que que no ocurre esto. El caso Cntx es consecuencia de losrestantes. En Nrrw1 tenemos δ′ ∈ solve(δθ) y por el Corolario 14 Sol(δ ′) ⊆ Sol(δθ). Y enEq tenemos δ′ ∈ solve(δθ ∪ δ′′) y es sencillo ver que tambien Sol(δ ′) ⊆ Sol(δθ). �

La Proposicion 25 y el Lema 9 se reformulan sin dificultad en el nuevo marco conigualdad.

Proposicion 29 (Aplanamiento con Desigualdades) Sea C un contexto principal dearidad n, las c-expresiones S1, . . . ,Sn,S ∈ CExp y un conjunto de desigualdades en formaresuelta δ. Es posible derivar:

⋃α∈C [S1,...,Sn] S2δ

∗ ε

C [⋃α∈S1

S, . . . ,⋃α∈Sn

S]2δ

utilizando unicamente las reglas Cntx, Flat y Dist de la relacion SNarr.

Demostracion: La demostracion es totalmente analoga a la de la Proposicion 25. �

Lema 14 Supongamos un SRLF-programa P y una c-expresion S. Si P `SRLF S / C

entonces existe una SNarr-derivacion S2∅∗ ε

S ′2∅ tal que C v (S ′)∗.

Demostracion: La demostracion es esencialmente igual a la del Lema 9. En razonamientocorrespondiente a la regla 8 de SRLF se utiliza la correspondiente Proposicion 29 deaplanamiento con desigualdades. �

El Lema 10 (pagina 151) sı sufre cambios importantes, ya que ahora no se obtiene laigualdad entre las c-expresiones S y S ′µ citadas en dicho resultado. Lo que tendremos esuna relacion de contenido entre los conjuntos informacion de ambas c-expresiones:

Lema 15 Sea S2δ una c-expresion (S ∈ CExpF) con desigualdades y θ ∈ Sust ∩ Sol(δ).

Si Sθ2∅∗ ε

S ′2δ′, entonces existe una derivacion S2δ

∗ θ′

S ′′2δ′′ con variables

nuevas Π tal que para algun µ ∈ Sust se tiene:

Page 179: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.3.3 Correccion y completitud de SNarr con (==) 179

θ = (θ′µ) |V−Π,

(S ′)∗ v (S ′′µ)∗, y

Sol(δ′) ⊆ Sol(δ′′µ)

Demostracion: Aunque el razonamiento sigue el mismo esquema que el del Lema 10,en este caso hay diferencias importantes debido a la funcion (==) y los conjuntos dedesigualdades, y es preferible rehacer por completo la demostracion. Al igual que en elcitado lema, es suficiente probar el resultado para un paso de derivacion (la extension an pasos es una sencilla induccion sobre n). Razonamos entonces sobre la regla utilizadapara dar ese paso:

Cntx asumimos un paso de la forma (Cθ [Sθ])2∅ ε

Cθ [S ′]2δ′ de modo que la

sub-derivacion Sθ ε

S ′ se lleva a cabo mediante una regla de SNarr distinta

de Cntx. Para esta sub-derivacion (como probaremos en los puntos siguientes) se

pueden determinar θ′ y µ tales que S2δ θ′

S ′′2δ′′ con θ = (θ′µ) |V−Π y (S ′)∗ v

(S ′′µ)∗. Entonces por la propia regla Cntx tenemos C [S]2δ θ′

Cθ′ [S ′′]2δ′′.

Ahora tenemos que probar (Cθ [S ′])∗ v ((Cθ′ [S ′′])µ)∗. La parte derecha de laigualdad, por la Proposicion 17 es equivalente a Cθ ′µ [S ′′µ]. Como C no contieneninguna variable de Π se tiene Cθ′µ = C(θ′µ)|V−Π = Cθ. Por otro lado como(S ′)∗ v (S ′′µ)∗, por la Proposicion 23 se tiene (Cθ [S ′])∗ v (Cθ′µ [S ′′µ])∗ comoesperabamos;

Nrrw1 suponemos una derivacion de la forma f(t)θ2∅ ε

Sσ2δ′ = S ′2δ′, donde

(f(s)� S) ∈ P, σ es un u.m.g. para s y tθ, con Dom(σ)∩Γ = ∅ y δ ′ ∈ solve(∅), i.e.,δ′ = ∅. Razonando igual que en la demostracion del Lema 10 existen θ ′, µ ∈ Susttales que θ′µ = θσ. Y este θ′ permitira dar un paso de derivacion de la forma:

f(t)2δ θ′ |var(t)

Sθ′2δ′′ = S ′′2δ′′

siendo δ′′ cualquier conjunto de desigualdades tal que δ ′′ ∈ solve(δθ′) (mas adelanteelegiremos el adecuado). La condicion (θ ′µ) |V−Π= θ se demuestra igual que en elLema 10. Tambien igual que en el Lema 10 se demuestra que S ′ = S ′′µ, luego esevidente que (S ′)∗ v (S ′′µ)∗.

Por ultimo hay que elegir δ′′ ∈ solve(δθ′) tal que Sol(δ′) ⊆ Sol(δ′′µ). Ahora bien,como δ′ = ∅, esto es equivalente a probar µ ∈ Sol(δ ′′). Como θ ∈ Sol(δ), θ =(θ′µ)|V−Π y δ no contiene variables de Π tenemos µ ∈ Sol(δθ ′), y por el Corolario15 debe existir δ′′ ∈ solve(δθ′) tal que µ ∈ Sol(δ′′) y este δ′′ es el que buscamos;

Page 180: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

180 6. Semantica Operacional con Igualdad

Nrrw2 supongamos f(t)θ2∅ θ

{F}2δ′, de modo que f(t)θ tiene un CS ∪ {F}-conflicto

con todas las cabezas de las reglas de f y δ ′ = ∅, luego Sol(δ′) = Sust. Igual que enla demostracion del Lema 10 podremos derivar:

f(t)2δ ε

{F}2δ

siendo θ′ = ε, µ = θ, S ′ = S ′′ = {F} y δ′′ = δ, luego δ′′µ = δθ y naturalmenteSol(δ′′µ) = Sust;

Eq en este caso distinguimos los posibles valores que podemos obtener:

• supongamos que la derivacion tiene la forma (t == s)θ2∅ ε

{true}2δ′

teniendo el sub-computo (t == s)θ∗

�σ

true con σ|var(tθ)∪var(sθ) = ε (que

implica σ = ε puesto que � no introduce sustituciones para variables queno esten presentes en la expresion a reducir en cada paso) y δ ′ = ∅. Por elTeorema 14 tenemos tθ ↓ sθ y ahora, por el Teorema 15, podemos derivar

t == s∗

�θ′

true con θ = (θ′µ)|V−Π. Entonces en SNarr podremos derivar

t == s2δ θ′

true2δ′′ tomando δ′′ ∈ solve(δθ′). Es claro que µ ∈ Sol(δθ′) y

por el Corolario 15 podremos tomar δ ′′ ∈ solve(δθ′) de modo que µ ∈ Sol(δ′′);

• supongamos que la derivacion tiene la forma (t == s)θ2∅ ε

{false}2δ′

teniendo el sub-computo (t == s)θ∗

�σ

false|δ′ . Como antes σ = ε, pero

ahora podemos tener:

◦ δ′ = ∅: se razona como en el caso anterior reemplazando ↓ por ↑ y true porfalse ;

◦ δ′ = {X 6= u}: por el Teorema 14 tenemos tθ ↑X 6=u sθ y entonces por el Teo-

rema 15 es posible derivar t == s∗

�θ′

false |Y 6=v tal que θ = (θ′µ)|V−Π y

Sol({X 6= u}) ⊆ Sol({Y 6= v}µ). Utilizando este sub-computo en Eq pode-

mos derivar t == s2δ θ′

{false}2δ′′, siendo δ′′ ∈ solve(δθ′∪{Y 6= v}).

Ahora, por un lado tenemos S ′ = S ′′ = {false} con lo que claramen-te (S ′)∗ v (S ′′µ)∗. Por otro lado, tenemos que probar Sol({X 6= u}) ⊆Sol(δ′′µ): tenemos que δ′′ ∈ solve(δθ′∪{Y 6= v}), µ ∈ Sol(δθ′) y Sol({X 6=u}) ⊆ Sol({Y 6= v}µ), de donde es facil concluir Sol({X 6= u}) ⊆ Sol(δ ′′µ);

Page 181: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

6.3.3 Correccion y completitud de SNarr con (==) 181

• si la derivacion tiene la forma (t == s)θ2∅ ε

{F}2δ′, teniendo el sub-

computo (t == s)θ∗

�σ

F con δ′ = ∅, como antes σ = ε y la demostracion es

completamente analoga al caso de una derivacion para true, donde en vez detrue ahora se tiene F y en vez de ↓ ahora se tiene 6↓ y 6↑;

Fail1 supongamos fails(S)θ2∅ ε

{true}2δ′, de modo que (Sθ)∗ = {F} y δ′ = ∅.

Como θ ∈ Sust no puede introducir F tiene que ser S ∗ = {F}, y entonces claramente

fails(S)2δ ε

{true}2δ. En este caso tenemos θ′ = ε, µ = θ, S ′ = S ′′ = {true}

y δ′′ = δ;

Fail2 supongamos fails(S)θ2∅{false}2δ, tal que existe t ∈ (Sθ)∗−{⊥, F} y δ′ = ∅. Enton-ces es claro que debe existir t′ ∈ S∗ tal que t′ = tθ, luego t′ 6∈ {⊥, F} y se podra derivar

fails(S)2δ ε

{false}2δ. Tenemos θ′ = ε, µ = θ, S ′ = S ′′ = {false} y δ′′ = δ;

Flat este caso es inmediato tomando θ ′ = ε y µ = θ;

Dist igual que el anterior;

Bind si⋃α∈{tθ} Sθ2∅

εSθ[α/tθ]2∅ con δ′ = ∅, entonces tambien se puede derivar

⋃α∈{t} S2δ

εS[α/t]2δ. En este caso tenemos θ′ = ε, µ = θ y δ′′ = δ;

Elim supongamos⋃α∈S′θ Sθ2∅

εSθ2δ′, con α 6∈ FV (S) y δ′ = ∅. Entonces, co-

mo θ no afecta a α, esta variable no puede aparecer en S, luego se puede derivar⋃α∈S′ S2δ

εS2δ. En este caso θ′ = ε, µ = θ y δ′′ = δ. �

El Teorema de completitud surge encadenando los dos Lemas previos al igual que enel capıtulo anterior. El enunciado, en este caso, tambien es ligeramente distinto:

Teorema 17 (Completitud de SNarr con (==)) Sea un SRLF-programa P, S2δ unac-expresion (S ∈ CExpF) con desigualdades y θ ∈ Sust∩Sol(δ). Si P `SRLF Sθ/C entonces

existe una SNarr-derivacion S2δ∗ θ′

S ′2δ′ con variables nuevas Π tal que para algun

µ ∈ Sust se tiene:

θ = (θ′µ) |V−Π,

C v (S ′µ)∗, y

Page 182: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

182 6. Semantica Operacional con Igualdad

µ ∈ Sol(δ′)

Demostracion: La demostracion sigue el mismo esquema que la del Teorema 13: si Sθ/C,

entonces por el Lema 14 podemos derivar Sθ2∅∗ ε

S12∅ tal que C v S∗1 . Por el Lema

15 existe una derivacion S2δ∗ θ′

S ′2δ′ con variables nuevas Π tal que θ = (θ′µ) |V−Π,

(S1)∗ v (S ′µ)∗ y Sol(∅) ⊆ Sol(δ′µ) para algun µ ∈ Sust, luego µ ∈ Sol(δ ′). Y por otro

lado se tiene C v (S1)∗ v (S ′µ)∗. �

Y tambien como consecuencia inmediata de este resultado obtenemos el analogo delCorolario 13 referido a derivaciones de fallo:

Corolario 18 Sea P un SRLF-programa, S2δ una c-expresion (S ∈ CExpF) con desi-gualdades y θ ∈ Sust ∩ Sol(δ). Si P `SRLF Sθ / {F} entonces existe una SNarr-derivacion

S2δ∗ θ′

{F}2δ′ con variables nuevas Π tal que para algun µ ∈ Sust se tiene θ =

(θ′µ) |V−Π y µ ∈ Sol(δ′).

Con este resultado queda completamente integrada la funcion (==) en la relacion deestrechamiento y concluye el desarrollo puramente teorico de este trabajo. Hemos propor-cionado una semantica formal para el fallo en PLF y una relacion de estrechamiento parael mismo. Esta relacion se formulo teniendo presente el siguiente objetivo: su implemen-tacion efectiva. De hecho, SNarr se diseno en paralelo con la implementacion del sistemaOOPS que presentamos en el capıtulo siguiente.

Page 183: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 7

Implementacion del fallo en PLF:

el sistema OOPS

En este capıtulo estudiaremos la forma de implementar el fallo en un sistema logico-funcional. Como primera tentativa serıa razonable tratar de llevar a cabo esta tareabasandonos en un sistema ya implementado como Curry o T OY, extendiendolo paraincluir la funcion fails como primitiva. En nuestro caso, puesto que T OY ha sido imple-mentado por nosotros mismos, lo mas sencillo serıa hacerlo en este sistema. Pero comoveremos, tal extension plantea serias limitaciones porque ni T OY ni Curry se adecuanfacilmente a la vision conjuntista en la que se apoya nuestra construccion de fallo. Porello abordaremos la implementacion de un prototipo logico-funcional basado directamenteen el calculo operacional que hemos construido en los capıtulos anteriores, en el que nosresulta comoda la manipulacion del fallo.

7.1. Primeras tentativas

7.1.1. Extension de T OY con fallo

En el Capıtulo 4 estudiamos la semantica denotacional de la funcion fails. En terminosde fallo en la reduccion podemos entender esta funcion como:

fails(e) =

{true si e falla al reducirse a forma normal de cabezafalse en otro caso

Como ya explicamos en el Capıtulo 4, la semantica de la funcion fails que proporcionanSRL y SNarr es una aproximacion a la definicion anterior. No obstante, esta definiciontiene una interpretacion directa en el mecanismo operacional de T OY , que esta guiadoprecisamente por la obtencion de formas normales de cabeza (dicho mecanismo se describeen detalle en [155]).

Siguiendo las ideas de [102], T OY lleva a cabo una traduccion a Prolog del programade partida, de modo que a cada funcion f de aridad n le corresponde un predicado dela forma f(t1, . . . , tn,H), donde t1, . . . , tn representan los argumentos de entrada de la

Page 184: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

184 7. Implementacion del fallo en PLF: el sistema OOPS

funcion y H el resultado de la evaluacion. Por otro lado, existe un predicado hnf para laobtencion de formas normales de cabeza con la siguiente especificacion Prolog:

hnf(E,H) ::= H es una forma normal de cabeza para la expresion E

Con todo ello, la implementacion de la primitiva fails resulta inmediata utilizando el fallofinito de Prolog:

fails(E,false):- hnf(E,H),!.fails(E,true).

Lo que expresa este codigo es en definitiva la negacion Prolog (mediante fallo finito) delpredicado hnf: si se puede reducir una forma normal de cabeza para E, entonces E nofalla, i.e., la funcion fails devuelve false; en otro caso (si no existe ninguna forma normalde cabeza para E) entonces E falla en la reduccion y la funcion fails devolvera true.

Esta sencilla implementacion de la funcion fails (con la sintaxis, declaracion de tiposadecuada, etc.), es perfectamente practicable en T OY y se ha implementado de hecho.Pero tiene algunas limitaciones. La primera de ellas no es un problema de implementacion;es inherente a nuestro marco: las funciones involucradas en las expresiones sobre las quese evalua el fallo no pueden contener variables extra.

Pero hay otra limitacion que no impone nuestra semantica, sino el propio fallo finito deProlog: no se garantiza la correccion si la expresion E sobre la que se evalua fails contienevariables, es decir, la funcion fails solo podra utilizarse con expresiones cerradas comoargumento.

Esto quiere decir que los ejemplos vistos en el Capıtulo 2 en los que se reducen expresio-nes sin variables funcionan bien con esta extension de T OY . Pero aquellos que involucranfallo constructivo no lo haran.

7.1.2. El fallo en Curry

En Curry [20] podrıamos hacer una extension similar a la del apartado anterior, con lasmismas limitaciones. Pero tambien podemos utilizar los recursos propios de este lenguaje,en concreto la busqueda encapsulada [80, 81]. En este apartado estudiamos nuevamenteel ejemplo de los caminos en un grafo de la Seccion 2.3.1 (pagina 28).

La sintaxis de Curry esta mas proxima a la de Haskell que la que venimos utilizandonosotros. En particular, las variables comienzan con minuscula y las constructuras y lostipos comienzan con mayuscula. Ademas, Curry incorpora el tipo Success con la construc-tora success (en este caso con minuscula) para expresar el resultado de la evaluacion derestricciones. Tambien cuenta con la primitiva findall, basada en busqueda encapsulada,y que calcula todas las soluciones del objetivo de busqueda mediante una exploracion enprofundidad, devolviendo los valores para la variable de busqueda en una lista.

Con esta primitiva se puede definir la funcion naf para expresar la negacion como fallofinito de la siguiente forma1):

1Vease la lista de distribucion de Curry enhttp://www.informatik.uni-kiel.de/~mh/curry/listarchive/0192.html

Page 185: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.1.3 Un intento en programacion funcional 185

naf :: Success -> Bool

naf c = (findall (\_ -> c)) == []

Dejando de lado cuestiones sintacticas, esta funcion tiene la semantica pretendida: devuelvetrue si no se encuentra ninguna solucion para c y false en caso contrario.

Una forma sencilla de adaptar nuestro programa sobre grafos al lenguaje Curry esinterpretar la funcion path como una restriccion (de tipo Success) para poder utilizardirectamente naf en la definicion de la funcion safe:

data Node = A|B|C|D

next :: Node -> Node

next A = B

next A = C

next B = D

path :: Node -> Node -> Success

path x y = if (x==y) then success else path (next x) y

safe :: Node -> Bool

safe x = naf (path x D)

Con este programa, si en Curry se lanza el objetivo safe A obtenemos el valor false, ysafe C se evalua a true, como se pretende.

No obstante, las implementaciones de Curry, como PAKCS [78], implementan unaversion de findall que no es capaz de instanciar variables libres (vease [20]). Esta limitaciones heredada por la funcion naf. Si se lanza un objetivo con una variable, como safe X,Curry lo deja suspendido, i.e., no es capaz de encontrar las ligaduras para X. En definitiva,se tiene la misma limitacion que en T OY, y esencialmente por las mismas razones.

7.1.3. Un intento en programacion funcional

En un lenguaje como Haskell, las listas intensionales sugieren tambien una posibletraduccion de las uniones indexadas de nuestra semantica operacional (una idea similar seplantea en [159]). Como es natural, en una traduccion mas o menos directa en programa-cion funcional no pretendemos capturar completamente el mecanismo de estrechamiento:no se hacen ligaduras de variables de las expresiones; de hecho solo consideramos expre-siones sin variables. La idea esencial de la traduccion que estamos sugiriendo es que unaunion de la forma:

⋃α∈S1

S2

corresponderıa informalmente a una lista intensional del estilo:

[β | α <− S1, β <− S2]

Page 186: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

186 7. Implementacion del fallo en PLF: el sistema OOPS

Notese que las funciones ahora devolveran listas de valores como contrapartida a losconjuntos obtenidos en SRL. Podrıamos plantear una traduccion mas formal para c-expresiones en general:

{t} se traduce como [t];

f(t) no varıa en la traduccion;

fails(S) se traducirıa como fails(TS) siendo TS la traduccion de S;

t == s se traducirıa como eq t s, siendo eq una implementacion de nuestra fun-cion igualdad, cuyo rango incluya tambien un valor especial de fallo de acuerdo connuestra semantica;

⋃α∈S1

S2 se traducirıa como [β | α <− TS1 , β <− TS2 ];

S1 ∪ S2 se traducirıa como TS1 + + TS2

Por ejemplo, la funcion coin definida en SRL como:

coin � {z} ∪ {s(z)}

en nuestra traduccion funcional serıa

coin = [z] + +[s(z)]

La funcion path en CRWL se definıa como:

path(X,Y ) → if (X == Y ) then true else path(next(X), Y )

al transformarla en su version conjuntista tenıamos:

path(X,Y )�⋃α∈(X==Y )

⋃β∈

⋃γ∈next(X) path(γ,Y ) ifThenElse(α, true , β)

y ahora, en la version funcional (en la sintaxis de Hugs, por ejemplo) tendrıa el siguienteaspecto:

path :: Node -> Node -> [Bool]

path x y = [delta | alpha <- eq x y,

gamma <- next x,

beta <- path gamma y,

delta <- ifThenElse alpha True beta]

Sin embargo, dejando a un lado algunos detalles que habrıa que aclarar, el problemafundamental es que una traduccion de este estilo no se corresponde realmente con nuestrasemantica conjuntista. Operacionalmente, esta lista intensional tiene la siguiente lectura:para cada uno de los alpha pertenecientes a la lista generada por eq x y, para cada uno delos gamma pertenecientes a la lista generada por next x, etc. En particular, para producirun valor de la lista resultante de una invocacion a path, por ejemplo path a a (aunqueocurre lo mismo con cualquier par de argumentos) necesitamos un valor del generador

Page 187: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.2. Hacia una implementacion de la relacion SNarr 187

beta <- path gamma a, que por recursion a su vez necesitara otro valor del generadorpath gamma’ a. El efecto es una recursion infinita como puede comprobarse experimen-talmente desarrollando por completo la traduccion que hemos planteado.

Notese que la relacion SNarr, en presencia de la c-expresion correspondiente:

⋃α∈(a==a)

⋃β∈

⋃γ∈next(a) path(γ,a) ifThenElse(α, true , β)

puede proceder reduciendo (a == a) a true y reemplazando α por este valor:

⋃β∈

⋃γ∈next(a) path(γ,a) ifThenElse(true, true , β)

a continuacion puede abordar directamente la invocacion a ifThenElse con lo que obtiene:

⋃β∈

⋃γ∈next(a) path(γ,a) true

y por ultimo, por eliminacion de indexaciones obtiene el conjunto {true}. En definitiva,con las listas intensionales estamos imponiendo un orden de evaluacion que no captura lasposibles reducciones de SNarr.

Como es natural, se puede abordar una implementacion de la relacion SNarr en PF;pero no sacarıa especial provecho de la aparente similitud entre nuestras uniones indexadasy las listas intensionales [133]. Por otro lado, para no restringir la presencia de variables enlas expresiones de partida, tambien habrıa que implementar el mecanismo de unificacion.

7.2. Hacia una implementacion de la relacion SNarr

A la vista de las limitaciones que hemos encontrado en las tentativas anteriores, nosplanteamos la posibilidad de construir un nuevo sistema que utilice un mecanismo decomputo basado directamente en la relacion SNarr del Cuadro 6.3 (pagina 174).

Estudiamos en primer lugar la conveniencia de mejorar la traduccion de las reglaspor defecto. A continuacion abordamos la problematica del indeterminismo de la relacionSNarr de cara a su implementacion posterior, que nos llevara a estudiar nociones dedemanda y extender la relacion SNarr para que opere guiada por la demanda.

Las reglas por defecto y la funcion ifFails

La funcion fails nos ha permitido introducir las reglas por defecto con la semantica quepretendıamos, pero la traduccion propuesta tiene inconvenientes desde el punto de vistapractico. Como ya apuntamos en la Seccion 2.2 una funcion de la forma:

f(z) → zdefault f(X) → s(z)

utilizando la funcion fails se traducirıa como:

f(X) → if (fails(f1(X)) then f2(X) else f1(X)f1(z) → zf2(X) → s(z)

Page 188: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

188 7. Implementacion del fallo en PLF: el sistema OOPS

Con esta traduccion se repetirıa la reduccion de f1(X) en el caso de que la condicionfails(f1(X)) se evalue a false. Por ejemplo, para reducir la expresion f(z), al evaluar lacondicion se reduce f1(z) y despues, para devolver el resultado vuelve a evaluarse f1(z).La solucion serıa utilizar algun mecanismo que aproveche la primera reduccion de f1(X)y una primera tentativa podrıa ser utilizar algun tipo de construccion let. Ası la regla laf podrıa reescribirse como:

f(X) → let Y = f1(X) in if fails(Y ) then f2(X) else Y

Sin embargo, esta regla es incorrecta porque en la variable Y se irıan recogiendo los distin-tos valores de f1(X) y fails se aplicarıa sobre estos valores individuales. Este hecho puedecomprenderse mejor recurriendo a la sintaxis conjuntista, donde esta regla se expresarıadel siguiente modo:

f(X)�⋃Y ∈f1(X)

⋃α∈fails(Y )

⋃β∈f2(X) ifThenElse(α, β, Y )

La relacion SNarr reducirıa f1(X) y reemplazarıa cada uno de los valores obtenidos enfails(Y ), con lo que efectivamente fails se evaluarıa sobre valores individuales del SAScorrespondiente en vez de hacerlo sobre el conjunto en cuestion.

La solucion para evitar la reevaluacion consiste en introducir una nueva funcion ifFailscon la semantica:

ifFails(e1, e2) = if fails(e1) then e2 else e1

pero implementada expresamente en el mecanismo de reduccion. Desde el punto de vistateorico, se podrıa definir en el calculo SRLF como:

S1 / {F} S2 / C

ifFails(S1,S2) / C

S1 / CifFails(S1,S2) / C

tal que existe t ∈ C − {⊥, F}

Y en la relacion SNarr se definirıa como:

IfF1 ifFails(S1,S2)2δ ε

S22δ si S∗1 = {F}

IfF2 ifFails(S1,S2)2δ ε

S12δ si ∃t ∈ (S1)∗ − {⊥, F}

Al nivel formal hay una gran similitud entre las funciones fails y ifFails, ya que ambastrabajan sobre el conjunto informacion, e intuitivamente resulta claro que tanto SRLFcomo SNarr seguiran preservando en esencia las propiedades estudiadas al incluir estanueva funcion.

Utilizando ifFails, una funcion de la forma:

f(t1) → e1. . .f(tn) → endefault f(tn+1) → en+1

Page 189: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.2.1 El problema del indeterminismo 189

se traduce como:

f(X) → ifFails(f1(X), f2(X))f1(t1) → e1. . .f1(tn) → enf2(tn+1) → en+1

7.2.1. El problema del indeterminismo

Con la semantica conjuntista que proponemos y su recoleccion de valores, el indeter-minismo se ha limitado considerablemente con respecto a CRWL. Pero aun conservamoscierto grado de indeterminismo en los mecanismos formales de reduccion, que de cara auna implementacion concreta, requiere un analisis ulterior. El Teorema de completitud 17(pagina 181) muestra, en pocas palabras, que la relacion SNarr es capaz de proporcionartodas las respuestas (reducciones con sustitucion) para una expresion dada. Lo que mues-tra de hecho es que existe una derivacion que proporciona la respuesta deseada, pero estarelacion no indica la regla a utilizar en cada paso. Es una relacion indeterminista de tipodon’t know. Por ejemplo, si suponemos f definida como f � f y la siguiente c-expresion:

⋃α∈f{true}

podemos reducir f con la regla Nrrw1 y (Cntx), lo que produce exactamente la misma c-expresion; haciendo reiteradamente esta reduccion tendremos un computo divergente queno proporciona ninguna solucion. Pero si aplicamos la regla Elim obtenemos directamente{true}. Este es un indeterminismo en la eleccion del redex, para el que debemos buscarcriterios de eleccion acordes a la evaluacion perezosa.

En la relacion SNarr hay tambien otro tipo de indeterminismo en la eleccion de reglasde programa que es deseable preservar, puesto que las distintas alternativas pueden ob-tener instancias de las variables distintas y por tanto a soluciones distintas. Por ejemplo,supongamos una funcion g definida sobre los naturales como:

g(z) � {true}g(s(N)) � {false}

y consideramos la c-expresion:

g(X)

Podemos aplicar Nrrw1 con la primera regla de g, obteniendo el resultado {true} con lasustitucion [X/z], o bien utilizar la segunda regla de g obteniendo el resultado {false} conla sustitucion [X/s(Y )]. Hablaremos en este caso de indeterminismo en la instanciacionen contraste con el indeterminismo en la eleccion del redex. No se trata de elegir unade las posibles ramas de computo, sino de garantizar que el mecanismo de reduccioneventualmente explore cada una de ellas para conseguir completitud en las respuestas,puesto que las distintas alternativas pueden proporcionar respuestas diferentes. Para estetipo de indeterminismo es adecuado delegar la exploracion en el mecanismo de backtrakingde Prolog, con lo que su implementacion no planteara especial dificultad.

Page 190: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

190 7. Implementacion del fallo en PLF: el sistema OOPS

Explorando nuestro mecanismo formal de estrechamiento podemos localizar y clasificarlos focos de indeterminismo y su tipo:

en la relacion SNarr, asumiendo sin perdida de generalidad que las aplicacionessucesivas de la regla Cntx se reducen a una unica aplicacion de la misma tenemos:

(*) la eleccion del redex por parte de la regla Cntx permite seleccionar cualquierredex sobre el que aplicar una las reglas restantes. Claramente esta regla intro-duce indeterminismo en la eleccion del redex;

• la regla Nrrw1 permite utilizar cualquier regla de programa cuya cabeza puedaunificarse con la llamada (sin ligar variables producidas). Esta regla introduceindeterminismo en la instanciacion;

en el mecanismo de evaluacion de (==) tenemos los siguientes focos:

(**) la igualdad concreta que se selecciona del conjunto de igualdades (el redex paraesta relacion) responde tambien a un indeterminismo en la eleccion del redex:para obtener el valor true hay que evaluarlas todas y en principio da igual elorden, pero para obtener false puede utilizarse una sola de ellas, sin procesarel resto;

• las reglas 3 y 6 tienen casos comunes de aplicacion. Por ejemplo X == z,con la regla 3 produce el valor true con la ligadura [X/z] y con la regla 6 elvalor false, con la desigualdad X 6= z. Esta regla introduce indeterminismoen la instanciacion, puesto que las distintas elecciones conducen a respuestasdiferentes (y excluyentes en este caso);

• otro tanto ocurre con las reglas 7 y 8, que en este caso son aplicables exactamen-te en los mismos casos y tambien introducen indeterminismo en la instanciacion;

la funcion solve en sı misma es determinista, pero el uso que se hace de ella en larelacion SNarr es otra fuente de indeterminismo, ya que las reglas Nrrw1 y Eq hande seleccionar un elemento del conjunto proporcionado por solve. Pero nuevamenteeste indeterminismo es en la instanciacion, puesto que distintas elecciones puedenconducir a distintas respuestas.

A la vista de este analisis hay dos puntos crıticos de indeterminismo en la eleccion deredex marcados con (*) y (**). El caso (**) consiste en seleccionar una igualdad de unconjunto y como veremos en la Seccion 7.3.7, una implementacion habil puede solucionarel problema. En el caso (*) se trata de seleccionar una de las sub-c-expresiones S1 o S2

en una c-expresion de la forma S1 ∪ S2, que es mas comprometido como veremos en lasiguiente Seccion.

7.2.2. Estrechamiento conjuntista guiado por la demanda

Intuitivamente, dada una c-expresion, hay en principio un conjunto distinguido desub-c-expresiones principales, que han de evaluarse y estan por tanto demandadas. Sonprecisamente las mas internas del nivel superior, i.e., aquellas que no estan indexadas ni

Page 191: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.2.2 Estrechamiento conjuntista guiado por la demanda 191

forman parte de otra sub-expresion indexada. Por ejemplo, si consideramos una constantec y una c-expresion de la forma:

(⋃α∈S f(α,X)) ∪ (

⋃β∈S′{c})

las sub-c-expresiones principales seran f(α,X) y {c}. Formalmente el conjunto PPal(S)de las sub-c-expresiones principales de S podrıa definirse como:

si S = {t} o S = f(t) o S = (t == s), entonces PPal(S) = S;

PPal(fails(S1) = PPal(ifFails(S1,S2)) = PPal(S1);

PPal(⋃α∈S1

S2) = PPal(S2);

PPal(S1 ∪ S2) = PPal(S1) ∪ PPal(S2)

A su vez, estas sub-c-expresiones principales pueden requerir la evaluacion de otras.Por ejemplo, supongamos que tenemos las constructoras a, b y c, y consideremos de nuevola funcion f del Ejemplo 5 (pagina 70):

f(a,X) → af(a, b) → bf(b, a) → c

En la c-expresion del ejemplo anterior, (⋃α∈S f(α,X))∪(

⋃β∈S′{c}), la c-expresion f(α,X)

requiere valores concretos para α, por lo que S tambien esta demandada.

La forma de proceder sera tratar de evaluar las sub-c-expresiones principales, que asu vez pueden demandar la evaluacion de otras sub-c-expresiones. Estas ultimas puedenlocalizarse comodamente a traves de las variables producidas que las indexan. En el ejemploanterior, para evaluar f(α,X) habra que evaluar la sub-c-expresion S asociada a α.

Antes de formalizar la nocion de variable demandada tenemos que solucionar otroproblema que puede ilustrarse con la funcion f anterior. Por ejemplo, en la c-expresion:

⋃α∈S

⋃β∈S′ f(α, β)

la variable β es o no demandada dependiendo de la regla de f que se considere (es de-mandada por las dos ultimas, pero no por la primera). En esta situacion no esta claro sireducir o no la c-expresion S ′. La solucion a este dilema intuitivamente es clara: reducirS, que esta demandada uniformemente por todas las reglas y despues, dependiendo delvalor obtenido reducir o no S ′ (si el valor es a reducir S ′ y no reducir en otro caso).

En realidad, este tipo de analisis serıa innecesario si las funciones demandasen exacta-mente los mismos argumentos con independencia de la regla concreta, i.e., si la demandade argumenos fuese uniforme en las reglas. Y esto puede conseguirse facilmente con unaligera modificacion en la alternativa 1) del algoritmo de obtencion de SRLF-programas apartir de CRWL-programas, introduciendo funciones intermedias. Sobre la complecion delas reglas de programa que se hizo en la Seccion 4.1.1 (pagina 105) anadimos ahora estaotra, quedando el primer caso del algoritmo como sigue (el resto queda intacto):

Page 192: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

192 7. Implementacion del fallo en PLF: el sistema OOPS

1. Alguna posicion u in V P (f(s)) es uniformemente demandada por Q (si hayvarias, elegir cualquiera).Sea X la variable de la posicion u en f(s) y C = {c1, . . . , ck} el conjunto de sımbo-los de contructora en la posicion u en las cabezas de las reglas de Q, y sea D ={d1, . . . , dl} el conjunto complementario de constructoras de C, esto es, D = CS−C.Definimos los nuevos patrones de las reglas como: sci = s[X/ci(Y )] y para las re-glas de fallo sdj

= s[X/dj(Z)], donde Y una m-tupla de variables frescas (siendo

ci ∈ CSm) y Z una m′-tupla de variables frescas (siendo dj ∈ CSm′)

Para cada i ∈ {1, . . . , k} definimos el conjunto Qci como el conjunto de reglas de Qque demandan la constructora ci en la posicion u.

Devolver

{f(sc1)� fc1(sc1), . . . , f(sck)� fck(sck)}∪

∆(Qc1 , fc1(sc1) ∪ . . . ∪ ∆(Qck , fck(sck))∪

{f(sd1) → F, . . . , f(sdl) → F}

El primer conjunto de reglas, {f(sc1)� fc1(sc1), . . . , f(sck)� fck(sck)}, es el conjuntode reglas de paso, en el que se anade el sımbolo de constructora al nombre de la funcion.Es inmediato comprobar que se sigue obteniendo un SRLF-programa y que la semanticano se ha alterado. Para ilustrar esta modificacion, aplicando ahora el algoritmo sobre lafuncion f que venimos utilizando, obtenemos:

f (a, X) � {a} ∪ fa1 (a, X)f (b, X) � fb(b, X)f (c, X) � {F}

fa1 (a, a) � {F}fa1 (a, b) � {b}fa1 (a, c) � {F}

fb(b, a) � {c}fb(b, b) � {F}fb(b, c) � {F}

(puede compararse este conjunto de reglas con el obtenido sin reglas de paso en la pagina105). Notese que efectivamente todas las reglas de una misma funcion demandan exacta-mente las mismas posiciones, garantizando ademas que no hay solapamiento entre ellas.

Esta transformacion produce una clase especial de SRLF-programas con demandauniforme. Ahora tiene sentido hablar de las posiciones demandadas por una funcion, queson las que demanda cualquiera de sus reglas y tenemos todo lo necesario para definir lasvariables demandadas por una c-expresion:

Definicion 16 (Variables demandadas de una c-expresion) El conjunto DV (S) ⊂V de variables demandadas de una c-expresion S se define sobre la estructura sintacticade la misma como:

DV ({t}) = var(t) ∩ Γ

DV (f(t)) = DVFun(f(t)) ∩ Γ, siendo

DVFun(f(t)) = {X ∈ var(t) | X ocupa una posicion demandada por f}

DV (t == s) = var(t) ∪ var(s)

Page 193: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.2.2 Estrechamiento conjuntista guiado por la demanda 193

DV (fails(S)) =

{∅ si S∗ = {F} o ∃t ∈ (S∗ − {⊥, F})DV (S) en otro caso

DV (ifFails(S1,S2)) =

{∅ si S∗

1 = {F} o ∃t ∈ (S∗ − {⊥, F})DV (S1) en otro caso

DV (⋃α∈S1

S2) =

{DV (S1) ∪DV (S2) si α ∈ DV (S2)DV (S2) en otro caso

DV (S1 ∪ S2) = DV (S1) ∪DV (S2)

Segun esta definicion solo las variables producidas pueden ser demandadas, lo cual tieneperfecto sentido de acuerdo con nuestra idea de que una variable demandada esta asociadacon una sub-c-expresion a evaluar. Por ejemplo, en la c-expresion:

S0 =⋃α∈

⋃β∈{a}f(β,Y )f(α,X) ∪

⋃γ∈f(Y,b)f(Z, γ)

tendremos DV (S0) = {α, β}.Apoyandonos en la nocion de variables demandadas podemos definir un tipo especial de

contextos de aridad 1 en los que la c-expresion del argumento estara siempre demandada.Los llamaremos contextos de demanda y se definen como:

C ::= [ ] | fails(C1) | ifFails(C1,S) | C1 ∪ S | S ∪ C1 |⋃α∈S C1 |

⋃α∈C1

S

donde C1 es un contexto de demanda, S es una c-expresion y, en el ultimo caso, α ∈ DV (S).Es facil ver que en cualquier forma contextual de una c-expresion que utilice un contextode demanda, la sub-c-expresion del argumento estara demandada de acuerdo con las ideasexpuestas. En particular, todas las sub-c-expresiones principales pueden jugar el papel deargumentos en un contexto de demanda. Por ejemplo, la c-expresion S0 anterior puedeescribirse en forma contextual con contextos de demanda de varias formas:

[ ] S0 (la c-expresion completa esta demandada);

(⋃α∈

⋃β∈{a}f(β,Y )[ ] ∪

⋃γ∈f(Y,b)f(Z, γ)) [f(α,X)]

(⋃α∈

⋃β∈{a}f(β,Y )f(α,X) ∪

⋃γ∈f(Y,b)[ ]) [f(Z, γ)]

(⋃α∈[ ]f(α,X) ∪

⋃γ∈f(Y,b)f(Z, γ)) [

⋃β∈{a}f(β, Y )]

(⋃α∈

⋃β∈[ ]f(β,Y )f(α,X) ∪

⋃γ∈f(Y,b)f(Z, γ)) [{a}]

Las tres primeras formas expresan la demanda de las sub-c-expresiones principales y lasdos ultimas reflejan la demanda de c-expresiones en uniones indexadas. Los argumentos deestas formas contextuales corresponden a los posibles redex de la c-expresion, lo cual noimplica que efectivamente pueda aplicarse alguna regla de reduccion sobre ellos. En esteejemplo, el calculo de estrechamiento solo podra operar sobre la tercera y cuarta formascontextuales (en el ultimo caso, el potencial redex ya es irreducible).

Ahora, para guiar la relacion SNarr de acuerdo con la demanda basta con modificarla regla Cntx, exigiendo que el contexto sea un contexto de demanda y que su argumentosea reducible:

Page 194: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

194 7. Implementacion del fallo en PLF: el sistema OOPS

Cntx C [S]2δ θ

Cθ [S ′]2δ′

si C es un contexto de demanda y S2δ θ

S ′2δ′

El resto de reglas de la relacion SNarr queda igual que en el Cuadro 6.3 (pagina 174).Con este cambio se ha limitado sensiblemente el indeterminismo de SNarr en la elecciondel redex y se consigue un comportamiento perezoso de SNarr. Pero el redex aun noqueda fijado de modo determinista ya que en general habra distintas sub-c-expresionesdemandadas en una c-expresion y el calculo no determina cual de ellas seleccionar.

Los problemas en unicidad en el redex vienen motivados, en ultima instancia, por lasc-expresiones del tipo S1 ∪ S2, en las que la misma forma sintactica hace alusion a unaeleccion en el computo. Por ejemplo, consideremos las funciones:

loop � loop g � {true},

y la siguiente c-expresion:

fails(loop ∪ g)

En este caso loop y g son los posibles redex. Si tomamos el primero, la c-expresion de par-tida se reduce a sı misma (reiterando esta eleccion se producirıa un computo divergente);mientras que reduciendo g tendrıamos:

fails(loop ∪ g) ε

fails(loop ∪ {true}) ε

{false}

por aplicacion de Cntx y Nrrw1 (para reducir g) y despues Fail2.

En general, no hay forma a priori de determinar cual de los redex es el adecuado.En este punto, de cara a la implementacion, hemos tomado una decision practica. Anteel indeterminismo en la eleccion de varios redex procedemos de un modo uniforme queresponde al siguiente principio:

ante la multiplicidad de redex, dar un paso de reduccion sobre cada uno de ellos

donde un paso de reduccion debe entenderse como una aplicacion de una regla de la relacionde estrechamiento distinta de Cntx. Ası, en el ejemplo anterior, para reducir fails(loop∪g),un paso sobre loop lo deja invariable y un paso sobre g produce {true}, con lo que se obtienefails(loop ∪ {true}) y despues {false} como se pretendıa. Queda garantizado en generalque cualquier sub-c-expresion demandada sera procesada eventualmente.

Este criterio tiene virtudes obvias en cuanto a la terminacion (y en consecuencia lacompletitud), pero tambien tiene otras implicaciones. Aunque no hemos hecho un plan-teamiento formal de esta relacion de estrechamiento con eleccion simultanea de redex,podemos razonar sobre su impacto en los resultados de correccion y completitud con res-pecto a la logica SRL. Por un lado, la correccion esta garantizada puesto que la c-expresionobtenida por aplicacion de esta nueva relacion puede obtenerse por aplicacion de reglas dela relacion SNarr original (completada con las dos reglas para ifFail).

Page 195: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.2.2 Estrechamiento conjuntista guiado por la demanda 195

Para la completitud la situacion es bien distinta. La nueva relacion esencialmente limitala aplicacion de reglas de SNarr mediante restricciones de demanda, i.e., hace que SNarrsea perezoso. Esto en principio no debe destruir el resultado de completitud. Pero hay unpunto crıtico: por ejemplo en una c-expresion de la forma S1∪S2 es posible que el computoglobal solo necesite reducir una de las sub-c-expresiones, mientras que nuestro mecanismoda un paso de reduccion sobre ambas, lo que puede producir instanciaciones innecesariasde variables. Por ejemplo, supongamos el SRLF-programa:

f(z) � {z}f(s(X)) � {F}

g(X)� {z}

Para reducir la c-expresion fails(f(Y ) ∪ g(Z)) el mecanismo propuesto da un paso dereduccion sobre f(Y ) y otro sobre g(Z). Para reducir f(Y ) hay dos posibilidades:

f(Y )2∅ ;[Y/z]

{z}2∅

f(Y )2∅ ;[Y/s(V )]

{F}2∅

mientras que para reducir g(Z) solo hay una eleccion:

g(Z)2∅ ε

{F}2∅

Combinando las posibles reducciones para f(Y ) y la reduccion para g(Z), la expresionfails(f(Y ) ∪ g(Z)) puede reducirse a

{false} con [Y/z], o bien

{false} con [Y/s(V )]

Pero segun la logica SRLF y la relacion SNarr original podemos obtener el resultado{false} sin ninguna ligadura (reduciendo g(Z) a {z} y dejando f(Y ) sin evaluar). Ası pues,el resultado de completitud del Teorema 17 no es cierto para la relacion SNarr guiada porla demanda: esta relacion no puede generalizar las sustituciones utilizadas por SRL (en estecaso la sustitucion vacıa). No obstante, en este ejemplo las respuestas obtenidas por la re-lacion guiada por la demanda cubren la respuesta general obtenida con la relacion original.Podemos conjeturar un resultado de completitud debil, como se expone a continuacion.

Intuitivamente lo que ocurre es que si la relacion SNarr original es capaz de derivaralgo de la forma:

S2δ θ

S ′2δ′

la nueva relacion guiada por la demanda sera capaz de hacer derivaciones de la forma:

Page 196: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

196 7. Implementacion del fallo en PLF: el sistema OOPS

S2δ θ1

S ′12δ

′1

S2δ θ2

S ′22δ

′2

. . .

S2δ θi

S ′i2δ

′i

. . .

de modo que la respuestas (S ′1, θ1, δ

′1), (S ′

2, θ2, δ′2), . . . , (S ′

i, θi, δ′i), . . . “capturan” la res-

puesta general (S ′, θ, δ′). Esta “captura” significa que una variable que no se liga en larelacion original SNarr, en la nueva relacion puede ligarse en distintas derivaciones a unconjunto de valores que cubren el espacio de busqueda.

Esta conjetura es razonable trabajando con los SRLF-programas obtenidos por latransformacion estudiada en la Seccion 7.2.2. Este tipo de programas, junto con las reglasde los calculos que restringen el valor de las variables (bien por sustitucion o bien mediantedesigualdades) garantizaran esta completitud en el espacio de valores. En concreto lasreglas de las que hablamos son Nrrw1 de la relacion SNarr y las reglas (3), (6) y (7)del Cuadro 6.2 (pagina 159). Con respecto a la regla Nrrw1 las ligaduras que hace estaregla son por unificacion de la llamada con una regla de programa y estas reglas soncompletas debido a la uniformidad en la demanda en las reglas, estudiada al principio dela seccion. Con respecto a las reglas de la igualdad, notese que las tres reglas implicadasson complementarias y excluyentes: la regla (3) produce una sustitucion, mientras que lasreglas (6) y (7) generan desigualdades incompatibles con esa sustitucion y ademas estasdos ultimas reglas son incompatibles entre sı.

A pesar de esta conjetura, en la practica las implementaciones reales como T OY oCurry y tambien OOPS son incompletas debido a la no terminacion. Por ejemplo, para elsiguiente programa:

f(z) � f(z)f(s(X)) � {z}

el objetivo f(Y ) producira un computo divergente sin dar ninguna respuesta (el sistemaelige las reglas de programa respetando el orden en que estan escritas), mientras que for-malmente, una relacion de estrechamiento puede producir la respuesta ({z}, [Y/s(X)], ∅).

7.3. El sistema OOPS

7.3.1. Descripcion del sistema

OOPS es un prototipo para el lenguaje logico-funcional con fallo que hemos desarro-llado formalmente en este trabajo. Al igual que otros sistemas logico-funcionales (T OY,Curry) esta implementado en Prolog [52], en concreto se ha implementado en el sistema

Page 197: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.1 Descripcion del sistema 197

operativo Linux utilizando el compilador SWI-Prolog2, ambos de libre distribucion3. Elmecanismo de computo es diferente por completo al de otros sistemas como T OY o Curry,ya que esta basado directamente en la relacion SNarr. No obstante, los programas fuentede OOPS tienen esencialmente la sintaxis (currificada) de T OY , mas proxima a la deCRWL y mas sencilla de utilizar que la sintaxis SRLF. El propio sistema lleva a cabo latransformacion a sintaxis SRLF, de forma transparente al usuario. Con relacion a T OY oCurry las innovaciones de OOPS son el propio fallo y algunas construcciones derivadasdel mismo. En concreto proporciona:

funcion predefinida fails correspondiente al fallo constructivo que hemos desarrolla-do;

funcion predefinida (==) segun la semantica que hemos estudiado en los capıtulosprecedentes. Recordemos que esta funcion puede devolver los valores true, false o F.En combinacion con las funciones if then y if then else , tambien predefinidascon la semantica habitual, se tiene la expresividad de las condiciones de T OY o lasguardas de Curry. Por otro lado, esta funcion tambien captura la expresividad delas desigualdades de T OY, tanto en programas como en respuestas;

funcion predefinida (/ =) que representa la negacion logica de (==), i.e., podrıadefinirse al nivel del lenguaje con la semantica:

X/= Y → (X == Y ) == false

El hecho de implementarla como predefinida permite utilizarla de forma infija (nose pueden definir operadores infijos en OOPS) y facilitar la escritura de programas;

dos construcciones let con la sintaxis:

let X <−e in e′ let X == e in e′

La diferencia es que en la primera e se evalua de forma perezosa dependiendo de lademanda de X por parte de e′, mientras que la segunda evalua la igualdad estrictaX == e con independencia de la demanda de e′. Ambas resultan muy utiles y senci-llas de implementar en el marco conjuntista, en el que se traducen respectivamentecomo:

⋃X∈e e

′⋃X∈e

⋃α∈X==X

⋃β∈e′

if α then β

Notese que en este caso la variable X se interpreta directamente como variableproducida;

2Disponible en http://www.swi-prolog.org/ para distintas plataformas junto con los manuales y otrasaplicaciones

3Vease la web http://www.gnu.org

Page 198: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

198 7. Implementacion del fallo en PLF: el sistema OOPS

construccion default para la definicion de reglas por defecto segun la semantica esla descrita en la Seccion 2.2, aunque la implementacion se basa en las ideas de laSeccion 7.2 y utiliza la funcion ifFails del apartado siguiente;

funcion predefinida ifFails con la semantica:

ifFails(e1, e2) = if fails(e1) then e2 else e1

Aunque esta primitiva se introduce para mejorar la traduccion de las reglas pordefecto queda tambien accesible al usuario;

generador de trazas de computo para depuracion. Debido a la complejidad sintacticade las c-expresiones y al propio mecanismo de estrechamiento, seguir paso a pasolos pasos de reduccion de una c-expresion es una tarea de enorme dificultad. Enel modo de depuracion OOPS muestra la evolucion del computo a traves de losconjuntos de informacion de las c-expresiones que va obteniendo en sucesivos pasosde reduccion. Al final del proceso muestra una ventana independiente con los pasos dereduccion detallados en un formato “legible” (LATEX que se compila a “postscript”).Este trazador resulto muy util en el diseno del motor de reduccion de OOPS y aunes una valiosa herramienta de analisis.

Hemos de decir que OOPS es solo un prototipo experimental y no anade muchas delas caracterısticas tıpicas de sistemas mas desarrollados como T OY o Curry. En concre-to, no tiene predefinidos algunos tipos elementales como los enteros, los reales, las listaso los caracteres. El unico tipo predefinido es el de los booleanos con los valores true yfalse. Tambien tiene predefinida la constructora polimorfica F (no accesible directamenteal usuario). Por otro lado, no detecta errores de tipo, y los errores lexicos y sintacticos tie-nen un tratamiento muy elemental (el sistema no ofrece muchas indicaciones acerca de lanaturaleza de los mismos). No proporciona ningun tipo de error en presencia de variablesextra o locales en las funciones, a pesar de que estas comprometen la correccion de las res-puestas. En definitiva, la correccion de los programas es en buena medida responsabilidaddel usuario.

7.3.2. Ejecutando OOPS

Una vez cargado el sistema en SWI-Prolog se muestra el prompt:

OOPS>

con un pequeno interprete de comandos, para los que puede obtenerse ayuda con “:h” quemostrara en pantalla:

Commands:

:l <program> - load program "<program>.oops"

:d - switch to debug mode

:nd - switch to non-debug mode

Page 199: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.2 Ejecutando OOPS 199

:f - switch to filter-fail mode

:nf - switch to non-filter mode

:h - show this message

:q - leave the OOPS system

Cualquier otra sentencia que no comience con “:” es interpretada como una expre-sion a reducir. Como ya hemos dicho, la sintaxis de OOPS es esencialmente la de T OY.Las variables comienzan por mayuscula y el resto de identificadores con minuscula. Laprincipal diferencia es que en OOPS las reglas no tienen la parte de condiciones ⇐ . . ..Los comentarios son al estilo C (los comentarios en lınea se ponen precedidos de // y loscomentarios generales encerrados entre /* y */).

Para ilustrar la sintaxis y el funcionamiento del sistema, consideremos el programa delEjemplo 2 (pagina 51), que se escribirıa como:

data nat = z | s nat

coin = z

coin = c z

add z X = X

add (s X) Y = s (add X Y)

double X = add X X

Podemos guardar este programa en el archivo “double.oops” y a continuacion compilarlocon el comando:

OOPS> :l double

Despues podrıamos hacer algunas reducciones:

OOPS> double coin

{ z, s(s(z)) }

Elapsed time: 0.00030601 secs. (8 reduction steps)

more [y]?

no.

Elapsed time: 6.40154e-05 secs.

OOPS>

o tambien:

OOPS> coin == X

Page 200: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

200 7. Implementacion del fallo en PLF: el sistema OOPS

{ true, false }

X = z

Elapsed time: 0.000286937 secs. (5 reduction steps)

more [y]?

{ false, true }

X = s(z)

Elapsed time: 0.000134945 secs. (5 reduction steps)

more [y]?

{ false }

X /= { s(z), z }

Elapsed time: 0.00010097 secs. (5 reduction steps)

more [y]?

no.

Elapsed time: 4.8995e-05 secs.

OOPS>

Notese que OOPS proporciona un conjunto de valores como resultado de la reduccion; acontinuacion presenta las ligaduras de variables y por ultimo las desigualdades sintacticas,en un formato abreviado cuya lectura es: la variable de la izquierda es distinta de cadauno de los valores de la lista de la derecha.

Activando el trazador de computo con la opcion “:d” obtendremos informacion deta-llada sobre el computo. Por ejemplo:

OOPS> :d

Debugger active

OOPS> add coin X == double coin

Information set:

{ bot }

{ bot }

{ bot }

{ bot, bot }

{ bot, bot, bot, bot }

{ bot, bot, bot, bot }

{ bot, bot, bot, bot }

{ bot, bot, bot, bot }

{ true, bot, false, bot }

{ true, false, false, bot }

Page 201: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.2 Ejecutando OOPS 201

{ true, false, false, bot }

{ true, false, false, false }

{ true, false }

X = z

Elapsed time: 0.011052 secs. (12 reduction steps)

more [y]?

...

{ false }

X = s(FV1)

FV1 /= { z, s(z) }

Elapsed time: 0.00050199 secs. (12 reduction steps)

more [y]? n

OOPS>

En estas reducciones el sistema muestra los conjuntos de informacion obtenidos para lasc-expresiones que va obteniendo por sucesivos pasos de reduccion. El termino bot representael indefinido ⊥ que en general ira tomando valores cada vez mas definidos, hasta obtenerel SAS (totalmente definido) correspondiente a la reduccion. Esta informacion es utilen particular para depurar computos que producen no terminacion. El sistema puedeintroducir variables libres adicionales para el computo que nombrara como FV 1, FV 2, . . .(como ocurre en la ultima respuesta del ejemplo).

Pero ademas, en el modo de depuracion, OOPS ha ido generando codigo LATEXenun archivo “debug.tex”. Al final del computo se compila este codigo y se muestra enpantalla el fichero “postscript” generado, que contiene el SRLF-programa obtenido portransformacion y la traza detallada del computo. Por ejemplo, si depuramos la reduccionadd X Y == s (s z), la traza mostrada tendra el siguiente aspecto:

(1)⋃

π1∈add(X,Y ) == [(π1, s(s(z )))] 2{} 2{}

(2)⋃

π1∈{Y } == [(π1, s(s(z )))] 2{X = z} 2{}

(3) == [(Y, s(s(z )))] 2{X = z} 2{}

(4) {true} 2{X = z, Y = s(s(z))} 2{}

Answer: {true} 2{X = z, Y = s(s(z))} 2{}

(4) {false} 2{X = z} 2{Y 6= s(s(z))}

Answer: {false} 2{X = z} 2{Y 6= s(s(z))}

(2)⋃

π1∈⋃

π2∈add(F V 1,Y ){s(π2)}== [(π1, s(s(z )))] 2{X = s(FV 1)} 2{}

Page 202: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

202 7. Implementacion del fallo en PLF: el sistema OOPS

. . .

(7) {true} 2{X = s(z), Y = s(z)} 2{}

Answer: {true} 2{X = s(z), Y = s(z)} 2{}

(7) {false} 2{X = s(z)} 2{Y 6= s(z)}

Answer: {false} 2{X = s(z)} 2{Y 6= s(z)}

. . .

Cada paso de reduccion corresponde a una lınea con el siguiente formato:

(i) S2θ2δ

donde (i) es un contador de pasos de reduccion, S es la c-expresion en proceso de reduccion,θ muestra las sutituciones realizadas hasta el momento y δ lleva cuenta de las desigualdadesgeneradas. El contador (i) permite hacer un seguimiento del backtraking que lleva a caboel sistema. Por ejemplo, en la reduccion anterior, tras la primera respuesta, el computo sereanuda en el paso (4), i.e., se utiliza una reduccion alternativa para la c-expresion del paso(3) de la reduccion anterior. Las variables producidas se notan como π1, π2, . . .. La funcion(==) se muestra en formato prefijo y su argumento es una lista de pares de terminos,que se interpretan como igualdades individuales. Eventualmente la traza muestra lıneasencabezadas por Answer que corresponden a reducciones completas y encajan (salvo elformato) con las respuestas que ofrece el sistema durante la ejecucion.

Si se activa el filtro de respuestas fallidas con la opcion “:f” el sistema no mostrara lasrespuestas {F} (los SAS’s de las respuestas pueden contener terminos con F, solo se excluyenlos SAS’s unitarios {F}). Esta opcion es a menudo util para obtener los “casos positivos”de las reducciones. Por ejemplo, en OOPS el generador de contradicciones disenando enla Seccion 2.6 (pagina 41), si se lanza tal cual como:

OOPS> if (complex F==s (s (s z))) then isContradiction F

produce gran cantidad de respuestas de la forma:

{ fail }

F = ...

que no son de interes en este ejemplo. Sin embargo, si activamos el filtro para este tipo derespuestas y lanzamos la reduccion:

OOPS> if (complex F==s (s (s z))) then success (isContradiction F)

las respuestas anteriores se eliminan y solo se muestran contradicciones de 3 conectivascomo se pretende. Notese que esta es una opcion que afecta solo a la presentacion derespuestas, no al computo en sı, i.e., el sistema realmente evalua las respuestas {F} perono las muestra en pantalla.

Page 203: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.3 Implementacion de OOPS 203

7.3.3. Implementacion de OOPS

En el diseno de OOPS se siguen esencialmente los pasos del desarrollo teorico quehemos presentado en los capıtulos precedentes: el CRWL-programa de partida se traduce aun SRLF-programa y las reducciones se llevan a cabo con un motor de reduccion basado enla relacion SNarr guiada por la demanda; para la reduccion de la funcion (==) se utilizaun mecanismo especıfico basado en las reglas del Cuadro 6.2 (pagina 159) y tambienen algunas ideas de gestion de desigualdades que ya disenamos para T OY [109, 155].Estudiaremos someramente el proceso de traduccion en los apartados siguientes y nosocuparemos mas en detalle del motor de reduccion y la evaluacion de la igualdad.

7.3.4. Analisis lexico y sintactico

Para procesar el programa de entrada se utilizan un parser basado en DCG’s de Prolog([52, 150]), implementado en el archivo “parser.pl”. No explicaremos en detalle su cons-truccion, pero sı el formato de salida que produce. Como entrada toma un archivo conextension “.oops” y genera otro con formato plano de extension “.flt”, que contiene el mis-mo programa pero en forma de hechos Prolog. En el archivo “.flt” para cada constructoracons se genera un hecho Prolog de la forma:

cdata(cons,arity,data type)

donde arity es la aridad de la misma y data type el tipo de datos que define. Para lasreglas de programa se generan hechos de la forma:

rule(cabeza, cuerpo, deLinea-aLinea)

donde cabeza y cuerpo corresponden a la cabeza y el cuerpo de la regla en sintaxis deprimer orden, y deLinea-aLinea guarda las lıneas donde comienza y termina la definicionde la regla (se usa para completar la informacion sobre errores). Por ejemplo, para elarchivo anterior “double.oops” se genera el archivo “double.flt” siguiente:

cdata(fail, 0, fail).

cdata(true, 0, bool).

cdata(false, 0, bool).

rule(ifThenElse(true, X, Y), X, 0).

rule(ifThenElse(false, X, Y), Y, 0).

rule(ifThen(true, X), X, 0).

cdata(z, 0, nat).

cdata(s, 1, nat).

rule(coin, z, 3-3).

rule(coin, s(z), 4-4).

rule(add(z, X), X, 6-6).

rule(add(s(X), Y), s(add(X, Y)), 7-7).

rule(double(X), add(X, X), 9-9).

Page 204: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

204 7. Implementacion del fallo en PLF: el sistema OOPS

El primer bloque corresponde a tipos de datos y funciones predefinidas y el segundo a lasintroducidas en el programa.

Nuestras construcciones let de la forma:

let X <−e in e′

se traducen en este paso a terminos Prolog de la forma:

let(X,e,e’)

Las reglas por defecto se traducen utilizando la funcion ifFails como se explico en laSeccion 7.2. Ası, para una funcion de la forma:

f(t1, . . . , tn) → e1. . .f(s1, . . . , sn) → endefault f(u1, . . . , un) → en+1

se produce un codigo Prolog de la forma:

rule(f(X_1,...,X_n), ifFails(f_1(X),f_2(X)), ...).

rule(f_1(t_1,...,t_n), e_1, ...).

...

rule(f_1(s_1,...,s_n), e_n, ...).

rule(f_2(u_1,...,u_n), e_n+1, ...).

El proceso de traduccion aun necesita analizar las funciones y producir un programaen formato conjuntista.

7.3.5. Traduccion a la sintaxis conjuntista

El archivo “setProgram.pl” toma como entrada el archivo con extension “.flt” de la faseanterior y genera otro con extension “.set” que contiene el SRLF-programa definitivo queutilizara el motor de reduccion. Esencialmente implementa el algoritmo de transformacionde la Seccion 3.2.2 con las extensiones correspondientes al fallo de la Seccion 4.1.1 ytambien incluye la transformacion de expresiones a c-expresiones.

Con respecto a la obtencion de c-expresiones a partir de expresiones estandar, la repre-sentacion Prolog que utilizamos hace corresponder a cada forma sintactica de c-expresionun termino Prolog del siguiente modo:

la constante F se representa con el termino fail

{t} se representa como una lista unitaria [t]

f(t) se representa como el termino Prolog f(t)

fails(S) se representa como fails(tpS) siendo tpS el termino Prolog correspondientea S

Page 205: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.5 Traduccion a la sintaxis conjuntista 205

t == t′ se representa como eq([(t, t′)])

⋃α∈S1

S2 se representa como in(pv(A), tpS1 , tpS2) siendo tpS1 y tpS2 los terminosProlog correspondiente a S1 y S2 respectivamente

S1 ∪ S2 se representa como tpS1 + tpS2 , siendo tpS1 y tpS2 como antes

Notese que segun esta representacion a una igualdad t == t′ le corresponde eq([(t, t′)]).El hecho de utilizar una lista de pares es aprovechado para mejorar la eficiencia del me-canismo de evaluacion de la funcion (==), que hara descomposiciones de terminos y uti-lizara listas de pares para no rehacer dichas descomposiciones.

Por otro lado, como puede apreciarse en las uniones indexadas, las variables producidasse representan como pv(. . .), lo que permitira determinar instantaneamente si una variablees producida o no.

La implementacion del algoritmo de obtencion de SRLF-programas a partir de CRWL-programas esta inspirada en el algoritmo de construccion de arboles definicionales [102]para T OY, aunque no llega a construir explıcitamente tales arboles. Incorpora algunasoptimizaciones en la lınea de las presentadas en [155] y en cuanto a la complecion de lasreglas de programa, utiliza la informacion de tipos de las constructoras. Esta complecionno se hace con respecto a todo el conjunto CS como indica el algoritmo, sino con respectoal subconjunto de las que tienen el mismo tipo que la de partida. Esto ademas de serlo correcto con respecto a los tipos, en general reduce considerablemente el numero dereglas de programa. Se presta atencion al orden de las reglas: se respeta el orden enel que aparecen en el programa y las nuevas reglas de fallo generadas por complecionse intercalan atendiendo a la complejidad de las constructoras que utilizan. Con ello semejoran las propiedades de terminacion en reducciones que requieren estrechamiento ensentido propio (con variables).

Para las reglas de funcion, OOPS produce hechos Prolog de la forma

setRule(nomFun, lstArgs, resul, demanda)

donde nomFun es el nombre de la funcion, lstArgs es una lista de terminos correspondientesa los argumentos, resul es la c-expresion correspondiente al cuerpo de la regla y demandaalmacena las posiciones que demanda la regla en cuestion4. Las posiciones demandadas serepresentan mediante una lista, donde cada posicion es a su vez una lista de enteros quecorresponden al ordinal del argumento al que representan. Ası por ejemplo, en un terminode la forma c(X, s(s(z))), la posicion del sımbolo z se representa como [2, 1, 1].

Por otro lado, los hechos cdata de la fase anterior se mantienen intactos (aunque elsistema no chequea tipos, el tipo de las constructoras es utilizado para instanciar variablesen las desigualdades como veremos). Como ejemplo, para el programa que contenıa lasfunciones double y coin, tomando el archivo “double.flt” de la Seccion 7.3.4, el SRL-programa generado en “double.set” serıa:

4Debido a la uniformidad en la demanda, el argumento demanda es redundante en todas lasreglas. Podrıa eliminarse de los hechos setRule y generar un hecho de la forma demandedPosi-tions(nomFun,demanda) para cada funcion.

Page 206: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

206 7. Implementacion del fallo en PLF: el sistema OOPS

cdata(fail, 0, fail).

cdata(true, 0, bool).

cdata(false, 0, bool).

cdata(z, 0, nat).

cdata(s, 1, nat).

setRule(add, [z, Y], [Y], [[1]]).

setRule(add, [s(X), Y], in(pv(A), add(X, Y), [s(pv(A))]), [[1]]).

setRule(coin, [], [z]+[s(z)], []).

setRule(double, [X], add(X, X), []).

setRule(ifThen, [true, X], [X], [[1]]).

setRule(ifThen, [false, X], [fail], [[1]]).

setRule(ifThenElse, [true, X, Y], [X], [[1]]).

setRule(ifThenElse, [false, X, Y], [Y], [[1]]).

El algoritmo de generacion de SRLF-programas incorpora ademas algunas otras opti-mizaciones de codigo en la lınea de las explicadas en [155].

7.3.6. El motor de reduccion de OOPS

El motor de reduccion de OOPS esta localizado en el archivo “engine.pl”, que esen-cialmente implementa la relacion SNarr guiada por la demanda introducida en la Seccion7.2.2. La evaluacion de la funcion (==) y toda la gestion de desigualdades se implementacomo un mecanismo subsidiario que estudiaremos en la Seccion 7.3.7.

El predicado esencial del motor de reduccion es (los prefijos “+” y “-” indican si elargumento es de entrada o salida respectivamente):

step(+Sin,-Sout,-Dvar,+Cin,-Cout)::= reduce la c-expresion Sin a Sout;en Dvar recopila la lista de variables de-mandadas y Cin/Cout son los conjuntosde desigualdades de entrada/salida res-pectivamente

Un paso de reduccion (o invocacion a step) es un paso de reduccion sobre cada una delas sub-c-expresiones de Sin para obtener Sout. Sobre cada una de las sub-c-expresionesse intenta aplicar una de las reglas de SNarr (Cuadro 6.3, pagina 174) distinta de Cntx.Si tal aplicacion no es posible, la sub-c-expresion se deja intacta. Ası pues un paso dereduccion corresponde en general a la aplicacion de varias reglas de SNarr. El computoprogresa porque Sin siempre contendra al menos una sub-c-expresion sobre la que aplicaruna de las reglas de SNarr (distinta de Cntx).

Las clausulas de step reflejan una reorganizacion de las reglas de la relacion SNarrguiada por la demanda. El propio predicado se encarga de acceder a las sub-c-expresiones

Page 207: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.6 El motor de reduccion de OOPS 207

de Sin, i.e., aplica la regla Cntx de modo implıcito. Ademas en esta descomposicion,para mejorar el rendimiento, se encargara simultaneamente del calculo de las variablesdemandadas:

% union plana, descomposicion

step(S1+S2,S1s+S2s,Dvar,Cin,Cout):-

!,

step(S1,S1s,Dvar1,Cin,Cout1),

step(S2,S2s,Dvar2,Cout1,Cout),

append(Dvar1,Dvar2,Dvar).

% conjunto unitario o forma normal, se deja intacto

step([T],[T],Dvar,Cin,Cin):- !, pVarTerm(T,Dvar/[]).

% union indexada, descomposicion

step(in(pv(X),S1,S2),SOut,Dvar,Cin,Cout):-

!,

step(S2,S2Out,Dvar1,Cin,Cout1),

continueStep(in(pv(X),S1,S2Out),SOut,Dvar1,Dvar,Cout1,Cout).

continueStep(in(pv(X),S1,S2Out),SOut,Dvar1,Dvar,Cin,Cout):-

free_variables(S2Out,FV),

(

% Elim

not(memberVar(X,FV)),

!,

SOut=S2Out, Dvar=Dvar1, Cout=Cin

;

% indexacion dentro de indexacion

not(memberVar(X,Dvar1)),

!,

SOut=in(pv(X),S1,S2Out), Dvar=Dvar1, Cout=Cin

;

% pv(X) esta demandada

(

% Bind

S1=[T],

!,

replace(pv(X),T,S2Out,SOut),

Dvar=Dvar1, Cout=Cin

;

% Flat

S1=in(pv(Y),S3,S4),

!,

SOut=in(pv(Y),S3,in(pv(X),S4,S2Out)),

Dvar=Dvar1, Cout=Cin

;

% Dist

S1=S3+S4,

Page 208: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

208 7. Implementacion del fallo en PLF: el sistema OOPS

!,

SOut=in(pv(X),S3,S2Out)+in(pv(X),S4,S2Out),

Dvar=Dvar1, Cout=Cin

;

% si no, es invocacion a funcion

step(S1,S1Out,Dvar2,Cin,Cout),

SOut=in(pv(X),S1Out,S2Out),

append(Dvar1,Dvar2,Dvar)

)

).

La primera clausula refleja nuestro modo de proceder ante una c-expresion de la formaS1∪S2. La segunda deja intactas las c-expresiones de la forma {t}, pero eso sı, devolviendoen Dvar el conjunto de variables producidas de la misma (que son de hecho demandadas)mediante el predicado pVarTerm. En el caso de una union indexada de la forma

⋃α∈S1

S2

la tercera clausula da un paso de reduccion sobre S2 determinando de paso las varia-bles demandadas de la misma. Despues continueStep determina lo que hay que hacer conS1. Intenta aplicar las reglas de SNarr en el orden apropiado para minimizar la compro-bacion de condiciones, hasta que al final, por exclusion llega al caso de una invocaciona funcion. Notese ademas que en la aplicacion de Bind se invoca a un predicado re-place(pv(X),T,S2Out,SOut) (reemplaza la variable producida X por el termino T en lac-expresion S2Out, obteniendo SOut). Esta sustitucion no puede hacerse mediante unifica-cion Prolog porque en otro contexto la misma variable puede tener que reemplazarse porotro valor distinto.

Para la evaluacion de una funcion se implementa la siguiente clausula:

% funcion de usuario

step(Fun,SOut,Dvar,Cin,Cout):-

functor(Fun,Nom,_),

setRule(Nom,_,_,Dem),

demandedPvars(Fun,Dem,Res),

!,

(

% Nrrw_2

Res==clash, !, SOut=[fail], Dvar=[], Cout=Cin

;

% reduccion bloqueada por vars demandadas

Res\==[], !, SOut=Fun, Dvar=Res, Cout=Cin

;

% Nrrw_1

Fun=..[_|ArgsCall],

Dvar=[],

!,

setRule(Nom,ArgsCall,Body,Dem),

solve(Cin,Cout),

SOut=Body

).

En primer lugar se utiliza una regla cualquiera de la funcion implicada para conocer las

Page 209: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.6 El motor de reduccion de OOPS 209

posiciones que demanda dicha funcion. Con esas posiciones, el predicado demandedPvarsdetermina las variables que demanda la llamada. Este mismo predicado determina si hayconflicto de constructoras, en cuyo caso se devuelve fail . Si no hay conflicto pero sı variablesdemandadas deja la llamada intacta y devuelve en Dvar la lista de tales variables. Enotro caso puede aplicar una regla cualquiera de funcion, para lo cual se selecciona unaregla en concreto, unificando su cabeza con la llamada, se obtiene una solucion para elconjunto de desigualdades mediante solve y se devuelve como resultado el cuerpo de laregla en cuestion. Notese que en este caso, tanto la seleccion de la regla de funcion comoel resultado de solve responden a un indeterminismo en la instanciacion que se delega enel backtraking de Prolog.

Con respecto a la igualdad, en realidad se implementan tres clausulas distintas: unapara la funcion igualdad (==) propiamente dicha (eq), otra para la igualdad orientada afalse (eqFalse) y otra para la desigualdad (/=) habitual (neq). La utilidad de la segundapuede ilustrarse con un ejemplo sencillo: supongamos una constructora c ∈ CS 2 y losnaturales con z y s; analicemos las posibles soluciones para la igualdad

c(z, F) == c(α, z)

siendo α una variable producida. Con seguridad no se evaluara a true por la presenciade F. Que se evalue a false o a F depende del valor que tome α: si toma el valor F o z laigualdad se evalua a F y si toma otro valor distinto de z la igualdad sera false. En resumen,esta igualdad puede evaluarse a F o a false y su valor depende de la igualdad z == α.Entonces la igualdad original se reduce a una igualdad orientada eqFalse([(z, α)]) segun elsignificado anterior.

step(eq(L),SOut,Dvar,Cin,Cout):- !, eq(L,SOut,Dvar,Cin,Cout).

step(eqFalse(L),SOut,Dvar,Cin,Cout):- !, eqFalse(L,SOut,Dvar,Cin,Cout).

step(neq(L),SOut,Dvar,Cin,Cout):- !, eq(L,SOut1,Dvar,Cin,Cout),

(

SOut1==[true],SOut=[false];

SOut1==[false],SOut=[true];

SOut1==[fail],SOut=[fail];

SOut1=..[eq|L1],SOut=..[neq|L1]

).

En cuanto a la funcion /= (neq), la forma de proceder es evaluar la igualdad y luego“invertir” el resultado, teniendo en cuenta que F queda invariable y que puede producirseuna lista de igualdades como respuesta.

Para las funciones fails y ifFails utilizamos dos predicados auxiliares: info calculael conjunto informacion de una c-expresion (en este punto se introduce explıcitamenteel termino bot que representa el valor ⊥); el predicado allFail determina si el conjuntoinformacion es exactamente {F} (devuelve AF=true), si hay algun termino construido(devuelve AF=false) o si el conjunto informacion es {⊥} (devuelve AF=bot) y por tantohay que reducir la c-expresion S.

step(fails(S),R,Dvar,Cin,Cout):-

!,

Page 210: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

210 7. Implementacion del fallo en PLF: el sistema OOPS

info(S,I/[]),

allFail(I,AF),

(

% Fail_1

AF==true,!,R=[true], Dvar=[],Cout=Cin

;

% Fail_2

AF==false,!,R=[false], Dvar=[],Cout=Cin

;

% descomposicion

step(S,S1,Dvar,Cin,Cout), R=fails(S1)

).

step(ifFails(S,Sd),R,Dvar,Cin,Cout):-

!,

info(S,I/[]),

allFail(I,AF),

(

% ifFail_1

AF==true,!,R=Sd, Dvar=[],Cout=Cin

;

% ifFail_2

AF==false,!,R=S, Dvar=[],Cout=Cin

;

% descomposicion

step(S,S1,Dvar,Cin,Cout), R=ifFails(S1,Sd)

).

El predicado step sera invocado recursivamente por snarr hasta obtener una formanormal para la c-expresion. Una forma de detectar este hecho es basandonos en que stepsera capaz de efectuar alguna reduccion mientras la c-expresion no este normalizada, odicho de otro modo, la c-expresion esta normalizada cuando step la deja intacta.

snarr(N,N2,S,Ss,Cin,Cout):-

N1 is N+1,

step(S,S1,_,Cin,Cout1),

continueSNarr(N1,N2,S,S1,Ss,Cout1,Cout).

continueSNarr(N,N1,S,S1,Ss,Cin,Cout):-

(

S==S1,!,Cout=Cin,Ss=S1,N1=N

;

snarr(N,N1,S1,Ss,Cin,Cout)

).

En general, el uso de cortes Prolog (!) es crıtico en todo el codigo. Por ejemplo, eneste ultimo predicado snarr se utiliza un predicado auxiliar continueSNarr precisamentepara incluir el corte en este segundo. De hacerlo directamente en snarr anularıamos laposibilidad de backtraking de Prolog. Algo similar ocurre con step y continueStep.

Page 211: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.7 Funcion (==) y gestion de desigualdades 211

El codigo de estos predicados junto con los auxiliares referenciados puede encontrarseen el apendice A.

7.3.7. Funcion (==) y gestion de desigualdades

A la vista de las invocaciones que hace el motor de reduccion seran necesarios los pre-dicados: eq, eqFalse (igualdad orientada a false) y solve, que estudiaremos en esta seccion.El mecanismo de resolucion de igualdades del Cuadro 6.2 (pagina 159) esta implementadoen el archivo “eqFunction.pl”. En este mismo archivo tambien se implementa la funcionsolve del Cuadro 6.1 (pagina 157) y en general toda la gestion de desigualdades.

Los conjuntos de igualdades se representaran como una lista de pares de terminos, deforma que cada uno de los pares representa una igualdad individual. El hecho de utilizarlistas sirve para evitar repetir descomposiciones de terminos al evaluar igualdades. Porejemplo, si tenemos c ∈ DC2 y los naturales con z y s, para la expresion c(s(coin), X) ==c(s(s(z), coin) (tras algunos pasos de reduccion) puede obtenerse la c-expresion:

⋃α∈coin

⋃β∈coin ==([(c(s(α), s(s(z))), c((β,X)))])

Para evaluar la sub-c-expresion == ([(c(s(α), s(s(z))), c((β,X)))]), el mecanismo de laigualdad obtiene por descomposicion == ([(α, s(z)), (β,X)]), y despues no puede conti-nuar porque demanda la evaluacion de α y β. En vez de devolver la lista original, devuelvela segunda, que es equivalente y en la que ya ha llevado a cabo un trabajo de descompo-sicion que no necesita repetirse.

La forma de reducir la funcion igualdad se basa en la relacion formal estudiada, peroel problema de seleccion de redex se resuelve a este nivel, en la implementacion. La ideaes pre-procesar todas las igualdades implicadas tratando de anticipar un resultado sinimponer restricciones sobre las variables (sustituciones o desigualdades). El pre-procesadoen cuestion consiste en estudiar la frontera, i.e., la parte construida de los terminos im-plicados, con la esperanza de encontrar un conflicto de constructoras o un fallo en eloccurCheck5. En ambos casos el resultado de la igualdad sera false sin ninguna condicionsobre variables. Por ejemplo, si tenemos la siguiente lista de igualdades:

X == Y, s(z) == s(X), z == s(z)

estudiando la frontera, en la ultima igualdad encontramos un conflicto entre z y s(z), conlo que se obtiene directamente el valor false sin ninguna ligadura para las variables.

En el caso de no encontrar tal conflicto o fallo en el occurCheck, el estudio de la fronterahace una descomposicion de terminos devolviendo una lista de igualdades pendientes comoresultado. En el ejemplo anterior, si no estuviese la ultima igualdad se obtendrıa la lista[(X,Y ), (z,X)] (se ha eliminado la constructora s en la segunda igualdad).

Este estudio de la frontera ya fue implementado en T OY (vease [155]), pero aquı lasituacion es ligeramente distinta por la presencia de F y las variables producidas (en vezde suspensiones como en T OY). Como ya hemos explicado en la Seccion anterior, la

5El sistema OOPS, al igual que T OY , implementa el occurCheck para la resolucion de igualdades ydesigualdades.

Page 212: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

212 7. Implementacion del fallo en PLF: el sistema OOPS

presencia de F permite restringir los posibles resultados al conjunto {false , F}, i.e., permiteorientar la igualdad. Por otro lado, el estudio de la frontera que implementamos aquı esmas sofisticado que en T OY . No se queda en la estructura construida de los terminos sinoque hace un estudio completo de los terminos determinando:

evaluacion a false en caso de conflicto de constructoras (regla (5) del calculo) o falloen occurCheck;

la lista de igualdades pendientes en el caso de no encontrar conflicto o fallo enoccurCheck, y ademas

el conjunto de variables producidas/demandadas implicadas en los terminos;

la presencia de F en los terminos (para orientar a false);

en la lista de igualdades pendientes anade a cada par (T1, T2) una tercera compo-nente Tot que tomara el valor tot si no hay F ni variables producidas implicadas enesa igualdad concreta; y notot en caso contrario. En el caso de una terna (T1, T2, tot)tenemos la garantıa de que es posible hacer la ligadura T1 = T2 (regla (3) del Cuadro6.2) o bien establecer la desigualdad T1/= T2 (regla (6)) directamente, sin llevar acabo la imitacion de estructura (reglas (7) y (8)).

Por ejemplo, consideremos c ∈ CS2 y el siguiente conjunto de igualdades:

c(s(X), X) == c(Y,X), s(Z) == s(F), s(s(pv(U))) == s(V )

En este caso no hay conflicto de constructoras ni fallo en el occurCheck. Haciendo ladescomposicion de los terminos (regla (4) del calculo) obtenemos las igualdades:

s(X) == Y, X == X, Z == F, s(pv(U)) == V

En la frontera, la primera igualdad se representara mediante la terna (s(X), Y, tot ), lasegunda X == X es trivial y no se anota en la frontera (regla (2) del calculo). La terceraZ == F no admite procesado posterior y no se anota en la frontera, pero se informara dela presencia de F que indica que la igualdad original no puede evaluarse a true. La ultimaproduce la terna (s(pv(U)), V, notot) y la variable U se anota como demandada.

Todo este analisis de la frontera es llevado a cabo por el predicado eqFrontierLst(+L,-Fr/[],-D/[],-F) que devuelve en Fr la frontera de las igualdades representadas en L; en Ddevuelve el conjunto de variables producidas de L; por ultimo F se instancia a false si hayconflicto o fallo en occurCheck, a F si no se da la situacion anterior pero hay F implicadoen las igualdades y se deja como variable en otro caso.

Ademas, la frontera orienta los pares que representan las igualdades de modo que enuna terna de la forma (T1, T2, ), el termino T1 sera siempre variable libre o producida(en el caso de que T1 sea variable producida y T2 sea libre se orienta como (T2, T1, )).Ası, para el ejemplo anterior el resultado serıa:

Fr = [(Y, s(X), tot), (V, s(pv(U)), notot)] D = [U ] F = fail

Page 213: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.7 Funcion (==) y gestion de desigualdades 213

donde F = fail proviene de la igualdad Z == F que no se refleja en la frontera. Utilizandola informacion de la frontera, el predicado eq se implementa como sigue:

eq(L,Res,D,Cin,Cout):-

eqFrontierLst(L,Fr/[],D/[],F),

(

% conflicto de constructoras (regla 5) o fallo en occurChek -> false

F==false, !, Res=[false], Cin=Cout

;

% no hay variables demandadas

D==[],!,

(

% fallo implicado -> orientacion a false

F==fail,!,

(

% frontera vacia -> fail (regla 9)

Fr==[], !, Res=[fail], Cin=Cout

;

% no vacia -> se fuerza desigualdad o conflicto (reglas 6/8)

Res=[false], eqFrFalse(Fr,Cin,Cout)

)

;

% no hay fail implicado, terminos totales -> orientacion

% a true o false (se excluye fail)

eqFrTrueFalse(Fr,Res,Cin,Cout)

)

;

% hay vars dems -> se intenta desigualdad o conflicto (reglas 6/8)

eqFrFalseSusp(Fr,LRes,Cin,Cout),

% indeterminismo en la instanciacion -> no cortes

(

% se ha podido forzar

LRes==[false], Res=[false]

;

% no se puede forzar

LRes\==[false],

(

% hay fail implicado -> se suspende, pero orientado a false

F==fail, Res=eqFalse(LRes)

;

% no hay fail implicado, se devuelve intacto

F\==fail, Res=eq(LRes)

)

)

).

La igualdad orientada a false se implementa con la misma idea, pero se simplificanalgunos casos:

% es analogo a eq pero contando con la orientacion a false

Page 214: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

214 7. Implementacion del fallo en PLF: el sistema OOPS

eqFalse(L,Res,D,Cin,Cout):-

eqFrontierLst(L,Fr/[],D/[],F),

(

F==false, !, Res=[false], Cin=Cout

;

D==[], !,

(

Fr==[], !, Res=[fail], Cin=Cout

;

Res=[false], eqFrFalse(Fr,Cin,Cout)

)

;

eqFrFalseSusp(Fr,Res,Cin,Cout),

(

LRes==[false], Res=[true]

;

LRes\==[false], Res=eqFalse(LRes))

).

En estos predicados la idea es utilizar como redex el conjunto completo de igualdadesen vez de una concreta, tratando de hacer el computo lo mas determinista posible. En lospredicados orientados la situacion es diferente, ya que nos veremos forzados a seleccionarigualdades concretas de la frontera de modo indeterminista. Para tratar adecuadamenteeste indeterminismo en la instanciacion las alternativas han de imponer condiciones mutua-mente excluyentes sobre las variables. Los predicados eqFrTrueFalse, eqFrTrue y eqFrFalseoperan sobre fronteras sin F ni variables producidas y estan orientados respectivamente a{true , false}, {true} y {false} (todos ellos excluyen F).

% terminos totales, orientada a true/false

eqFrTrueFalse([],[true],Cin,Cin):-!.

eqFrTrueFalse(Fr,Res,Cin,Cout):-

(

Res=[true], eqFrTrue(Fr,Cin,Cout)

;

Res=[false], eqFrFalse(Fr,Cin,Cout)

).

% terminos totales, orientada a true

eqFrTrue([],Cin,Cin).

eqFrTrue([(X,T,tot)|R],Cin,Cout):-

X=T, solve(Cin,Cout1), eqFrTrue(R,Cout1,Cout).

% terminos totales, orientada a false

eqFrFalse([(X,T,tot)|R],Cin,Cout):-

% insercion de la desigualdad X/=T, o de una de las restantes

addCtr(X,T,Cin,Cout); eqFrFalse(R,Cin,Cout).

En el caso de que la frontera contenga variables producidas la orientacion es mas

Page 215: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.3.7 Funcion (==) y gestion de desigualdades 215

compleja. De acuerdo con la filosofıa de la pereza tratamos de obtener {false} provocandoun conflicto de constructoras, pero tambien podemos obtener como resultado un conjuntode igualdades suspendidas por la presencia de variables producidas. Esta situacion se daprecisamente en un ejemplo anterior, en el que habıamos obtenido la frontera:

[(Y, s(X), tot), (V, s(pv(U)), notot)]

En este caso el modo de proceder es el siguiente: en primer lugar podemos obtener el valorfalse imponiendo la desigualdad Y 6= s(X); otra posibilidad es hacer lo contrario, i.e.,ligar Y = s(X) y buscar el conflicto entre las restantes igualdades, i.e., buscar un conflictoen la igualdad s(pv(U)) == V . Pero ahora no podemos razonar igual ya que hay unavariable producida implicada. Aun ası, hay informacion suficiente para provocar valoresfalse . Una posibilidad es ligar V = z. Otra posibilidad (excluyente) es ligar V = s(W )y dejar la igualdad W == pv(U) suspendida. Este es el modo de funcionamiento delpredicado eqFrFalseSusp que mostramos a continuacion:

eqFrFalseSusp([],[],Cin,Cin).

eqFrFalseSusp([(X,T,Tot)|R],Res,Cin,Cout):-

(

var(X),!,

(

Tot==tot,!,

% alternativas excluyentes

(

addCtr(X,T,Cin,Cout), Res=[false]

;

X=T,solve(Cin,Cout1), eqFrFalseSusp(R,Res,Cout1,Cout)

)

;

% constructoras del mismo tipo

functor(T,Nom,Ar), cdata(Nom,Ar,Tipo), !,

(

% con una distinta -> conflicto

cdata(Nom2,Ar2,Tipo),Nom\==Nom2, functor(F,Nom2,Ar2),

X=F, solve(Cin,Cout), Res=[false]

;

% con una igual -> imitacion y busqueda de conflicto

functor(F,Nom,Ar),X=F,solve(Cin,Cout1),

X=..[_|Args1], T=..[_|Args2],

eqFrontierLst(Args1,Args2,Fr1/R,_/_,_),

eqFrFalseSusp(Fr1,Res,Cout1,Cout)

)

)

)

;

% si X no es var entonces es pv(_)

(

% se busca conflicto en las restantes

eqFrFalseSusp(R,Res1,Cin,Cout),

(

Page 216: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

216 7. Implementacion del fallo en PLF: el sistema OOPS

Res1==[false], Res=[false]

;

Res1\==[false],Res=[(X,T,Tot)|Res1]

)

).

Para el ejemplo anterior este codigo proporciona por backtraking las tres posibilidadesque pretendıamos:

valor false con Y 6= X

valor false con Y = X y V = z

igualdad pendiente W == pv(U) con V = s(W )

Ademas, en este caso, como esta frontera provenıa de un conjunto de igualdades con failimplicado, para la ultima posibilidad el predicado eq se encargarıa de orientar el computodevolviendo el termino eqFalse([(W,pv(U), )]) y la variable U anotada en las lista dedemandadas.

Terminamos esta Seccion explicando brevemente como se lleva a cabo la manipulacionde desigualdades. En primer lugar para la representacion de los conjuntos de desigualdadesse utiliza una lista Prolog de la forma [X:[T1,. . . ,TN],. . . ,Y:[S1,. . . ,SM]], donde X,. . . ,Yson variables y T1,. . . ,TN,S1,. . . ,SM son terminos construidos (sin fallo ni variables pro-ducidas). Su manipulacion se hace a traves de dos predicados:

addCtr(+X,+T,+Cin,-Cout)::= anade la restriccion X/= T al conjunto Cin obte-niendo el nuevo conjunto Cout;

solve(+Cin,-Cout)::= obtiene en Cout una solucion para el las desigualdades de Cinde acuerdo a la definicion formal de la funcion solve del Cuadro 6.1 (pagina 157).Por backtraking de hecho devuelve todas las posibles soluciones.

El codigo completo del archivo “eqFunction.pl” puede consultarse en el apendice A

7.4. Balance de la implementacion

Nuestra pretension con este prototipo es unicamente disponer de un sencillo sistemaexperimental para el fallo. Los ejemplos presentados en el capıtulo 2 han sido programadosen OOPS haciendo algunas modificaciones. En primer lugar, puesto que OOPS utilizareglas incondicionales, las condiciones de los programas originales han de ser encadenadascon construcciones if then en el cuerpo de las mismas. Por ejemplo la funcion path dela Seccion 2.3.1 quedarıa:

path X Y = if (X == Y) then true else path (next X) Y

Page 217: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

7.4. Balance de la implementacion 217

Este tipo de transformacion es aplicable a todas las condiciones.Por otro lado, algunos de los ejemplos utilizan variables extra. En general no hay una

forma automatica de eliminarlas, pero sı que puede prescindirse de su uso en muchoscasos de forma sencilla, en particular en los ejemplos que hemos visto. La construccionlet (version estricta) se ha incorporado en el sistema precisamente por este motivo. Porejemplo, la funcion winMove de la Seccion 2.4 (pagina 32) utiliza este tipo de variables.En OOPS puede definirse como:

winMove State = let M==move State in if (fails (winMove M)) then M

Los ejemplos con funciones de orden superior, en concreto en el Ejemplo 2.3.2 (pagina29), han de redisenarse para trasladar todo el programa a primer orden.

Los programas del Capıtulo 2 ilustran de forma sencilla algunos aspectos de nuestrapropuesta, pero son ejemplos de pequeno tamano. OOPS proporciona una notable ri-queza expresiva pero no se distingue por ser un sistema eficiente. En relacion a T OY oa Curry, ha de tenerse en cuenta que estos sistemas compilan los programas generandocodigo Prolog especıfico (y bastante sofisticado) para las funciones, mientras que OOPSes esencialmente interpretado: transforma las reglas para obtener un SRLF-programa queluego se utiliza de forma generica. Con los propios programas del Capıtulo 2, pero plan-teando reducciones mas complejas, pueden obtenerse tiempos de ejecucion muy elevadoso consumir los recursos de memoria de la maquina.

De acuerdo con nuestra experiencia en la implementacion de T OY, hay extensiones quepensamos no plantearıan problemas en OOPS, como el sistema de tipos, tipos predefinidospara las listas o las tuplas, orden superior, etc. La constructora F es especial y debe serpolimorfica con respecto al sistema de tipos. Para los tipos numericos o caracteres lacomplecion de reglas del algoritmo de transformacion tendrıa problemas. Por ejemplo, enuna funcion como:

f 1 = 2

no se puede hacer la complecion del argumento 1 (se generarıan infinitas reglas de com-plecion, una por cada numero natural). La solucion consiste en hacer una transformacionprevia:

f X = if (X==1) then 2

Lo mismo ocurre con los reales o los caracteres (aunque en este ultimo caso son un numerofinito, es mas razonable hacer esta transformacion).

No serıa especialmente complicado incorporar al nivel de primitivas del lenguaje otrasconstrucciones, como las de recoleccion collect y collectN de la Seccion 2.5. Estas primitivasdevolverıan el SAS en forma de lista, con los elementos en el orden dado por el motorde reduccion, anulando el resto de repuestas obtenidas por permutacion de dicha lista.Tambien se podrıan definir otras funciones de recoleccion mas proximas al findall deProlog (y de Curry).

Desde el punto de vista del rendimiento y dejando a un lado el hecho de que losprogramas sean interpretados, el propio mecanismo de reduccion de OOPS plantea otras

Page 218: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

218 7. Implementacion del fallo en PLF: el sistema OOPS

cuestiones de fondo. Para reducir una expresion OOPS arrastra en el computo todas lasposibles vıas de reduccion y el backtraking solo se utiliza para encontrar distintas instanciaspara las variables. En contraste, T OY o Curry hacen una exploracion en profundidad paracada una de las posibles vıas de reduccion. En este sentido OOPS explora en anchura,manipulando de terminos Prolog de considerable tamano (las c-expresiones). El mecanismode reduccion de OOPS esta pensado para hacer posible la captura de fallos, pero si en unprograma o en una reduccion concreta no hay fallos implicados, no es necesario hacer estetipo de reducciones en anchura. Podrıa modificarse el motor de reduccion de modo que enestos casos estudiase cada una de las vıas de reduccion en profundidad. Para ello, ante unac-expresion de la forma S1∪S2, en vez de dar un paso reduciendo ambas sub-c-expresiones,se escogerıa una de modo indeterminista.

Hay otro punto crıtico para el rendimiento del sistema: la regla Bind para la ligadurade variables producidas no puede utilizar la unificacion Prolog, sino que debe hacer unreemplazamiento explıcito, analizando la estructura del termino. Esto es ası porque laregla Dist puede hacer que una misma variable producida aparezca en distintos ambitos.Por ejemplo, consideremos la siguiente reduccion:

α∈{z,s(z)}

{α} ε

α∈{z}

{α} ∪⋃

α∈{s(z)}

{α}

En la segunda c-expresion α debe ligarse a z en una sub-c-expresion y a s(z) en otra, luegono puede utilizarse unificacion Prolog.

En resumen, OOPS, ademas de una herramienta util para experimentar con el falloen PLF, nos ha proporcionado una vision amplia de las dificultades de implementacion deeste recurso. El pequeno tamano del sistema y la forma en que esta organizado permitehacer comodamente las modificicaciones necesarias para ampliar el lenguaje con nuevasconstrucciones y explorar alternativas en el mecanismo de reduccion.

Page 219: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Capıtulo 8

Conclusiones y trabajo futuro

La negacion aparece en variadas situaciones en el ambito de la programacion logica(PL) porque hay problemas que demandan su uso de manera natural. Este interes estrasladable al paradigma de programacion logico-funcional (PLF), en el que la negaciontiene su contrapartida como fallo en la reduccion. Una forma razonable de incorporar elfallo a PLF es mediante una funcion fails(e) que determine si la expresion e falla o no en lareduccion (a forma normal de cabeza). El significado intuitivo de esta funcion es bastantefacil de asimilar, con lo que su uso en programacion resulta sencillo. Sin embargo, comoocurre en PL con la negacion, el estudio formal de una aproximacion constructiva exigeun estudio semantico riguroso.

Ası pues, el objetivo central de este trabajo, y por tanto su aportacion principal, hasido la introduccion del fallo constructivo en PLF, similar a la negacion constructiva enPL. Nuestra investigacion ha cubierto este objetivo en tres aspectos:

por un lado hemos estudiado el uso del fallo en programacion desde un punto de vistapractico, a traves de ejemplos breves, pero suficientemente elaborados para ilustrarel potencial expresivo que encierra el fallo:

• en primer lugar, el fallo tiene un uso directo como sustituto o contrapartida de lanegacion en programacion logica, como es de esperar. Puede utilizarse tambienpara resolver problemas cuya solucion se expresa naturalmente en terminos defallo;

• el fallo tambien sugiere y posibilita otras construcciones de programacion talescomo las reglas por defecto o mecanismos de recoleccion de valores en reduc-ciones indeterministas. Estos recursos contribuyen a la riqueza expresiva dellenguaje sin merma de la declaratividad del mismo y difıcilmente pueden abor-darse prescindiendo del fallo;

el segundo aspecto que hemos investigado es la fundamentacion teorica del fallo. Paraello partimos del marco formal CRWL, un formalismo introducido en [70, 71] queproporciona una base solida para PLF. La idea central de estos trabajos es una logicade reescritura que refleja los aspectos cruciales de PLF, tales como el indeterminismo,

Page 220: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

220 8. Conclusiones y trabajo futuro

la evaluacion perezosa y el sharing o comparticion de valores. Tomando esta logicacomo referencia hemos elaborado nuestra propia construccion:

• en primer lugar hemos adaptado la logica CRWL para reinterpretar las restric-ciones de igualdad y desigualdad como invocaciones a una funcion de igualdad(==), obteniendo una version con el mismo potencial expresivo pero mas ade-cuada a nuestro proposito;

• despues hemos dado una vision conjuntista de PLF a traves de la logica SRL(Set Reduction Logic), en la que el indeterminismo se manipula explıcitamentepor medio de conjuntos de recoleccion. En este planteamiento se reconstru-ye todo el marco formal: las expresiones seran expresiones conjuntistas o c-expresiones cuya sintaxis se inspira en la habitual de conjuntos; las aproxima-ciones o reducciones de las mismas proporcionan conjuntos de valores o SAS’sen vez de valores aislados.

Esta nueva logica aun no incluye el fallo y es esencialmente equivalente a CRWL(tiene la misma capacidad de demostracion). Pero tanto las nociones sintacticas,como la vision semantica que aporta, poseen interes en sı mismas, ya que sehacen explıcitos determinados aspectos de CRWL, como el sharing o el propioindeterminismo, para el que se adquiere un control mas fino que en CRWL.Pero sobre todo, abre una vıa para introducir el fallo a nivel formal;

• a continuacion se ha extendido la logica SRL a SRLF (SRL con fallo) paraincluir la construccion fails, i.e., el fallo en PLF. Esta logica proporciona unasemantica precisa para la funcion fails y sobre ella se demuestran las propieda-des fundamentales. Se prueba ademas que SRLF engloba a CRWL en el sentidode que proporciona la misma capacidad deductiva que CRWL y, adicionalmente,permite probar fallos de derivacion de CRWL.

Lo que aporta SRLF de hecho, es una aproximacion al fallo en PLF: no puedecapturar todos los fallos de CRWL si hay involucrada no terminacion en los pro-gramas ya que, en este caso, el fallo es una propiedad indecidible. No obstante,esta aproximacion es razonable y util en la practica;

• siguiendo el esquema de [70, 71], aunque con una orientacion conjuntista, di-senamos una relacion de estrechamiento perezoso SNarr para PLF con fallo.Aquı es donde la cualidad de ser constructivo cobra pleno sentido, puesto queesta relacion posibilita la busqueda de valores para las variables implicadas enlas expresiones.

La relacion de estrechamiento se plantea de forma relativamente modular per-mitiendo aislar procesos como la instanciacion de variables o el tratamiento delas igualdades y desigualdades, con lo que se facilita el razonamiento de algunaspropiedades. En concreto, se construye un mecanismo especıfico para la igual-dad y la desigualdad que unifica el tratamiento de ambas a traves de una unicafuncion (==).

Hemos formalizado y demostrado los resultados de correccion y completitudde la relacion SNarr con relacion a la logica SRLF, con lo que se concluye el

Page 221: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

221

tratamiento formal del fallo;

el ultimo aspecto que cubrimos en este trabajo es la implementacion efectiva del falloen PLF. En este sentido hemos estudiado dos alternativas:

• incorporacion del fallo en un sistema existente como T OY [110, 44, 1] o Curry[20]. En concreto, se ha llevado a cabo esta extension en T OY , con la limitacionde no utilizar variables en el ambito de la funcion fails, i.e., se tiene una ver-sion no constructiva del fallo. El fallo constructivo plantea dificultades porqueel mecanismo operacional que hemos disenado no es facilmente adaptable almecanismo de reduccion de T OY. No obstante, la implementacion realizada esmuy simple y puede sacarse partido de ella en muchos problemas. En Curry laextension serıa esencialmente analoga y con las mismas limitaciones;

• para conseguir una implementacion del fallo constructivo hemos disenado elsistema OOPS, basado directamente en la relacion de estrechamiento SNarrestudiada. OOPS ha permitido experimentar con los ejemplos de este trabajo.Ademas de la primitiva fails, incorpora la construccion default para las reglaspor defecto, construcciones let y un elaborado trazador de computo. OOPSes un prototipo muy elemental, sin pretensiones en cuanto al rendimiento, pe-ro muy versatil y adecuado para la experimentacion y el estudio de futurasimplementaciones mas ambiciosas.

La semantica del fallo que provee SRLF ya ha encontrado algunas aplicaciones enotras areas de PLF como las bases de datos deductivas [11, 9, 8, 10]. Tiene tambien unuso potencial en depuracion declarativa en PLF [43, 45, 46, 42], en concreto para el analisisde respuestas perdidas.

Ademas de las lıneas de investigacion mencionadas, en cuanto al trabajo futuro, desdeel punto de vista teorico hay varios aspectos que interesa estudiar:

la clase de programas para los que hemos estudiado el fallo excluye el uso de variablesextra en los lados derechos de las reglas. Este tipo de variables plantean un escollodifıcil en presencia de fallo y la extension para admitirlas no es inmediata. Lasdificultades que entranan son conocidas en PL al introducir la negacion y tambienen PLF en contextos ajenos al fallo.

Esta limitacion no es tan importante como en el contexto de PL, ya que en PLFlas construcciones let y el uso adecuado de funciones permiten prescindir de estetipo de variables en muchos casos. Pero hay usos no triviales de las mismas en losque no resulta inmediato prescindir de ellas y tiene interes estudiar la posibilidad derecuperarlas en nuestro marco;

la relacion entre la negacion como fallo finito en PL y nuestro fallo en PLF ha sidosugerida solo desde un punto de vista informal y tiene sentido plantearse un analisisen profundidad;

Page 222: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

222 8. Conclusiones y trabajo futuro

el marco CRWL cuenta con una semantica declarativa de modelos [70, 71] que no seha abordado en SRLF. En [11] se estudian los modelos de Herbrand para la logicaCRWLF (CRWL con fallo) [111, 117], que supuso nuestro primer acercamiento alfallo en PLF. Pero tiene interes elaborar una semantica declarativa de modelos paraSRLF;

un aspecto en el que se esta investigando en nuestro grupo en la actualidad es enla verificacion de programas logico-funcionales en el marco de CRWL [51]. Serıainteresante extender este estudio a programas con fallo, utilizando nuestro marcosemantico como punto de partida.

Desde el punto de vista de la implementacion OOPS es una herramienta valiosa parala investigacion pero se requiere una implementacion mas eficiente:

serıa posible mejorar el rendimiento de la implementacion reemplazando el enfoqueinterpretado de OOPS por una compilacion similar a la que realizan T OY o Curry;

por otra parte, a la hora de incorporar el fallo constructivo a T OY o Curry puede serrazonable utilizar una idea similar a la que se propone en [125, 126, 127] en el ambitode PL: se combinan distintas propuestas de negacion constructiva y como fallo finitoen un mismo sistema, y se utiliza una u otra aproximacion dependiendo del objetivoconcreto a resolver. En nuestro caso, la idea serıa utilizar el fallo restringido quehemos implementado en T OY para expresiones sin variables y un mecanismo maselaborado como el de OOPS en otro caso.

Estas dos propuestas son compatibles y de hecho complementarias, y serıa interesantedesarrollar ambas.

El estudio formal que hemos llevado a cabo ha ampliado nuestra vision de PLF, nosolo por la propia aportacion del fallo, sino porque hace explıcitos y mas comprensibles al-gunos aspectos, en especial sobre el indeterminismo. El hecho de disponer de una pequenaimplementacion que opera con fallo y con expresiones conjuntistas, nos ha permitido in-vestigar las posibilidades practicas del fallo y nos ha incitado a buscar nuevos recursos. Esposible que al termino de este trabajo el lector comparta con nosotros la sensacion de queel formalismo que hemos presentado aun sugiere otras posibilidades que merece la penaexplorar. Si es ası, habremos cubierto otra de las metas de esta tesis.

Page 223: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Apendice A

Motor de reduccion de OOPS

/*

Archivo: engine.pl

Reduccion de set-expressiones de acuerdo con el calculo operacional SNarr

La sintaxis prolog que utilizamos para las set-expresiones es:

S ::= [t] | f(t1,...,tn)

| eq([(t1,t2)|R]) | eqFalse([(t1,t2)|R]) | neq([(t1,t2)|R])

| fails(S) | in(pv(X),S1,S2) | S1 + S2

Para == se utilizan tres construcciones distintas eq, eqFalse y neq.

El predicado de entrada de este modulo es:

snarr(N,Sin,Sout,Cin,Cout)::= reduce la set-expresion Sin a la forma resuelta

Sout tomando como almacen de desigualdades Cin y devolviendo Cout;

el parametro N es un contador de llamadas que se va incrementando con cada

una de ellas.

*/

snarr(N,N2,S,Ss,Cin,Cout):-

N1 is N+1, step(S,S1,_,Cin,Cout1),

continueSNarr(N1,N2,S,S1,Ss,Cout1,Cout).

continueSNarr(N,N1,S,S1,Ss,Cin,Cout):-

S==S1,!,Cout=Cin,Ss=S1,N1=N; snarr(N,N1,S1,Ss,Cin,Cout).

% Sub_1 union plana

step(S1+S2,S1s+S2s,Dvar,Cin,Cout):-

!,

step(S1,S1s,Dvar1,Cin,Cout1),

step(S2,S2s,Dvar2,Cout1,Cout),

append(Dvar1,Dvar2,Dvar).

Page 224: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

224 A. Motor de reduccion de OOPS

step([T],[T],Dvar,Cin,Cin):- !, pVarTerm(T,Dvar/[]).

:- discontiguous step/5.

step(in(pv(X),S1,S2),SOut,Dvar,Cin,Cout):-

!,

step(S2,S2Out,Dvar1,Cin,Cout1),

continueStep(in(pv(X),S1,S2Out),SOut,Dvar1,Dvar,Cout1,Cout).

continueStep(in(pv(X),S1,S2Out),SOut,Dvar1,Dvar,Cin,Cout):-

free_variables(S2Out,FV),

(

% elim del calculo SNarr

not(memberVar(X,FV)),!,SOut=S2Out,Dvar=Dvar1,Cout=Cin

;

% no esta demandada -> no hacemos nada con S1

not(memberVar(X,Dvar1)),!,SOut=in(pv(X),S1,S2Out),Dvar=Dvar1,Cout=Cin

;

% esta demandada

(

% bind del calculo SNarr -> desaparece S1

S1=[T],!,replace(pv(X),T,S2Out,SOut),Dvar=Dvar1,Cout=Cin

;

% flat del calculo SNarr

S1=in(pv(Y),S3,S4),!,

SOut=in(pv(Y),S3,in(pv(X),S4,S2Out)),Dvar=Dvar1,Cout=Cin

;

% dist del calculo SNarr

S1=S3+S4,!,

SOut=in(pv(X),S3,S2Out)+in(pv(X),S4,S2Out),Dvar=Dvar1,Cout=Cin

;

% si no, damos un paso sobre S1 y ya esta

step(S1,S1Out,Dvar2,Cin,Cout),

SOut=in(pv(X),S1Out,S2Out), append(Dvar1,Dvar2,Dvar)

)

).

Page 225: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

225

% funcion de usuario

step(Fun,SOut,Dvar,Cin,Cout):-

functor(Fun,Nom,_),

setRule(Nom,_,_,Dem), % tomamos una regla cualquiera

demandedPvars(Fun,Dem,Res,_Unified), % y miramos las vars q demanda

!,

(

% si hay clash es por fail y lo habra con

% cuaquier otra regla por compleccion -> fail

Res==clash,!,SOut=[fail],Dvar=[],Cout=Cin

;

% si el pattern matching se encuentra con

% vars producidas bloqueo -> se deja intacto

Res\==[], !, SOut=Fun, Dvar=Res, Cout=Cin

;

% en otro caso utilizamos cualquier regla que sirva

% (todas las q sirvan por backtraking)

% y propagamos las desigualdades

Fun=..[_|ArgsCall], Dvar=[],

!,

setRule(Nom,ArgsCall,Body,Dem),

solve(Cin,Cout),

SOut=Body

).

% funciones primitivas de igualdad == y desigualdad /=

% (eqFalse -> igualdad orientada a false)

step(eq(L),SOut,Dvar,Cin,Cout):-!,eq(L,SOut,Dvar,Cin,Cout).

step(eqFalse(L),SOut,Dvar,Cin,Cout):-!,eqFalse(L,SOut,Dvar,Cin,Cout).

step(neq(L),SOut,Dvar,Cin,Cout):-!,eq(L,SOut1,Dvar,Cin,Cout),

(

SOut1==[true],SOut=[false];

SOut1==[false],SOut=[true];

SOut1==[fail],SOut=[fail];

SOut1=..[eq|L1],SOut=..[neq|L1]

).

Page 226: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

226 A. Motor de reduccion de OOPS

step(fails(S),R,Dvar,Cin,Cout):-

!,

% obtenemos el conjunto informacion y miramos si es {fail}

info(S,I/[]),

allFail(I,AF),

(

AF==true,!,R=[true], Dvar=[],Cout=Cin

;

AF==false,!,R=[false], Dvar=[],Cout=Cin

;

step(S,S1,Dvar,Cin,Cout), R=fails(S1)

).

%default: primitiva para las reglas por defecto

step(ifFails(S,Sd),R,Dvar,Cin,Cout):-

!,

info(S,I/[]),

allFail(I,AF),

(

AF==true,!,R=Sd, Dvar=[],Cout=Cin

;

AF==false,!,R=S, Dvar=[],Cout=Cin

;

% se sigue reducciendo hasta resolver

step(S,S1,Dvar,Cin,Cout), R=ifFails(S1,Sd)

).

% variables producidas/demadadas por un termino

pVarTerm(X,L/L):-var(X),!.

pVarTerm(pv(X),[X|L]/L):-!.

pVarTerm(T,L/L1):- T=..[_|Args], pVarTermLst(Args,L/L1).

pVarTermLst([],L/L).

pVarTermLst([C|R],L/L2):- pVarTerm(C,L/L1), pVarTermLst(R,L1/L2).

% estudio de vars demandadas por una regla.

demandedPvars(_,[],[],[]).

demandedPvars(Fun,[P|R],Dem,U):-

demandedPvar(Fun,P,Dem1,U1),

(

Dem1==clash,!,Dem=clash

;

demandedPvars(Fun,R,Dem2,U2),

(Dem2==clash,!,Dem=clash; append(Dem1,Dem2,Dem), append(U1,U2,U))

).

Page 227: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

227

demandedPvar(T,_,[],[T]):-var(T),!.

demandedPvar(pv(X),_,[X],[]):-!.

demandedPvar(fail,_,clash,[]):-!.

demandedPvar(_,[],[],[]):-!.

demandedPvar(T,[A|R],D,U):- arg(A,T,Arg), demandedPvar(Arg,R,D,U).

% reemplazo de una variable por un termino (sin unificacion)

replace(_,_,Y,Y):-var(Y),!.

replace(pv(X),V,pv(Y),V):-var(Y),X==Y,!.

replace(pv(X),V,T,T1):-

T=..[N|Args], replaceLst(pv(X),V,Args,Args1), T1=..[N|Args1].

replaceLst(_,_,[],[]).

replaceLst(pv(X),V,[C|R],[C1|R1]):-

replace(pv(X),V,C,C1), replaceLst(pv(X),V,R,R1).

% obtencion del cto informacion

info([T],[T1|L]/L):- !, replacePvarBot(T,T1).

info(fails(_S),[bot|L]/L):- !.

info(ifFails(_S),[bot|L]/L):- !.

info(in(pv(_),_S1,S2),I/L):- !, info(S2,I/L).

info(S1+S2,I/L):- !, info(S1,I/I2), info(S2,I2/L).

info(_Fun,[bot|L]/L).

% en el cto informacion se manejan bot explicitos

replacePvarBot(X,X):- var(X),!.

replacePvarBot(pv(_),bot):-!.

replacePvarBot(T,T1):- T=..[N|Ar], replacePvarBotLst(Ar,Ar1), T1=..[N|Ar1].

replacePvarBotLst([],[]).

replacePvarBotLst([C|R],[C1|R1]):- replacePvarBot(C,C1), replacePvarBotLst(R,R1).

% comprueba si todos los eltos de una lista son fail

allFail([],true).

allFail([C|R],F):-

(

var(C),!,F=false

;

C==fail,!,allFail(R,F)

;

C==bot,!,allFail(R,F1), (F1==false,!,F=false; F=bot)

;

F=false

).

Page 228: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

228 A. Motor de reduccion de OOPS

/*

Archivo: eqFun.pl

Evaluacion de la funcion ==

Las igualdades se presentan como un lista de pares de terminos

procendentes de la descomposicion de dos terminos.

Se utilizan tres construcciones distintas eq, eqFalse y neq, con sendos

predicados de entrada

*/

eq(L,Res,D,Cin,Cout):-

eqFrontierLst(L,Fr/[],D/[],F),

(

% conflicto de constructoras (regla 5) o fallo en occurChek

F==false, !, Res=[false], Cin=Cout

;

% no hay variables demandadas

D==[],!,

(

% fallo implicado -> orientacion a false

F==fail,!,

(

% frontera vacia -> fail (regla 9)

Fr==[], !, Res=[fail], Cin=Cout

;

% no vacia -> se fuerza desigualdad o conflicto (reglas 6/8)

Res=[false], eqFrFalse(Fr,Cin,Cout)

)

;

% no hay fail implicado, terminos totales -> orientacion

% a true o false (se excluye fail)

eqFrTrueFalse(Fr,Res,Cin,Cout)

)

;

% hay vars dems -> se intenta forzar

% desigualdad o conflicto (reglas 6/8)

eqFrFalseSusp(Fr,LRes,Cin,Cout),

% indeterminismo don’t care -> no cortes

(

% se ha podido forzar

LRes==[false], Res=[false]

;

% no se puede forzar

LRes\==[false],

(

% si hay fail implicado se devuelve

% al motor pero orientado a false

Page 229: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

229

F==fail, Res=eqFalse(LRes)

;

% no hay fail implicado, se devuelve intacto

F\==fail, Res=eq(LRes)

)

)

).

% es analogo a eq pero contando con la orientacion a false

eqFalse(L,Res,D,Cin,Cout):-

eqFrontierLst(L,Fr/[],D/[],F),

(

F==false,!,Res=[false],Cin=Cout

;

D==[],!,

(

Fr==[],!,Res=[fail],Cin=Cout

;

Res=[false],eqFrFalse(Fr,Cin,Cout)

)

;

eqFrFalseSusp(Fr,Res,Cin,Cout),

(LRes==[false],Res=[true]; LRes\==[false],Res=eqFalse(LRes))

).

eqFrTrueFalse([],[true],Cin,Cin):-!.

eqFrTrueFalse(Fr,Res,Cin,Cout):-

(

Res=[true],eqFrTrue(Fr,Cin,Cout)

;

Res=[false],eqFrFalse(Fr,Cin,Cout)

).

eqFrTrue([],Cin,Cin).

eqFrTrue([(X,T,tot)|R],Cin,Cout):-

X=T, solve(Cin,Cout1), eqFrTrue(R,Cout1,Cout).

eqFrFalse([(X,T,tot)|R],Cin,Cout):-

addCtr(X,T,Cin,Cout); eqFrFalse(R,Cin,Cout).

Page 230: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

230 A. Motor de reduccion de OOPS

eqFrFalseSusp([],[],Cin,Cin).

eqFrFalseSusp([(X,T,Tot)|R],Res,Cin,Cout):-

(

var(X),!,

(

Tot==tot,!,

(

addCtr(X,T,Cin,Cout),Res=[false]

;

X=T,solve(Cin,Cout1),eqFrFalseSusp(R,Res,Cout1,Cout)

)

;

functor(T,Nom,Ar),

cdata(Nom,Ar,Tipo),!,

(

% se provoca conflicto

cdata(Nom2,Ar2,Tipo),Nom\==Nom2,

functor(F,Nom2,Ar2),X=F,solve(Cin,Cout),Res=[false]

;

% se imita estructura y se busca conflicto mas interno

functor(F,Nom,Ar),X=F,solve(Cin,Cout1),

X=..[_|Args1],T=..[_|Args2],

eqFrontierLst(Args1,Args2,Fr1/R,_/_,_),

eqFrFalseSusp(Fr1,Res,Cout1,Cout)

)

)

)

;

% si X no es var entonces es pv(_)

(

% buscamos conflicto en las restantes

eqFrFalseSusp(R,Res1,Cin,Cout),

(

Res1==[false], Res=[false]

;

% si no se encuetra X==T se deja intacta

Res1\==[false],Res=[(X,T,Tot)|Res1]

)

).

Page 231: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

231

/*

eqFrontier(T1,T2,L1/L2,D1/D2,F)::= estudia la frontera de los

terminos T1 y T2 (elimina las constructoras iguales en posiciones

comunes de T1 y T2)

- en L1 devuelve la lista de igualdades pendientes de procesar en

la forma (S1,S2,Tot) donde S1 es variable estandar o pv(_),

S2 es un termino cualquiera (menos fail) y Tot es

* tot: los terminos S1 y S2 estan totalmente evaluados y libres

de fallo (se pueden unificar o establecer desigualdad entre ellos

* notot: S1 y/o S2 contienen alguna variable producida o fail,

no pueden unificarse o establecer desigualdad entre ellos

L1 es una lista abierta y L2 es la variable de la ultima posicion.

- en D1 devuelve la lista de variables producidas pv(_) que seran

demandadas para el motor de reduccion. D1 es una lista abierta y

D2 es la variable de la ultima posicion

- en F puede devolver:

* false: se ha detectado conflicto de constructoras ->

el resultado global es false

* fail: no se ha detectado conflicto pero hay fallo implicado ->

la igualdad no podra evaluarse a true, como mucho a false

*/

eqFrontier(X,Y,L1/L2,D1/D2,F):- var(X),!,eqFrontierVar(X,Y,L1/L2,D1/D2,F).

eqFrontier(Y,X,L1/L2,D1/D2,F):- var(X),!,eqFrontierVar(X,Y,L1/L2,D1/D2,F).

eqFrontier(fail,_,L/L,D/D,fail):-!.

eqFrontier(_,fail,L/L,D/D,fail):-!.

eqFrontier(pv(X),pv(Y),[(pv(X),pv(Y),notot)|L]/L,[X,Y|D]/D,_):-!.

eqFrontier(pv(X),Y,[(pv(X),Y,notot)|L]/L,[X|D]/D,_):-!.

eqFrontier(X,pv(Y),[(pv(Y),X,notot)|L]/L,[Y|D]/D,_):-!.

eqFrontier(X,Y,L1/L2,D1/D2,F):-

X=..[NameX|ArgsX], Y=..[NameY|ArgsY],

(

NameX\==NameY,!,D2=D1,F=false,L2=L1

;

eqFrontierLst(ArgsX,ArgsY,L1/L2,D1/D2,F)

).

eqFrontierVar(X,Y,L/L,D/D,_):- X==Y,!.

eqFrontierVar(X,Y,[(X,Y,tot)|L]/L,D/D,_):- var(Y),!.

eqFrontierVar(_,fail,L/L,D/D,fail):-!.

eqFrontierVar(X,pv(Y),[(pv(Y),X,notot)|L]/L,[Y|D]/D,_):-!.

eqFrontierVar(X,T,[(X,T,Tot)|L]/L,D1/D2,F):-

occurCheck(X,T,D1/D2,F),

( F\==fail,D1==D2,!,Tot=tot; Tot=notot).

Page 232: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

232 A. Motor de reduccion de OOPS

eqFrontierLst([],L/L,D/D,_).

eqFrontierLst([(T1,T2,_)|R],L1/L3,D1/D3,F):-

eqFrontier(T1,T2,L1/L2,D1/D2,F1),

(

F1==false,!,L3=L2,D3=D2,F=false

;

eqFrontierLst(R,L2/L3,D2/D3,F2),

(

F2==false,!,F=false

;

F=F1,F=F2

)

).

eqFrontierLst([],[],L/L,D/D,_).

eqFrontierLst([T1|R1],[T2|R2],L1/L3,D1/D3,F):-

eqFrontier(T1,T2,L1/L2,D1/D2,F1),

(

F1==false,!,L3=L2,D3=D2,F=false

;

eqFrontierLst(R1,R2,L2/L3,D2/D3,F2),

(

F2==false,!,F=false

;

F=F1,F=F2

)

).

occurCheck(X,Y,D/D,false):-X==Y,!.

occurCheck(_,Y,D/D,_):-var(Y),!.

occurCheck(_,fail,D/D,fail):-!.

occurCheck(_,pv(Y),[Y|D]/D,_):-!.

occurCheck(X,T,D1/D2,F):-T=..[_|Args], occurCheckLst(X,Args,D1/D2,F).

occurCheckLst(_,[],D/D,_).

occurCheckLst(X,[C|R],D1/D3,F):-

occurCheck(X,C,D1/D2,F1),

(

F1==false,!,F=false, D3=D2

;

occurCheckLst(X,R,D2/D3,F2),

(

F2==false,!,F=false

;

F=F1,F=F2

)

).

Page 233: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

233

% Gestion del almacen de desigualdades: solve del calculo

solve(Cin,Cout):- listToSets(Cin,Cout), solve(Cin,[],Cout).

solve([],Cin,Cin).

solve([T:L|R],Cin,Cout):- solve2(T,L,Cin,Cout1), solve(R,Cout1,Cout).

solve2(_,[],Cin,Cin).

solve2(T,[C|R],Cin,Cout):- ctermDiv(C,T,Cin,Cout1), solve2(T,R,Cout1,Cout).

% resuelve T1/=T2 de acuerdo con Cin y Cout

ctermDiv(X,T,Cin,Cout):- var(X),!,addCtr(X,T,Cin,Cout).

ctermDiv(T,X,Cin,Cout):- var(X),!,addCtr(X,T,Cin,Cout).

ctermDiv(T1,T2,Cin,Cout):-

T1=..[Name1|Args1],T2=..[Name2|Args2],

(Name1\==Name2,!,Cin=Cout; ctermDivLst(Args1,Args2,Cin,Cout)).

ctermDivLst([C1|R1],[C2|R2],Cin,Cout):-

ctermDiv(C1,C2,Cin,Cout); ctermDivLst(R1,R2,Cin,Cout).

% Insercion de una desigualdad Var/=Term (Term no es exactamente igual a Var)

% occurCheck para no insertar triviales

addCtr(X,Term,Cin,Cin):-free_variables(Term,L), memberVar(X,L),!.

addCtr(X,Term,[],[X:[Term]]):-!.

addCtr(X,Term,[Y:Ctr|R],[Y:Ctr1|R]):-

X==Y,!,(memberVar(Term,Ctr),!,Ctr1=Ctr; Ctr1=[Term|Ctr]).

addCtr(X,Term,[F|R],[F|R1]):-

addCtr(X,Term,R,R1).

Page 234: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

234 A. Motor de reduccion de OOPS

Page 235: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Apendice B

Puzle japones

En este apendice reproducimos el codigo completo para resolver el puzle planteadoen la Seccion 2.5. Este programa es ejecutable en una extension de T OY que incluye laprimitiva fails con las limitaciones expuestas en la Seccion 7.1.1. Dichas limitaciones noafectan a este ejemplo concreto. Ademas esta extension de T OY cuenta tambien con dosprimitivas adicionales:

collect E::= recolecciona todos los valores a los que puede reducirse la expresion E ylos devuelve en una lista (en el orden en que los evalua el mecanismo de reduccion).Esta funcion esta definida a “bajo nivel” utilizando el findall de Prolog;

collectN N E::= acota la busqueda anterior a N valores. Si hay menos los devol-vera todos. Tambien se implementa con un findall acotado.

Las funciones de disposicion de cuadrados negros e interseccion de las mismas quedancomo antes:

data color = unknown | white | black

fill [] L = fillWhite L

fill [0|R] L = fill R L

fill [N|R] [X|Xs] = [black|fillBlack [N-1|R] Xs] <== N>0, X/=white

fill [N|R] [X|Xs] = [white|fill [N|R] Xs] <== N>0, X/=black

fillWhite [] = []

fillWhite [X|Xs] = [white|fillWhite Xs] <== X/=black

fillBlack [0] [] = []

fillBlack [0|R] [X|Xs] = if (R==[]) then fillWhite [X|Xs]

else [white|fill R Xs] <== X/=black

fillBlack [N|R] [X|Xs] = [black|fillBlack [N-1|R] Xs] <== N>0, X/=white

intersect [X] = X

intersect [X,Y|Ys] = intersect [intersectTwo X Y|Ys]

Page 236: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

236 B. Puzle japones

intersectTwo [] [] = []

intersectTwo [X|Xs] [Y|Ys] = [contrast X Y|intersectTwo Xs Ys]

contrast black black = black

contrast white white = white

default contrast X Y = unknown

traspose [] = []

traspose [F|M] = mapHead F (traspose M)

mapHead [] [] = []

mapHead [X|Xs] [] = [[X]|mapHead Xs []]

mapHead [X|Xs] [M|Ms] = [[X|M]|mapHead Xs Ms]

Pero la funcion para recorrer filas y columnas intersecando disposiciones ahora esdistinta. Utiliza un parametro adicional N que acota el numero de disposiciones admisibles.Si no superan la cota se intersecan los resultados para obtener informacion, pero si excedenla cota se obvia la fila/columna correspondiente

addInfo N [] [] = []

addInfo N [I|Is] [F|Fs] = if (length L<N) then [intersect L|addInfo N Is Fs]

else [F|addInfo N Is Fs]

<== L==collectN N (fill I F)

length [] = 0

length [X|Xs] = 1+length Xs

addInfoFilCol N IFil ICol B = if (X==B) then B

else addInfoFilCol N IFil ICol X

<== X==traspose (addInfo N ICol

(traspose (addInfo N IFil B)))

En la funcion solve se ha incluido un parametro Prof que controla la profundidad de labusqueda, y otro parametro Top que limita la profundidad maxima de busqueda. La idea estratar de obtener informacion sobre las filas/columnas explorando inicialmente un numeropequeno Prof de disposiciones posibles. Si efectivamente se obtiene alguna informacionel proceso continua normalmente (iterando sucesivos analisis sobre las filas/columnas).Pero si la profundidad anterior no permite incrementar la informacion, se amplıa (nos haparecido razonable duplicarla, pero el factor de incremento puede variarse) las veces quesea necesario mientras no se supere la Top establecida.

solve Prof Top IFil ICol B = if (Prof>Top) then B

else if (solved B) then B

else if (X==addInfoFilCol Prof IFil ICol B) then

if (X==B) then solve (2*Prof) Top IFil ICol B

else solve Prof Top IFil ICol X

Page 237: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

237

solved [] = true

solved [[]|L] = solved L

solved [[X|Xs]|Yss] = if (X/=unknown) then solved [Xs|Yss] else false

Para obtener una presentacion amigable del resultado utilizamos las primitivas deescritura de T OY. Pintamos en pantalla dos cuadros por cada uno del tablero para pro-porcionar la imagen; escribiremos ’()’ para las casillas desconocidas.

write [] = putChar ’\n’

write [[]|Xs] = write Xs <== putChar ’\n’ == _

write [[X|Xs]|Ys] = write [Xs|Ys] <== writePosition X == _

writePosition black = true <== putChar (chr 24)==_, putChar (chr 24)==_ % negro

writePosition white = true <== putChar ’ ’==_, putChar ’ ’==_

writePosition unknown = true <== putChar ’(’==_, putChar ’)’==_

Ahora podemos tratar de resolver uno de los puzles que plantea Conceptis1

Utilizamos dos funciones para almacenar la informacion de las filas y las columnas,otras para generar el tablero, y una ultima sol para hacer comodamente las busquedasacotadas:

fil = [[2,5],[2,7],[2,7],[10],[14],[2,1],[2,2,3],[1,1,1,1],

[1,1],[1,2,1],[1,2,1],[1,1,3],[2,1,1,1,1],[4,3,1,1],[6,2,1]]

col = [[1,1],[1,2],[8,3],[7,2,3],[1,2,1,2],[4,1,1,1],[5,2,1],

[5,2,1],[5,2,1],[5,2,1,1],[5,1,1,2],[9],[1,4],[1,2],[2]]

board = genBoard 15 15

genBoard 0 M = []

genBoard N M = [gen M|genBoard (N-1) M]

gen N = if (N==0) then [] else [unknown|gen (N-1)]

1Extraıdo de su pagina web http://www.conceptispuzzles.com/products/index.html.

Page 238: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

238 B. Puzle japones

sol Top = write (solve 2 Top infoFil infoCol board) <==

putChar ’\n’==_, putChar ’\n’==_

Si lanzamos la busqueda con una cota de 4, se obtiene muy poca informacion. Con 8se tiene una solucion mas definida y con 16 se obtiene la solucion completa. Mostramos acontinuacion el resultado de la ejecucion en T OY para las cotas 8 y 16:

La estrategia de resolucion utilizada aun puede ser mejorada anadiendo heurısticasparticulares. Por ejemplo, observemos la ultima fila, para la que no se ha obtenido ningunainformacion con una cota de 8, i.e., el numero de posibles disposiciones supera esa cota.Es posible sin embargo razonar utilizando solo dos de estas disposiciones, poniendo todoslos bloques lo mas a la izquierda posible y lo mas a la derecha posible:

6 2 1 ���������������

6 2 1 ���������������

Observamos que hay dos cuadrados negros que coinciden en ambas disposiciones y comoestas son las disposiciones “extremas”, es facil concluir que dichos cuadrados han de sernegros necesariamente:

6 2 1 ���������������

Esta regla es poco costosa de aplicar y podrıa implementarse facilmente para mejorarel rendimiento del algoritmo, y no es la unica. Nos ha llamado la atencion tambien elproblema de disenar este tipo de puzles [66] para que la solucion quede unıvocamentedeterminada por un conjunto determinado de reglas (y por que no, que ademas el dibujo

Page 239: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

239

resultante sea atractivo). Pero como es logico, esta discusion queda fuera del alcance deeste trabajo.

Como curiosidad apuntaremos que el metodo propuesto por Conceptis funciona parauna gran variedad de “puzles preparados”, pero no garantiza la resolucion en el casogeneral, i.e., puede plantearse un puzle con solucion unica, no resoluble por este metodo[66]. Esto ocurre por ejemplo con el siguiente:

2 2 2 1

2 ����1 ����2 ����2 ����

Es facil observar que el metodo de las intersecciones propuesto no proporciona ningunainformacion para ninguna de las filas ni columnas, de manera aislada. Pero podemos inferiralguna informacion de otro modo: si la casilla de la esquina superior izquierda fuese negra,entonces su contigua por la derecha tambien serıa negra, y tambien las dos que quedandebajo de estas, lo cual contradice la informacion de la segunda fila; entonces la casillasuperior izquierda ha de ser blanca. Graficamente:

2 2 2 1

2 ����1 ����2 ����2 ����

2 2 2 1

2 ����1 ����2 ����2 ����

2 2 2 1

2 ����!!!1 ����

2 ����2 ����

Con un razonamiento analogo, se concluye que la casilla a la derecha de la de la esquinasuperior izquierda ha de ser blanca y entonces ya es muy sencillo completar el puzle demanera unıvoca:

2 2 2 1

2 ����1 ����2 ����2 ����

Podrıa modificarse el programa para resolver puzles como este, por ejemplo escogiendode manera indeterminista una de las posibles disposiciones cuando el proceso de resolucionque hemos implementado quede bloqueado. Por backtraking obtendrıamos la solucion, olas soluciones si fuese el caso de un puzle indeterminista. Pero esto queda fuera del alcancede nuestros propositos en este punto.

Page 240: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

240 B. Puzle japones

Page 241: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Apendice C

Relacion de trabajos del autor

El contenido teorico de esta tesis es en buena medida una compilacion de diversas pu-blicaciones, que relacionamos a continuacion. No obstante, en esta tesis hemos simplificadola presentacion de la semantica logica (se pasa directamente del marco CRWL al marcoSRL, omitiendo el paso por CRWLF). Ası mismo, la implementacion del sistema OOPSy muchos de los ejemplos no han sido previamente publicados.

[111] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Proving failure in functional logicprograms. In Proc. Computational Logic (CL’00), number 1861 in LNAI, pages179–193. Springer, 2000.

Esta es nuestra primera aproximacion formal al fallo en PLF. Se presenta la logica dereescritura CRWLF (CRWL con fallo) que propociona una semantica precisa parael fallo, en concreto, para la negacion de las relaciones de igualdad y desigualdad. Eneste trabajo exploramos las ideas de recoleccion de valores y se introduce la nocionde SAS. No se considera aun la construccion fails. Las demostraciones completas delos resultados pueden encontrarse en:

[112] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Proving failure in functional logicprograms, extended version. Technical Report SIP 100-98, UCM, Madrid, May 2000.

En el siguiente artıculo se extienden los anteriores incorporando ya la construccionfails, ejemplos de uso y la demostracion detallada de los resultados:

[117] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. A proof theoretic approach to failurein functional logic programming. Theory and Practice of Logic Programming, 1-2(4):41–74, 2004.

En el trabajo siguiente se utilizo en otra lınea una parte de nuestra investigacion: lasbases de datos deductivas. En concreto la logica CRWLF se plantea como soportesemantico para manipular informacion negativa en bases de datos deductivas dentrodel marco logico-funcional y con un modelo de evaluacion “bottom-up”.

Page 242: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

242 C. Relacion de trabajos del autor

[11] J.M. Almendros Jimenez, A. Becerra Teron, and J. Sanchez Hernandez A com-putational model for functional logic deductive databases. In Proc. InternationalConference on Logic Programming (ICLP’01), pages 331–347. Springer LNCS 2237,2001.

El siguiente objetivo de nuestra lınea central de investigacion es disenar una relacionde estrechamiento para el fallo en PLF. Nuestros intentos de construir tal relaciondirectamente asociada a la logica CRWLF fracasaron. En el siguiente trabajo explo-ramos una nueva forma de abordar el problema: se amplian las ideas de recoleccionde los dos precedentes, para obtener una vision conjuntista completa para PLF.Aquı se introducen las c-expresiones y la logica SRL con la construccion fails y semuestra la equivalencia entre CRWLF y SRL.

[113] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Functional logic programming withfailure: A set-oriented view. In Proc. International Conference on Logic for Pro-gramming and Automated Reasoning (LPAR’01), pages 455–469. Springer LNAI2250, 2001.

Por simplicidad, se descartan por el momento las restricciones de igualdad y desi-gualdad. Aunque no se presenta aun una relacion de estrechamiento, ya contamoscon un esbozo de la misma directamente ligado a SRL (e indirectamente a CRWLF).

En el siguiente trabajo presentamos la relacion de estrechamiento SNarr basada en lasintaxis conjuntista y las ideas de recoleccion de los trabajos previos. Se muestran losresultados de correccion y completitud con relacion a la logica SRL. Las igualdadesy desigualdades siguen ausentes por el momento.

[114] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Narrowing failure in functional logicprogramming. In Proc. International Symposium on Functional and Logic Program-ming (FLOPS’02), pages 212–227. Springer LNCS 2441, 2002.

Recuperamos la igualdad y la desigualdad tanto al nivel de la logica de reescrituraSRL como al nivel operacional de SNarr en los siguientes trabajo. En realidad, nose reintroducen como restricciones como en CRWLF, sino por medio de la funcion(==) que se ajusta mejor a nuestro desarrollo y que de hecho proporciona la mismafuncionalidad que las restricciones citadas.

[115] F.J. Lopez-Fraguas and J Sanchez-Hernandez. Failure and equality in functionallogic programming. Electronic Notes in Theoretical Computer Science, ENTCS,3(86):21, 2003.

[116] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Functional logic programming withfailure and built-in equality. In Proc. International Workshop on Functional and(Constraint) Logic Programming (WFLP’03), pages 61–74. Universidad Politecnicade Valencia, 2003.

Page 243: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

243

La incorporacion de igualdades y desigualdades a nuestro marco conjuntista se apoyaen investigaciones previas a nuestro estudio del fallo. En concreto, en los trabajossiguientes se hizo una extension de CRWL con desigualdades sintacticas. Ademas sediseno una transformacion de programas que hace uso de las mismas para simularuna estrategia de computo guiada por la demanda.

[109] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Disequalities may help to narrow. InJoint Conference on Declarative Programming (APPIA-GULP-PRODE’99), pages89–104, 1999.

[107] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. An efficient narrowing strategy bymeans of disequality constraints. Technical Report SIP 84-98, UCM, Madrid, No-vember 1998.

En esta tesis rescatamos muchas de las ideas sobre gestion de desigualdades y trans-formacion de programas que se estudiaron en estos trabajos. Desde el punto de vistade la implementacion ya habiamos hecho uso de dichas ideas en la implementacionde T OY. El siguiente trabajo, ademas de la parte formal, describe en detalle laimplementacion de T OY, y en particular gestion de desigualdades.

[155] J. Sanchez-Hernandez. T OY: Un lenguaje logico funcional con restricciones. Trabajode Investigacion de Tercer Ciclo, Dpto. de Sistemas Informaticos y Programacion,Universidad Complutense de Madrid, Sep. 1998.

Este documento tambien cubre el sistema T OY desde el punto de vista del usuario,como complemento al manual del mismo:

[44] R. Caballero-Roldan, F.J. Lopez-Fraguas, and J. Sanchez-Hernandez. User’s manualfor T OY. Technical Report 97/57, Depto. SIP, UCM Madrid, 1997.

Tambien puede encontrase una descripcion del sistema desde el punto de vista practi-co en:

[110] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. T OY: A multiparadigm declarativesystem. In Proc. Rewriting Techniques and Applications (RTA’99), pages 244–247.Springer LNCS 1631, 1999.

La introduccion de restricciones sobre reales que incorpora T OY se describe en elsiguiente trabajo:

[82] T. Hortala-Gonzalez, F.J. Lopez-Fraguas, J. Sanchez-Hernandez, and E. Ullan-Hernandez. Declarative programming with real constraints. Technical report, SIP-5997, 1997.

En el momento presente, el documento de referencia de T OY es el siguiente:

Page 244: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

244 C. Relacion de trabajos del autor

[1] M. Abengozar-Carneros, P. Arenas-Sanchez, J.C. Gonzalez-Moreno, R. Caballero-Roldan, A. Gil-Luezas, J. Leach-Albert, F.J. Lopez-Fraguas, N. Martı-Oliet, J.M.Molina-Bravo, E. Pimentel-Sanchez, M. Rodrıguez-Artalejo, M.M. Roldan-Garcıa,J.J. Ruz-Ortiz, and J. Sanchez-Hernandez. T OY a multiparadigm declarative lan-guage, version 2.0. Technical report, UCM, Madrid, February 2002.

Este informe actualiza y extiende trabajos anteriores, haciendo una descripcion ex-haustiva de la funcionalidad del sistema T OY. Este documento sigue en expansion.

Page 245: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa

[1] M. Abengozar-Carneros, P. Arenas-Sanchez, J.C. Gonzalez-Moreno, R. Caballero-Roldan, A. Gil-Luezas, J. Leach-Albert, F.J. Lopez-Fraguas, N. Martı-Oliet, J.M.Molina-Bravo, E. Pimentel-Sanchez, M. Rodrıguez-Artalejo, M.M. Roldan-Garcıa,J.J. Ruz-Ortiz, and J. Sanchez-Hernandez. T OY a multiparadigm declarative lan-guage, version 2.0. Technical report, UCM, Madrid, February 2002.

[2] H. Aıt-Kaci, P. Lincoln, and R. Nasr. Le Fun: Logic, equations, and functions. InProc. IEEE International Symposium on Logic Programming, pages 17–23, 1987.

[3] E. Albert, M. Alpuente, M. Hanus, and G. Vidal. A partial evaluation frameworkfor Curry programs. In Proc. International Conference on Logic for Programmingand Automated Reasoning (LPAR’99), pages 376–395. Springer LNCS 1705, 1999.

[4] E. Albert, M. Hanus, and G. Vidal. A practical partial evaluation scheme formulti-paradigm declarative languages. Journal of Functional and Logic Program-ming (JFLP’02), 2002(1), 2002.

[5] E. Albert and G. Vidal. Symbolic profiling for multi-paradigm declarative languages.In Proc. Logic-Based Program Synthesis and Transformation (LOPSTR’01), pages148–167. Springer LNCS 2372, 2002.

[6] J. Almendros-Jimenez, A. Gavilanes-Franco, and A. Gil-Luezas. Algebraic semanticsfor functional logic programming with polymorphic order-sorted types. In Proc.International Conference on Algebraic and Logic Programming (ALP’96), pages 299–313. Springer LNCS 1139, 1996.

[7] J. Almendros-Jimenez and A. Gil-Luezas. Lazy narrowing with parametric sortedtypes. In Proc. International Conference on Algebraic and Logic Programming andWorkshop on Higher-Order Algebra, Logic and Term Rewriting (ALP-HOA’97), pa-ges 159–173. Springer LNCS 1298, 1997.

[8] J. M. Almendros-Jimenez and A. Becerra-Teron. A relational algebra for functionallogic deductive databases. In Proc. International Conference on Perspectives ofSystem Informatics (PSI’03), pages 494–508. Springer LNCS 2890, 2003.

[9] J. M. Almendros-Jimenez and A. Becerra-Teron. A safe relational calculus for func-tional logic deductive databases. In Proc. International Workshop on Functional

Page 246: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

246 Bibliografıa

and (Constraint) Logic Programming (WFLP’03), pages 212–226. Universidad Po-litecnica de Valencia, 2003.

[10] J. M. Almendros-Jimenez and A. Becerra-Teron. A safe relational calculus for func-tional logic deductive databases. Electronic Notes in Theoretical Computer Science,86(3):37, 2003.

[11] J.M. Almendros Jimenez, A. Becerra Teron, and J. Sanchez Hernandez. A com-putational model for functional logic deductive databases. In Proc. InternationalConference on Logic Programming (ICLP’01), pages 331–347. Springer LNCS 2237,2001.

[12] M. Alpuente, F. Correa, and M. Falaschi. A declarative debugging system for lazyfunctional logic programs. Electronic Notes in Theoretical Computer Science, 64,2002.

[13] M. Alpuente, S. Escobar, and S. Lucas. UPV-Curry: an incremental Curry interpre-ter. In J. Pavelka, editor, Proc. Seminar on Current Trends in Theory and Practiceof Informatics (SOFSEM’99). Springer LNCS 1725, 1999.

[14] J. Alvez, P. Lucio, F. Orejas, E. Pasarella, and E. Pino. An implementation ofconstructive negation. In J.J. Moreno R. Pena, A. Herranz, editor, Proc. SegundasJornadas sobre Programacion y Lenguajes, pages 55–104, 2002.

[15] J. Alvez, P. Lucio, F. Orejas, E. Pasarella, and E. Pino. Constructive negation bybottom-up computation of literal answers. In Proc. ACM Symposium on AppliedComputing (SAC’04), 2004. To appear.

[16] S. Antoy. Definitional trees. In Proc. International Conference on Algebraic andLogic Programming (ALP’92), pages 143–157. Springer LNCS 632, 1992.

[17] S. Antoy. Optimal non-deterministic functional logic computations. In Proc. Inter-national Conference on Algebraic and Logic Programming (ALP’97), pages 16–30.Springer LNCS 1298, 1997.

[18] S. Antoy. Constructor based conditional narrowing. In Proc. International Con-ference on Principles and Practice of Declarative Programming (PPDP’01), pages199–206. ACM Press, 2001.

[19] S. Antoy, R. Echahed, and M. Hanus. A needed narrowing strategy. In Proc.ACM Symposium on Principles of Programming Languages, pages 268–279, Port-land, 1994.

[20] S. Antoy and M. Hanus. Curry. a tutorial introduction. Available athttp://www.informatik.uni-kiel.de/ curry/tutorial/, November 2002.

[21] K.R Apt. Logic programming. In J van Leeuwen, editor, Handbook of TheoreticalComputer Science, volume B, pages 495–574. Elsevier, 1990.

Page 247: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 247

[22] K.R. Apt. Logic programming and Prolog. Unpublished tutorial, 2000.

[23] K.R. Apt and R. Bol. Logic programming and negation: A survey. Journal of LogicProgramming, 19&20:9–71, 1994.

[24] P Arenas-Sanchez. Programacion Declarativa con Restricciones sobre Tipos de DatosAlgebraicos. PhD thesis, Departamento de Sistemas Informaticos y Programacion,Universidad Complutense de Madrid, 1998.

[25] P. Arenas-Sanchez, A. Gil Luezas, and F.J. Lopez-Fraguas. Combining lazy narro-wing with disequality constraints. In Proc. International Symposium on Program-ming Language Implementation and Logic Programming (PLILP’94), pages 385–399.Springer LNCS 844, 1994.

[26] P. Arenas-Sanchez, A. Gil-Luezas, and F.J Lopez-Fraguas. Combining lazy narro-wing with disequality constraints. Technical Report DIA 94-2, UCM, Madrid, 1994.

[27] P. Arenas-Sanchez, T. Hortala-Gonzalez, P. Lopez-Fraguas, and E. Ullan-Hernandez.Real constraints within a functional logic language. In Proc. Joint Conference onDeclarative Programming (APPIA-GULP-PRODE’96), pages 451–462, 1996.

[28] P. Arenas-Sanchez, F.J. Lopez-Fraguas, and M. Rodrıguez-Artalejo. Embeddingmultiset constraints into a lazy functional logic language. In Proc. Internatio-nal Symposium on Programming Language Implementation and Logic Programming(PLILP’98), pages 429–444. Springer 1490 LNCS, 1998.

[29] P. Arenas-Sanchez, F.J. Lopez-Fraguas, and M. Rodrıguez-Artalejo. Functional pluslogic programming with built-in and symbolic constraints. In Proc. InternationalConference on Principles and Practice of Declarative Programming (PPDP’99), pa-ges 152–169. Springer LNCS 1702, 1999.

[30] P. Arenas-Sanchez and M. Rodrıguez-Artalejo. A lazy narrowing calculus for func-tional logic programming with algebraic polymorphic types. In Proc. InternationalLogic Programming Symposium (ILPS’97), pages 53–69. The MIT Press, 1997.

[31] P. Arenas-Sanchez and M. Rodrıguez-Artalejo. A semantic framework for functionallogic programming with algebraic polymorphic types. In Proc. International JointConference on Theory and Practice of Software Development (TAPSOFT’97), pages453–464. Springer LNCS 1214, 1997.

[32] P. Arenas-Sanchez and M. Rodrıguez-Artalejo. A general framework for lazy func-tional logic programming with algebraic polymorphic types. Theory and Practice ofLogic Programming, 2(1):185–245, 2001.

[33] F. Baader and T. Nipkow. Term Rewriting and All That. Cambridge UniversityPress, United Kingdom, 1998.

Page 248: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

248 Bibliografıa

[34] R. Barbuti, P. Mancarella, D. Pedreschi, and F. Turini. Intensional negation of logicprograms: Examples and implementation techniques. In Proc. International JointConference on Theory and Practice of Software Development (TAPSOFT’87), pages96–110. Springer LNCS 250, 1987.

[35] R. Barbuti, P. Mancarella, D. Pedreschi, and F. Turini. A transformational approachto negation in logic programming. Journal of Logic Programming, 8:201–228, 1990.

[36] D. Bert and R. Echahed. Abstraction of conditional term rewriting systems. InProc. International Logic Programming Symposium (ILPS’95), pages 162–176. MITPress, 1995.

[37] R. Bird. Introduction to Functional Programming using Haskell. Prentice Hall Press,second edition, 1998.

[38] P.G. Bosco, E. Giovannetti, G. Levi, C. Moiso, and C. Palamidessi. A completesemantic characterization of K-LEAF, a logic language with partial functions. InProc. International Logic Programming Symposium (ILPS’87), pages 1–27. The MITPress, 1987.

[39] A. Bruffaerts and E. Henin. Negation as failure: Proofs, inference rules and meta-interpreters. In H. Abramson and M.H. Rogers, editors, Metaprograming in LogicProgramming, chapter 9, pages 169–190. MIT Press, 1989.

[40] P. Bruscoli, F. Levi, and M.C. Meo. Compilative constructive negation in cons-traint logic programs. In Proc. Colloquium on Trees in Algebra and Programming,(CAAP’94), pages 52–67. Springer LNCS 787, 1994.

[41] F. Bueno, D. Cabeza, M. Carro, M. Hermenegildo, P. Lopez, and G. Puebla. TheCiao Prolog system, reference manual. Technical Report CLIP 3/97.1, version 1.8#2,The CLIP Group, School of Computer Science, Technical University of Madrid, 2002.

[42] R. Caballero-Roldan. Tecnicas de diagnostico y depuracion declarativa para lengua-jes logico-funcionales. PhD thesis, SIP-UCM, Madrid, 2004.

[43] R. Caballero-Roldan, F.J. Lopez-Fraguas, and M. Rodrıguez-Artalejo. Theoreticalfoundations for the declarative debugging of lazy functional logic programs. In Proc.International Symposium on Functional and Logic Programming (FLOPS’01), pages170–184. Springer LNCS 2024, 2001.

[44] R. Caballero-Roldan, F.J. Lopez-Fraguas, and J. Sanchez-Hernandez. User’s manualfor T OY. Technical Report 97/57, Depto. SIP, UCM Madrid, 1997.

[45] R. Caballero-Roldan and M. Rodrıguez-Artalejo. A declarative debugging system forlazy functional logic programs. Electronic Notes in Theoretical Computer Science,64:63, 2002.

Page 249: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 249

[46] R. Caballero-Roldan and M. Rodrıguez-Artalejo. DDT : A declarative debuggingtool for functional logic languages. In Proc. International Symposium on Functionaland Logic Programming (FLOPS’04). Springer LNCS, 2004. To appear.

[47] D. Chan. Constructive negation based on the completed database. In Proc. Confe-rence on Logic Programming & Symposium on Logic Programming, pages 111–125,1988.

[48] D. Chan. An extension of constructive negation and its application in coroutining.In Proc. North American Conference on Logic Programming (NACLP’89), pages477–493, 1989.

[49] K.L. Clark. Negation as failure. In H. Gallaire and J. Minker, editors, Proc. Logicand Data Bases, pages 293–322. Plenum Press, 1978.

[50] M. Clavel, F. Duran, S. Eker, P. Lincoln, N. Martı-Oliet, J. Meseguer, and C. Tal-cott. The maude 2.0 system. In R.Nieuwenhuis, editor, Rewriting Techniques andApplications (RTA 2003), pages 76–87. Springer LNCS 2706, 2003.

[51] J.M. Cleva, J. Leach, and F.J. Lopez-Fraguas. A logical approach to the verificationof functional-logic programs. In Proc. International Workshop on Functional andLogic Programming (WFLP’04), 2004. To appear.

[52] W.F. Clocksin and C.S. Mellish. Programming in Prolog. Springer, third revisedand extended edition, 1987.

[53] H. Comon. Disunification: A survey. In J.L. Lassez and G. Plotkin, editors, Proc.Computational Logic, Essays in Honor of Alan Robinson, pages 322–359. MIT Press,1991.

[54] P. Cousot and R. Cousot. Abstract interpretation: A unified lattice model for staticanalysis of programs by construction of approximation of fixpoints. In Proc. ACMSymposium on Principles of Programming Languages, pages 238–252, 1977.

[55] D. DeGroot and G. Lindstrom, editors. Logic Programming, Functions, Relations,and Equations. Prentice Hall, 1986.

[56] N. Dershowitz. Orderings for term-rewriting systems. Theoretical Computer Science,17(3):279–301, 1982.

[57] N. Dershowitz and J.-P. Jouannaud. Rewrite systems. In J. van Leeuwen, editor,Handbook of Theoretical Computer Science, Vol. B, pages 243–320. Elsevier, 1990.

[58] N. Dershowitz and M. Okada. Conditional equational programming and the theoryof conditional term rewriting. In Proc. International Conference on Fifth GenerationComputer Systems, pages 337–346, 1988.

[59] N. Dershowitz and M. Okada. A rationale for conditional equational programming.Theoretical Computer Science, 75:111–138, 1990.

Page 250: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

250 Bibliografıa

[60] W. Drabent. What is failure? An approach to constructive negation. Acta Informa-tica, Springer, 32(1):27–59, 1995.

[61] F. Fages. Constructive negation by pruning. Journal of Logic Programming,32(2):295–312, 1997.

[62] M. Fernandez. Narrowing based procedures for equational disunification. ApplicableAlgebra in Engineering, Communication and Computing, 3:1–26, 1992.

[63] M. Fernandez. AC complement problems: Satisfiability and negation elimination.Journal of Symbolic Computation, 22:49–82, 1996.

[64] A.J. Fernandez-Leiva, T. Hortala-Gonzalez, and F. Saenz-Perez. Solving combina-torial problems with a constraint functional logic language. In Proc. InternationalWorkshop on Practical Aspects of Declarative Languages (PADL’03), pages 320–338.Springer LNCS 2562, 2003.

[65] M.A. Fitting. A Kripke-Kleene semantics for general logic programs. Journal ofLogic Programming, 2:295–312, 1985.

[66] A. Gavilanes-Franco. Comunicacion personal, 2004.

[67] M. Gelfond and V. Lifschitz. The stable model semantics for logic programming. InR.A. Kowalski and K.A. Bowen, editors, Procs. International Conference on LogicProgramming and Symposium on Logic Programming (ICLP/SLP’88), pages 1070–1080, 1988.

[68] E. Giovannetti, G. Levi, C. Moiso, and C. Palamidessi. Kernel LEAF: A logic plusfunctional language. Journal of Computer and System Sciences, 42(2):139–185, 1991.

[69] J.C. Gonzalez-Moreno, M.T. Hortala-Gonzalez, and M. Rodrıguez-Artalejo. A hig-her order rewriting logic for functional logic programming. In Proc. InternationalConference on Logic Programming (ICLP’97), pages 153–167. MIT Press, 1997.

[70] J.C. Gonzalez-Moreno, T. Hortala-Gonzalez, F.J. Lopez-Fraguas, and M. Rodrıguez-Artalejo. A rewriting logic for declarative programming. In Proc. European Sympo-sium on Programming (ESOP’96), pages 156–172. Springer LNCS 1058, 1996.

[71] J.C. Gonzalez-Moreno, T. Hortala-Gonzalez, F.J. Lopez-Fraguas, and M. Rodrıguez-Artalejo. An approach to declarative programming based on a rewriting logic. Jour-nal of Logic Programming, 40(1):47–87, 1999.

[72] J.C. Gonzalez-Moreno, T. Hortala-Gonzalez, and Rodrıguez-Artalejo, M. Polymorp-hic types in functional logic programming. In Journal of Functional and Logic Pro-gramming, volume 2001/S01, pages 1–71, 2001. Special issue of selected paperscontributed to the International Symposium on Functional and Logic Programming(FLOPS’99).

Page 251: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 251

[73] M. de Guzman. Cuentos con cuentas. Labor, Barcelona, 1984. (tambien puedeconsultarse http://www.mat.ucm.es/deptos/am/guzman/juemat/juemat.htm).

[74] M. Hanus. On the completeness of residuation. In Proc. Joint International Con-ference and Symposium on Logic Programming (JICSLP’92), pages 192–206. MITPress, 1992.

[75] M. Hanus. The integration of functions into logic programming: A survey. Jour-nal of Logic Programming, 19-20:583–628, 1994. Special issue ”Ten Years of LogicProgramming”.

[76] M. Hanus. On extra variables in (equational) logic programming. In Proc. Inter-national Conference on Logic Programming (ICLP’95), pages 665–679. MIT Press,1995.

[77] M. Hanus. A unified computation model for functional and logic programming.In Proc. Symposium on Principles of Programming Languages (POPL’97), pages80–93, 1997.

[78] M. Hanus, S. Antoy, M. Engelke, K. Hoppner, J. Koj, P. Niederau, R. Sadre, andF. Steiner. PAKCS 1.5.0. The Portland Aachen Kiel Curry System. User Manual.http://www.cs.pdx.edu/ antoy/, May 2003.

[79] M. Hanus, H. Kuchen, and J.J. Moreno-Navarro. Curry: A truly functional lo-gic language. In Proc. Workshop on Visions for the Future of Logic Programming(ILPS’95), 1995.

[80] M. Hanus and F. Steiner. Controlling search in declarative programs. In Proc. Inter-national Symposium on Programming Language Implementation and Logic Program-ming & Conference on Algebraic and Logic Programming (PLILP/ALP’98), pages374–390. Springer LNCS 1490, 1998.

[81] M. Hanus (ed.). Curry: An integrated functional logic language (version 0.8). Avai-lable at http://www.informatik.uni-kiel.de/~curry/report.html, April 2003.

[82] T. Hortala-Gonzalez, F.J. Lopez-Fraguas, J. Sanchez-Hernandez, and E. Ullan-Hernandez. Declarative programming with real constraints. Technical report, SIP-5997, 1997.

[83] P. Hudak, J. H. Fasel, and J. Peterson. A Gentle Introduction to Haskell. Version98, June 2000.

[84] P. Hudak and J.H. Fasel. A gentle introduction to Haskell. SIGPLAN Notices, 27(5),1992.

[85] J.M. Hullot. Canonical forms and unification. In Proc. 5th Conference on AutomatedDeduction, pages 318–334. Springer LNCS 87, 1980.

Page 252: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

252 Bibliografıa

[86] H. Hussmann. Nondeterministic algebraic specifications and nonconfluent term rew-riting. Journal of Logic Programming, 12:237–255, 1992.

[87] H. Hussmann. Non-Determinism in Algebraic Specifications and Algebraic Programs.Birkhauser Verlag, 1993.

[88] J. Jaffar and J.L. Lassez. Constraint logic programming. In Proc. of the 14th ACMSymposium on Principles of Programming Languages, pages 111–119, Munich, 1987.

[89] J. Jaffar, J.L. Lassez, M.J. Maher, K. Marriott, and P.J. Stuckey. The semantics ofconstraint logic programs. Journal of Logic Programming, 1-3(37):1–46, 1998.

[90] J. Jaffar and M.J. Maher. Constraint logic programming: A survey. Journal of LogicProgramming, 19&20:503–581, 1994.

[91] G. Jager and R.F. Stark. A proof-theoretic framework for logic programming. InS.R. Buss, editor, Handbook of Proof Theory, pages 639–682. Elsevier, 1998.

[92] Mark P. Jones and John C. Peterson. Hugs. A functional programmingsystem based on Haskell 98. User manual, Septiembre 1999. Available athttp://www.haskell.org/Hugs/pages/documentation.htm.

[93] J.P. Jouannaud and C. Kirchner. Solving equations in abstract algebras: A rule-based survey of unification. In J. L. Lassez and G. Plotkin, editors, ComputationalLogic: Essays in Honor of Alan Robinson, pages 257–321. MIT Press, 1991.

[94] J.W. Klop. Term rewriting systems. In S. Abramsky, D. Gabbay, and T. Maibaum,editors, Handbook of Logic in Computer Science, volume 2. Oxford University Press,1992.

[95] R. Kowalski. Predicate logic as programming language. In Proc. International Fede-ration for Information Processing (IFIP’74), pages 569–574. North-Holland, 1974.

[96] H. Kuchen, F.J. Lopez-Fraguas, J.J. Moreno-Navarro, and M. Rodrıguez-Artalejo.Implementing a lazy functional logic language with disequality constraints. In Proc.Joint International Conference and Symposium on Logic Programming (JICSLP’92).MIT Press, 1992.

[97] K. Kunen. Negation in logic programming. Journal of Logic Programming, 4:289–308, 1987.

[98] H.R. Lewis and C.H. Papadimitriou. Elements of the Theory of Computation.Prentice-Hall International, second edition, 1998.

[99] J.W. Lloyd. Foundations of Logic Programming. Springer, second, extended edition,1987.

[100] J.W. Lloyd. Combining functional and logic programming languages. In Proc.International Logic Programming Symposium (ILPS’94), pages 43–57, 1994.

Page 253: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 253

[101] J.W. Lloyd. Declarative programming in escher. Technical report cstr-95-013, Uni-versity of Bristol, 1995.

[102] R. Loogen, F. Lopez-Fraguas, and M. Rodrıguez-Artalejo. A demand driven compu-tation strategy for lazy narrowing. In Proc. International Symposium on Program-ming Language Implementation and Logic Programming (PLILP’93), pages 184–200.Springer LNCS 714, 1993.

[103] W. Lux and H. Kuchen. An efficient abstract machine for Curry. In R. Echahed,editor, Functional and Logic Programming, Eigth International Workshop, Rapportde Recherche RR 1021-I-, pages 171–181. Insititut IMAG, Grenoble, 1999.

[104] F.J. Lopez-Fraguas. A general scheme for constraint functional logic programming.In Proc. International Conference on Algebraic and Logic Programming (ALP’92),pages 213–227. Springer LNCS 632, 1992.

[105] F.J. Lopez-Fraguas. Programacion Funcional y Logica con Restricciones. PhD thesis,DIA-UCM, Madrid, 1994.

[106] F.J. Lopez-Fraguas, M. Rodrıguez-Artalejo, and R. del Vado-Vırseda. Constraintfunctional logic programming revisited. In Proc. Workshop on Rewriting Logic andApplications (WRLA’04), 2004. To appear in Electronic Notes in Theoretical Com-puter Science.

[107] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. An efficient narrowing strategy bymenas of disequality constraints. Technical Report SIP 84-98, UCM, Madrid, No-vember 1998.

[108] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. A rewriting logic view of functionallogic programming with disequality constraints. Technical Report 98/84, Depto.SIP, UCM Madrid, 1998.

[109] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Disequalities may help to narrow. InJoint Conference on Declarative Programming (APPIA-GULP-PRODE’99), pages89–104, 1999.

[110] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. T OY: A multiparadigm declarativesystem. In Proc. Rewriting Techniques and Applications (RTA’99), pages 244–247.Springer LNCS 1631, 1999.

[111] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Proving failure in functional logicprograms. In Proc. Computational Logic (CL’00), pages 179–193. Springer LNAI1861, 2000.

[112] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Proving failure in functional logicprograms, extended version. Technical Report SIP 100-98, UCM, Madrid, May 2000.

Page 254: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

254 Bibliografıa

[113] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Functional logic programming withfailure: A set-oriented view. In Proc. International Conference on Logic for Pro-gramming and Automated Reasoning (LPAR’01), pages 455–469. Springer LNAI2250, 2001.

[114] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Narrowing failure in functional logicprogramming. In Proc. International Symposium on Functional and Logic Program-ming (FLOPS’02), pages 212–227. Springer LNCS 2441, 2002.

[115] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Failure and equality in functionallogic programming. Electronic Notes in Theoretical Computer Science, 86(3):21,2003.

[116] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. Functional logic pro-gramming with failure and built-in equality. In Proc. InternationalWorkshop on Functional and (Constraint) Logic Programming (WFLP’03),pages 61–74. Universidad Politecnica de Valencia, 2003. Available athttp://www.dsic.upv.es/~rdp03/wflp/proceedings.html.

[117] F.J. Lopez-Fraguas and J. Sanchez-Hernandez. A proof theoretic approach to fai-lure in functional logic programming. Theory and Practice of Logic Programming,4(1&2):41–74, 2004.

[118] A. Martelli and U. Montanari. An efficient unification algorithm. ACM Transactionson Programming Languages and Systems, 4(2):258–282, 1982.

[119] J. Mateos-Lago and M. Rodrıguez-Artalejo. A declarative framework for objectoriented programming with genetic inheritance. Theoretical Computer Science,269:363–417, 2001.

[120] A. Middeldorp, S. Okui, and T. Ida. Lazy narrowing: Strong completeness and eagervariable elimination. In Proc. Colloquium on Trees in Algebra and Programming(CAAP’95), pages 394–408. Springer LNCS 915, 1995.

[121] J.J. Moreno-Navarro. Diseno, semantica e implementacion de Babel: un lenguajeque integra la programacion funcional y logica. PhD thesis, Fac. de Informatica,UPM, Madrid, 1989.

[122] J.J. Moreno-Navarro. Default rules: An extension of constructive negation fornarrowing-based languages. In Proc. International Conference on Logic Program-ming (ICLP’94), pages 535–549. MIT Press, 1994.

[123] J.J. Moreno-Navarro. Tuple inheritance: A new kind of inheritance for (cons-traint) logic programming. In Proc. International Conference on Logic Programming(ICLP’95), page 829. MIT Press, 1995.

[124] J.J. Moreno-Navarro. Extending constructive negation for partial functions in lazyfunctional-logic languages. In Proc. International Workshop on Extensions of LogicProgramming (ELP’96), pages 213–227. Springer LNAI 1050, 1996.

Page 255: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 255

[125] J.J. Moreno-Navarro and S. Munoz-Hernandez. How to incorporate negation in aProlog compiler. In V. Santos Costa and E. Pontelli, editors, Proc. InternationalWorkshop on Practical Aspects of Declarative Languages (PADL’00), pages 124–140.Springer LNCS 1753, 2000.

[126] J.J. Moreno-Navarro and S. Munoz-Hernandez. Efficient negation using abstractinterpretation. In Proc. International Conference on Logic for Programming andAutomated Reasoning (LPAR’01), pages 485–494. Springer LNAI 2250, 2001.

[127] J.J. Moreno-Navarro and S. Munoz-Hernandez. Constructive negation for Prolog:a real implementation. In Joint Conference on Declarative Programming (APPIA-GULP-PRODE’02), pages 39–52, 2002.

[128] J.J. Moreno-Navarro and M. Rodrıguez-Artalejo. Logic programming with func-tions and predicates: The language Babel. Technical report dia/89/3, UniversidadComplutense, Madrid, 1989.

[129] J.J. Moreno-Navarro and M. Rodrıguez-Artalejo. Logic programming with functionsand predicates: The language Babel. Journal of Logic Programming, 12:189–223,1992.

[130] R.A. O’Keefe. The Craft of Prolog. Cambridge, MIT Press, 1990.

[131] S. Peyton Jones and J. Hughes (eds.). Haskell 98: A Non-strict, Purely FunctionalLanguage. Available at http://www.haskell.org, February 1999.

[132] S. (ed.) Peyton Jones. Haskell 98 Language and Libraries. The Revised Report.Available at http://www.haskell.org, September 2002.

[133] R. Pena-Marı. Comunicacion personal, 2003.

[134] M.J. Ramırez-Quintana. Negacion Constructiva para Programacion Logica Ecua-cional. PhD thesis, Universidad Politecnica de Valencia, 1993.

[135] M.J. Ramırez-Quintana and M. Falaschi. Conditional narrowing with constructivenegation. In Proc. International Workshop on Extensions of Logic Programming(ELP’93), pages 59–79. Springer LNCS 660, 1993.

[136] U.S. Reddy. Narrowing as the operational semantics of functional languages. In Proc.IEEE International Symposium on Logic Programming, pages 138–151, Boston, 1985.

[137] R. Reiter. On closed world data bases. In H. Gallaire and J. Minker, editors, Logicand Data Bases, pages 55–76. Plenum Press, 1978.

[138] J.C. Reynolds. Theories of Programing Languages. Cambridge University Press,1998.

Page 256: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

256 Bibliografıa

[139] M. Rodrıguez-Artalejo. Functional and constraint logic programming. In RevisedLectures of the International Summer School CCL’99, H. Common, C. Marche andR. Treinen (eds.), Constraints in Computational Logics, Theory and Applications,chapter 5, pages 202–270. Springer LNCS 2002, 2001.

[140] C. Schulte and G. Smolka. Encapsulated search for higher-order concurrentconstraint programming. In Proc. International Logic Programming Symposium(ILPS’94), pages 505–520. MIT Press, 1994.

[141] C. Schulte, G. Smolka, and J. Wurtz. Encapsulated search and constraint program-ming in Oz. In Proc. Workshop on Principles and Practice of Constraint Program-ming, pages 134–150. Springer LNCS 874, 1994.

[142] J.C Shepherdson. Negation as failure: a comparison of Clark’s completed data baseand Reiter’s closed world assumption. Journal of Logic Programming, 1:51–79, 1984.

[143] J.C Shepherdson. Negation as failure II. Journal of Logic Programming, 2(3):185–202, 1985.

[144] J.C Shepherdson. Negation in logic programming. In J. Minker, editor, Foundationsof Deductive Databases and Logic Programming, pages 19–88. Kaufmann, Los Altos,CA, 1988.

[145] G. Smolka. The definition of kernel Oz. Research report RR-94-23, DFKI, 1994.

[146] G. Smolka. The Oz programming model. In J. van Leeuwen, editor, ComputerScience Today: Recent Trends and Developments, pages 324–343. Springer LNCS1000, 1995.

[147] Z. Somogyi and F. Henderson. The design and implementation of Mercury. Slidesof a tutorial at JICSLP’96, 1996.

[148] Z. Somogyi, F. Henderson, and T. Conway. The execution algorithm of Mercury, anefficient purely declarative logic programming language. Journal of Logic Program-ming, 29(1-3):17–64, 1996.

[149] H. Søndergaard and P. Sestoft. Non-determinism in functional languages. TheComputer Journal, 35(5):514–523, 1992.

[150] L. Sterling and E. Shapiro. The Art of Prolog. MIT Press, 1986.

[151] P.J. Stuckey. Constructive negation for constraint logic programming. In Proc. Logicin Computer Science (LICS’91), pages 328–339, 1991.

[152] P.J. Stuckey. Negation and constraint logic programming. Information and Com-putation, 118:12–33, 1995.

[153] R.F. Stark. First-order theories for pure Prolog programs with negation. Archivefor Mathematical Logic, 2(34):113–144, 1995.

Page 257: Una aproximaci on al fallo en programaci on declarativa …gpd.sip.ucm.es › jaime › papers › tesis › tesis.pdf · 2004-06-04 · Una aproximaci on al fallo en programaci on

Bibliografıa 257

[154] P.A. Subrahmanyam and J.-H. You. Funlog: a computational model integratinglogic programming and functional programming. In D. DeGroot and G. Lindstrom,editors, Logic Programming, Functions, Relations, and Equations, pages 157–198.Prentice Hall, 1986.

[155] J. Sanchez-Hernandez. T OY: Un lenguaje logico funcional con restricciones. Trabajode Investigacion de Tercer Ciclo, Dpto. de Sistemas Informaticos y Programacion,Universidad Complutense de Madrid, Sep. 1998.

[156] D. Turner. Miranda: A non-strict functional language with polymorphic types. InProc. Conference on Functional Programming Languages and Computer Architectu-re, pages 1–16. Springer LNCS 201, 1985.

[157] D. Turner. An overview of Miranda. SIGPLAN Notices, 21(12):158–166, 1986.

[158] R. del Vado-Vırseda. A demand-driven narrowing calculus with overlapping defini-tional trees. In Proc. ACM SIGPLAN Conf. on Principles and Practice of Declara-tive Programming (PPDP’03), pages 213–227. ACM Press, 2003.

[159] P. Wadler. How to replace failure by a list of successes. In Proc. Functional Pro-gramming and Computer Architecture. Springer LNCS 201, 1985.


Recommended