このディレクトリの索引
%  
%  カレンダーの形式(何曜日から始まるか)と
%  月日数と1日の曜日が分かっている時
%  カレンダーをならびに得る。
%  

第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :-
        曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1),
        第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー).

曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :-
        findall(N,between(1,_月日数,N),_日ならび),
        起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号),
        曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー).

起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :-
        曜日番号(_曜日番号_1,_起点曜日形式),
        曜日番号(_曜日番号,_1日の曜日),
        _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7.

曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :-
        'N個組'(7,_日ならび,_カレンダー),!.
曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :-
        length(L0,_曜日番号),
        append(L0,L1,_日ならび),
        'N個組'(7,L1,LL).

曜日番号(0,日曜) :- !.
曜日番号(1,月曜) :- !.
曜日番号(2,火曜) :- !.
曜日番号(3,水曜) :- !.
曜日番号(4,木曜) :- !.
曜日番号(5,金曜) :- !.
曜日番号(6,土曜) :- !.

'N個組'(_,[],[]) :- !.
'N個組'(N,L,[U|R]) :-
        先頭からN個(N,L,U,R1),
        'N個組'(N,R1,R).

先頭からN個(_,[],[],[]) :- !.
先頭からN個(0,L,[],L) :- !.
先頭からN個(N,[A|R1],[A|R2],R) :-
        M is N - 1,
        先頭からN個(M,R1,R2,R).

第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :-
        第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]),
        最終週を変数で補正(LL1,LL2).

第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :-
        append(_,L,[_1,_2,_3,_4,_5,_6,_7]).

最終週を変数で補正(LL1,LL2) :-
        append(LL1_1,[L_2],LL1),
        append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]),
        append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!.

変数だけ値を詰める([],_).
変数だけ値を詰める([V|R],V) :-
        変数だけ値を詰める(R,V),!.
変数だけ値を詰める([_|R],V) :-
        変数だけ値を詰める(R,V).

変数だけ要素位置番号を詰める([],_).
変数だけ要素位置番号を詰める([N|R],N) :-
        N_2 is N + 1,
        変数だけ要素位置番号を詰める(R,N_2),!.
変数だけ要素位置番号を詰める([_|R],N) :-
        N_2 is N + 1,
        変数だけ要素位置番号を詰める(R,N_2).