首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog 100美分的更改

Prolog 100美分的更改
EN

Stack Overflow用户
提问于 2014-03-19 03:03:10
回答 1查看 1.1K关注 0票数 1

我是Prolog的新手,我想编写一个函数,返回每美元(100美分)进行更改的所有不同方式。我们有2美分硬币,11美分硬币,38美分硬币,有趣的是-8美分硬币(一枚价值-8美分的硬币)。另外,我们总共只有10枚"-8“硬币。(其他硬币无上限)

以下是我的尝试:

代码语言:javascript
运行
复制
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.

但不起作用。当我运行它并查询

代码语言:javascript
运行
复制
?- change100(A).

我收到消息

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2014-03-19 03:16:36

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

代码试图算术地比较未实例化的变量,这不是Prolog所能做的。

但是您可以使用所谓的“约束逻辑编程”- Prolog扩展来解决这个问题。

以下是SWI中的代码(与原始代码几乎相同):

代码语言:javascript
运行
复制
:- 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种解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22495371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档