簡體   English   中英

合金中的值分配和枚舉的使用

[英]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
  • 沒有定義String原子。 那是合金的怪異部分之一。 如果要在模型中使用字符串,則需要在特定位置(例如,事實中)指定字符串文本。

這是您的模型,已更正:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM