我很好奇评估何时开始,显然某些运营商转化为条款而不是评估:
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 }
并分别为Test1
和Test2
运行它将提供不同数量的变量/子句,具体为:
Test1: 0 vars, 0 primary vars, 0 clauses
Test2: 5 vars, 3 primary vars, 4 clauses
虽然Element
是abstract
并且其所有成员及其基数都是已知的,但差异似乎不是事先计算的,而总和是。我不想做任何假设,所以我对这是为什么感兴趣。 +
运算符是特殊的吗?
为了给出一些上下文,我试图限制关系的域,并发现,仅使用+
似乎更有效,即使事先完全知道这些集合。
答案 0 :(得分:1)
为了给出一些上下文,我尝试限制关系的域,并发现,仅使用+似乎更有效,即使事先完全知道集合。
这几乎是正确的结论。原因是合金分析仪试图推断某些合金成语的关系界限。它使用保守的近似值,对于集合联合和乘积总是合理的,但不是用于设置差异。这就是为什么上面的例子中的Test1
合成分析器推断出test
关系(this/Test.test: [[[A$0], [B$0]]]
)的固定界限,因此不需要调用解算器;对于Test2
,test
关系的边界不能缩小,因此被设置为最宽松的(this/Test.test: [[], [[A$0], [B$0], [C$0]]]
),因此需要调用求解器来找到满足约束的解决方案给出了界限。