2014-05-19 5 views
1

이것은 8 가지 다른 동전 값으로 동전을 계산하는 통화 시스템입니다. 예 : 1 센트, 2 센트, 4 센트, 33 센트 등 ... 동전 중 하나에 '5'값이 있어야합니다. 그래서이 프로그램은 동전의 다른 7 가지 가치가 가져야 만하는 다른 개인적인 가치와 각 가치에 대해 얼마나 많은 동전이 1에서 99 센트 사이인지를 결정하려고합니다.Prolog를 위해 동전 카운터 통화 프로그램에 포함될 값을 어떻게 포함시킬 수 있습니까?

내 질문은, 프로그램에 수동으로 '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 
     ) 
    ). 

: 그래서 여기에 하나 개 이상의 솔루션 ...

여기에 코드 'S이 있어야합니다. 고맙습니다!

답변

0

당신은 ic_global 라이브러리 (http://eclipseclp.org/doc/bips/lib/ic_global/occurrences-3.html)에서 occurrences을 사용할 수

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'Values ​​= [_, _, _, 5, _, _, _, _] 대신'occurrences (5, Values, 1)'를 넣으십시오. 프로그램 시작 부분에': - lib (ic_global) .'을 추가하여'ic_global'을 포함하는 것을 잊지 마십시오. –

+0

그래서 나는 프로그램을 돌렸다. 그러나 나는 8과 같은 동전을 더 넣습니다. 정말 느립니다. 코드 속도를 높이는 또 다른 방법이 있습니까? – user3390252