Clin go: logi c ИЛИ в ограничении целостности - PullRequest
0 голосов
/ 30 апреля 2020

Для лекционного упражнения я должен представить в 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).

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

1 Ответ

1 голос
/ 05 мая 2020

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

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

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

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

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

...