我是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美分,8 11美分,2 38美分和9 8美分。 有些硬币中有0枚是可能的,例如50枚2美分的硬币是一美元兑换的一种方式。 编写一个名为change100(硬币)的Prolog函数,开头如下: change100(P2,P11,P38,Pn8) :- %.P2是2美分硬币的数量,P11是11美分硬币的数量,等等.请记住,正如问题描述中所指定的,Pn8最多为10。
发布于 2014-03-19 03:16:36
要在数值不等式中使用,必须实例化Prolog中的变量。
代码试图算术地比较未实例化的变量,这不是Prolog所能做的。
但是您可以使用所谓的“约束逻辑编程”- Prolog扩展来解决这个问题。
以下是SWI中的代码(与原始代码几乎相同):
:- 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=价值2的50枚硬币)。如果我们只有正币,这个假设是正确的,但是对于这个问题,这个假设会导致省略"90 *2+0* 11 +0* 38 - 10 * 8“。
要模拟这个不正确的逻辑并得到108个解决方案,您可以向程序中添加2 * P2 #=< 100, 11 * P11 #=<100, 38 * P38 #=< 100,行。但请争辩说,确实有195种解决方案。
https://stackoverflow.com/questions/22495371
复制相似问题