下午好,
在处理无界通用量词时,我遇到过Alloy的问题。正如Daniel Jackson的书“软件抽象”(第5.3节“无界通用量词”)中所解释的那样,Alloy在通用量词和断言检查方面有一个微妙的限制。合金在某些情况下产生虚假的反例,例如下一个检查集合是否在联合下关闭(如上所述):
sig Set {
elements: set Element
}
sig Element {}
assert Closed {
all s0, s1: Set | some s2: Set |
s2.elements = s0.elements + s1.elements
}
check Closed for 3
制作一个反例,例如:
Set = {(S0),(S1)}
Element = {(E0),(E1)}
s0 = {(S0)}
s1 = {(S1)}
elements = {(S0,E0), (S1,E1)}
其中分析器没有填充具有足够值的Set(缺少Set原子,S2,包含S0和S1的并集)。
然后在书中提出了这个一般问题的两种解决方案:
1)声明生成器公理,强制Alloy生成所有可能的实例。 例如:
fact SetGenerator{
some s: Set | no s.elements
all s: Set, e: Element |
some s': Set | s'.elements = s.elements + e
}
但是,此解决方案会产生范围爆炸,并可能导致不一致。
2)省略发生器公理并使用有界通用形式进行约束。也就是说,量化变量的边界表达式没有提到生成的签名的名称。但是,并非所有断言都能以这种形式表达。
我的问题是:是否有任何具体规则可以选择这些解决方案?我从书中不清楚这一点。
感谢。
答案 0 :(得分:0)
不,没有具体的规则(或者至少没有我提出过的规则)。在实践中,这并不经常出现,所以我会在每个案例出现时处理它。你有一个特定的例子吗?
另外,请记住,有时您可以使用更高阶的量词(即一组或关系上的量词)来表达您的问题,在这种情况下,您可以使用Alloy *,这是Alloy的扩展,支持更高阶的分析。