在断言中对蕴涵运算符感到困惑

时间:2017-09-01 18:32:55

标签: alloy

签名Test有两个字段ab

sig Test {
    a: lone Value,
    b: lone Value
}

sig Value {}

请注意,ab可能有也可能没有值。

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具有ab的值。 t'的值为a但不包含b。因此,t有效,但t'不是。但是分析器提供了这样的示例:t具有ab的值,t'具有ab的值。我不明白。如果t的值为ab,则t有效。同样,如果t'的值为ab,则t'有效。怎么可能是一个反例?

表达断言的正确方法是什么?同样,我的目标是表达这一点:我断言如果t有效,那么t稍微较小的版本(例如,b没有值)也是有效的。由于相互依赖性,这应该会产生反例。

1 个答案:

答案 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都已经成为一个反例。