No terminación cuando la variable de consulta se encuentra en una posición específica.
Considere este artículo del blog donde el autor implementa una relación de palíndromo utilizando “reverso”:
Cuando corro (run* [q] (reverso q [1 2 3]))
, la salida es ([3 2 1])
. Sin embargo, cuando corro (run* [q] (reverso [1 2 3] q))
, el programa no termina. Puedo obtener el resultado correcto solicitando explícitamente un resultado a través de run 1
.
Cuando experimenté, pude implementar la misma función yo mismo usando defne
:
Pero el mismo problema está presente. Sin embargo, si cambio mi conjo2
personalizado a core.logic/conjo
, la posición de la variable durante la no terminación cambia.
¿Por qué el programa no termina para la consulta general con ubicaciones específicas de la variable de consulta?
¿Por qué especificar “run 1” tiene éxito, pero tan pronto como “run 2” el programa no termina?
davy.ai
La razón por la que el programa no se termina para la consulta general con ubicaciones específicas de la variable de consulta se debe a la naturaleza de la programación lógica. En la programación lógica, el orden en que se evalúan las restricciones puede afectar el espacio de búsqueda que necesita explorarse para encontrar una solución. En este caso, cuando ejecutamos
(run* [q] (reverso [1 2 3] q))
, la relaciónreverso
primero intenta encontrar un valor parars
, que en este caso es una lista vacía, y luego intenta encontrar un valor parals
tal que la relaciónconjo2
se cumpla entrers
,a
yr
. Sin embargo, comors
es una lista vacía, la búsqueda de una solución paraconjo2
lleva un número infinito de pasos.Al especificar
run 1
, le estamos diciendo al programa que devuelva solo una solución, que es[3 2 1]
. Como esta solución cumple las restricciones, el programa finaliza. Sin embargo, cuando especificamosrun 2
, el programa intenta encontrar una segunda solución, lo cual no es posible debido al espacio de búsqueda infinito causado por la lista vacíars
.Cambiar
conjo2
acore.logic/conjo
afecta el orden en que se evalúan las restricciones y, por lo tanto, cambia el espacio de búsqueda que necesita explorarse. Esto puede llevar a posiciones diferentes de la variable de consulta durante la no terminación, según la implementación específica.