合金 - 处理无界的通用量词

时间:2017-02-10 15:16:31

标签: scope assertion universal alloy quantifiers

下午好,

在处理无界通用量词时,我遇到过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)省略发生器公理并使用有界通用形式进行约束。也就是说,量化变量的边界表达式没有提到生成的签名的名称。但是,并非所有断言都能以这种形式表达。

我的问题是:是否有任何具体规则可以选择这些解决方案?我从书中不清楚这一点。

感谢。

1 个答案:

答案 0 :(得分:0)

不,没有具体的规则(或者至少没有我提出过的规则)。在实践中,这并不经常出现,所以我会在每个案例出现时处理它。你有一个特定的例子吗?

另外,请记住,有时您可以使用更高阶的量词(即一组或关系上的量词)来表达您的问题,在这种情况下,您可以使用Alloy *,这是Alloy的扩展,支持更高阶的分析。