2

我正在 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不断地检查第一个子句的目标。我知道这很愚蠢,但我找不到如何获取可激活任务的列表。更简单的是,如何生成任务列表...?

4

1 回答 1

4

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

底线:

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

或者

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

其中 activate/1 实现了副作用

于 2013-02-20T17:56:58.233 回答