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!好极了那很好用。谢谢你,韦梅尔!