List 在Prolog中对列表排序
Prolog有一种独特的处理方式,特别是因为实际上每个操作都涉及某种递归 每种语言都有一个经典的例子,就是将整数列表按升序排序List 在Prolog中对列表排序,list,sorting,prolog,List,Sorting,Prolog,Prolog有一种独特的处理方式,特别是因为实际上每个操作都涉及某种递归 每种语言都有一个经典的例子,就是将整数列表按升序排序 什么是对随机整数列表进行排序的最佳方法(不使用太多内置谓词,这当然排除了sort/2谓词)?Roman Barták的Prolog编程站点给出了一个优化的快速排序 quick_sort2(List,Sorted):-q_sort(List,[],Sorted). q_sort([],Acc,Acc). q_sort([H|T],Acc,Sorted):- piv
什么是对随机整数列表进行排序的最佳方法(不使用太多内置谓词,这当然排除了sort/2谓词)?Roman Barták的Prolog编程站点给出了一个优化的快速排序
quick_sort2(List,Sorted):-q_sort(List,[],Sorted).
q_sort([],Acc,Acc).
q_sort([H|T],Acc,Sorted):-
pivoting(H,T,L1,L2),
q_sort(L1,Acc,Sorted1),q_sort(L2,[H|Sorted1],Sorted)
据我所知,最好的排序算法是直接用Prolog编写的,没有参考任何特殊的内置函数,而是使用某种形式的合并排序 一个常见的优化是开始合并长度不是1的列表,而是已经排序的段 也就是说,要对列表进行排序,
[4,5,3,6,2,7,1,2]
,将合并列表[4,5]
,[3,6]
,[2,7]
,[1,2]
这可以通过不仅在升序方向上,而且在另一个方向上组合排序列表来进一步优化。对于上面的示例,这意味着排序段的组装如下:
[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...
请注意,在Prolog中,在开始和结束时都可以直接扩展列表
因此,我们只能合并[1,2,3,4,5,6,7]
和[2]
使用Richard O'Keefe的原始实现(~1984年)的当前系统位于
ciao-1.15/lib/sort.pl
只需注意:该谓词(使用链接中实现的pivoting/4)执行降序排序,您必须反转pivoting/4的比较运算符才能执行升序排序。@j4nbur53:下载ciao的当前版本。我最喜欢的是用于排序的树,另请参阅,但是Prolog树比Java树涉及更多的复制。