Pregunta

pred(Args).
pred(Args) :-
    goalA,
    goalB,
    !,
    pred(Args).
pred(Args) :-
    goalC,
    goalD,
    !,
    pred(Args).

Normalmente me gustaría escribir un predicado recursivo que se ocupa de rendimiento de la memoria algo a lo largo de las líneas del fragmento de código anterior. Con el corte que se utiliza para tratar de forzar la optimización de llamada de cola que se produzca. Recientemente he estado pasando por una gran base de código de prólogo y he encontrado algunos ejemplos en los que el corte es en realidad después de la llamada recursiva en lugar de inmediatamente antes de la misma. Es de suponer que esto tiene el efecto de impedir la optimización de llamada de cola suceda en lugar de ayudar a él.

Mi pregunta es ¿puedo mover el corte desde después de la llamada recursiva a la inmediatamente anterior a ella sin afectar el significado del programa? Esto es suponiendo que hay un corte en la misma ubicación relativa para cada cláusula del predicado.

Ahora he estado pensando en ello un poco más, estoy pensando que tal vez la respuesta es "no necesariamente", pero después de haber reescrito todo el código con el corte antes de la llamada y encontrar que el conjunto de pruebas todavía está pasando, yo también estoy preguntando si podría haber alguna otra razón esotérica para escribir predicados como este. ¿O es sólo una mala codificación?

¿Fue útil?

Solución

Mi conjetura es que podría ser malo codificación (o no se entiende lo que el autor estaba haciendo)

Yo digo esto, porque yo mismo hice una vez el mismo error:

https: //mailbox.iai .uni-bonn.de / mailman / public / SWI-Prolog / 2009 / 001540.html

http://xonix.habrahabr.ru/blog/60430/ (aviso , en ruso)

Sin embargo, la gente de SWI lista de correo confirmaron que forma correcta de código de la cola es recursivo

head :-
       <guard goals>, !,
       <deterministic stuff>,
       head.
head :-
       ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top