我对使用String类型的Alloy感兴趣(特别是因为它允许使用特殊字符)。 我注意到,为了将一个给定的String添加到一个实例,将它包含在一个表达式中就足够了。例如
fact stringInsert{
none!="a"+"b"+"c"
}
将导致在任何生成的实例中创建原子“a”,“b”和“c”。
现在我的问题是,有没有办法声明一个字符串池,定义可能出现在可满足的实例中的所有可能的字符串原子,但是哪个数字符合给定的范围并且可以进一步约束?
作为一个例子,如果我们将上述事实视为声明一个字符串原子池{“a”,“b”,“c”},我希望从使用此池的模型执行获得的实例全局范围2只包含这三个字符串中的两个“a”,“b”和“c”。
答案 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”。