Prolog改为100美分

时间:2014-03-19 03:03:11

标签: prolog clpfd coin-change

我是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。

1 个答案:

答案 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个解决方案。