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等快乐.那是问题吗?如果是这样,我该如何解决?
在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)