[英]Value assignment in Alloy and use of Enum
如何在Alloy中分配變量?
Sig ClassA{
variable_1: String,
variable_2: Int
}
Sig ClassB{
variable_1: String,
variable_2: Int
}
pred isLess[a:ClassA,b:ClassB]{
a.variable_2 < b.variable_2
}
assert integrityTest{
all a:ClassA,b:ClassB| isLess[a,b]
}
現在,當我在a.variable_2中分配比b.variable_2更大的值時,我想檢查變量的反例。 但是我不確定如何在Alloy中分配變量。 我想出的唯一東西是跟隨但不能正常工作-
pred assignValue[a:ClassA]{
a.variable_2 = Int[4]
}
但是,我相信它將只檢查4的相等性並返回false。 它與任務無關。 所以我的問題是當a.variable_2>b.variable_2
時我應該如何產生反例
以及如何在合金中使用Enum of Int? Like- Enum MetricValue {1,2,3,4,5}
分配變量1。
編輯我仍然很難找到反例,即使我可以通過手動檢查切換ca和cb的variable_2的值來找到反例。
sig ClassA{
variable_1: String,
variable_2 = Int
}
sig CA extends ClassA{}{
variable_2 = 1
}
sig ClassB{
variable_1: String,
variable_2 = Int
}
sig CB extends ClassB{}{
variable_2 = 4
}
pred checkAllConstraint [ca: ClassA, cb: ClassB] {
ca.variable_2 > cb.variable_2 }
assert checkAll{
all ca: ClassA, cb: ClassB | checkAllConstraint[ca,cb]
}
check checkAll for 15
您可以通過事實將字段限制為單個值。 在您的情況下,簽名事實很方便。
它看起來像這樣:
sig ClassA{
variable_1: String,
variable_2: Int
}{
variable_1="hello world"
variable_2=4
}
要將字段綁定到一組值中的一個值,可以使用“ in”關鍵字代替“ =”,如下所示:
sig ClassA{
variable_1: String,
variable_2: Int
}{
variable_1 in ("hello" + "world")
variable_2 in (1+2+3+4)
}
注意,Alloy +中是UNION運算符。 它不像您期望的那樣求和或連接。
編輯它不起作用有兩個原因:
variable_2 = Int
而不是variable_2: Int
。 這樣做,沒有有效的實例包含由CA或CB類型的原子,因為例如ClassA.variable2
被約束為所有整數的集合,而CA.variable2
被約束為1 這是您的模型,已更正:
sig ClassA{
variable_1: String,
variable_2 : Int
}
sig CA extends ClassA{}{
variable_2 = 1
}
sig ClassB{
variable_1: String,
variable_2 : Int
}
sig CB extends ClassB{}{
variable_2 = 4
}
pred checkAllConstraint [ca: ClassA, cb: ClassB] {
ca.variable_2 > cb.variable_2 }
assert checkAll{
all ca: ClassA, cb: ClassB | checkAllConstraint[ca,cb]
}
check checkAll for 15
fact { String in ("test"+"test2"+"test3"+"test4")}
如果仍有問題,請重新創建一個。
-
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.