如何在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
我如何在合金中使用Int枚举?像-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
答案 0 :(得分: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输入的原子,因为例如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")}
如果仍有问题,请创建一个新问题。
-