このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/211
#  1] 授業単元:プログラミング演習  
#  [2] 問題文:  
#  購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。 
#  単価5千円の品物Aと、単価3千円の品物Bの購入数をそれぞれ入力すると、値段を返すnedan関数を作成。 
#  そして品物Aと品物Bを入力すると代金を計算し、出力するプログラムをmain関数からnedan関数を呼び出す形で作成しなさい。 
#  

'購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :-
        _購入金額 < 10000,
        _送料 = 500,
        _代金 is _購入金額 + _送料.
'購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :-
        _購入金額 >= 10000,
        \+(_購入金額 >= 30000),
        _送料 = 0,
        _代金 is _購入金額 + _送料.
'購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :-
        _購入金額 >= 30000,
        _送料 = 0,
        代金1割引になる(_購入金額,_代金).

代金1割引になる(_購入金額,_代金) :-
        '1割引'(_1割引),
        _代金 is truncate(_購入金額 * _1割引).

'1割引'(_1割引) :-
        _1割引 is 1 - 0.1.

'品物Aと品物Bを入力すると代金を計算し、出力するプログラムをmain関数からnedan関数を呼び出す形で作成しなさい。' :-
        値段(_品物Aの単価,_品物Aの購入数,_品物Bの単価,_品物Bの購入数,_値段),
        '購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_値段,_送料,_代金),
        出力する([[品物A,_品物Aの単価,_品物Aの購入数],[品物B,_品物Bの単価,_品物Bの購入数]],_値段,_送料,_代金).

値段(_品物Aの単価,_品物Aの購入数,_品物Bの単価,_品物Bの購入数,_値段) :-
        品物の単価と購入数の入力('品物A',_品物Aの単価,_品物Aの購入数),
        品物の単価と購入数の入力('品物B',_品物Bの単価,_品物Bの購入数),
        _値段 is _品物Aの単価 * _品物Aの購入数 + _品物Bの単価 * _品物Bの購入数.

品物の単価と購入数の入力(_品物,_品物の単価,_品物の購入数) :-
        品物の名前(_品物),
        品物の単価(_品物の単価),
        品物の購入数(_品物の購入数).

品物の名前(_品物) :-
        write('品物を入力してください : '),
        get_line(_品物),!.

品物の単価(_品物の単価) :-
        write('単価を入力してください : '),
        get_line(Line),
        品物の単価入力診断(Line,_品物の単価),!.
品物の単価(_品物の単価) :-
        品物の単価(_品物の単価).

品物の単価入力診断(Line,_品物の単価) :-
        atom_to_term(Line,_品物の単価,_),
        number(_品物の単価),
        _品物の単価 >= 0,!.
品物の単価入力診断(Line,_品物の単価) :-
        writef('入力された %t からは適切な単価が得られません。再入力をお願いします。\n',[Line]),
        fail.

品物の購入数(_品物の購入数) :-
        write('購入数を入力してください : '),
        get_line(Line),
        品物の購入数入力診断(Line,_品物の購入数),!.
品物の購入数(_品物の購入数) :-
        品物の購入数(_品物の購入数).

品物の購入数入力診断(Line,_品物の購入数) :-
        atom_to_term(Line,_品物の購入数,_),
        number(_品物の購入数),
        _品物の購入数 >= 0,!.
品物の購入数入力診断(Line,_品物の購入数) :-
        writef('入力された %t からは適切な購入数が得られません。再入力をお願いします。\n',[Line]),
        fail.

出力する(_商品名_単価_購入金額ならび,_購入金額,_送料,_代金) :-
        append(_,[[_商品名,_単価,_購入金額]|R],_商品名_単価_購入金額ならび),
        writef('%8c %8r %8r\n',[_商品名,_単価,_購入金額]),
        R = [],
        writef('\n購入金額合計は %t円\n        送料は %8r円\n        代金は %8r円\n',[_購入金額,_送料,_代金]).