【发布时间】:2014-07-05 01:29:53
【问题描述】:
我是 Prolog 的新手,我想编写一个函数,它返回所有不同的方式来为一美元(100 美分)找零。我们有 2 美分硬币、11 美分硬币、38 美分硬币,有趣的是,还有 -8 美分硬币(价值 -8 美分的硬币)。此外,我们总共只有 10 枚“-8”美分硬币。 (其他种类的硬币没有上限)
这是我的尝试:
change100([P2, P11, P38, Pn8]):-
Pn8 =< 10,
Pn8 >= 0,
P2 >= 0, P11 >= 0, P38 >= 0,
D is 2 * P2 + 11 * P11 + 38 * P38 - 8 * Pn8,
D = 100.
但它不起作用。当我运行它并查询时
?- change100(A).
我收到消息
ERROR:
=< /2: Arguments are not sufficiently instantiated.
这是为什么?我该如何解决?
原问题陈述:
硬币有 4 种:2 美分、11 美分、38 美分,有趣的是,还有 -8 美分(价值 -8 美分的硬币)。更有趣的是,总共只制作了 10 -8 美分的作品,因此您无需担心超过 10 -8 美分的情况。
一美元(100 美分)有多少种不同的方法?
例如,找零 100 美分的一种方法是使用 4 个 2-cent、8 个 11-cent、2 个 38-cent 和 9 个 -8-cent。
某些硬币可能为 0,例如50 个 2 美分的硬币是换一美元的一种方法。
编写一个名为 change100(Coins) 的 Prolog 函数,开头如下:
change100([P2, P11, P38, Pn8]) :- % ...P2 是 2 美分硬币的数量,P11 是 11 美分硬币的数量,依此类推。请记住,正如问题描述中所述,Pn8 最多为 10。
【问题讨论】:
-
很久以前我写了一篇关于 Prolog 中的变更问题的巨大博客文章。这是... xor0110.wordpress.com/2010/06/04/…
标签: prolog clpfd coin-change