小编Joa*_*oan的帖子

如何使用 call_with_depth_limit/3

我试图call_with_depth_limit/3在 SWI-Prolog 中使用来实现迭代深化,要么我不明白它是如何工作的,要么它行为不端。我有一个例子,其中发生以下情况:

?- call_with_depth_limit(mygoal, 29, Result).
Result = 29 ;
Result = 25 ;
Result = 27 ;
Result = 27 ;
false.
Run Code Online (Sandbox Code Playgroud)
?- call_with_depth_limit(mygoal, 26, Result).
Result = depth_limit_exceeded ;
false.
Run Code Online (Sandbox Code Playgroud)

根据文档,如果目标可以用限制最大递归或更少来证明,它应该会成功。在限制为 30 的第一次调用中,我们看到结果为 25,因此我希望以 26 的限制调用它会成功。我在模块中使用约束处理规则,以防那里可能有一些交互使其行为不端。

编辑:玩过伊莎贝尔的回答后,我想我明白它的行为方式了:

  • 它像往常一样运行深度优先搜索,但如果达到限制+1 深度,它就好像失败了。
  • 失败的分支计入结果。
  • 每次在成功回答后回溯时,它都会将 Result 重置为堆栈的当前深度。

看这个例子:

loop :- loop.

succeed(0).
succeed(N) :- N > 0, N1 is N - 1, succeed(N1).

fail(N) :- N > 0, N1 is N - 1, fail(N1).
Run Code Online (Sandbox Code Playgroud)
?- call_with_depth_limit(succeed(0), 1000, Result). …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog iterative-deepening

7
推荐指数
3
解决办法
247
查看次数

标签 统计

iterative-deepening ×1

prolog ×1

swi-prolog ×1