0

我正在尝试优化并找到函数的最小成本。下面的程序findall/3用于迭代所有可能的值选项,这些选项是使用clpfdSWI-Prolog 提供的库生成的。

Cost使用下面的这个程序生成了几个值,这些值被收集到一个列表中。我知道为了获得最小值,我可以简单地使用min_list/2可用的谓词。但是,我想要的是,一旦程序找到某个值,即当前最小值,同时计算其他选项时,如果该值大于最小值,则不会添加列表。

所以本质上,我想优化程序,使它简单地考虑程序生成的最小值。

optimise(input, arguments, Cost):-
    findall(Cost, some_predicate(input, arguments, Cost), List).

some_predicate(input, arguments, Cost):-
    Option in input..arguments, label(Option),
    find_data(Option, Value),
    find_cost(Value, Cost).

上面的代码已经过修改,因此它被压缩了,但满足了问题的目的。

4

1 回答 1

0

我认为 findall 它不是正确的工具:是我之前写的一些代码,可以帮助你。例如,给定

member_(X,Y) :- member(Y,X).

我们可以得到较低的元素

?- integrate(min, member_([1,2,4,-3]), M).
M = -3

我将通常的约定应用于带有下划线的库谓词后缀,该库谓词交换参数,以便能够元调用它。

以那段代码为例,注意nb_setarg 的使用。

要查看它是否可以“开箱即用”,请尝试:

:- [lag].

optimise(Input, Arguments, Cost):-
    integrate(min, some_predicate(Input, Arguments), Cost).
于 2013-07-19T15:56:16.257 回答