我正在尝试在prolog中创建一个谓词,如果它达到一组值中的最低数值,它将成立。
例如:
我现在有这样的事情
基础步骤
lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue).
递归步骤
lowest(Object, Value) :- lessThan(Object, Value, NewValue), lowest(Object, NewValue).
其中Object是一些抽象对象,可以附加多个数值 lessThan返回Object的值(NewValue),小于输入值。
由于NewValue 将低于Value的输入,我可以假设每次递归步骤Value都会减少。
我已经从另一个我想要解决的问题中提取了这个问题,但基本上发生的事情是我希望整个递归函数只有2个输出,但我得到的输出与lessThan(Object, Initial, X)
+一样多2。
我不确定这个问题是否清楚,请告诉我,以便澄清。
我相信我的基本步骤是正确的,因为我假设如果Value是与Object一起的最低值,则没有其他值小于Value。
我不确定在哪里终止递归,这增加了我的困惑。我的猜测是,一旦它达到没有较低的对象值的状态,它将终止。
答案 0 :(得分:0)
此示例应该有效,根据您的域名重命名值/。
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.
请注意,它重复了“偷看”的价值。每次,然后效率不高。 可能的替代方案是存储较低的值并运行故障驱动的循环。 否则,SWI-Prolog(和YAP)具有库(aggregate):
?- aggregate(min(V), value(a,V), M).
M = 3.