z3 教程:为什么 return UNSAT?
z3 tutorial: why does this return UNSAT?
我是 Z3(和一般的 SMT 求解器)的新手,我一直在经历 Z3 tutorial。在关于量词的部分,它有我 运行 以下代码:
(declare-fun f (Int) Int)
(declare-fun g (Int) Int)
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(assert (forall ((x Int))
(! (= (f (g x)) x))))
(assert (= (g a) c))
(assert (= (g b) c))
(assert (not (= a b)))
(check-sat)
并且 运行宁此 returns UNSAT。但这似乎是可以满足的:只要取 a = 1, b = 2, c = 1, f(x) = 1 - x, 如果 x = 0 则 g(x) = 0,否则取 1。然后 a != b, g (a) = g(b) = 1,我们没有固定点,因为 f(g(x)) 将所有内容都映射到 0,除了 0 本身,它被映射到 1。
我哪里错了?
好吧,你的作业不满足量化公理,即:
f (g 0) == 0
在 0
实例化时。根据您的定义,这意味着 1 == 0
,这是不正确的。
我怀疑您混淆了 !
的含义。不是否定。 (即 not
。)感叹号用于在 SMTLib 中提供注释。请参阅 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf
的第 3.6.5 节
我是 Z3(和一般的 SMT 求解器)的新手,我一直在经历 Z3 tutorial。在关于量词的部分,它有我 运行 以下代码:
(declare-fun f (Int) Int)
(declare-fun g (Int) Int)
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(assert (forall ((x Int))
(! (= (f (g x)) x))))
(assert (= (g a) c))
(assert (= (g b) c))
(assert (not (= a b)))
(check-sat)
并且 运行宁此 returns UNSAT。但这似乎是可以满足的:只要取 a = 1, b = 2, c = 1, f(x) = 1 - x, 如果 x = 0 则 g(x) = 0,否则取 1。然后 a != b, g (a) = g(b) = 1,我们没有固定点,因为 f(g(x)) 将所有内容都映射到 0,除了 0 本身,它被映射到 1。
我哪里错了?
好吧,你的作业不满足量化公理,即:
f (g 0) == 0
在 0
实例化时。根据您的定义,这意味着 1 == 0
,这是不正确的。
我怀疑您混淆了 !
的含义。不是否定。 (即 not
。)感叹号用于在 SMTLib 中提供注释。请参阅 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf