Alloy 对断言中的蕴涵运算符感到困惑
签名Alloy 对断言中的蕴涵运算符感到困惑,alloy,Alloy,签名Test有两个字段,a和b: sig Test { a: lone Value, b: lone Value } sig Value {} assert Valid_After_Removing_b_Value { all t, t': Test { t'.a = t.a no t'.b valid[t] => valid[t'] } } 请注意,a和b可能有值,也可能没有值 Test只有
Test
有两个字段,a
和b
:
sig Test {
a: lone Value,
b: lone Value
}
sig Value {}
assert Valid_After_Removing_b_Value {
all t, t': Test {
t'.a = t.a
no t'.b
valid[t] => valid[t']
}
}
请注意,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
的值:
sig Test {
a: lone Value,
b: lone Value
}
sig Value {}
assert Valid_After_Removing_b_Value {
all t, t': Test {
t'.a = t.a
no t'.b
valid[t] => valid[t']
}
}
我希望合金分析器生成这样的反例: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
没有值)也是有效的。由于相互依赖,这应该会产生反例 我认为你的主张应该是:
assert Valid_After_Removing_b_Value {
all t, t': Test {
(t'.a = t.a &&
no t'.b &&
valid[t]) => valid[t']
}
}
在最初的断言中,您断言了三个独立的东西。例如,每个带有
b
的t'
都将是一个反例。Bingo!好极了那很好用。谢谢你,韦梅尔!