合金 - 设置差异导致vars和子句,设置联合不

时间:2014-11-20 18:23:27

标签: alloy

我很好奇评估何时开始,显然某些运营商转化为条款而不是评估:

abstract sig Element {}
one sig A,B,C extend Element {}

one sig Test {
  test: set Element
}

pred Test1 { Test.test = A+B }
pred Test2 { Test.test = Element-C }

并分别为Test1Test2运行它将提供不同数量的变量/子句,具体为:

Test1: 0 vars, 0 primary vars, 0 clauses
Test2: 5 vars, 3 primary vars, 4 clauses

虽然Elementabstract并且其所有成员及其基数都是已知的,但差异似乎不是事先计算的,而总和是。我不想做任何假设,所以我对这是为什么感兴趣。 +运算符是特殊的吗?

为了给出一些上下文,我试图限制关系的域,并发现,仅使用+似乎更有效,即使事先完全知道这些集合。

1 个答案:

答案 0 :(得分:1)

  

为了给出一些上下文,我尝试限制关系的域,并发现,仅使用+似乎更有效,即使事先完全知道集合。

这几乎是正确的结论。原因是合金分析仪试图推断某些合金成语的关系界限。它使用保守的近似值,对于集合联合和乘积总是合理的,但不是用于设置差异。这就是为什么上面的例子中的Test1合成分析器推断出test关系(this/Test.test: [[[A$0], [B$0]]])的固定界限,因此不需要调用解算器;对于Test2test关系的边界不能缩小,因此被设置为最宽松的(this/Test.test: [[], [[A$0], [B$0], [C$0]]]),因此需要调用求解器来找到满足约束的解决方案给出了界限。