簡體   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