Logo Studenta

Recuperando la terminación: Subsunción con filtrado de números En programas que contienen predicados aritméticos de Prolog pero que no generan ...

Recuperando la terminación: Subsunción con filtrado de números En programas que contienen predicados aritméticos de Prolog pero que no generan infinitos functores v́ıa functor/3, =../2, etc., una so- lución inmediata para recuperar la terminación es utilizar la relación Enum. Ésta, es una adaptación del HEm que simplemente filtra los va- lores numéricos, es decir, cualquier número subsume a otro número. En el ejemplo, el átomo execute(st(fr(count, 2, [], [N, 1]), []), Sf) subsume a execute(st(fr(count, 2, [], [N, 0]), []), Sf ) bajo Enum, evitándose aśı la no ter- minación. Desafortunadamente, esta modificación del HEm, es demasiado simplista, y da lugar a una perdida excesiva de precisión. Por ejemplo, al especializar main(count, [N], I), los primeros dos átomos de execute/2 son execute(st(fr(count, 0, [], [N, 0]), []), Sf) y execute(st(fr(count, 1, [0], [N, 0]), []), Sf). Usando Enum, el silbato se activa en este punto y el desplegado tiene que parar. Esto provoca que este último átomo sea generalizado en el control global produciéndose execute(st(fr(count, X, Y, [N, 0]), []), Sf). Es- to no es aceptable en el caso de la especialización de nuestro intérprete, pues se pierde la pista de la siguiente instrucción a ser ejecutada—lo que provoca que no se pueda eliminar la capa de interpretación—y de hecho, en la mayoŕıa de casos provoca que el programa residual obtenido contenga prácticamente el intérprete por completo.