【问题标题】:Prolog change for 100 cents100 美分的 Prolog 变化
【发布时间】: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 clpfd coin-change


【解决方案1】:

要用于数值不等式,Prolog 中的变量必须被实例化。

你的代码试图在算术上比较未实例化的变量,这不是 Prolog 可以做的。

但是你可以使用所谓的“约束逻辑编程”——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”,例如。

要模拟这种不正确的逻辑并获得 108 个解决方案,您可以在程序中添加 2 * P2 #=&lt; 100, 11 * P11 #=&lt;100, 38 * P38 #=&lt; 100, 行。但请辩解一下,确实有 195 种解决方案。

【讨论】:

  • 非常感谢。但是如果我测试我得到 195 个返回的代码,而正确的答案应该是 108 个不同的返回。我想我需要在函数中添加更多约束。
  • @user3221327 确实有 195 种不同的解决方案,我认为这对于问题中提出的问题是正确的。也许您错过了问题陈述中的一些重要细节?
  • 是的,也许。我需要检查一下。顺便说一句,如果您有兴趣,我已经更新了原始问题陈述。
  • @user3221327 我看到问题已更新。我认为 195 个不同的答案是该问题的正确数字。为什么你认为应该只有 108 个?您可以打印所有答案并手动尝试找出至少一个不正确的答案。如果真的有 108 个正确答案,那么 195 个中几乎有一半是不正确的,所以应该不难找到一个。但我认为所有 195 都是正确的。
  • 哈,我发现了如何获得 108(这是不正确的)。查看我的答案更新。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多