Prolog:foreach还是forall用于约束求解?

Adr*_*May 5 lambda prolog resource-scheduling constraint-programming clpfd

我正在尝试使用SWI prolog和CLP进行项目调度.我设法支持顺序依赖,但我正在努力避免双重预订人.

我有一个名为Schedule的列表,其中包含[taskname,starttime]等元素,其中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)
  )),
Run Code Online (Sandbox Code Playgroud)

随着foreach它总是失败和forall它总是成功而不会约束任何东西.

就这个循环而言,Schedule是全局的,目的是使用序列化来约束其starttime元素.OTOH,HisSchedule,Sts和Dus取决于特定的人.因此,我认为我需要foreach让Schedule快乐,但是要让HisSchedule等快乐.那是问题吗?如果是这样,我该如何解决?

fal*_*lse 8

forall/2内置由序言部分系统提供,它在很大程度上依赖于非单调的结构,以及从未被设计以限制合作.对于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
Run Code Online (Sandbox Code Playgroud)

答案现在可能根本没有解决方案,换句话说,它们可能是错误的.

在你的例子中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.
Run Code Online (Sandbox Code Playgroud)

如果有的话,正确的答案是I in 1..5.

要解决此问题,请首先将关系数据转换为列表:

   ...,
   setof(P, isa(P, person), Ps),
   maplist(perperson(P,Global),Ps),
   ...
Run Code Online (Sandbox Code Playgroud)

  • @AdrianMay:也许从[this]开始(http://logic.at/prolog/simsttab/simsttab.html) (2认同)