Z3 是否找到两个公式相等的逻辑条件?

Z3 是否找到两个公式相等的逻辑条件?,z3,z3py,Z3,Z3py,我发了一个帖子,但是我觉得不是很清楚。我想把这个问题重新表述如下: 如果a==0,则两个公式a1==a+b(1)和a1==b(2)是等价的。给定这些公式(1)和(2),我如何使用Z3 python找出这个必要条件(a==0),使上述公式变得等效 我假设a1、a和b都是BitVecs(32)格式 编辑:我想出了如下代码: from z3 import * a, b = BitVecs('a b', 32) a1 = BitVec('a1', 32) s = Solver() s.add(ForA

我发了一个帖子,但是我觉得不是很清楚。我想把这个问题重新表述如下:

如果
a==0
,则两个公式
a1==a+b
(1)和
a1==b
(2)是等价的。给定这些公式(1)和(2),我如何使用Z3 python找出这个必要条件(
a==0
),使上述公式变得等效

我假设
a1
a
b
都是
BitVecs(32)
格式

编辑:我想出了如下代码:

from z3 import *

a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)
s = Solver()
s.add(ForAll(b, a + b == b))
if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Not Equ'
输出为:
a=0
,如预期的那样

但是,当我稍微修改代码以使用两个公式时,它不再有效:

from z3 import *

a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)

f = True
f = And(f, a1 == a * b)

g = True
g = And(g, a1 == b)

s = Solver()
s.add(ForAll(b, f == g))
if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Not Equ'
现在的输出不同了:
a=1314914305

因此,问题是:

(1) 为什么第二个代码会产生不同(错误)的结果

(2) 有没有办法不用ForAll(或量词)就可以做到这一点


谢谢

这两个代码生成相同的正确答案a=0。你有一个打字错误:你正在写作 a1=a*b,它必须是a1=a+b。你同意吗

不使用ForAll的可能代码:

a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)
s = Solver()
s.add(a + b == b)
if s.check() == sat:
print 'a =', s.model()[a]
else:
print 'Not Equ'
s1 = Solver()
s1.add(a==0, Not(a + b == b))
print s1.check()
输出:

a = 0
unsat

如果你已经提出了一个新问题,而不是改进了以前的问题,那么至少提供一个到后一个问题的链接。我认为,提出新问题比修改旧问题更容易理解。我添加了链接。谢谢。第二个代码段产生了一个不同的结果,因为解算器可以选择a1的值,使两个公式的计算结果相同-它确实如此。为了防止这种情况发生,你还需要对a1进行量化。弗拉基米尔,这似乎解决了我的问题!对于这个问题,你有没有办法避免使用所有的量词?谢谢Juan,我确实打错了,但问题是:为什么结果是
a=1314914305
,而不是
a=1
?(因为a*b==b和每个'b',我们应该有a==1)。Juan,您的解决方案的第二个问题是:s.check()生成一个模型,但该模型对于
b
的所有值可能都不是真的。我想要的是找到
a
,这样
a+b==b
每一个
b
,所以我想我无法避免所有的
。如果我错了,请纠正我。如您所见,第一个解算器获得值a=0,然后第二个解算器生成输出“unsat”,然后在a=0时,每b生成一个a+b=b。你同意吗?Juan,正如我所说的,模型可能给出不同的值(a!=0),所以我认为你的结论不正确。弗拉基米尔的回答对我来说似乎是最好的。