【问题标题】:How to do Insertion Sort on Swi Prolog如何在 Swi Prolog 上进行插入排序
【发布时间】:2018-08-20 02:21:10
【问题描述】:

我想使用 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].

我不太明白其他数字是如何不被处理的。有人请消除我的困惑,并可能请赐教。

【问题讨论】:

  • isort([H|T],Sorted) :- isort(T,Sorted). 中你永远不会对H 做任何事情。
  • 我应该使用它吗?我可以输入 isort([_|T],Sorted) 以忽略它。
  • 好吧,如果你忽略它,它当然不会成为输出的一部分。
  • 好吧,当它包含它时,它给出了错误的答案。
  • 您的第一个问题实际上是您没有递归来处理任何模式的尾部。请记住,规则末尾的T = [] 与用[] 代替T 重写头部相同,因此您的第二条规则(例如)变为isort([H1,H2], [H2,H1]) :- H1 &gt; H2. 显然您需要对尾部进行一些处理。

标签: sorting prolog insertion-sort declarative


【解决方案1】:

你的代码相当于

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

【讨论】:

  • 这有帮助吗?还有什么不清楚的吗?不要犹豫,问。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多