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

时间:2014-05-30 15:25:14

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

鉴于约束处理规则维持一个约束存储'实现这一点确实不是一件容易的事。并且执行规则可以在运行时从此商店添加重写删除规则。这改变了程序的状态,使得在整个执行过程中跟踪全局状态有些困难。

但是,由于CHR集成在SWI中,因此您可以使用非逻辑操作nb_setarg/3来计算回溯的数量。

来自文档的说明:

  
      
  • 与GNU-Prolog的setarg(A,T,V,false)兼容

  •   
  • 此实现是线程安全的,可重入的并且能够处理异常

  •   

修改

关于在哪里计算回溯,这当然取决于你的程序,但通常会出现在定义搜索失败条件的CHR约束规则中,允许它分支'分支。 (=重写CHR规则)。每次在搜索期间重写约束存储时,它表示回溯,您可以使用上面定义的操作相应地增加计数器。

考虑一个小而抽象的例子:

invalid_state ==> increment_backtracks, fail.
        guess <=> branch