Cómo determinar la eficiencia de un programa de retroceso

Al contar la cantidad de backtracks que se necesitan antes de encontrar una solución.

Esto puede sonar frívolo, pero lo digo en serio: el algoritmo de retroceso más eficiente es uno que no tiene que retroceder en absoluto. Obviamente, en un sistema que admite la búsqueda con retroceso, espera hacer un retroceso, pero si sus parámetros están configurados de forma inteligente, el retroceso se minimizará.

Los sistemas Prolog tienen varias herramientas disponibles para contar las pistas, pero que yo sepa, ninguna ha sido estandarizada. Este es un truco rápido para crear un predicado de paso que cuenta las llamadas de puerto ‘rehacer’:

count_bt: –
( cierto
; retractarse (bt_count (A)),
B es A + 1,
afirmar (bt_count (B)),
fallar
)

Debería investigar la especificación ISO para ver si hay una mejor opción. Si sabes de uno, ¡por favor comenta!

editar: El predicado originalmente causó una recalculación innecesaria porque la cláusula ‘else’ tuvo éxito a pesar de que fue invocada como consecuencia de una falla posterior: ‘call’ debería pasar a ‘exit’; ‘rehacer’ debería pasar a ‘fallar’ (y actualizar el contador como un efecto secundario) para un verdadero predicado transparente.