【发布时间】: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 > H2.显然您需要对尾部进行一些处理。
标签: sorting prolog insertion-sort declarative