1

我正在关注 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”是书中的错误。

4

1 回答 1

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中的一个错误。可能有些变量还没有被排除。

于 2013-11-23T21:41:29.893 回答