Для лекционного упражнения я должен представить в Answer Set Programming
(мы используем Clingo
в качестве переводчика) следующее ограничение целостности:
"Вы должны запланировать календарь мастер-класса. Обычно, лекции проводятся по пятницам (8 часов) и в субботу (4 или 5 часов) . А 7-я и 16-я недели заполнены, что означает, что лекции проходят с понедельника по пятницу, по 8 часов в день, и в субботу с 4 или 5 часами лекции . "
Основные настройки c для этой задачи следующие:
#const n_weeks = 2. % for now we limit the problem size to 2 weeks
#const n_days = 6. % days in a fullweek
week(1..n_weeks).
day(1..n_days).
hour(1..8). % from the 1st to the 8th hour of the day
% the second week is a fullweek (lectures from 1st to 8th hour from Monday to Friday)
fullweek(2).
% We number all the weekdays (mon-fri) (we need it for the saturday)
fullday(1..5).
% some professors just for test
prof("prof1").
prof("prof2").
prof("prof3").
prof("prof4").
% subj, total hours, prof
subject("subj1", 8, "prof1").
subject("subj2", 14, "prof2").
subject("subj3", 24, "prof3").
subject("subj4", 11, "prof1").
% The main predicate, to print out at the end.
0 {calendar(W, D, H, W*100+D*10+H, lecture(S, P))} 1 :- week(W), day(D), hour(H), subject(S, _, P).
Теперь, как уже упоминалось выше (последняя строка выделена жирным шрифтом), у нас есть некоторые проблемы со следующим ограничением:
"В этом мастер-классе часов лекции в субботу могут быть 4 или 5 . "
Пока я и мои коллеги представляли это ограничение следующим образом:
% The Saturday has 4 or 5 hours of lecture
:- #count{I : calendar(W, D, _, I, lecture(_, _))} > 5, week(W), day(D), not fullday(D).
:- #count{I : calendar(W, D, _, I, lecture(_, _))} < 4, week(W), day(D), not fullday(D).
Является ли это правильным способом представления ограничения таким образом? Есть лучший подход?