我不明白合金中的事实是如何运作的。在这个小例子中有两个相互矛盾的事实,但谓词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可能有效。
答案 0 :(得分:3)
查看testWithoutParameters
的解决方案:集合A
始终为空。对于空集,通用量化公式总是正确的,因此矛盾并不重要。
testWithParameters
包含A
中至少有一个元素的隐含事实:参数a
。但是没有a
可以解决相互矛盾的事实,所以这个谓词没有解决方案。
编辑:找不到testWithoutSense
的反例,原因相同。由于事实Rule_1
和Rule_2
存在矛盾,因此您的模型始终被约束为不包含A
中的元素。如果空A
,则断言testWithoutSense
很简单。