繁体   English   中英

Prolog相互递归谓词

[英]Prolog Mutual recursive predicates

晚上好,

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

任何帮助我将不胜感激。 谢谢各位编码员!

让我们首先考虑没有先决条件的情况。 在这种情况下,您最早的完成时间就是您的持续时间:

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定义,那么仅用one子句就可以完成。 如果没有,您将必须找到一种方法来组合这两个子句的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM