为Alloy提供自定义字符串的“池”

时间:2014-12-10 09:52:48

标签: alloy

我对使用String类型的Alloy感兴趣(特别是因为它允许使用特殊字符)。 我注意到,为了将一个给定的String添加到一个实例,将它包含在一个表达式中就足够了。例如

fact stringInsert{
   none!="a"+"b"+"c"
}

将导致在任何生成的实例中创建原子“a”,“b”和“c”。

现在我的问题是,有没有办法声明一个字符串池,定义可能出现在可满足的实例中的所有可能的字符串原子,但是哪个数字符合给定的范围并且可以进一步约束?

作为一个例子,如果我们将上述事实视为声明一个字符串原子池{“a”,“b”,“c”},我希望从使用此池的模型执行获得的实例全局范围2只包含这三个字符串中的两个“a”,“b”和“c”。

1 个答案:

答案 0 :(得分:1)

您只能为String声明完全范围,例如

run {} for 3 but exactly 5 String

目前不可能仅给出字符串的上限,例如for 5 String,并要求Alloy找到最多5个字符串的解决方案(相对于其他约束)。因此,如果您尝试在上面的示例中将String的范围设置为2,您仍将获得模型中声明的所有3个字符串文字(“a”,“b”,“c”),这是一致的字符串文字是“一个sigs”扩展抽象String sig;另一方面,如果你将范围设置为5,Alloy将生成2个额外的字符串原子,“String $ 0”和“String $ 1”。