我正在尝试优化并找到函数的最低成本。下面的程序使用findall/3
来迭代使用SWI-Prolog提供的clpfd
库生成的所有可能的值选项。
使用下面的程序生成了几个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).
上面的代码已经过修改,因此它是精简的,但却符合问题的目的。
答案 0 :(得分:0)
我认为发现它不是正确的工具:here是我之前写的一些代码,可以帮到你。例如,给定
member_(X,Y) :- member(Y,X).
我们可以获得较低的元素
?- integrate(min, member_([1,2,4,-3]), M).
M = -3
我将通常的约定应用于postfix,并使用下划线交换参数的库谓词,以便能够元调用它。
以该代码为例,注意nb_setarg用法。
要查看它是否可以“开箱即用”,请尝试:
:- [lag].
optimise(Input, Arguments, Cost):-
integrate(min, some_predicate(Input, Arguments), Cost).