[英]Checking Sig Equality in Alloy
在以下合金模型中,我想檢查具有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
的active
字段都為True
,則此模型會檢查它們是否相等。 Alloy 給出了一個反例,然而,在反例中, x_1
和x_2
在結構上是相等的,但由於某種原因,Alloy 認為它們不相等。
編輯:
一種建議是使用子類型如下:
sig Info {}
sig ActiveInfo in Info {}
-- i is inactive if i in (Info - ActiveInfo)
但是,這不適合我的模型。
引自《軟件抽象》一書:
"平等是結構平等還是參照平等?
關系沒有與其值不同的身份,因此這種基於編程概念的區別在這里沒有意義。 如果兩個關系具有相同的元組集,則它們不是兩個關系:它們只是一個且相同的關系。 一個原子不過是它的身份; 當兩個原子是同一個原子時,它們是相等的。 如果你有一組代表復合對象的原子(使用一些關系將原子映射到它們的內容),你可以通過引入一個新的關系來明確定義任何你想要的結構相等的概念。 (對於那些 C++ 程序員來說:不,你不能在 Alloy 中重新定義等號。)”
這一段我不是很明白。 我很欣賞關於合金中平等如何運作的解釋。 特別是如何檢查具有不同身份但相同值的原子的相等性?
我知道 Alloy 中的平等是基於價值觀的。
這不是真的。 x1
和x2
具有相同的active
值,但在簽名中是不同的原子。 這類似於在許多 OOP 語言中,兩個對象可以具有相同的結構值但具有不同的身份。
順便說一句,我建議使用子類型來表示布爾值。 你可以做
sig Info {}
sig ActiveInfo in Info {}
-- i is inactive if i in (Info - ActiveInfo)
如果願意,您可以將簽名中的字段視為“屬於”該簽名的原子,但最好將字段視為關系。 如果他們有同一個母親,你不會期望兩個人是一樣的:
sig Person {mother: Parent}
但是,如果您希望簽名具有沒有兩個不同成員具有相同字段的屬性,則可以將其添加為事實:
sig Coordinate {x, y: Value}
fact {all c, c': Coordinate | (c.x = c'.x and c.y = c'.y) implies c = c'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.