Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3Python:ForAll导致我的代码挂起,或者返回Unsat,为什么?_Z3_Z3py - Fatal编程技术网

Z3Python:ForAll导致我的代码挂起,或者返回Unsat,为什么?

Z3Python:ForAll导致我的代码挂起,或者返回Unsat,为什么?,z3,z3py,Z3,Z3py,我仍然在努力解决查找a值的问题,以便a*b==b具有b的所有值。预期结果是a==1。下面我有两个解决方案 (A)我使用下面代码中的所有量词实现了这一点(如果有不使用任何量词的解决方案,请更正我)。这个想法是为了证明f和g是等价的。 from z3 import * a, b, a1, tmp1 = BitVecs('a b a1 tmp1', 32) f = True f = And(f, tmp1 == b) f = And(f, a1 == a * tmp1) g= True g =

我仍然在努力解决查找
a
值的问题,以便
a*b==b
具有
b
的所有值。预期结果是
a==1
。下面我有两个解决方案

(A)我使用下面代码中的所有量词实现了这一点(如果有不使用任何量词的解决方案,请更正我)。这个想法是为了证明
f
g
是等价的。

from z3 import *

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

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

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

s = Solver()
s.add(ForAll([b, tmp1, a1], f == g))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'
然而,这个简单的代码永远不会返回结果。我想这是因为所有的。你知道怎么解决这个问题吗

(B)我用另一个版本再试了一次。这次我没有证明两个公式是等价的,而是把它们都放在一个公式中,逻辑上,我认为这是正确的,但如果我在这里错了,请纠正我:

from z3 import *

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

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

s = Solver()
s.add(ForAll([b, a1], f))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'
这次代码不会挂起,但会立即返回“Unsat”。你知道怎么解决这个问题吗


非常感谢。

您问题的直接表述提供了您期望的答案:

您建议的版本使用辅助变量a1、tmp、tmp1和您 对这些变量使用通用量化。这是不相符的
你想要的配方

尼古拉,实际上我要解决的问题不是简单的公式“a*b==b”,而是属于一个更广泛的问题。事实上,我要求解的公式总是有那些辅助变量(a1、tmp等)。请问,您对修改原代码(A)和(B)有什么建议吗?