使用swi-prolog在约束逻辑编程中最小化导致的不必要变量

时间:2013-07-27 22:15:41

标签: swi-prolog constraint-programming clpq

我正在关注Ivan Bratkos的“人工智能第四版Prolog编程”,我目前正在阅读约束逻辑编程。

在本书中,有一个关于任务调度的小优化示例,如下所示:

{Ta >= 0,
Ta + 2 =< Tb,
Ta + 2 =< Tc,
Tb + 3 =< Td,
Tc + 5 =< Tf,
Td + 4 =< Tf},
minimize(Tf).

在swi-prolog中导致

Ta = 0,
Tb = 2,
Td = 5,
Tf = 9,
{_G371>=0, _G377=2-_G371, _G371=<2, Tc=4-_G371}.

结果很好(即使它如果刚好书中的{Tc =&lt; 4} {Tc> = 2}那样会更漂亮),但我不明白为什么它会增加'_G377 = 2-_G371'部分, - 这似乎非常不必要......

为什么这个额外变量(_G377)被添加到结果中?

万一其他人正在读这本书:我改变了'Ta =&lt; 0'到'Ta&gt; = 0',我相信'Ta =&lt; 0'是书中的错误。

1 个答案:

答案 0 :(得分:2)

您显示的答案表明您使用的是library(clpq)而非library(clpr)。在SICStus Prolog中这个库的原始实现中,我得到:

| ?- {Ta >= 0,
Ta + 2 =< Tb,
Ta + 2 =< Tc,
Tb + 3 =< Td,
Tc + 5 =< Tf,
Td + 4 =< Tf},
minimize(Tf).     
Ta = 0,
Tb = 2,
Td = 5,
Tf = 9,
{Tc=<4},
{Tc>=2} ? 
yes

所以这似乎是SWI中的一个错误。可能还有一些变量未被预测。