基数运算符 (#) 错误结果 Alloy
cardinality operator (#) wrong results in Alloy
我正在使用 # 运算符获取笛卡尔积 (A->B) 和并集 (A+B) 的基数。但它 returns 奇怪的负数,我不知道它们是什么!?
请查看下面的快照,其中显示了我的模型的 A->B 和 A+B 内容以及使用 # 运算符给我的基数 Alloy。 (我希望第一次得到 12,第二次得到 8,但我第一次得到 -4,第二次得到 -8)
有什么意见吗?!
以下是我的说明,如果有帮助的话:
open util/relation
sig A {}
sig B{}
sig C{r1: one A,r2:one B}
run {} for 6
默认情况下,Alloy 整数是 4 位二进制补码值,因此可能值的范围 运行s 从 -8 到 7。出于与设计中复杂权衡相关的原因和实现,分析器通过环绕处理有限范围的整数。在您的示例中,A->B 的基数为 12,超出了可用范围;值回绕,计算器显示值 -4。
要允许高达 12 的基数,最简单的解决方法是确保 Int 的位宽大于 4,在范围规范中使用关键字 int
。
具体来说:将run {} for 6
改为run {} for 6 but 5 int
。 (你当然可以使用大于 5 的位宽。)
较新版本的 Alloy 也有一个禁止溢出选项,它可以防止在 运行 或检查断言时出现虚假示例和反示例。
另见最近的问题
我正在使用 # 运算符获取笛卡尔积 (A->B) 和并集 (A+B) 的基数。但它 returns 奇怪的负数,我不知道它们是什么!?
请查看下面的快照,其中显示了我的模型的 A->B 和 A+B 内容以及使用 # 运算符给我的基数 Alloy。 (我希望第一次得到 12,第二次得到 8,但我第一次得到 -4,第二次得到 -8)
有什么意见吗?!
以下是我的说明,如果有帮助的话:
open util/relation
sig A {}
sig B{}
sig C{r1: one A,r2:one B}
run {} for 6
默认情况下,Alloy 整数是 4 位二进制补码值,因此可能值的范围 运行s 从 -8 到 7。出于与设计中复杂权衡相关的原因和实现,分析器通过环绕处理有限范围的整数。在您的示例中,A->B 的基数为 12,超出了可用范围;值回绕,计算器显示值 -4。
要允许高达 12 的基数,最简单的解决方法是确保 Int 的位宽大于 4,在范围规范中使用关键字 int
。
具体来说:将run {} for 6
改为run {} for 6 but 5 int
。 (你当然可以使用大于 5 的位宽。)
较新版本的 Alloy 也有一个禁止溢出选项,它可以防止在 运行 或检查断言时出现虚假示例和反示例。
另见最近的问题