3

我是 Prolog 的新手,我正在尝试进行选择排序。这是我所拥有的:

ssort([],[]).
ssort([M|S],L):-min(M,L),remove(M,L,N),ssort(S,N).

min(M,[M]).
min(M,[H,T]):-min(N,T),min2(M,H,N).

min2(A,A,B):-less(A,B).
min2(B,A,B):-not(less(A,B)).

less(A,B):-(A<B).

append([],B,B).
append([H|A],B,[H|AB]):-append(A,B,AB).

remove(X,L,N):-append(A,[X|B],L),append(A,B,N).

但是当我尝试这个例如:

ssort(S,[5,3,1]),write(S).

我明白false了,无论我尝试什么。您能告诉我如何对列表进行实际排序并获得写入的结果S吗?

4

2 回答 2

5

这是一种至少可以定位程序中的错误的一般方法。如果您的查询失败,只需从您的程序中删除目标。如果剩余的片段仍然失败,则该片段中一定有错误。

:- op(950,fy,*)。
*_。

ssort(_/* [] */,[])。
ssort(_/* [M|S] */,L):-
   min(_/* M */,L),
   *删除(M,L,N) ,
   *排序(S,N)。

最小(M,[M])。
分钟(M,[H,T]):-
   * min(N,T) ,
   * min2(M,H,N)。

?-ssort(S,[5,3,1])。

因为这个片段失败了,你的原始程序也会失败。你需要在剩下的部分概括一些东西。

于 2017-03-19T14:41:15.337 回答
4

正如@Boris 指出的那样,主要错误在于min/2谓词,因为它需要第三个参数才能返回该参数中的 min 元素。通过一些小的更改,代码如下所示:

ssort([],[]).
ssort([M1|S],[H|T]):-min(H,T,M1),remove(M1,[H|T],N),ssort(S,N).

min(M,[],M).
min(M,[H|T],M1):-min2(M,H,N),min(N,T,M1).

min2(A,B,A):-less(A,B).
min2(A,B,B):-not(less(A,B)).

less(A,B):-(A<B).

append([],B,B).
append([H|A],B,[H|AB]):-append(A,B,AB).

remove(X,L,N):-append(A,[X|B],L),append(A,B,N).

例子:

?- ssort(S,[5,3,1]).
S = [1, 3, 5] ;
false.

?- ssort(S,[5,3,1,7]).
S = [1, 3, 5, 7] ;
false.

编辑:

正如@Will Ness 正确指出的那样,唯一的错误是逗号min(M,[H,T])更改为 min(M,[H|T]) 它工作正常!!!。我认为 min/2 谓词效果不佳,因此我在上面的答案中对其进行了更改,但最后没有必要。

于 2017-03-19T13:47:14.873 回答