如何在Prolog中生成可激活任务列表?

时间:2013-02-20 17:35:10

标签: 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子句目标。我知道这很愚蠢,但我找不到如何获得可激活任务的列表。更简单,如何生成任务列表......?

1 个答案:

答案 0 :(得分:4)

Prolog有一个特定的执行流程。在回溯时考虑替代方案。然后你需要使用一些内部使用回溯的内置函数,如findall,或失败驱动的循环,如forall,如果你有兴趣为每个解决方案生成副作用你可以找到。

底线:

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

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

其中activate / 1实现副作用