签名Test
有两个字段a
和b
:
sig Test {
a: lone Value,
b: lone Value
}
sig Value {}
请注意,a
和b
可能有也可能没有值。
Test
仅在满足此相关性时才有效:如果a
有值,则b
也必须具有值:
pred valid (t: Test) {
one t.a => one t.b
}
我想创建一个断言,我希望Alloy Analyzer找到反例。断言如下:如果t: Test
有效,则t': Test
也有效,其中t'
与t
相同,但t'
没有值b
:
assert Valid_After_Removing_b_Value {
all t, t': Test {
t'.a = t.a
no t'.b
valid[t] => valid[t']
}
}
我希望Alloy Analyzer能够产生这样的反例:t
具有a
和b
的值。 t'
的值为a
但不包含b
。因此,t
有效,但t'
不是。但是分析器提供了这样的示例:t
具有a
和b
的值,t'
具有a
和b
的值。我不明白。如果t
的值为a
和b
,则t
有效。同样,如果t'
的值为a
和b
,则t'
有效。怎么可能是一个反例?
表达断言的正确方法是什么?同样,我的目标是表达这一点:我断言如果t
有效,那么t
稍微较小的版本(例如,b
没有值)也是有效的。由于相互依赖性,这应该会产生反例。
答案 0 :(得分:3)
我认为你的断言应该是:
assert Valid_After_Removing_b_Value {
all t, t': Test {
(t'.a = t.a &&
no t'.b &&
valid[t]) => valid[t']
}
}
在你原来的断言中,你断言三个独立的东西。例如,t'
的每个b
都已经成为一个反例。