Prolog:倒退一步以上(倒退!)?

时间:2018-02-21 21:15:46

标签: prolog backtracking skip

这可能是一个简单的问题,但是这里就是.....假设我有一些事情:

.... step1, step2, step3, ...

我希望每次step3失败回溯都跳过step2而转到step1,但是在前进的路上要遵循正常的..step1,step2,step3 .. sequence。

.... step1, (step2, step3), ...

似乎没有做到,或者我做错了什么。

它需要更多测试,但到目前为止似乎有效:

.... step1, (step2 -> (step3; true)), ...

可能这是swi-prolog特质,要求真实。

2 个答案:

答案 0 :(得分:3)

在文献中,这种搜索策略也称为回跳

在Prolog中实现此功能的一种方法是使用例外

请参阅ISO谓词catch/3throw/1

特别是,在您的情况下,您可以安排它,以便step3失败导致通过throw/1投掷“球”,可以通过catch/3抓住预定的目标位置。

答案 1 :(得分:2)

表达式step1, (step2, step3)的行为与step1, step2, step3没有区别。括号只强制优先分组,在这种情况下没有效果(就像写1 + (2 + 3)而不是1 + 2 + 3)。

可能的解决方案是:

step1, (step2 -> step3)

这意味着您只能从step2获得第一个解决方案。所以我认为它与:

相同
step1, once(step2), step3

如果需要,上述两个示例中的“步骤”可以是子步骤的结合,带有合适的括号。

相关问题