1

我正在尝试在 prolog 中创建一个谓词,如果它达到一组值中的最低数值,它将成立。

例如:
我现在有这样的事情

基本步骤

lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue).

递归步骤

lowest(Object, Value) :- lessThan(Object, Value, NewValue), lowest(Object, NewValue).

其中 Object 是一些抽象对象,可以附加多个数值。
lessThan 返回小于输入值的对象的值 (NewValue)。

而且由于 NewValue低于 Value 的输入,我可以假设每个递归步骤 Value 都会减少。

我已经从另一个我试图解决的问题中抽象出这个问题,但基本上正在发生的事情是我希望整个递归函数只有 2 个输出,但我得到的输出与lessThan(Object, Initial, X)+ 2 一样多。

我不确定这个问题是否清楚,请告诉我,以便我澄清。

我相信我的基本步骤是正确的,因为我假设如果 Value 是与 Object 耦合的最低值,那么没有其他值小于 Value。

我也不确定在哪里终止递归,这增加了我的困惑。我的猜测是,一旦达到对象没有较低值的状态,它将终止。

4

1 回答 1

0

此示例应该可以工作,将 value/2 重命名为适合您的域。

value(a, 10).
value(a, 3).
value(a, 100).

lowest(Object, L) :-
    value(Object, First), !, lowest(Object, First, L).
lowest(Object, LowestSoFar, Lowest) :-
    value(Object, Try), Try < LowestSoFar, !,
    lowest(Object, Try, Lowest).
lowest(_, Lowest, Lowest).

它产生

?- lowest(a,X).
X = 3.

请注意,它每次都重复值“peek”,然后效率不高。一种可能的替代方法是存储较低的值并运行故障驱动循环。否则,SWI-Prolog(和 YAP)有库(聚合):

?- aggregate(min(V), value(a,V), M).
M = 3.
于 2013-05-27T15:11:36.813 回答