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



我正在关注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=<4}{Tc>=2},它会更漂亮),但我不明白为什么它会添加"_G377=2-G371"部分,这似乎非常没有必要。。。

为什么要将这个额外的变量(_G377)添加到结果中

以防其他人正在阅读这本书:我已经更改了'Ta=<"0"到"Ta>=0",因为我相信"Ta=<"0"是书中的错误

您显示的答案表明您使用的是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中的一个错误。可能有些变量还没有被投射出去。

最新更新