你如何计算,Prolog SWI或CHR Prolog SWI的回溯量

我正在使用CHR(约束处理规则)在Prolog SWI中创建几个拼图求解器

一切都很好,但我喜欢测试哪个解算器最好.
因此,我想找出哪个解算器使用最少量的回溯.

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

从逻辑上讲,计数会有所帮助,但它不会 – >回溯! < – .
此外,由于SWI的GUI,在屏幕上打印新行无效.您不能打印超过/ – 50行,并且无法正确选择

最佳答案 考虑到约束处理规则维护一个“约束存储”并且规则的执行可以在运行时添加,重写或从该存储中删除规则,实现这一点确实不是一件容易的事.这改变了程序的状态,使得在整个执行过程中跟踪全局状态有些困难.

但是,由于CHR集成在SWI中,您可以使用非逻辑操作nb_setarg/3来保持回溯的计数.

来自doc的说明:

  • 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
点赞