1

我尝试生成具有所有不同值的 uint ( my_list_of_list) 列表的动态列表(我有一个变量num_of_ms_in_each_g : list of uint,它将每个列表的长度保持在内部my_list_of_list):

  var my_list_of_list : list of list of uint;
  gen my_list_of_list keeping {
     for each (g) using index (g_idx) in it {
        g.size() == num_of_ms_in_each_g[g_idx];
        for each (m) using index (m_idx) in g {
           // Error in the next line:
           m not in it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1]; 
           m not in it[g_idx][0..max(0, m_idx-1)];
        };
  };

代码算法说明:生成m(值)之前尚未出现在任何 uint ( g) 列表中,并且未出现在先前索引的当前列表中。

我得到编译错误:

  *** Error: 'm' is of type 'uint', while expecting type 'list of uint' or
'list of list of uint'.

您知道如何解决编译错误吗?(it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1] 是 uint ..)或者也许是另一种即时生成list of list of uint具有所有不同值的方法?谢谢您的帮助。

4

2 回答 2

1

我将通过使用一种包含所有项目的统一列表来降低此约束的复杂性,然后将此列表分解为所需的列表列表(因为生成单个唯一列表更容易)。此外,一般来说,最好将所有非生成操作保持在约束之外,因为它可以在之后以程序方式完成,这将提高生成此类字段集的整体性能。

我将使用以下代码执行此操作:

   var unified_list:list of uint;
    var my_list_of_list : list of list of uint;
    gen unified_list keeping { 
        it.size()==num_of_ms_in_each_g.sum(it);
        it.all_different(it);
    };
    for each in num_of_ms_in_each_g {
        var temp_list:list of uint;
        for i from 0 to it-1 {
            temp_list.add(unified_list.pop0());
        };
        my_list_of_list.add(temp_list);
        };

谢谢

于 2016-01-13T09:53:30.233 回答
1

实际上,表达式it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1]是 type list of list of uint。操作员list[from..to]产生一个子列表。在您的代码中,您将它应用两次it,首先生成一个子列表,然后生成子列表的子列表。

您的代码中的第二个此类约束有效,因为it[g_idx]它不会生成子列表,而是访问一个列表项,该列表项具有类型list of uint,然后生成子列表。

要生成一个完全不同的列表列表,我会执行以下操作:

var my_list_of_list : list of list of uint;
for each (sz) in num_of_ms_in_each_g {
    var l : list of uint;
    gen l keeping {
        it.size() == sz;
        it.all_different(it);
        //  not it.has(it in my_list_of_list.flatten());
        // for better performance
        for each (itm) in it {
            itm not in my_list_of_list.flatten();
        };
    };
    my_list_of_list.add(l);
};
于 2016-01-13T10:14:58.373 回答