prolog - 您如何计算 Prolog SWI 或 CHR Prolog SWI 中的回溯量

标签 prolog backtracking swi-prolog constraint-handling-rules

我在序言SWI与CHR(约束处理规则)创建多个谜题解决者

一切都很好,但是,我喜欢测试哪个求解器是最好的。
因此,我想搞清楚,这解算器使用回溯的最少。

是否有一种聪明的方法可以找出(或打印出)求解器解决特定难题所需的回溯量?

从逻辑上讲,计数会有所帮助,但它不会 --> 回溯! <--。
此外,在屏幕上打印一个新行是不是有效,因为SWI的GUI的。您不能打印超过+/- 50行,不能正确选择

最佳答案

考虑到约束处理规则维护“约束存储”并且规则的执行可能,实现这一点确实并非易事。添加 , 重写 删除 运行时来自此商店的规则。这会改变程序的状态,并使得在整个执行过程中跟踪全局状态有些困难。
但是,由于 CHR 已集成在 SWI 中,因此您可以使用非逻辑操作 nb_setarg/3保持计数回溯。
文档中的注释:

  • Compatible with GNU-Prolog's setarg(A,T,V,false)

  • This implementation is thread-safe, reentrant and capable of handling exceptions


编辑
至于在哪里计算回溯,这当然取决于您的程序,但通常会出现在定义搜索失败条件的 CHR 约束规则中,允许它“分支”(= 重写 CHR 规则)。每次在搜索期间重写约束存储时,它都表示回溯,您可以使用上面定义的操作相应地增加计数器。
考虑一个小的、抽象的例子:
invalid_state ==> increment_backtracks, fail.
        guess <=> branch

关于prolog - 您如何计算 Prolog SWI 或 CHR Prolog SWI 中的回溯量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958087/

相关文章:

prolog - 读一剪!在序言中

prolog - 使用 Prolog 中的累加器计算多项式的计算问题

python 回溯

prolog - 以秒为单位递增日期时间

prolog - 尝试运行 SWI Prolog Simplex 示例时出错

c++ - 使用 C++ 接口(interface)在 Prolog 中进行列表处理

Prolog 忘记/取消实例化我的变量?

algorithm - 在迷宫中寻找输出的死胡同填充算法是否被视为回溯算法?

python - 回溯算法的时间复杂度说明

json - 如何在 Prolog 中读取 JSON 文件