Как вы можете посчитать, количество возвратов в Prolog SWI или CHR Prolog SWI
Я создаю несколько решателей головоломок в Prolog SWI с CHR (Правила обработки ограничений)
Все отлично работает, но мне нравится проверять, какой решатель лучший. Поэтому мне нравится выяснять, какой решатель использует наименьшее количество возвратов.
Есть ли умный способ выяснить (или распечатать) количество возвратов, необходимых для решения определенной головоломки?
Логично, что подсчет поможет, но это не так -> возвращение!<-. Кроме того, печать новой строки на экране неэффективна из-за графического интерфейса SWI. Вы не можете напечатать более +/- 50 строк и не можете выбрать правильно
1 ответ
Это действительно не тривиально, поскольку правила обработки ограничений поддерживают "хранилище ограничений", и выполнение правил может добавлять, переписывать или удалять правила из этого хранилища во время выполнения. Это изменяет состояние программы и несколько усложняет отслеживание глобальных состояний во время выполнения.
Однако, поскольку CHR интегрирован в SWI, вы можете использовать нелогическую операцию nb_setarg / 3, чтобы вести подсчет обратных возвратов.
Примечания из документа:
Совместим с сетаргом GNU-Пролог (A,T,V,false)
Эта реализация является поточно-ориентированной, реентерабельной и способной обрабатывать исключения
РЕДАКТИРОВАТЬ
Что касается того, где подсчитывать возвратные дорожки, это, конечно, зависит от вашей программы, но обычно происходит в правиле ограничения CHR, которое определяет условие сбоя вашего поиска, позволяя ему "переходить" (= переписывать правила CHR). Каждый раз, когда во время поиска происходит перезапись хранилища ограничений, оно представляет собой возвратный путь, и вы можете соответственно увеличить счетчик, используя операцию, как определено выше.
Рассмотрим небольшой абстрактный пример:
invalid_state ==> increment_backtracks, fail.
guess <=> branch