【问题标题】:why this code returns Unsat?为什么此代码返回 Unsat?
【发布时间】:2013-07-01 05:58:29
【问题描述】:

给定c == a + 4t == c + b,如果b == -4,那么t == a。我试图做相反的事情,这意味着鉴于上述 2 个方程和 t == a,我试图找到 b 的值。

这和related question很相似,但是这次我只切换ab,我真的很困惑代码返回的结果不同。

按照上面链接中发布的代码,我有以下代码(类似,仅ab 切换):

#!/usr/bin/python
from z3 import *

a, b, c, t = BitVecs('a b c t', 32)

g = True
g = And(g, c == (a + 4))
g = And(g, t == (c + b))

s = Solver()
s.add(ForAll([t, a, c], Implies(t == a, g)))
if s.check() == sat:
    print s.model()[b]
else:
    print 'Unsat'

但是,在 Ubuntu 上,运行上述代码会返回意外结果 Unsat,但不会返回值 -4(或 0xfffffffc

知道为什么这是错误的吗?

非常感谢。

【问题讨论】:

  • Round 2???我们在这里参加测验吗?
  • 不,我想说的是这与另一个问题有关。无论如何,我修复了标题以使其不那么混乱。谢谢。

标签: z3 z3py


【解决方案1】:

Z3 实际上返回了unknowncheck 方法返回:satunsatunknown。 这是一个自定义策略,表明该公式确实不饱和。

#!/usr/bin/python
from z3 import *
a, b, c, t = BitVecs('a b c t', 32)

g = True
g = And(g, c == (a + 4))
g = And(g, t == (c + b))

s = Goal()
s.add(ForAll([t, a, c], Implies(t == a, g)))

T = Then("simplify", "der", "distribute-forall")
# print the simplified formula. Note that it is unsat
print T(s)

# Create a solver using the tactic above and qe

s = Then("simplify", "der", "distribute-forall", "qe", "smt").solver()
s.add(ForAll([t, a, c], Implies(t == a, g)))
print s.check()

更新 公式的形式为

forall t, a, c: t == a ==> c == (a + 4) and t == (c + b).

这个公式在逻辑上等价于:

forall a, c: c == (a + 4) and a == (c + b).

逻辑上等价于

(forall a, c: c == (a + 4)) and (forall a, c: a == (c + b)).

这两个子公式在逻辑上都等价于 false。 这就是公式不可满足的原因。

您写的评论表明您认为您创建的公式略有不同

forall t, a, c: t == a ==> c == (a + 4) ==> t == (c + b).

这个公式是sat。要创建这个公式,我们必须替换

g = True
g = And(g, c == (a + 4))
g = And(g, t == (c + b))

g = Implies(c == (a + 4), t == (c + b))

更新后的示例可用here

【讨论】:

  • 哦,那 Unknown 真的没用。 Leo,你有什么解决这个问题的方法吗?谢谢!
  • 我们可以通过使用自定义 Z3 策略/策略来证明该公式是不饱和的。我用策略更新了答案。
  • Leo,我真的很困惑:如果b==-4,那么t == c+b == (a+4)+-4 == a 的所有值都是a。明明(t == a) => g满足b==4,那为什么上面的公式返回Unsat??谢谢
  • 其实我原来的问题是,给定上面的g 公式(或者更复杂的东西),我想找到b 的值,这样t==a 对其他所有值都是正确的变量(b 除外)。这就是我提出公式ForAll([t, a, c], Implies(t == a, g)) 的原因。您认为这是解决我的问题的正确方法吗?非常感谢!
  • 我更新了答案,解释了为什么原始公式不能满足。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2022-06-16
相关资源
最近更新 更多