为什么z3 smt证明器失败了这么简单的公式?

时间:2016-09-27 14:13:22

标签: z3 smt

我在使用微软的z3 smt prover进行了一些实验,同时正在研究我的硕士论文。在我的用例中,我需要检查包含量词的简单公式(具有相等性的一阶逻辑)的可满足性(无模型)。 z3可以在几毫秒内完成所有示例的解决,除了这一个:

forall x  P(f(g(f(x)))) and not P(f(g(h(c))))

我使用z3 java-binding在rise4fun.com和我的计算机(ubuntu 16.04,4x 3.4GHz)上测试了公式。我在1小时后没有结果就杀死了这个过程。 我知道这样的事实,这些问题只是半自由的。 但是为什么z3不能用于这个特定的公式。我测试了很多其他公式(较小的公式,甚至更大的公式),z3在所有公式上都取得了成功。 也许有人可以向我解释是什么让这个公式对于z3来说很难? z3内部会发生什么?

例如:更改一个函数符号就足以让z3以结果终止(sat / unsat):

forall x  P(f(g(f(x)))) and not P(f(g(f(c))))
forall x  P(f(g(f(x)))) and not P(f(g(g(c))))
forall x  P(f(g(f(x)))) and not P(f(f(g(c))))
forall x  P(f(g(f(x)))) and not P(f(g(i(c))))
// and even
forall x  P(f(g(h(x)))) and not P(f(g(f(c))))

您可以使用以下代码段在http://rise4fun.com/Z3上尝试这些示例。

(declare-fun c () Int)
(declare-fun d () Int)
(declare-fun f (Int) Int)
(declare-fun g (Int) Int)
(declare-fun h (Int) Int)
(declare-fun i (Int) Int)
(declare-fun P (Int) Bool)

(assert (forall ((x Int))
     (P (f (g (f x)))  )
))

(assert (not 
    (P (f (g (h c)))  )
))

(check-sat)

1 个答案:

答案 0 :(得分:1)

Z3试图为您的量化公式找到有限可表示的解释,但未能建立一个或确定该公式不可满足。 您可以使用公理剖析器{3}来按Z3剖析实例化。