【发布时间】:2013-12-03 11:46:39
【问题描述】:
我目前正在阅读 Bratko Prolog 书,并且正在研究冒泡排序程序。我似乎无法弄清楚为什么 cut(!) 是必要的。假设剪辑不存在,Prolog 会回溯,它怎么可能找到错误的答案?因为如果我把它删掉,Prolog 会先给我正确的答案,然后也会给出替代的错误答案。
在我看来,swap 怎么会返回一个未排序的列表?一个未排序的列表怎么可能达到目标bubblesort(Sorted, Sorted)。
当然,除非第一个列表也被更改...无法理解它。
Prolog BubbleSort 程序:
gt(X,Y) :- X > Y.
bubblesort(List, Sorted) :-
swap(List, List1), !, % A useful swap in List?
bubblesort(List1, Sorted).
bubblesort(Sorted, Sorted). % Otherwise list is already sorted
swap([X,Y|Rest], [Y,X|Rest]) :- % Swap first two elements
gt(X,Y).
swap([Z|Rest], [Z|Rest1]) :- % Swap elements in tail
swap(Rest, Rest1).
留下它给我的切口:
?- bubblesort([5,7,3,6,8,9,2,6], Sorted).
Sorted = [2, 3, 5, 6, 6, 7, 8, 9] ;
Sorted = [2, 3, 5, 6, 7, 6, 8, 9] ;
Sorted = [2, 3, 5, 6, 7, 8, 6, 9] ;
Sorted = [2, 3, 5, 6, 7, 8, 9, 6] ;
我想我明白了,但我不确定。是不是在某个时刻,它回溯到swap(List, List1) 去第二个冒泡排序谓词并达到目标,这意味着两个列表排序相等?
在英语中,这是否意味着冒泡排序需要继续进行交换,直到无法再进行交换,然后才需要终止?或者这是否意味着每次成功的交换完成后,回溯该成功是没有用的?
【问题讨论】:
-
我认为你关于它为什么存在的第二个概念基本上是正确的。如果
gt(X,Y)失败,swap将提供替代方案。即使gt(X,Y)成功,该替代方案也将被退回。bubblesort谓词的结构方式,bubblesort的每次迭代只是寻找swap以找到下一次出现的必要交换并执行它。如果没有剪辑,您会从swap获得不符合所需条件的回溯。
标签: prolog bubble-sort prolog-cut