0

如何在合金中分配变量?

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 更大的值时,我想检查变量的反例。但我不确定如何在合金中分配变量。我想出的唯一一件事是跟随,但它不起作用-

pred assignValue[a:ClassA]{
    a.variable_2 = Int[4]  
}

但是,我相信它只会检查与 4 的相等性并返回为假。它与任务无关。所以我的问题是我应该如何产生反例a.variable_2>b.variable_2

以及如何在合金中使用 Int 枚举?喜欢-分配一个.variable 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
4

1 回答 1

1

您可以通过事实将字段限制为单个值。在您的情况下,签名事实会派上用场。

它看起来像这样:

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 类型的原子,因为 egClassA.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")}

如果您仍有疑问,请创建一个新问题。

-

于 2019-03-14T06:49:03.800 回答