如何在Prolog的硬币计数器货币计划中包含一个值?

时间:2014-05-19 05:03:24

标签: prolog eclipse-clp

所以这是一个货币系统,用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
        )
    ).

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用occurrenceshttp://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)