将Z3 QBF公式直接转换为pcnf

将Z3 QBF公式直接转换为pcnf,z3,z3py,quantifiers,Z3,Z3py,Quantifiers,我正在使用Z3定理证明器(使用Z3Py:Python中的Z3API)创建QBF(量化布尔公式) Z3中有没有办法直接将qbf公式转换成Prenex?我认为没有转换成Prenex的策略,但你肯定可以应用量词消除策略并进一步处理你的公式。请注意,转换后的公式与原始公式不太一样,因为它们是机械生成的 下面是一个例子: from z3 import * f = Function('f', IntSort(), IntSort(), IntSort()) x, y = Ints('x y') p = F

我正在使用Z3定理证明器(使用Z3Py:Python中的Z3API)创建QBF(量化布尔公式)


Z3中有没有办法直接将qbf公式转换成Prenex?

我认为没有转换成Prenex的策略,但你肯定可以应用量词消除策略并进一步处理你的公式。请注意,转换后的公式与原始公式不太一样,因为它们是机械生成的

下面是一个例子:

from z3 import *

f = Function('f', IntSort(), IntSort(), IntSort())
x, y = Ints('x y')
p = ForAll(x, Or(x == 2, Exists(y, f (x, y) == 0)))

print Tactic('qe')(p)
这里
qe
是量词消除策略。这将产生:

[[Not(Exists(x!0,
             Not(Or(x!0 == 2,
                    Exists(x!1,
                           And(f(x!0, x!1) <= 0,
                               f(x!0, x!1) >= 0))))))]]
[[不存在(x!0,
不是(或(x!0==2,
存在(x!1,
和(f(x!0,x!1)=0()()()()))]]

有关战术的详细教程,请参见此处:

您可以使用skolemize战术(snf),根据定义,该战术将采用prenex格式。然而,它也将消除存在量词,这不是你想要的。这里有一个例子

(declare-fun a (Int) Bool)
(declare-fun b (Int) Bool)
(declare-fun c (Int) Bool)
(assert
  (forall ((x Int))
    (or
      (exists ((y Int))
        (a y)
      )
      (exists ((z Int))
        (=>
          (b z)
          (c x)
        )
      )
    )
  )
)
(apply
  (and-then
  ; mode (symbol) NNF translation mode: skolem (skolem normal form), quantifiers (skolem normal form + quantifiers in NNF), full (default: skolem)
    (using-params snf :mode skolem)
  )
  :print_benchmark true
  :print false
)
当Z3被赋予上述属性时,它将以如下方式响应

(declare-fun c (Int) Bool)
(declare-fun b (Int) Bool)
(declare-fun a (Int) Bool)
(assert (forall ((x Int))
          (or (exists ((y Int)) (a y)) (exists ((z Int)) (=> (b z) (c x))))))
(check-sat)
你可以通过跑步看到可用的战术

echo "(help-tactic)" | ./z3 -in | less
从一个bash shell


不幸的是,我没有看到一个声明它可以转换为prenex。

谢谢。我的目标是将Z3生成的公式转换为qbf解算器的输入。我不确定,不确定。。但使用“qe”将使事情复杂化,并使编写标准输入格式的翻译变得困难。