如何在Swi Prolog上进行插入排序

时间:2018-08-20 02:21:10

标签: sorting prolog insertion-sort declarative

我想使用swi prolog上的规则进行插入排序。目前我的代码看起来像 这个:

isort([H|T],Sorted) :- T = [], Sorted = [H|T].

%When there are only two elements
isort([H1,H2|T],[H2,H1|T]) :- H1 > H2, T = [].
isort([H1,H2|T],[H1,H2|T]) :- H1 < H2, T = [].

%More than two elements
isort([H|T],Sorted) :- isort(T,Sorted).

我已经尝试了一切,但这一切都导致了死胡同,最终使我更加困惑。现在,如果我查询

isort([5,4,3,2,1],L).

它返回

L = [1,2].

我不太了解其他数字是如何处理的。请有人消除我的困惑,并可能启发我。

1 个答案:

答案 0 :(得分:0)

您的代码等同于

isort([H],[H]).                 % a singleton list is sorted

isort([H1,H2],[H1 , H2]) :-     % an ascending list of two elts is sorted
               H1 < H2.    
isort([H1,H2],[H2 , H1]) :-     % a descending list of two elts is
               H2 < H1.         %  sorted, when reversed

isort([H|T],Sorted) :- isort(   % recursion... ?
         T ,Sorted           ).

首先,isort([],[]).怎么样?空列表是否已经排序?

第二,isort([H1,H2],[H1 , H2]):- H1 =:= H2.呢?不是两个相等元素的列表已经排序?

最后,递归。实际将您的H插入 将其余列表T排序的结果是什么?

isort( [H|T],      S ) :-       % [H|T] sorted is       S, *if*
   isort( T,  TS ),             %    T  sorted is TS, *and*
   insert( H, TS,  S ).         % H inserted into TS is S

现在剩下要做的就是定义insert/3