このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/641
#  [1] C言語演習 
#  [2] http://codepad.org/umohMOn3のプログラムを完成させ、 
#    年と月を入力して、その月のカレンダーを表示するプログラムを作成せよ。 
#    なお、http://codepad.org/qb798eoX、http://codepad.org/rPzv2BAEの 
#    プログラムを参考にすること。 
#  [3.1] Windows7 
#  [3.3] C言語 
#  [4] 7月15日 19時まで 
#  [5] 関数呼び出しまで 
#  わかる方よろしくお願いします。 
# 
# 

'年と月を入力して、その月のカレンダーを表示する' :-
        '年と月を入力して'(_年,_月),
        '年と月を入力して、その月のカレンダーを表示する'(_年,_月).

'年と月を入力して'(_年,_月) :-
        write('年,月をカンマ区切りで入力してください : '),
        readln([_年,_月]).

'年と月を入力して、その月のカレンダーを表示する'(_年,_月) :-
        'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日),
        末日(_年,_月,_末日),
        writef('    %t年 %t月\n\n', 日 月 火 水 木 金 土\n',[_年,_月]),
        カレンダ日ならび(_末日,_曜日を表す値,L),
        カレンダ表示(L).

カレンダ日ならび(_末日,_曜日を表す値,L) :-
        length(L0,_曜日を表す値),
        all(L0,' '),
        S is 6 - _曜日を表す値,
        length(L2,S),
        all(L2,' '),
        findall(_,for(1,N,_末日),L1),
        append(L0,L1,L2,L),!.

カレンダ表示([]) :- !.
カレンダ表示(L) :-
       length(L0,7),
       append(L0,R,L),
       カレンダ週表示(L0),
       write('\n'),
       カレンダ表示(R).

カレンダ週表示([]).
カレンダ週表示([A|R]) :-
       writef('%3r',[A]),
       カレンダ週表示(R),!.

末日(_,_月,31) :-
        member(_月,[1,3,5,7,8,10,12]),!.
末日(_,_月,30) :-
        member(_月,[4,6,9,11]).
末日(_年,2,29) :-
        うるう年(_年),!.
末日(_年,2,28) :-
        \+(うるう年(_年)),!.

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

'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :-
        _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7,
        曜日を表す値(_曜日を表す値,_曜日),
        !.

曜日を表す値(0,日曜).
曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).