所以这是一个货币系统,用8种不同的硬币值计算最少量的硬币。例如:1美分,2美分,4美分,33美分等等......其中一枚硬币的值必须为“5”。所以这个程序试图确定硬币的其他7个值必须具有的其他单个值以及每个值的硬币总数在1到99美分之间。
所以我的问题是,有没有办法编写一段代码而无需手动在程序中插入'5'(例如:值= [_,_,_,_,5,_,_, _]或值= [_,5,_,_,_,_,_,_])?所以这里应该有多个解决方案......
这是代码:
questionSix(Values, Coins) :-
init_vars(Values, Coins),
coin_cons(Values, Coins, Pockets),
clever_cons(Values, Coins),
Min #= sum(Coins),
minimize((labeling(Values), labeling(Coins), check(Pockets)), Min).
init_vars(Values, Coins) :-
length(Values, 8),
Values = [_, _, _, 5, _, _, _, _],
Values :: 1..99,
increasing(Values),
length(Coins, 8),
Coins :: 0..99.
increasing(List) :-
( fromto(List, [This, Next | Rest], [Next | Rest], [_])
do
This #< Next
).
clever_cons(Values, Coins) :-
( fromto(Values, [V1 | NV], NV, []),
fromto(Coins, [N1 | NN], NN, [])
do
( NV = [V2 | _]
-> N1*V1 #< V2;
N1*V1 #< 100
)
).
感谢任何帮助。谢谢!
答案 0 :(得分:0)
您可以使用occurrences
库http://eclipseclp.org/doc/bips/lib/ic_global/occurrences-3.html)中的ic_global
:
occurrences(5, Values, 1)
另一种更冗长的方式,但没有ic_global
,是建立约束的分离,第一个值是5,或第二个值是5,等等。(我还没有测试过这段代码):
( foreach(Vi, Values), fromto(0, Eprev, Ecurr, Expr) do
Ecurr = Eprev or (Vi #= 5) ),
1 #= eval(Expr)