【发布时间】:2021-09-29 04:49:12
【问题描述】:
在下面的合金模型中,我想检查两个具有 Bool 字段类型的 sig 实例的相等性:
module test
open util/boolean as bool
sig Info {
active: Bool
}
assert assertion {
all x1, x2: Info |
x1.active = True && x2.active = True implies x1 = x2
}
check assertion for 10
此模型检查x_1 和x_2 是否相等,如果两者都将True 作为其active 字段。 Alloy 给出了一个反例,然而,在反例中,x_1 和 x_2 在结构上是相等的,但由于某种原因,Alloy 认为它们不相等。
编辑:
一个建议是使用子类型如下:
sig Info {}
sig ActiveInfo in Info {}
-- i is inactive if i in (Info - ActiveInfo)
但是,这不适合我的模型。
引用自软件抽象书:
" 平等是结构平等还是引用平等?
关系没有与其价值不同的身份,所以这种区别, 基于编程概念,在这里没有意义。如果两个关系具有相同的元组集,它们就不是两个关系:它们只是 一个和相同的关系。一个原子只不过是它的身份;当它们是同一个原子时,两个原子相等。如果你有一组原子 表示复合对象(使用一些关系将原子映射到它们的内容),您可以定义任何结构相等的概念 通过引入新的关系,您明确地想要。 (对于那些 C++ 程序员们:不,你不能在 Alloy 中重新定义等号。)”
我不太明白这一段。我很欣赏关于平等如何在合金中起作用的解释。特别是如何检查不同身份但相同值的原子是否相等?
【问题讨论】: