Clingo: логическое ИЛИ в ограничении целостности

Для лекционного упражнения я должен представлять в Answer Set Programming (мы используем Clingo как интерпретатор) следующее ограничение целостности:

"Вы должны спланировать календарь мастер-класса. Обычно лекции проходят по пятницам (8 часов) и субботам (4 или 5 часов). А 7-я и 16-я неделя заполнены, что означает, что лекции проходят с понедельника по пятницу, с 8 часами в день, а в субботу с 4 или 5 часами лекций".

Основные настройки проблемы следующие:

#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).

Правильный ли способ представить такое ограничение? Есть подход получше?

1 ответ

Я не верю, что существует "правильный способ" представить ограничение, если это технически правильно. Предлагаю учесть следующие моменты:

  • Способ выражения субботы сложен, т.е. вы можете заменить переменную D на 6 и исключить предикаты день и полный день.

  • Я не понимаю, почему вы используете "лекция (_, _)" вместо подчеркивания.

  • Я не уверен, почему вы используете переменную I для подсчета и думаете, что вместо этого вам нравится считать часы.

  • Возможно, имеет смысл использовать дизъюнкцию явно, то есть использовать предикат типа "hours_on_sunday(H)" и написать правило, согласно которому H должно быть 4 или 5.

Другие вопросы по тегам