晚上好,
我是Prolog的新手,我有一个问题需要解决。我试图自己做,但它对我不起作用。我搜索了我的Prolog书籍以寻求任何帮助,但也没有找到任何帮助。这个问题让我很困惑。
问题是:
我们需要计算每项任务的早期开始时间(如果必须首先完成先决条件,它可以开始的最早时间)。
•任务的早期开始时间由最新的早期完成 先决条件。
•可以通过开始计算任何任务列表的最新早期完成 零,并在早期完成时间内连续取得最大值 每项任务。
•任务的早期完成时间是通过将其持续时间添加到其中来给出的 早起的时间。
在Prolog中为谓词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.
任何帮助都会让我非常感激。谢谢你的编码员!
答案 0 :(得分:0)
让我们从考虑没有先决条件的情况开始。在这种情况下,您最早的完成只是您的持续时间:
echo "<input type='text' value='" . $aName . "'>";
如果您有先决条件怎么办?然后你的早期完成是你的持续时间加上最新的那些,看起来像这样:
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
定义为为空列表赋予0并且您保证所有任务都具有maxlist/2
定义,那么您只需使用一个子句即可完成。如果没有,你将不得不找到一种方法来结合这两个条款的逻辑。