z3教程:为什么这会返回UNSAT?

时间:2018-03-08 01:35:45

标签: z3 smt

我是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)

运行此命令返回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。

我在哪里错了?

1 个答案:

答案 0 :(得分:0)

嗯,你的任务并不能满足量化的公理,即:

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节