这可能是一个简单的问题,但是这里就是.....假设我有一些事情:
.... step1, step2, step3, ...
我希望每次step3失败回溯都跳过step2而转到step1,但是在前进的路上要遵循正常的..step1,step2,step3 .. sequence。
.... step1, (step2, step3), ...
似乎没有做到,或者我做错了什么。
它需要更多测试,但到目前为止似乎有效:
.... step1, (step2 -> (step3; true)), ...
可能这是swi-prolog特质,要求真实。
答案 0 :(得分:3)
在文献中,这种搜索策略也称为回跳。
在Prolog中实现此功能的一种方法是使用例外。
请参阅ISO谓词catch/3
和throw/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
如果需要,上述两个示例中的“步骤”可以是子步骤的结合,带有合适的括号。