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 に答える