このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1381909900/328
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  a) 4桁の西暦を入力として受け取り 
#  b) その年のすべての日について次の演算を行い 
#  c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 
#  (例) 
#   20 + 13 + 11 + 25 = 69 
#  d) 各日の小計を大きいものから順に 
#  20131231 = 76 
#  ... 
#  20131125 = 69 
#  ... 
#  20130101 = 35 
#  のように表示させるプログラムを作りなさい 
#  

'a) 4桁の西暦を入力として受け取り 
b) その年のすべての日について次の演算を行い 
c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 
(例) 
 20 + 13 + 11 + 25 = 69 
d) 各日の小計を大きいものから順に 
20131231 = 76 
... 
20131125 = 69 
... 
20130101 = 35 
のように表示させるプログラムを作りなさい '(_四桁の西暦) :-
        findall([_小計,_年月日整数],(
                    'b) その年のすべての日について'(_四桁の西暦,_年月日整数),
                    '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)),
                _小計_年月日整数ならび),
        'd) 各日の小計を大きいものから順に 
20131231 = 76 
... 
20131125 = 69 
... 
20130101 = 35 
のように表示させる'(_小計_年月日整数ならび).


'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :-
        between(1,12,_月整数),
        月末日(_四桁の西暦,_月整数,_月末日整数),
        between(1,_月末日整数,_日整数),
        _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数.

月末日(_年整数,_月整数,_月末日整数) :-
        うるう年(_年整数),
        nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数).
月末日(_年整数,_月整数,_月末日整数) :-
        \+(うるう年(_年整数)),
        nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数).

うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,!,
        fail.
うるう年(_年) :-
        0 is _年 mod 4.

'次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :-
        年の上位2桁(_年月日整数,_年の上位2桁),
        年の下位2桁(_年月日整数,_年の下位2桁),
        月(_年月日整数,_月整数),
        日(_年月日整数,_日整数),
        _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数.

年の上位2桁(_年月日整数,_年の上位2桁) :-
        _年の上位2桁 is _年月日整数 // 1000000.

年の下位2桁(_年月日整数,_年の下位2桁) :-
        _剰余 is _年月日整数 mod 10000,
        _年の下位2桁 is _剰余 mod 100.

月(_年月日整数,_月整数) :-
        _剰余 is _年月日整数 mod 10000,
        _月整数 is _剰余_1 // 100.

日(_年月日整数,_日整数) :-
        _日整数 is _年月日整数 mod  100.

'd) 各日の小計を大きいものから順に 
20131231 = 76 
... 
20131125 = 69 
... 
20130101 = 35 
のように表示させる'(_小計_年月日整数ならび) :-
        各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび),
        forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])).

各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :-
        sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび),
        reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび),