2013-02-20 42 views
2

我正在編程Prolog中的任務調度程序。我有一組謂詞的定義,當一個任務可以被認爲是激活的,就像這樣:如何在Prolog中生成可執行任務列表?

task(id01). 
task(id02). 
task(id03). 
task(id04). 

activable(X) :- 
    task(X), 
    inactive(X), 
    conditions1(X). 
activable(X) :- 
    task(X), 
    inactive(X) 
    conditions2(X). 
activable(X) :- 
    task(X), 
    inactive(X), 
    conditions3(X). 

我不知道我可以生成的所有激活的任務列表,激活其中任何一個之前。我試着像這樣的東西:

handle_activable([A|As]) :- 
    activable(A), 
    handle_activable(As). 
handle_activable([]). 

schedule :- 
    handle_activable(As), 
    activate_all(As). 

但是當我打電話schedule/0,我總是第一個任務檢查,task(id01)和第一activable/1條款的目標不斷。我知道這很愚蠢,但我找不到如何獲得可執行任務的列表。更簡單的是,如何生成任務列表......?

+0

你認爲你會看到一個問題,如果'conditions1'和'conditions2' /'conditions3'對於同一個任務是'true'? – dasblinkenlight 2013-02-20 17:38:30

+0

我們假設'conditions1','2'和'3'不能同時爲同一個任務執行。 – 2013-02-20 17:42:53

回答

4

Prolog有一個特定的執行流程。在回溯時考慮替代方案。那麼您需要使用一些內部使用回溯的內置模塊,如findall,或者失敗驅動迴路,如forall,如果您有興趣爲您可以找到的每個解決方案產生副作用。

底線:

schedule :- 
    findall(A, activable(A), As), 
    activate_all(As). 

schedule :- 
    forall(activable(A), activate(A)). 

其中激活/ 1實現了副作用

+0

感謝@CapelliC'findall/3'正是我所需要的。我想知道你是如何學習過幾次所證明的所有Prolog知識的。非常感謝分享! – 2013-02-21 13:16:27

相關問題