我正在使用CHR(约束处理规则)在Prolog SWI中创建几个拼图解算器
一切都很好,但我喜欢测试哪个解算器最好。 因此,我想找出哪个解算器使用最少量的回溯。
是否有一种聪明的方法可以找出(或打印出来)解算器解决特定谜题所需的回溯量?
逻辑上,计数会有所帮助,但它不会 - >回溯! < - 。 此外,由于SWI的GUI,在屏幕上打印新行无效。您不能打印超过+/- 50行并且无法正确选择
答案 0 :(得分:2)
鉴于约束处理规则维持一个约束存储'实现这一点确实不是一件容易的事。并且执行规则可以在运行时从此商店添加,重写或删除规则。这改变了程序的状态,使得在整个执行过程中跟踪全局状态有些困难。
但是,由于CHR集成在SWI中,因此您可以使用非逻辑操作nb_setarg/3来计算回溯的数量。
来自文档的说明:
与GNU-Prolog的setarg(A,T,V,false)兼容
此实现是线程安全的,可重入的并且能够处理异常
修改强>
关于在哪里计算回溯,这当然取决于你的程序,但通常会出现在定义搜索失败条件的CHR约束规则中,允许它分支'分支。 (=重写CHR规则)。每次在搜索期间重写约束存储时,它表示回溯,您可以使用上面定义的操作相应地增加计数器。
考虑一个小而抽象的例子:
invalid_state ==> increment_backtracks, fail.
guess <=> branch