如何在Prolog的硬币计数器货币程序中包含要包含的值?

如何在Prolog的硬币计数器货币程序中包含要包含的值?,prolog,eclipse-clp,Prolog,Eclipse Clp,所以这是一个货币系统,它计算出8种不同价值的硬币的最少数量。例:1分、2分、4分、33分等。。。其中一枚硬币的价值必须为“5”。因此,这个程序试图确定其他7种价值的硬币还必须有哪些单独的价值,以及每种价值有多少硬币的价值总和在1到99美分之间 所以我的问题是,有没有一种方法可以编写一段代码而不必在程序中手动插入一个“5”:value=[[uu,[uu,]?所以这里应该有不止一个解决方案 代码如下: questionSix(Values, Coins) :- init_vars(Value

所以这是一个货币系统,它计算出8种不同价值的硬币的最少数量。例:1分、2分、4分、33分等。。。其中一枚硬币的价值必须为“5”。因此,这个程序试图确定其他7种价值的硬币还必须有哪些单独的价值,以及每种价值有多少硬币的价值总和在1到99美分之间

所以我的问题是,有没有一种方法可以编写一段代码而不必在程序中手动插入一个“5”:value=[[uu,[uu,]?所以这里应该有不止一个解决方案

代码如下:

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
        )
    ).
感谢您的帮助。谢谢大家!

您可以使用ic_全局库中的引用:

另一个更冗长的方法,但没有ic_global,是构建约束的析取,第一个值是5,或者第二个值是5,等等。我还没有测试这段代码:

( foreach(Vi, Values), fromto(0, Eprev, Ecurr, Expr) do
    Ecurr = Eprev or (Vi #= 5) ),
1 #= eval(Expr)

我应该将引用行放在哪里?@user3390252放置引用5,value,1而不是value=[[uu,[uu,]5,[uu,[uu,]。不要忘记通过添加:-libic_global来包括ic_global。在程序开始的时候,我运行了这个程序,它运行正常。但随着我投入更多的硬币,比如8。真的很慢。还有其他方法可以加速代码吗?@user3390252有几种方法可以加速代码。我建议你为这个问题单独提出一个问题。所以我设法提出了一个关于这个问题的新问题。。。
( foreach(Vi, Values), fromto(0, Eprev, Ecurr, Expr) do
    Ecurr = Eprev or (Vi #= 5) ),
1 #= eval(Expr)