このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/22
#  口頭で説明されたものを書くので分かりづらかったらごめんなさい 
#  【質問テンプレ】 
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  5種類の通貨(a,b,c,d,e)が存在する 
#  最初に幾らかのお金を渡されるそのお金はa,b,c,d,e以外にも 
#  aとしてもbとしても使えるものbとしてもdとしても使えるものなどがある 
#  そのお金を持って商品を買うが商品には特定の通貨しか使えない 
#  ただし、a,bどちらでも払える商品やb,dどちらでも払える商品もある 
#  それらの商品の合計が渡されるのでソレを手持ちのお金で変えるかどうかを答えよ 
#  合計は配列p[15]として辞書順で与えられる(例えばaで払えるものp[0]bとcで払えるものはp[7]) 
#  ex)p={3,2,0,0,0,0,2,0,0,0,0,0,0,0,0} 
#  だとa=3,ab=2,bc=2なので 
#  手持ちが{5,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0} 
#  a=5,b=2ならはらえる 
#  

商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_商品の合計のならび,_手持ちのお金ならび) :-
        利用可能ならびの形式(_利用可能ならびの形式),
        数値表現をならび表現に変換(_商品の合計ならび,LA),
        数値表現をならび表現に変換(_手持ちのお金ならび,LB),
        商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_利用可能ならびの形式,LA,LB).

商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([],[],_).
商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([_|R1],[[]|R2],K1) :-
        商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,K1).
商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([[_第一候補,_第二候補]|R1],[_商品の合計|R2],_拠出前の手持ちのお金) :-
        ならび表現による要素位置指定による、ならびからの値の取得(_第一候補,_拠出前の手持ちのお金,_第一候補の手持ちのお金),
        ならび表現による要素位置指定による、ならびからの値の取得(_第二候補,_拠出前の手持ちのお金,_第二候補の手持ちのお金),
        append(_第一候補からの拠出金,_第二候補からの拠出金,_商品の合計),
        append(_第一候補からの拠出金,_第一候補の残りの手持ちのお金,_第一候補の手持ちのお金),
        append(_第二候補からの拠出金,_第二候補の残りの手持ちのお金,_第二候補の手持ちのお金),
        手持ち金から利用分を差し引く([_],_第一候補,_第一候補の残りの手持ちのお金,_第二候補,_第二候補の残りの手持ちのお金,_拠出前の手持ちのお金,_拠出後の手持ちのお金),
        商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,_拠出後の手持ちのお金).

手持ち金から利用分を差し引く(_,_,_,_,_,[],[]).
手持ち金から利用分を差し引く(L,_,_,L,_第二候補の手持ちのお金,[_|R1],[_第二候補の手持ちのお金|R1]) :- !.
手持ち金から利用分を差し引く(L,L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,[_|R1],[_第一候補の手持ちのお金|R2]) :-
        手持ち金から利用分を差し引く([_|L],L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,R1,R2).
手持ち金から利用分を差し引く(L,_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,[U|R1],[U|R2]) :-
        手持ち金から利用分を差し引く([_|L],_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,R1,R2).

利用可能ならびの形式(_利用可能ならびの形式) :-
        findall(U,組み合わせ([1,2,3,4,5,0],2,U),L1),
        sort(L1,L2),
        数値表現をならび表現に変換(L2,_利用可能ならびの形式).

数値表現をならび表現に変換([],[]) :- !.
数値表現をならび表現に変換([L|R1],[L2|R2]) :-
        list(L),
        数値表現をならび表現に変換(L,L2),
        数値表現をならび表現に変換(R1,R2),!.
数値表現をならび表現に変換([N|R1],[L2|R2]) :-
        length(L2,N),
        数値表現をならび表現に変換(R1,R2).

ならび表現による要素位置指定による、ならびからの値の取得(_ならび表現による要素位置,_ならび,_値) :-
        append(L0,[_],_ならび表現による要素位置),
        append(L0,[_値|_],_ならび),!.