このディレクトリの索引
#  以下の2次元配列「Shopping」のデータを用い、
#  以下のように、各商品の単価、個数、小計を表示し、
#  最後に合計を表示させる。
#  var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ];
#  
#  単価:500 個数:9 小計:4500
#  単価:5000 個数:8 小計:40000
#  単価:50 個数:1 小計:50
#  単価:10000 個数:2 小計:20000
#  合計:64550
#  
#  できる人は、下図のように小計の降順表示させよ
#  
#  単価:5000 個数:8 小計:40000
#  単価:10000 個数:2 小計:20000
#  単価:500 個数:9 小計:4500
#  単価:50 個数:1 小計:50
#  合計:64550
#  


'「Shopping」のデータを用い、
#  var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ];
以下のように、各商品の単価、個数、小計を表示し、最後に合計を表示させる。
#  単価:5000 個数:8 小計:40000
#  単価:10000 個数:2 小計:20000
#  単価:500 個数:9 小計:4500
#  単価:50 個数:1 小計:50
#  合計:64550' :-
        '「Shopping」のデータを用い、'(_Shopping),
        '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび),
        '最後に合計を表示させる。'(_小計_単価_数量_ならび).

'「Shopping」のデータを用い、'(_Shopping) :-
        'Shopping'(_Shopping).

'Shopping'([ [500, 9], [5000, 8], [50, 1], [10000, 2] ]).

'各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび) :-
        '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび),
        '表示し、'(_小計_単価_数量_ならび).

'各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび) :-
        findall([_小計,_単価,_数量],(
                    member([_単価,_数量],_Shopping),
                    _小計 is _単価 * _数量),
                _小計_単価_数量_ならび).

'表示し、'(_小計_単価_数量_ならび) :-
        降順整列(_小計_単価_数量_ならび,_降順の_小計_単価_数量_ならび),
        forall(member([_小計,_単価,_数量],_降順の_小計_単価_数量_ならび),
               writef('単価:%t 数量:%t 小計:%t\n',[_単価,_数量,_小計])).

降順整列(L1,L2) :-
        sort(L1,L3),
        reverse(L3,L2).

'最後に合計を表示させる。'(_小計_単価_数量_ならび) :-
        findsum(_小計,member([_小計,_,_],_小計_単価_数量_ならび),_合計).
        writef('合計:%t\n',[_合計]).

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        sum_list(_値ならび,_合計値),!.