Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/prolog/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Prolog迭代/递归,以深入到最低值_Recursion_Prolog_Terminate - Fatal编程技术网

Recursion Prolog迭代/递归,以深入到最低值

Recursion Prolog迭代/递归,以深入到最低值,recursion,prolog,terminate,Recursion,Prolog,Terminate,我试图在prolog中创建一个谓词,如果它达到一组值中的最低数值,它将保持true 例如: 我现在有类似的事情 基本台阶 lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue). 递归步骤 lowest(Object, Value) :- lessThan(Object, Value, NewValue), lowest(Object, NewValue). 其中Object是一个抽象对象,可以附加多个数值。 lessTha

我试图在prolog中创建一个谓词,如果它达到一组值中的最低数值,它将保持true

例如: 我现在有类似的事情

基本台阶

lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue).
递归步骤

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

由于NewValue将低于输入值,我可以假设,随着每个递归步骤,值都将减小

我从另一个我试图解决的问题中抽象出了这个问题,但基本上,我期望整个递归函数只有2个输出,但是我得到的输出与lessThanObject,Initial,X+2一样多

我不确定这个问题是否清楚,请让我知道,以便我可以澄清

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


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

此示例应该可以工作,根据您的域对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).
请注意,它每次都重复“peek”值,因此效率不高。 一种可能的替代方法是存储较低的值并运行故障驱动循环。 否则,SWI Prolog和YAP具有库:


调用allLessThanObject、Value、NewValue如果成功,会将一个值放入NewValue中,该值小于值的值?如果是这样的话,为什么它被称为所有…?好的一点,我想我已经在我的脑海中,因为我可以使用它;以交互方式返回或打印低于该值的“所有”值,对于每次迭代,NewValue保留该新的较低值。然而,这只是我提出的抽象出真正问题的东西,我现在就改变它。
?- lowest(a,X).
X = 3.
?- aggregate(min(V), value(a,V), M).
M = 3.