我正在尝试编写一个 prolog 程序,该程序需要一个谓词,每次调用时都会返回最小变量。但我需要这样一种方式,即如果你产生函数,它应该返回下一个最小值。例如:
min([5,3,2,7],B).
B = 2 ;
B = 3 ;
B = 5 ;
B = 7 ;
false.
有任何想法吗?
我正在尝试编写一个 prolog 程序,该程序需要一个谓词,每次调用时都会返回最小变量。但我需要这样一种方式,即如果你产生函数,它应该返回下一个最小值。例如:
min([5,3,2,7],B).
B = 2 ;
B = 3 ;
B = 5 ;
B = 7 ;
false.
有任何想法吗?
一般来说,你不能依赖解决方案的顺序,在一个有点奇怪的系统成员中可能会以不同的方式实现:
member2(X,[_|Xs]) :-
member2(X,Xs).
member2(X,[X|_]).
min(L, Min) :-
sort(L, S),
member2(Min, S).
产生:
?- min([2,1,4,3,2],X).
X = 4 ;
X = 3 ;
X = 2 ;
X = 1.
如果通过将原始列表与正确顺序的解决方案列表相关联来明确顺序,则它变得可靠。在您的情况下,这相当于排序谓词(只要您接受不报告两次重复条目),对于一般终止谓词,这可以通过使用 setof/2 并在单独的步骤中确定顺序来完成,如 CapelliC已经提到了。