2017-03-16 60 views
1

我试图将教程的澳大利亚程序转换为使用数组。如何获得MiniZinc输出来解释转义,而不是逐字打印?

我有麻烦与输出,即:

% Coloring Australia using nc colors 

int: nc = 3; % number of colors 
int: ns = 7; % number of states 
array[1..nc] of string:  colors = ["red", "green", "blue"]; 
array[1..ns] of string:  states = ["wa","nt","sa","q","nsw","v","t"]; 
array[1..ns] of var 1..ns: indices = [1,2,3,4,5,6,7]; 

array[1..ns] of var 1..nc: color; % computed color for each state 

% I want to use the name as a mnemonic for the index of the state 
var int: wa=1; % I know of no alternative to the brute force method 
var int: nt=2; var int: sa=3; var int: q=4; 
var int: nsw=5; var int: v=6; var int: t=7; 

constraint color[wa] != color[nt]; % abutting states 
constraint color[wa] != color[sa]; 
constraint color[nt] != color[sa]; 
constraint color[nt] != color[q]; 
constraint color[sa] != color[q]; 
constraint color[sa] != color[nsw]; 
constraint color[sa] != color[v]; 
constraint color[q] != color[nsw]; 
constraint color[v] != color[nsw]; 

solve satisfy; 

/* 
    I want a loop to print it out like this: 
"wa" = "blue" 
"nt" = "green" 
... 
*/ 

output [ 
    show(["\n\(states[j]) = \(colors[color[j]])" | j in indices]) 
]; 
/* prints 

["\n\"wa\" = \"blue\"", "\n\"nt\" = \"green\"", "\n\"sa\" = \"red\"",  "\n\"q\" = \"blue\"", "\n\"nsw\" = \"green\"", "\n\"v\" = \"blue\"", "\n\"t\" = \"red\""] 
*/ 

我怎样才能得到展示,使\ n一个新行,而不是逃避的常量引号?像perl双引号而不是单引号?

和/或是否有任何方法来定义没有引号的常量?像perl qw一样?

回答

3

您在代码中犯了一个小错误:show用于输出变量。所以用它像:

output["this is variable x:" ++ show(x)] 

注意\(x)"++show(x)++"

output语句本身的速记将打印出给定阵列的格式化字符串。如预期的那样,此格式化的字符串可以包含转义字符。因此,您的型号的正确输出语句为:

output ["\n\(states[j]) = \(colors[color[j]])" | j in indices];