Recursion Prolog相互递归谓词

Recursion Prolog相互递归谓词,recursion,prolog,Recursion,Prolog,晚上好, 我是Prolog的新手,我有一个问题要解决。我试着自己做,但对我不起作用。我搜索了我的序言书寻求帮助,但也没有找到任何帮助。这个问题真让我困惑 问题是: 我们需要计算每个任务的早期启动时间(考虑到先决条件,必须首先完成任务的最早启动时间) •任务的早期开始时间由任务的最新早期完成时间确定 先决条件 •任何任务列表的最新提前完成时间可通过启动 在零位,并在提前完成时间连续取最大值 每项任务的执行情况 •任务的早期完成时间通过将其持续时间添加到 提前开始时间 用Prolog编写谓词e_st

晚上好,

我是Prolog的新手,我有一个问题要解决。我试着自己做,但对我不起作用。我搜索了我的序言书寻求帮助,但也没有找到任何帮助。这个问题真让我困惑

问题是:

我们需要计算每个任务的早期启动时间(考虑到先决条件,必须首先完成任务的最早启动时间)

•任务的早期开始时间由任务的最新早期完成时间确定 先决条件

•任何任务列表的最新提前完成时间可通过启动 在零位,并在提前完成时间连续取最大值 每项任务的执行情况

•任务的早期完成时间通过将其持续时间添加到 提前开始时间

用Prolog编写谓词e_start、l_e_finish、e_finish的定义。这些谓词是相互递归的

任务及其时间定义如下:

先决条件定义如下:

我试图解决它,但我想我需要更多的解释,如何正确地做它,因为我只是不能得到它的权利

我的解决办法是:

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
定义,则只需使用一个子句即可。如果没有,你必须找到一种方法来组合这两个子句的逻辑。

你的谓词在语法上不正确,因为它们以大写字母开头。你能详细说明一下吗?你的解决方案失败了吗?如果是,以什么方式?当我尝试执行三个谓词中的一个时,我得到的结果都是错误的。我使用trace检查问题所在,最后代码显然失败了。我需要修改代码,但我不知道如何使它工作。我需要的是得到一个数字作为答案。您这里也缺少一个逗号:
先决条件(k[b])
。谢谢您,编辑。谢谢您告诉我如何提前完成任务。现在,我将通过“早完成”的帮助,努力完成任务的早开始和晚完成。我希望它能起作用。
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.