このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/645
#  [1] 授業単元: C言語 
#  [2] 問題文(含コード&リンク): 
#  ■プログラム1: 
#    りんごが30個中、腐ったりんごが10個あったとき、 
#    腐ってないりんごを3人で分けると、 
#    一人当たりのりんごの個数は何個になるか、計算し、 
#    "一人あたりのりんごの個数"と"残ったりんごの個数"を 
#    出力するプログラム。  
#    (C言語の足し算、引き算、かけ算、割り算はそれぞれ、 +, -, *, / を使うが、 
#     割った余り(剰余) は % で計算できる。 (例: n を m で割った余りは n % m ))  
#    ■プログラム2: 
#    上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから 
#    入力することで、任意の個数に対して計算できるように改良したプログラム。 
#  ただし両プログラムの変数名は、最初のりんごの個数をapple、 
#  腐っていたりんごの個数を bad_apple、人数をpersons、 
#  一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 
#    

'りんごの個数を入力し、その中の腐ったりんごの個数を入力する。人数を入力して、腐ってないりんごをこの人数で分けると、一人当たりのりんごは何個になるかを計算し、"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する' :-
        りんごの個数を入力し(_りんごの個数),
        腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数),
        人数を入力して(_分割する人数),
        '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数),
        '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数).


りんごの個数を入力し(_りんごの個数) :-
        write('りんごの個数を入力してください : '),
        get_line(Line),
        りんごの個数入力検査(Line,_りんごの個数),!.
りんごの個数を入力し(_りんごの個数) :-
        りんごの個数を入力し(_りんごの個数).

りんごの個数入力検査(Line,_りんごの個数) :-
        atom_to_term(Line,_りんごの個数,_),
        integer(_りんごの個数),
        _りんごの個数 > 0,!.
りんごの個数入力検査(Line,_りんごの個数) :-
        writef('入力された%tからは適切なりんごの個数が得られません。再入力をお願いします。\n',[Line]),
        fail.

腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :-
        writef('腐ったりんごの個数を入力してください( >%t ) : ',[_りんごの個数]),
        get_line(Line),
        腐ったりんごの個数入力検査(Line,_腐ったりんごの個数),!.

腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :-
        腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数).

腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :-
        atom_to_term(Line,_腐ったりんごの個数,_),
        integer(_腐ったりんごの個数),
        _腐ったりんごの個数 < _りんごの個数,!.
腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :-
        writef('入力された%tからは適切な腐ったりんごの個数は得られません。再入力をお願いします。\n',[Line]),
        fail.

人数を入力して(_分割する人数) :-
        write('分割する人数を入力してください : '),
        get_line(Line),
        人数入力検査(Line,_分割する人数),!.
人数を入力して(_分割する人数) :-
        人数を入力して(_分割する人数).

人数入力検査(Line,_分割する人数) :-
        atom_to_term(Line,_分割する人数,_),
        integer(_分割する人数),
        _分割する人数 > 0,!.
人数入力検査(Line,_分割する人数) :-
        writef('入力された%tからは適切な分割する人数が得られません。再入力をお願いします。\n',[Line]),

'腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :-
        '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数),
        '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数).

'腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数) :-
        _腐っていないりんごの個数 is _りんごの個数 - _腐ったりんごの個数.

'何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :-
        _一人当たりのりんごの個数 is _腐っていないりんごの個数 // _分割する人数,
        _残ったりんごの個数 is _腐っていないりんごの個数 mod _分割する人数.

'"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数) :-
        出力する('一人あたりのりんごの個数 = %t\n',_一人当たりのりんごの個数),
        出力する('残ったりんごの個数 = %t\n',_残ったのりんごの個数).

出力する(_表示パターン,_表示項目) :-
        writef(_表示パターン,[_表示項目]).


%  このプログラムは http://nojiriko.asia/prolog/c152_645_1.html のどこを変更
%  したかを確認してこそ、意味のあるものです。
%  最初の述語名が大きく異なっていること。これが一番重要だと思います。
%  それから具体値を一般化した場合の述語名の書き換え方。
%  やはり、Prologは国語だ。