为什么z3 smt校准仪在如此简单的公式中失败?

为什么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小时后终止了进程,但没有结果。 我知道这样的问题是半可判定的。 但是为

我在写硕士论文的时候,用微软的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小时后终止了进程,但没有结果。 我知道这样的问题是半可判定的。 但是为什么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)