使用Z3检查一阶公式的可满足性

时间:2019-12-10 14:22:28

标签: z3 first-order-logic satisfiability

我正在尝试使用Z3解决一些基本的FOL公式可满足性问题。我不明白为什么下面的代码片段返回Unsat。请帮忙。

如果可能的话,如果有人尝试使用带有量词的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)

1 个答案:

答案 0 :(得分:4)

由于此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 xtrue 如果 x大于6?对于此输入,z3表示:

sat
((f (lambda ((x!1 Real) (x!2 Real)) (= x!2 0.0)))
 (a 0.0)
 (b 7.0))

您会看到这确实是一个令人满意的模型,尽管不是特别有趣。

希望有帮助!