我想使用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].
我不太了解其他数字是如何处理的。请有人消除我的困惑,并可能启发我。
答案 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
。