为什么z3 smt校准仪在如此简单的公式中失败?
我在写硕士论文的时候,用微软的z3 smt prover做了一些实验。在我的用例中,我需要检查包含量词的简单公式(具有等式的一阶逻辑)的可满足性(无模型)。 z3可以在几毫秒内很好地解决我所有的示例,除了这个:为什么z3 smt校准仪在如此简单的公式中失败?,z3,smt,Z3,Smt,我在写硕士论文的时候,用微软的z3 smt prover做了一些实验。在我的用例中,我需要检查包含量词的简单公式(具有等式的一阶逻辑)的可满足性(无模型)。 z3可以在几毫秒内很好地解决我所有的示例,除了这个: forall x P(f(g(f(x)))) and not P(f(g(h(c)))) 我在rise4fun.com和我的电脑(ubuntu16.04,4x3.4GHz)上用z3java绑定测试了这个公式。我在1小时后终止了进程,但没有结果。 我知道这样的问题是半可判定的。 但是为
forall x P(f(g(f(x)))) and not P(f(g(h(c))))
我在rise4fun.com和我的电脑(ubuntu16.04,4x3.4GHz)上用z3java绑定测试了这个公式。我在1小时后终止了进程,但没有结果。
我知道这样的问题是半可判定的。
但是为什么z3在这个特定的公式中失败了呢。我测试了许多其他公式(小的和更大的),z3在所有公式上都成功了。
也许有人可以向我解释是什么让这个公式对z3如此困难?
z3内部发生了什么
例如:更改一个功能符号就足以使z3终止并产生结果(sat/unsat):
您可以使用以下代码段来尝试这些示例
(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)
Z3试图为您的量化公式找到一个有限代表性的解释,但未能建立一个解释或确定公式不可满足。
您可以使用axiom探查器通过Z3评测实例化: 但在这种情况下,z3在类似的公式上也会失败。但事实并非如此。此外,这个公式没有嵌套的量词(一个谓词上只有一个量词)。所以我想这对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)