【问题标题】:How can you count, the amount of backtracks in Prolog SWI or CHR Prolog SWI您如何计算 Prolog SWI 或 CHR Prolog SWI 中的回溯量
【发布时间】:2014-05-30 15:25:13
【问题描述】:

我正在使用 CHR(约束处理规则)在 Prolog SWI 中创建几个解谜程序

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

有没有一种聪明的方法来找出(或打印出)求解者解决特定难题所需的回溯量?

从逻辑上讲,计数会有所帮助,但它没有 --> 回溯!

【问题讨论】:

  • gprofile 可以帮助你,浏览手册
  • gprofile?和profile/3一样吗?
  • profile/1,抱歉我没记好
  • 如果 CPU 时间对您来说不够好,您可以将统计数据显示的推断数量视为一个非常好的独立于架构且可重现的近似效率。
  • @Dieter 当 Prolog 再次返回执行子句 (REDO) 以尝试找到回溯的另一个解决方案时。

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


【解决方案1】:

鉴于约束处理规则维护一个“约束存储”并且规则的执行可能添加重写删除 运行时来自此存储的规则。这会改变程序的状态,并使得在整个执行过程中跟踪全局状态变得有些困难。

但是,由于 CHR 集成在 SWI 中,您可以利用非逻辑运算 nb_setarg/3 来保持回溯计数。

文档注释:

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

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

编辑

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

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

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

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2014-12-22
    相关资源
    最近更新 更多