このディレクトリの索引


勤務体制(X)
  :-
    開館時刻(_開館時刻),
    勤務体制(_開館時刻,[],X),
    全員が勤務できる(X).

勤務体制(_時刻,Y,X)
  :-
    閉館時刻(_時刻),
    Y = [[_|A],[_|B]|_],
    全解探索(_人,(要素(_人,A),要素(_人,B) ではない),[]),
    ならびの反転(Y,X),!.
勤務体制(_時刻,Y,X)
  :-
    閉館時刻(_時刻) ではない,
    時刻別勤務体制(_時刻,Y,[],_勤務体制),
    length(_勤務体制,Len),
    必要人数(_時刻,_必要人数),
    Len > 0,
    Len >= _必要人数,
    男性がいる(_勤務体制),
    役職者がいる(_勤務体制),
    連続勤務検査(_勤務体制,Y),
    _時刻の二 is _時刻 + 1,
    勤務体制(_時刻の二,[[_時刻|_勤務体制]|Y],X).


時刻別勤務体制(_時刻,U,Y,X)
  :-
    人員選択(_時刻,U,Y,_人),
    時刻別勤務体制(_時刻,U,[_人|Y],X).
時刻別勤務体制(_時刻,_,X,X).

連続勤務検査(_勤務体制,X)
  :-
    全解探索(_人,(人員(_人,_),要素(_人,_勤務体制) ではない),L),
    連続勤務検査の二(L,X).

連続勤務検査の二([],_) :- !.
連続勤務検査の二([_人|_],[[_|A]])
   :-
     要素(_人,A),
     !,fail.
連続勤務検査の二([_人|_],[[_|A],[_|B]|_])
  :-
    要素(_人,A),
    要素(_人,B) ではない,!,
    fail.
連続勤務検査の二([_人|R],X)
  :-
    連続勤務検査の二(R,X).

連続勤務限界を越えた(_人,X)
  :-
    連続勤務限界時間(_限界時間),
    連続勤務限界を越えた(1,_限界時間,_人,X).
    
連続勤務限界を越えた(N,N,_,_) :- !.
連続勤務限界を越えた(M,N,_人,[[_|A]|R])
  :-
    member(_人,A),
    M2 is M+1,
    連続勤務限界を越えた(M2,N,_人,R),!.

男性がいる([_人|_])
  :-
    性別(_人,男),!.
男性がいる([_|R])
  :-
    男性がいる(R).

女性の役職者がいない([]) :- !.
女性の役職者がいない([_人|_])
  :-
    役職(_人,_),
    性別(_人,女),!,fail.
女性の役職者がいない([_|R])
  :-
    女性の役職者がいない(R).

役職者がいる([_人|_])
  :-
    役職(_人,_),!.
役職者がいる([_|R])
  :-
    役職者がいる(R).

所長と副所長が共にいる(_人,_勤務体制候補)
  :-
    役職(_人,所長),
    member(_所長候補,_勤務体制候補),
    役職(_所長候補,所長),!.
所長と副所長が共にいる(_人,_勤務体制候補)
  :-
    役職(_人,副所長),
    member(_副所長候補,_勤務体制候補),
    役職(_所長候補,副所長),!.

アルバイトの男女が一緒(_人,X)
  :-
    役職(_人,_) ではない,
    性別(_人,男),
    findall(FM,(member(A,X),役職(A,_) ではない,性別(A,FM)),L),
    member(女,L),
    女性の役職者がいない(X),!.
    
アルバイトの男女が一緒(_人,X)
  :-
    役職(_人,_) ではない,
    性別(_人,女),
    findall(FM,(member(A,X),役職(A,_) ではない,性別(A,FM)),L),
    member(男,L),
    女性の役職者がいない(X),!.

全員が勤務できる(X)
  :-
    findall(U,人員(U,_),L),
    sort(L,L1),
    findall(V,member([_|V],X),L2),
    flat(L2,L3),
    sort(L3,L1).

/* 役職者を先に定義すること */
人員(像一,1).
人員(項,2).
人員(彩,3).
人員(ミルク,4).
人員(モヘ,5).
人員(ビー,6).
人員(チー,7).

人員選択(_時刻,U,X,_人)
  :-
    人員(_人,_人員順序),
    用事(_人,_時刻) ではない,
    U=[[_|[_人]]|_] ではない,
    (要素(A,X),人員(A,B),B>=_人員順序) ではない,
    所長と副所長が共にいる(_人,X) ではない,
    アルバイトの男女が一緒(_人,X) ではない,
    連続勤務限界を越えた(_人,U) ではない.


必要人数(_時刻,1)
  :-
    _時刻 >= 19,!.
必要人数(_,2).


用事(像一,9).
用事(像一,11).
用事(項,11).
用事(項,14).
用事(彩,14).
用事(モヘ,N)
  :-
    N >= 9,
    N =< 14.
/*
用事(モヘ,9).
用事(モヘ,10).
用事(モヘ,15).
用事(モヘ,16).
*/
用事(ビー,10).
用事(チー,12).
用事(チー,16).
用事(ビー,12).
用事(ビー,13).
用事(ビー,16).
用事(ミルク,9).
用事(ミルク,10).
用事(ミルク,15).


用事(彩,10).
用事(彩,19).
用事(項,20).
用事(ミルク,17).
用事(チー,15).
用事(ビー,N)
  :-
    N >= 17.
用事(チー,N)
  :-
    N >= 17.
用事(モヘ,N)
  :-
    N >= 17.


性別(像一,男).
性別(項,男).
性別(彩,女).
性別(モヘ,女).
性別(ビー,女).
性別(ミルク,男).
性別(チー,女).


役職(像一,所長).
役職(項,副所長).
役職(彩,主任).

時間給(像一,_,2600).
時間給(項,_,2000).
時間給(彩,_,1800).
時間給(ミルク,_,950).
時間給(モヘ,_時刻,780)
  :-
    _時刻 >= 18,!.
時間給(モヘ,_,760).
時間給(ビー,_時刻,820)
  :-
    _時刻 >= 18,!.
時間給(ビー,_,800).
時間給(ミルク,_時刻,900)
  :-
    _時刻 >= 18,!.
時間給(チー,_,850).


連続勤務限界時間(3).

支給額合計([],0) :- !.
支給額合計([[_時刻|L]|R],S)
  :-
    支給額合計(R,S1),
    findall(U,(member(V,L),時間給(V,_時刻,U)),L2),
    加算(L2,S2),
    S is S1+S2.

開館時刻(9).

閉館時刻(21).