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 が必要だと思います。それが問題ですか?もしそうなら、どうすれば修正できますか?