Я пытаюсь планировать проект с помощью пролога SWI и CLP. Мне удалось поддерживать последовательные зависимости, но я изо всех сил пытаюсь избежать двойного бронирования людей.
У меня есть список Schedule, содержащий такие элементы, как [taskname, starttime], где starttime — это свободная переменная для решателя ограничений. Они уже ограничены последовательными зависимостями.
Я пытаюсь написать такой цикл, чтобы исключить двойное бронирование:
forall /* or maybe foreach*/ (isa(P,person), (
% Filter scheduled tasks on that person...
include(\[T,S]^(assigned(T,P)), Schedule, HisSchedule),
% Present what serialized expects..
maplist(\[T,S]^S^true, HisSchedule, Sts),
% duration is just user-defined data...
maplist(\[T,S]^D^(duration(T,D)), HisSchedule, Dus),
% Hit it...
serialized(Sts, Dus)
)),
С foreach это всегда терпит неудачу, а с forall всегда удается, ничего не ограничивая.
Расписание является глобальным для этого цикла, и цель состоит в том, чтобы ограничить его элементы времени начала с помощью сериализации. OTOH, HisSchedule, Sts и Dus зависят от конкретного человека. Поэтому я думаю, что мне нужно foreach, чтобы сделать Schedule счастливым, но forall, чтобы сделать HisSchedule и т. д. счастливыми. В этом проблема? И если да, то как мне это исправить?
forall/2
:forall(Generator, Test) :- \+ (Generate, \+ Test)
. Использование отрицания (как отказа), вероятно, является причиной того, что ваш запрос завершается успешно без каких-либо ограничений. - person Paulo Moura   schedule 15.11.2014