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(目前)。