我正在尝试编写一个带有嵌套循环的输出语句,以及外层的非平凡输出。如果Minizinc有一个顶级for
命令,我会做类似
for (f in Foo) (
output(["Foo: ", f])
for (b in Bar) (
for (q in Quz) (
output([myArray[f,b,q], " "]);
)
output(["\n"]);
)
output(["\n"]);
)
所以,如果
myArray = [[[1,2], [3,4]], [[5,6], [7,8]]];
它会输出
Foo: 1
1 2
3 4
Foo: 2
5 6
7 8
我想我可以用
之类的东西做到这一点output(if (b = 1 /\ q = 1) then "Foo: " ++ show(f) else "" endif ++
show(myArray[f,b,q] ++ " " ++
if (<maximum q>) <newline> ++
if (<maximum q and maximum b>) <newline>
| f in Foo, b in Bar, q in Quz);
但这似乎很尴尬(我的第一次尝试不起作用)。
我看到Minizinc nested for loop不同,因为所有输出都在最里面的循环中。我也想在外循环中输出。
我认为接受答案的稍微清晰的版本将是
output [
"Foo: \(f)\n"
++ concat(
concat([show(myArray[f,b,q]) ++ " " | q in Quz])
++ "\n"
| b in Bar])
++ "\n"
| f in Foo];
这避免了if / then / else构造,并清楚地表明我们在每个内循环之前/之后添加额外的输出。
答案 0 :(得分:3)
正如您已经说过的:MiniZinc输出语句可能有点尴尬。输出语句由关键字[nLine, nColumn, ~] = size(imRGB_River);
后跟一个字符串数组组成。在很多情况下我们想使用for循环,但是在像MiniZinc这样的声明性语言中,这种控制流结构是不可用的。
你已经提供了解决方案:数组理解!看起来你几乎就在那里,但是你的语法有些偏差,你可能无法理解它们是如何工作的。数组理解类似于for循环,因为它会迭代集合中的所有值。但是,它的不同之处在于它不仅仅执行循环中的语句,而是对它们进行计算,所有结果都必须是相同的类型,在这种情况下是字符串。
您正在编写的输出语句可以这样写:
output