使用“如果声明” - OZ

时间:2015-03-29 15:35:07

标签: oz mozart

我在莫扎特使用“if statement”时遇到问题。程序启动但只有它给出的结果是: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}

1 个答案:

答案 0 :(得分:0)

问题是:您正在尝试评估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

后者在约束编程问题中通常会更有效。