SWI-Prolog分区谓词在REPL中的作用与在程序中的作用不同

问题描述 投票:0回答:2

我以这种方式使用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).

随机列表确实会排序。区别在哪里?

prolog quicksort higher-order-functions swi-prolog
2个回答
0
投票

[当我在{H}/前面添加[X,O]>>compare(O,X,H)时有效。可能是顶级不需要(但允许)预期行为的bug。但是我不确定,所以知道的人都欢迎回答。


0
投票

[qsort/2谓词的第二个子句被编译时,除了在编译lambda表达式时它是一个变量之外,没有关于H的信息。必须使用{}/1构造声明在lambda表达式中出现但在本地lambda参数中找不到的任何变量。但是,当在顶级解释器上运行查询时,在解释lambda表达式时,H已绑定,因此不再是变量(无需使用{}/1构造)。

© www.soinside.com 2019 - 2024. All rights reserved.