Я пытаюсь написать оператор вывода с вложенными циклами и нетривиальным выводом на внешних уровнях. Если бы в 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, вложенный для цикла, который отличается, потому что весь вывод находится внутри внутреннего самая петля. Мне также нужен вывод во внешних циклах.
Я думаю, что более четкая версия принятого ответа была бы
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 и дает понять, что мы добавляем дополнительный вывод до / после каждого внутреннего цикла.