es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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ón reverso primero intenta encontrar un valor para rs, que en este caso es una lista vacía, y luego intenta encontrar un valor para ls tal que la relación conjo2 se cumpla entre rs, a y r. Sin embargo, como rs es una lista vacía, la búsqueda de una solución para conjo2 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 especificamos run 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ía rs.

    Cambiar conjo2 a core.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.

Comments are closed.