我是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。
我在哪里错了?
答案 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