В первом списке указываются ждущие задачи и продолжительности их выполнения; во втором - текущие решаемые задачи и их времена окончания, упорядоченные так, чтобы выполнялись неравенства K1<=K2, K2<=K3, ... . Время окончания плана - самое последнее по времени время окончания задачи.

*/

        после( Задачи1*[ _ /К | Акт1]*Кон1, Задачи2*Акт2*Кон2,Ст):-

                удалить( Задача/Т, Задачи1, Задачи2),

                                                            % Взять ждущую задачу

                not( принадлежит( Здч1/_, Задачи2),

                        раньше( ЗДЧ, Задача) ),

                                                           % Проверить предшествование

                not( принадлежит( Здч1/К1, Акт1), К1<К2,

                        раньше( К1, Задача) ),    % Активные задачи

                Время is К + Т,

                                            % Время окончания работающей задачи

                встав( ЗадачаВремя, Акт1, Акт2, Кон1, Кон2),

                Ст is Кон2 - Кон1.

        после( Задачи*[ _ /К | Акт1]*Кон, Задачи2*Акт2*Кон, 0):-

                вставпростой( К, Акт1, Акт2).

                                            % Оставить процессор бездействующим

        раньше( Задача1, Задача2) :-

                                            % В соответствии с предшествованием

                предш( Задача1, Задача2).

                                            % Задача1 раньше, чем Задача2

        раньше( Здч1, Здч2) :-

                предш( Здч, Здч2),

                раньше( Здч1, Здч).

        встав( Здч/А, [Здч1/В | Спис], [Здч/А, Здч1/В | Спис], К, К):-

                                            % Список задач упорядочен

                А =< В,  !.

        встав( Здч/А, [Здч1/В | Спнс], [Здч1/В | Спис1], К1, К2) :-

                встав( Здч/А, Спис, Спис1, Kl, К2).

        встав( Здч/А, [ ], [Здч/А], _, А).

        вставпростой( А, [Здч/В | Спис], [простой/В, Здч/В | Спис]):-

                                            % Оставить процессор бездействующим

                А < В,  !              % До ближайшего времени окончания

        вставпростой( А, [Здч/В | Спис], [Здч/В | Спис1]) :-

                вставпростой( А, Спис, Спис1 ).

        удалить( А, [А | Спис], Спис ).

                                            % Удалить элемент из списка

        удалить( А, [В | Спис], [В | Спис1] ):-

                удалить( А, Спис, Спис1 ).

        цель( [ ] *_*_ ).           % Целевое

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату