使用 Z3 检查一阶公式的可满足性
Checking satisfiability of First Order Formula using Z3
我正在使用 Z3 尝试一些基本的 FOL 公式可满足性问题。我无法理解为什么下面的代码片段 returns 不满意。请帮忙。
如果可能的话,如果有人尝试过一些例子,其中带有量词的 FOL 给出 "Sat" 并且经过一些小的小改动给出 "Unsat" 作为输出,这将非常有帮助
除了 rise4fun 教程页面上提供的以外,是否存在一些简单的 FOL 公式代码片段可供研究。
(set-option :smt.mbqi true)
(declare-fun f (Real Real) Bool)
(declare-const a Real)
(declare-const b Real)
(assert (forall ((x Real)) (and (f a x) (> x 6))))
(assert (and (f a b) (> b 6) ))
(check-sat)
您的输入是 unsat
因为这个 assert
:
(assert (forall ((x Real)) (and (f a x) (> x 6))))
右边是连词。所以这就是说所有实数值 x
值都大于 6,这显然不是真的。事实上,您可以将整个输入简化为:
(assert (forall ((x Real)) (> x 6)))
(check-sat)
出于完全相同的原因,它仍然是 unsat
。
也许你的意思是这样的:
(set-option :smt.mbqi true)
(declare-fun f (Real Real) Bool)
(declare-const a Real)
(declare-const b Real)
(assert (forall ((x Real)) (=> (> x 6) (f a x))))
(assert (and (f a b) (> b 6) ))
(check-sat)
(get-value (f a b))
即f a x
是true
如果x
大于6?对于这个输入 z3 说:
sat
((f (lambda ((x!1 Real) (x!2 Real)) (= x!2 0.0)))
(a 0.0)
(b 7.0))
而且你可以看到这确实是一个令人满意的模型,虽然不是一个特别有趣的模型。
希望对您有所帮助!
我正在使用 Z3 尝试一些基本的 FOL 公式可满足性问题。我无法理解为什么下面的代码片段 returns 不满意。请帮忙。
如果可能的话,如果有人尝试过一些例子,其中带有量词的 FOL 给出 "Sat" 并且经过一些小的小改动给出 "Unsat" 作为输出,这将非常有帮助
除了 rise4fun 教程页面上提供的以外,是否存在一些简单的 FOL 公式代码片段可供研究。
(set-option :smt.mbqi true)
(declare-fun f (Real Real) Bool)
(declare-const a Real)
(declare-const b Real)
(assert (forall ((x Real)) (and (f a x) (> x 6))))
(assert (and (f a b) (> b 6) ))
(check-sat)
您的输入是 unsat
因为这个 assert
:
(assert (forall ((x Real)) (and (f a x) (> x 6))))
右边是连词。所以这就是说所有实数值 x
值都大于 6,这显然不是真的。事实上,您可以将整个输入简化为:
(assert (forall ((x Real)) (> x 6)))
(check-sat)
出于完全相同的原因,它仍然是 unsat
。
也许你的意思是这样的:
(set-option :smt.mbqi true)
(declare-fun f (Real Real) Bool)
(declare-const a Real)
(declare-const b Real)
(assert (forall ((x Real)) (=> (> x 6) (f a x))))
(assert (and (f a b) (> b 6) ))
(check-sat)
(get-value (f a b))
即f a x
是true
如果x
大于6?对于这个输入 z3 说:
sat
((f (lambda ((x!1 Real) (x!2 Real)) (= x!2 0.0)))
(a 0.0)
(b 7.0))
而且你可以看到这确实是一个令人满意的模型,虽然不是一个特别有趣的模型。
希望对您有所帮助!