一致性检查与Alloy中的矛盾事实

时间:2015-08-25 20:16:08

标签: alloy

我不明白合金中的事实是如何运作的。在这个小例子中有两个相互矛盾的事实,但谓词testWithoutParameters找到一个实例(不是预期的),不像谓词testWithParameters那样(预期)。两个断言都没有在他们应该做的时候找到反例。我的解释错误在哪里?代码和执行输出。

sig A{
    aset: set B
}

sig B{
    bset: set B
}

fact Rule_1{
    all a: A |
    #a.aset < 3
}

fact Rule_2{
    all a: A |
    #a.aset > 3
}

pred testWithoutParameters[]{
    all a:A |
    #a.aset = 3
}

pred testWithParameters[a:A, b:B]{
    #a.aset = 3
}

assert test_aset{
    all a:A |
    {
        #a.aset = 3
    }
}

assert testWithoutSense{
    all a: A |
    #a.aset > 3 and #a.aset < 3
}

run testWithParameters for 10
run testWithoutParameters for 10
check test_aset for 10
check testWithoutSense for 10

执行“运行testWithParameters for 10”    求解器= sat4j位宽= 0 MaxSeq = 0 SkolemDepth = 1对称性= 20    2910 vars。 240个主要变种。 6294条款。 14MS。    找不到实例。谓词可能不一致。的3ms。

执行“运行testWithoutParameters for 10”    求解器= sat4j位宽= 0 MaxSeq = 0 SkolemDepth = 1对称性= 20    2602 vars。 220个主要变种。 5499条款。 14MS。    。找到。谓词是一致的。 21ms。

执行“检查test_aset为10”    求解器= sat4j位宽= 0 MaxSeq = 0 SkolemDepth = 1对称性= 20    2834个变种。 230个主要变种。 6162条款。 14MS。    没有找到反例。断言可能有效。的3ms。

执行“检查testWithoutSense 10”    求解器= sat4j位宽= 0 MaxSeq = 0 SkolemDepth = 1对称性= 20    2844个变种。 230个主要变种。 6191条款。 13毫秒。    没有找到反例。断言可能有效。 7毫秒。

执行了4个命令。结果是:    #1:没有找到实例。 testWithParameters可能不一致。    #2:。testWithoutParameters是一致的。    #3:没有找到反例。 test_aset可能有效。    #4:没有找到反例。 testWithoutSense可能有效。

1 个答案:

答案 0 :(得分:3)

查看testWithoutParameters的解决方案:集合A始终为空。对于空集,通用量化公式总是正确的,因此矛盾并不重要。

另一方面,

testWithParameters包含A中至少有一个元素的隐含事实:参数a。但是没有a可以解决相互矛盾的事实,所以这个谓词没有解决方案。

编辑:找不到testWithoutSense的反例,原因相同。由于事实Rule_1Rule_2存在矛盾,因此您的模型始终被约束为不包含A中的元素。如果空A,则断言testWithoutSense很简单。