Пролог Взаимные рекурсивные предикаты - PullRequest
0 голосов
/ 01 мая 2018

Добрый вечер,

Я новичок в Прологе, и мне нужно решить проблему. Я пытался сделать это сам, но у меня это не работает. Я искал свои книги по Прологу за любую помощь, но ничего не нашел. Этот вопрос действительно смущает меня.

Вопрос:

Нам нужно рассчитать время раннего запуска для каждой задачи (самое раннее возможное время, когда оно может начаться, если его предварительные условия должны быть выполнены в первую очередь).

• Время раннего начала задания определяется последним ранним завершением его задания. предпосылки.

• Последнее раннее завершение любого списка задач можно рассчитать, запустив в ноль и последовательно принимая максимум с ранним временем финиша каждой задачи.

• Время раннего завершения задания определяется путем добавления его продолжительности к время раннего старта.

Написать определения в Прологе для предикатов e_start, l_e_finish, e_finish. Эти предикаты являются взаимно рекурсивными.

Задачи и их время определены следующим образом:

duration(Task, Time),
duration(b, 10),
duration(k,5),
duration(a,2).

Предпосылки определены следующим образом:

prerequisites(Task, PreqTask),
prerequisites(k,[b]),
prerequisites(b,[]),
prerequisites(a,[k]).

Я пытался решить это, но мне нужно больше объяснений о том, как это сделать правильно, потому что я просто не могу понять это правильно.

Мое решение:

e_start(Task,Start):-
   prereqs(Task, X),
   l_e_finish(X,Start).

l_e_finish(Task,Finish) :-
    e_finish(Task,Finish),
    l_e_finish(Task,Finish1),
    duration(Task, Finish),
    max(Finish,Task,Finish1).

e_finish(Task,Finish):-
    duration(Task, Time),
    e_start(Task,Finish),
    Finish is Time+Finish.

Любая помощь была бы мне очень полезна. Спасибо товарищи кодеры!

1 Ответ

0 голосов
/ 01 мая 2018

Давайте начнем с рассмотрения случая, когда у вас нет предпосылок. В этом случае ваше самое раннее окончание - это просто ваша продолжительность:

early_finish(T, Finish) :- 
    duration(T, Finish).

Что если у вас есть предпосылки? Тогда ваш ранний финиш - это ваша продолжительность плюс последний из тех, которые будут выглядеть так:

early_finish(T, Finish) :-
    prerequisites(T, Prerequisites),
    maplist(early_finish, Prerequisites, PrerequisiteFinishes),
    maxlist(PrerequisiteFinishes, LastFinish),
    duration(T, Duration),
    Finish is LastFinish + Duration.

Я предполагаю, что у вас есть предикат maxlist/2, который дает вам самый большой элемент в списке. Если вы определяете maxlist/2, чтобы дать 0 для пустого списка, и вы гарантируете, что все задачи имеют определение prerequisite/2, то вы закончите только с одним предложением. Если нет, вам придется найти способ объединить логику этих двух предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...