むつかしい時間割を組む.prolog
全員違う時間割の学生35人のために、毎週A、Bの2回授業を開催したい。全員が一度に集まれる機会は一度もないので、同じ授業を2回ずつ行い、毎週合計4回は開講する必要がある。
全員の時間割から、全員がA,Bそれぞれに一度ずつ出席できるような開講日程の組み合わせを求めなさい。
解の例:
https://gyazo.com/96334f515f9601085b219f8ccc50e897
code:hor.prolog
:- encoding(utf8).
% _月1-2, _月3-4, _月5-6, _月7-8, _月9-10, _火1-2, _火3-4, _火5-6, _火7-8, _火9-10, _水1-2, _水3-4, _水5-6, _水7-8, _水9-10, _木1-2, _木3-4, _木5-6, _木7-8, _木9-10, _金1-2, _金3-4, _金5-6, _金7-8, _金9-10, _土1-2, _土3-4, _土5-6, _土7-8, _土9-10
% 汎用述語
ならば(_なら, _ば, _) :- _なら, !, _ば.
ならば(_, _, _さもなくば) :- _さもなくば.
全解探索 :-
実行,
fail.
実行 :-
時間割(30, X, 2),
学生の予定(Y),
全員出席できる(X, Y, 0),
先生の予定(Z),
出席できる(X, Z, 2),
表示(X).
実行(A) :-
時間割(30, X, A),
学生の予定(Y),
全員出席できる(X, Y, 0),
表示(X).
表示(X) :- write('\n\n月曜日'), 表示(X,1).
表示([],_).
write(X),
ならば(0 is Z mod 5,
ならば(1 is Z / 5, write('\n火曜日'),
ならば(2 is Z / 5, write('\n水曜日'),
ならば(3 is Z / 5, write('\n木曜日'),
ならば(4 is Z / 5, write('\n金曜日'),
ならば(5 is Z / 5, write('\n土曜日'),
true
)
)
)
)
),
true),
Z1 is Z+1,
表示(Y,Z1).
時間割(C, X, B) :-
全時間割(C, X),
sum_list(X, B).
全時間割(C, X) :-
全時間割(C, A, X),
有無(A).
全時間割(0, _, []).
C > 0,
C1 is C-1,
!, 全時間割(C1, A1, L1),
有無(A1).
有無(0).
有無(1).
全員出席できる(_, [], _).
出席できる(X, Y, Fojoj),
Fojoj > Limo,
全員出席できる(X, A, Limo).
%授業, 学生の予定, 出席可能回数
出席できる(X, Y, Fojoj) :-
出席できる(X,Y,0,Fojoj).
出席できる([], [], F, F).
ならば(U = 1, ならば(V = 1, F1 is F, F1 is F+1), F1 is F),
出席できる(X,Y,F1,G).
先生の予定([
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 1,
0, 0, 0, 0, 1,
1, 0, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0]).
学生の予定([
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 1, 1, 0, % 星期一
1, 0, 0, 0, 1, % 星期二
1, 1, 0, 0, 0, % 星期三 %我想起了神奇的事,周三的34节有时上课
1, 1, 1, 0, 0, % 星期四
0, 0, 1, 0, 0, % 星期五
1, 1, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 1, 0, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
0, 0, 0, 0, 0, % 星期三
0, 0, 1, 1, 0, % 星期四
1, 0, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 1, 0, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
0, 0, 0, 0, 0, % 星期三
0, 0, 1, 1, 0, % 星期四
1, 0, 0, 1, 1, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 0, 0, % 星期一
1, 1, 1, 1, 1, % 星期二
0, 0, 0, 0, 0, % 星期三
0, 1, 1, 0, 0, % 星期四
0, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 1, 1, 0, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
1, 0, 0, 0, 0, % 星期三
1, 1, 1, 0, 0, % 星期四
1, 0, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 1, 1, 1, % 星期一
1, 0, 0, 1, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 1, 1, 0, 0, % 星期四
0, 0, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 1, 1, 0, % 星期一
1, 0, 0, 1, 0, % 星期二
1, 0, 0, 0, 1, % 星期三
1, 1, 1, 0, 0, % 星期四
0, 0, 1, 1, 0, % 星期五
1, 1, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 0, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 0, 1, 1, 0, % 星期四
1, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 0, 0, % 星期一
1, 1, 1, 1, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 0, 1, 0, 1, % 星期四
1, 1, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
1, 1, 1, 0, 0, % 星期二
1, 0, 0, 0, 0, % 星期三
1, 0, 0, 0, 0, % 星期四
1, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
0, 1, 0, 1, 1, % 星期二
0, 0, 0, 0, 1, % 星期三
0, 0, 1, 0, 0, % 星期四
1, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
0, 1, 0, 1, 1, % 星期二
0, 1, 0, 0, 1, % 星期三
0, 0, 1, 0, 0, % 星期四
1, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 0, 0, 0, % 星期一
1, 0, 1, 0, 1, % 星期二
1, 0, 0, 0, 0, % 星期三
0, 0, 0, 0, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
1, 1, 1, 1, 1, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 0, 1, 0, 0, % 星期四
1, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 0, % 星期一
0, 1, 1, 0, 1, % 星期二
1, 0, 0, 0, 0, % 星期三
1, 0, 0, 0, 0, % 星期四
1, 1, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 1, 1, 0, % 星期一
1, 0, 1, 0, 1, % 星期二
0, 1, 0, 0, 0, % 星期三
0, 0, 0, 0, 0, % 星期四
0, 1, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
1, 0, 1, 0, 1, % 星期二
0, 1, 0, 0, 1, % 星期三
1, 0, 0, 1, 1, % 星期四
1, 1, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 0, 0, 0, % 星期一
1, 0, 1, 0, 1, % 星期二
1, 0, 0, 0, 0, % 星期三
0, 0, 0, 0, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 1, 1, 1, 0, % 星期一
1, 0, 0, 0, 0, % 星期二
1, 1, 0, 0, 1, % 星期三
0, 1, 1, 1, 0, % 星期四
1, 1, 1, 0, 0, % 星期五
1, 1, 1, 1, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 1, 1, 0, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
1, 0, 1, 1, 0, % 星期三
0, 1, 0, 0, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 1, 1], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 0, % 星期一
0, 1, 1, 1, 0, % 星期二
0, 1, 0, 0, 0, % 星期三
1, 0, 1, 1, 0, % 星期四
0, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
0, 2, 0, 0, 1, % 星期二
0, 1, 0, 0, 0, % 星期三
1, 1, 1, 0, 0, % 星期四
1, 0, 0, 1, 0, % 星期五
1, 1, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 1, 0, 0, % 星期一
1, 0, 1, 0, 1, % 星期二
1, 0, 0, 0, 0, % 星期三
0, 0, 0, 1, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 0, 0, 0, 0, % 星期一
1, 1, 1, 0, 0, % 星期二
0, 0, 0, 1, 0, % 星期三
1, 1, 0, 1, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 0, % 星期一
0, 0, 1, 1, 0, % 星期二
0, 0, 0, 0, 0, % 星期三
0, 0, 1, 0, 0, % 星期四
0, 0, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 1, 0, 0, % 星期一
1, 0, 1, 1, 0, % 星期二
1, 0, 1, 1, 0, % 星期三
1, 0, 1, 1, 0, % 星期四
1, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 0, % 星期一
1, 1, 1, 1, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 1, 1, 0, 0, % 星期四
0, 1, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 1, 0, % 星期一
1, 1, 1, 0, 0, % 星期二
1, 1, 0, 1, 0, % 星期三
0, 0, 0, 0, 0, % 星期四
0, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 1, 0, 0, 0, % 星期一
0, 1, 1, 1, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
1, 1, 1, 0, 0, % 星期四
1, 0, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 1, 0, % 星期一
1, 0, 1, 0, 0, % 星期二
1, 1, 0, 0, 0, % 星期三
0, 1, 0, 0, 0, % 星期四
1, 0, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 1, 0, % 星期一
0, 1, 1, 0, 0, % 星期二
1, 0, 0, 1, 0, % 星期三
1, 1, 1, 1, 1, % 星期四
0, 1, 1, 0, 1, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 0, 1, 0, % 星期一
1, 0, 0, 0, 1, % 星期二
1, 0, 0, 0, 0, % 星期三
1, 0, 0, 0, 0, % 星期四
1, 0, 0, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
0, 1, 1, 0, 0, % 星期一
1, 0, 1, 1, 0, % 星期二
1, 0, 0, 0, 0, % 星期三
0, 1, 1, 1, 0, % 星期四
1, 0, 1, 0, 0, % 星期五
0, 0, 0, 0, 0], % 星期六
[
% 1-2,3-4,5-6,7-8,9-10节 1=有事 0=有空
1, 0, 0, 0, 0, % 星期一
1, 1, 1, 1, 0, % 星期二
0, 1, 0, 0, 0, % 星期三
1, 0, 1, 1, 0, % 星期四
0, 1, 1, 1, 0, % 星期五
0, 0, 0, 0, 0]]). % 星期六