使用 "If statement" - OZ
Using "If statement" - OZ
我在使用莫扎特 "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}
问题是:尽管此时 X
尚未完全确定,但您正在尝试评估 X > 1
。所以这个过程只是在这一点上阻塞。
您可以将有问题的语句移到 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
后者通常在约束规划问题中更有效。
我在使用莫扎特 "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}
问题是:尽管此时 X
尚未完全确定,但您正在尝试评估 X > 1
。所以这个过程只是在这一点上阻塞。
您可以将有问题的语句移到 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
后者通常在约束规划问题中更有效。