我是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美分的情况。
您可以用多少种不同的方式兑换1美元(100美分)?
例如,改变100美分的一种方法是使用4个2美分,8个11美分,2个38美分和9个8美分。
可能有一些硬币,例如50分2分是改变一美元的一种方式。
编写名为change100(Coins)的Prolog函数,其开头如下:
change100([P2, P11, P38, Pn8]) :- % ...
P2是2美分硬币的数量,P11是11美分硬币的数量,依此类推。请记住,如问题描述中所指定的,Pn8最多为10。
答案 0 :(得分:1)
要在数字不等式中使用,必须实例化Prolog中的变量。
您的代码尝试对未经实例化的变量进行算术比较,而不是Prolog可以做的事情。
但你可以使用所谓的约束逻辑编程&#34; - Prolog扩展,解决了这个问题。
以下是SWI-Prolog中的代码(与原始代码几乎相同):
:- use_module(library(clpfd)).
change100([P2, P11, P38, Pn8]):-
Pn8 #=< 10,
Pn8 #>= 0,
P2 #>= 0, P11 #>= 0, P38 #>= 0,
D #= 2 * P2 + 11 * P11 + 38 * P38 - 8 * Pn8,
D #= 100,
label([P2, P11, P38, Pn8]).
更新。
可以通过此程序验证您获得195种不同的解决方案。
你提到应该有108种不同的解决方案。可以通过不正确的假设获得该数量的解决方案,即硬币的数量乘以硬币值应该小于或等于100(即,不超过100/2 = 50个值为2的硬币)。如果我们只有正硬币,这个假设是正确的,但对于这个问题,这个假设会导致省略#90; 2 * 0 + 11 + 0 * 38 - 10 * 8&#34 ;, / p>
要模拟这个错误的逻辑并获得108个解决方案,您可以在程序中添加2 * P2 #=< 100, 11 * P11 #=<100, 38 * P38 #=< 100,
行。但请说明确实有195个解决方案。