gpt4 book ai didi

Minizinc 嵌套输出循环

转载 作者:行者123 更新时间:2023-12-02 21:37:33 26 4
gpt4 key购买 nike

我正在尝试编写一个带有嵌套循环的输出语句,以及在外部级别的重要输出。如果 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 构造,并清楚地表明我们在每个内部循环之前/之后添加额外的输出。

最佳答案

正如您已经说过的:MiniZinc 输出语句可能有点尴尬。输出语句由关键字output 和后跟的字符串数组组成。在很多情况下,我们希望使用 for 循环,但在像 MiniZinc 这样的声明性语言中,这种控制流结构不可用。

不过,您已经提供了解决方案:数组推导式!看来你已经快到了,但你的语法有点不对劲,你可能不明白它们实际上是如何工作的。数组理解类似于 for 循环,因为它会迭代集合中的所有值。但是,它的不同之处在于它不仅执行循环中的语句,而且还对它们进行求值,并且所有结果都需要具有相同的类型,在本例中为字符串。

您正在编写的输出语句可以这样写:

output [
"Foo: \(f)\n"
++ concat(["\(myArray[f,b,q])"
++ if q == max(Quz
then "\n"
else " "
endif
|b in Bar, q in Quz])
++ "\n"
| f in Foo];

关于Minizinc 嵌套输出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com