使用“禁止溢出:是”的合金整数比较语义

时间:2014-03-10 09:08:32

标签: alloy

我有以下Alloy模块并运行命令:

sig A { x : set A }
run {all a: A| #a.x<3 and #a.x>1} for exactly 2 A, 2 int

使用“禁止溢出:否”合金分析仪4.2(生成日期:2012-09-25)找不到实例。我相信原因是由于常量3的溢出,运行谓词读取{all a: A| #a.x<-1 and #a.x>1}

使用“禁止溢出:是”,Alloy Analyzer会找到一个实例。

---INSTANCE---
integers={-2, -1, 0, 1}
univ={-1, -2, 0, 1, A$0, A$1}
Int={-1, -2, 0, 1}
seq/Int={0}
String={}
none={}
this/A={A$0, A$1}
this/A<:x={A$0->A$0, A$0->A$1, A$1->A$0, A$1->A$1}

Alloy Evaluator告诉我,run命令中使用的谓词{all a: A| #a.x<3 and #a.x>1}的计算结果为false

有人可以解释一下这种行为吗?评估器和分析器中的整数比较的语义是否存在差异?

编辑:我注意到最新实验版本的行为有所不同:Alloy 4.2_2014-03-07。它找不到实例。此行为符合预期。

1 个答案:

答案 0 :(得分:2)

您已在问题中提供了所有正确的答案,因此我只能快速重申这些答案

  • 预期行为(无实例)是该模型的“正确”行为;
  • 版本4.2有一些关于处理溢出的已知错误,所以这就是它找到一个实例的原因(那些应该在最新版本中修复,因此这个模型的行为正确);
  • 在整数的“环绕”语义下(关闭溢出检测),仍然没有实例,正是因为你描述的原因(-3被视为-1);
  • 评估者仍然存在一些问题(即使在最新版本中),所以有时它只会使用环绕语义。