Prolog - 通过屈服获得不同的结果

时间:2013-06-04 08:41:40

标签: prolog yield-keyword

我正在尝试编写一个prolog程序,它需要有一个谓词,每次调用时都返回最小变量。但我需要这样一种方式,即如果你产生函数,它应该返回下一个最小值。例如:

min([5,3,2,7],B).
B = 2 ;
B = 3 ;
B = 5 ;
B = 7 ;
false.

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

min(L, Min) :- sort(L, S), member(Min, S).

将为您的示例数据做。更一般地说,setof / 3将允许为通用目标构建排序的解决方案列表。

编辑:没有排序,基于select / 3的一个有点参与的解决方案:

min(L, M) :-
    select(T, L, R),
    ( maplist('<'(T), R), (M = T ; min(R, M)) ).

产量

?- min([2,6,1],X).
X = 1 ;
X = 2 ;
X = 6 ;
false.

答案 1 :(得分:2)

一般来说,你不能依赖解决方案的顺序,在一个有点奇怪的系统成员可能会以不同的方式实现:

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已经提到了。