【问题标题】:Using "If statement" - OZ使用“If 语句” - OZ
【发布时间】:2015-03-29 15:35:07
【问题描述】:

我在莫扎特中使用“if 语句”时遇到问题。程序启动但它给出的唯一结果是:1#_。我想知道为什么它现在起作用了。

declare PSO

proc{PSO W}
  X1 X2 X3 X4
  Y1 Y2 Y3 Y4
in   
   X1::1#6
   X2::1#6
   X3::1#6
   X4::1#6
   Y1::1#6
   Y2::1#6
   Y3::1#6
   Y4::1#6

   if X1 > 1 then Y1 =: 2 else Y2=:3
   end

   W=w(x1:X1 y1:Y1 x2:X2 y2:Y2 x3:X3 y3:Y3 x4:X4 y4:Y4)

   {FD.distribute ff W}   
end
{ExploreOne PSO}

【问题讨论】:

  • 我发现这些 X1::1#6... 造成了麻烦,但不知道为什么以及如何解决它。

标签: oz mozart


【解决方案1】:

问题是:您正在尝试评估X > 1,尽管此时X 尚未完全确定。所以程序在这一点上只是阻塞。

您可以将有问题的语句移到distribute 之后:

W=w(x1:X1 y1:Y1 x2:X2 y2:Y2 x3:X3 y3:Y3 x4:X4 y4:Y4)
{FD.distribute ff W}   

if X1 > 1 then Y1 =: 2 else Y2=:3
end

distribute 之后的所有变量都会有具体的值。

或者您将 if-else-statement 替换为逻辑编程构造:

choice
   X1 >: 1
   Y1 =: 2
[] X1 =<: 1
   Y2 =: 3
end

后者通常在约束规划问题中更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2011-06-09
    • 2014-06-05
    相关资源
    最近更新 更多