2014-05-19 32 views
1

所以這是一個貨幣系統,可以用8個不同的硬幣值計算最少的硬幣數量。例如:1美分,2美分,4美分,33美分等...其中一枚硬幣的值必須爲'5'。所以這個程序正在試圖確定其他個人價值硬幣的其他價值必須有多少,每個價值有多少硬幣總和在1和99美分之間。如何在Prolog的硬幣計數器貨幣程序中包含一個值?

所以我的問題是,有沒有辦法寫一段代碼,而不必手動插入'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

你可以只使用occurrencesic_global庫(http://eclipseclp.org/doc/bips/lib/ic_global/occurrences-3.html):

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) 
+0

我應該在哪裏發生事件? – user3390252

+1

@ user3390252將'occurrences(5,Values,1)'代替'Values = [_,_,_,5,_,_,_,_]'。不要忘記在程序的開頭添加': - lib(ic_global).'來包含'ic_global'。 –

+0

所以我跑了程序,它的工作原理。但是當我投入更多的硬幣時,比如8,這真的很慢。有另一種方法來加速代碼? – user3390252