SWI Prolog分区谓词在REPL中的工作方式与在程序中的工作方式不同

SWI Prolog分区谓词在REPL中的工作方式与在程序中的工作方式不同,prolog,quicksort,higher-order-functions,Prolog,Quicksort,Higher Order Functions,我使用以下方式实现了快速排序: 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]). 它不能正常工作

我使用以下方式实现了快速排序:

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中运行此命令时:
长度(S,22),映射列表(随机(0,9),S),[H|T]=S,分区([X,O]>>比较(O,X,H),T,L,E,G)。


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

当我在
[X,O]>>比较(O,X,H)
前面添加
{H}/
时,它会起作用。可能是toplevel不需要(但允许)它实现预期行为的bug。但是我不确定,所以欢迎有知识的人给出答案。

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


请注意,这里有几个细节超出了lambda库本身的范围:(1)编译器是否在编译时识别您正在使用lambda表达式的参数调用元谓词?(2) 顶级查询是如何解释的?完整查询首先是完全编译的还是元解释的?这些细节取决于系统本身。

保罗·莫拉知道!我在SWI Prolog文档的页面末尾添加了一个注释,但它只显示在not(目前)。