Prolog相互递归谓词

时间:2018-04-30 21:15:19

标签: recursion prolog

晚上好,

我是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.

任何帮助都会让我非常感激。谢谢你的编码员!

1 个答案:

答案 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定义,那么您只需使用一个子句即可完成。如果没有,你将不得不找到一种方法来结合这两个条款的逻辑。