3

考虑程序:

:- table cost(+, min).
cost(1, 0).
cost(1, 1).
cost(2, 1).

我预计结果cost(I, C).是 I = 1, C = 0; I = 2, C = 1 - 所有可能的输入参数以及相应的最小结果。

但我只得到一个:

cost(I, C).
I = 1
C = 0 ?;
no

但是,如果我明确指出输入参数的所有可能性,我会得到我想要的:

( I = 1 ; I = 2 ), cost(I, C).
I = 1
C = 0 ?;
I = 2
C = 1 ?;
no

是否可以在不显式枚举所有可能输入的情况下获得具有相应最小结果的输入参数的所有组合?

4

2 回答 2

2

具有优化模式(最小值或最大值)的表声明指示系统为输入参数的每个组合表一个答案。您可以给出基数限制以指示系统存储多个最佳答案。例如,您可以给出如下声明:

:- table cost(+, min):3.

然后,系统将为每个输入列出最多 3 个最佳答案,按最优性排序。如果没有明确给出限制,则假定为 1。

系统不会存储所有答案。这很重要,因为对于动态规划问题,您只需要记住子问题的当前最佳答案。

周能发

于 2013-01-31T14:34:42.313 回答
1

前段时间,我在 B-Prolog 手册中找到了答案:“请注意,如果不尊重表模式,或者如果没有优化参数的界限,程序可能会给出意想不到的答案”。

问题中的代码不尊重“表成本(+,min)”。模式并尝试使用第一个 cost/2 参数作为输出。

于 2013-12-24T00:35:41.070 回答