我正在关注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'是书中的错误。
答案 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中的一个错误。可能还有一些变量未被预测。