Prolog试图找到其他解决方案,但我不知道为什么(只有一个)



我阅读了Learn Prolog Now网站,并尝试做以下练习:

6.5编写一个谓词swapfl(List1,List2(,它检查List1是否与List2相同,只是交换了第一个和最后一个元素。这就是append/3再次发挥作用的地方,但也可以在不使用append/3(或任何其他(谓词的情况下编写递归定义。

我已经写了它,它工作正常,但它试图找到多个解决方案。

swapfl([HL1|TL1],[HL2|TL2]):-
swpfl(TL1,TL2,HL2,HL1).
swpfl([HL1|TL1],[HL2|TL2],AccEL1,AccEL2):-
swpfl(TL1,TL2,AccEL1,AccEL2),
HL1=HL2.
swpfl([H1],[H2],H1,H2).

我查看代码和跟踪

[trace] [5]  ?- swapfl([1,2,3],[3,2,1]).
Call: (51) swapfl([1, 2, 3], [3, 2, 1]) ? creep
Call: (52) swpfl([2, 3], [2, 1], 3, 1) ? creep
Call: (53) swpfl([3], [1], 3, 1) ? creep
Exit: (53) swpfl([3], [1], 3, 1) ? creep
Call: (53) 2=2 ? creep
Exit: (53) 2=2 ? creep
Exit: (52) swpfl([2, 3], [2, 1], 3, 1) ? creep
Exit: (51) swapfl([1, 2, 3], [3, 2, 1]) ? creep
true ;
Redo: (52) swpfl([2, 3], [2, 1], 3, 1) ? creep
Fail: (52) swpfl([2, 3], [2, 1], 3, 1) ? creep
Fail: (51) swapfl([1, 2, 3], [3, 2, 1]) ? creep
false.

我无法理解为什么prolog认为启动重做部分可能是值得的。

有人能解释为什么解决方案树中有一个未搜索的分支吗?

Prolog在做出最终决定之前,将始终探索所有选项。

请尝试查看以下堆栈溢出问题:Prolog:停止条件?

对于刚开始的Prolog程序员来说,错误响应可能看起来不一致,"感觉"像是错误或警告,但实际上这是一个完全正常的Prolog响应。Prolog在试图寻找解决方案的行为上非常一致,当没有更多选择时,它将返回false。如果Prolog在找到最终解决方案之前已经用尽了所有其他选择,那么它将显示解决方案,并且不会返回false。

相关内容

最新更新