Поскольку вы пометили это как prolog
, я рекомендую реализовать его в программировании логики ограничений (CLP) и использовать алгоритмы, встроенные в вашу реализацию CLP. Частичный пример:
:- use_module(library(clpfd)).
on_time([]).
on_time([Task|Tasks]) :-
Task = task(TSuggested,TActual,L,Rs),
TActual #>= TSuggested - 10,
TActual #=< TSuggested + 10,
on_time(Tasks).
Другой предикат будет проверять, что никакие две задачи не используют один и тот же ресурс одновременно:
nonoverlap(R,Task1,Task2) :-
Task1 = task(_,T1,L1,Rs2),
Task2 = task(_,T2,L2,Rs2),
((member(R,Rs1), member(R,Rs2)) ->
T2 #> T1+L1 % start Task2 after Task1 has finished
#\/ % OR
T1 #> T2+L2 % start Task1 after Task2 has finished
;
true % non-conflicting, do nothing
).
Наконец, вызовите labeling
для всех ограниченных переменных, чтобы дать им согласованные значения. При этом используется CLP (fd) , который работает для целочисленных единиц времени. CLP (R) делает то же самое для реального времени, но это немного сложнее. Ссылки предназначены для SWI-Prolog, но SICStus и ECLiPSe имеют похожие библиотеки.