我以这种方式使用SWISH实施了快速排序:
qsort([],[]).
qsort([H|T],S) :-
partition([X,O]>>compare(O,X,H),T,L,E,G),
qsort(L,A),
qsort(G,Z),
append([A,[H|E],Z],S).
main :-
length(L,22),
maplist(random(0,9),L),
qsort(L,S),
maplist(writeln,[L,S]).
无法正常工作。输入和输出列表相同。但是,当我在REPL中运行此代码时,在右侧:length(S,22), maplist(random(0,9),S),[H|T]=S, partition([X,O]>>compare(O,X,H),T,L,E,G).
随机列表确实会排序。区别在哪里?
[当我在{H}/
前面添加[X,O]>>compare(O,X,H)
时有效。可能是顶级不需要(但允许)预期行为的bug。但是我不确定,所以知道的人都欢迎回答。
[qsort/2
谓词的第二个子句被编译时,除了在编译lambda表达式时它是一个变量之外,没有关于H
的信息。必须使用{}/1
构造声明在lambda表达式中出现但在本地lambda参数中找不到的任何变量。但是,当在顶级解释器上运行查询时,在解释lambda表达式时,H
已绑定,因此不再是变量(无需使用{}/1
构造)。