5

SWI プロローグと CLP でプロジェクトのスケジューリングを試みています。順次依存関係をサポートすることはできましたが、二重予約の人を避けるのに苦労しています。

[taskname, starttime] のような要素を含む Schedule というリストがあります。ここで、starttime は制約ソルバーの自由変数です。それらは、シーケンシャルな依存関係によって既に制約されています。

二重予約を排除するために、次のようなループを作成しようとしています。

  forall /* or maybe foreach*/ (isa(P,person), (
    % Filter scheduled tasks on that person...
    include(\[T,S]^(assigned(T,P)), Schedule, HisSchedule),
    % Present what serialized expects..
    maplist(\[T,S]^S^true, HisSchedule, Sts),
    % duration is just user-defined data... 
    maplist(\[T,S]^D^(duration(T,D)), HisSchedule, Dus),
    % Hit it...
    serialized(Sts, Dus)
  )),

foreach では常に失敗し、forall では何も制約することなく常に成功します。

このループに関する限り、Schedule はグローバルであり、その目的は、シリアル化を使用して starttime 要素を制約することです。OTOH、HisSchedule、Sts、Dus は人によって異なります。ですから、Schedule を幸せにするためには foreach が必要だと思いますが、HisSchedule などを幸せにするためには forall が必要だと思います。それが問題ですか?もしそうなら、どうすれば修正できますか?

4

2 に答える 2

8

ビルトインはforall/2一部の Prolog システムで提供されており、非単調構造に大きく依存しており、制約と連携するようには設計されていません。foreach/2少し賢くしようとする試みについても同じことが言えます。

答え、解決策、制約

では、ここでの大きな根本的な問題は何でしょうか? 多くの Prolog は、制約が広く知られていなかったときに現在の形になりました。したがって、多くの構成概念は、最終的な真実として、目標の成功を「はい」と見なします。しかし、制約がある場合、状況は少し異なります。次の目標は、解決策をまったく含まない可能性がある回答を生成します。このため、成功は以前ほどではありません。SICStus を使用した例を次に示します。

| ?- asserta(clpfd:full_answer).
yes
| ?- X mod 2 #= 1.
clpfd:(X mod 2#=1),
X in inf..sup ? 
yes
| ?- X mod 2 #= 1, X mod 2 #= 0.
clpfd:(X mod 2#=0),
clpfd:(X mod 2#=1),
X in inf..sup ? ;
no
| ?- X mod 2 #= 1, X mod 2 #= 0, X in 0..9.
no

回答には解決策がまったく含まれていない可能性があります。つまり、回答が間違っている可能性があります。

あなたの例include/3では、非常に問題がありforall/2ます。ああ、またsetof/3制約に夢中になります:

| ?- setof(t, (I in 1..3 ; I in 3..5 ), _). % SICStus
yes

?- setof(t, (I in 1..3 ; I in 3..5 ),_).  % SWI
I = 3.

もしあったとしても、正解は でしょうI in 1..5

この問題を解決するには、まずリレーショナル データをリストに変換します。

   ...,
   setof(P, isa(P, person), Ps),
   maplist(perperson(P,Global),Ps),
   ...
于 2014-11-15T15:26:22.627 に答える