Z3 Tseitin编码下的满意模型

Z3 Tseitin编码下的满意模型,z3,Z3,我使用Z34.0中的以下代码片段将公式转换为CNF (set-logic QF_UF) ( set-option :produce-models true ) ; ------ snip ------- ; ; declarations, ; and assert statement ; of "original" formula ; here. ; ; ------ snap ------- ( apply ( then ( !

我使用Z34.0中的以下代码片段将公式转换为CNF

(set-logic QF_UF)
(
  set-option
  :produce-models
  true
)

; ------ snip -------
;
; declarations, 
; and assert statement
; of "original" formula
; here.
;
; ------ snap -------

(
  apply
  (
    then
    (
      !
      simplify
      :elim-and
      true
    )
    tseitin-cnf
  )
)
我得到如下结果:

(goals
(goal

  ; ------ snip -------
  ;
  ; Lot's of lines here
  ;
  ; ------ snap -------

  :precision precise :depth 2)
)
我假设
goal
后面的每个表达式都是CNF的一个子句,也就是说,所有这些表达式都应该合并以产生实际公式。我将把这个连词称为“编码”公式

显然,原始公式和编码公式并不等价,因为编码公式包含新变量
k!0,k!1,…
哪个进行Tseitin编码。然而,我期望它们是平等可满足的,或者实际上它们是由相同的模型满足的(当忽略
k!I
变量时)

也就是说,我希望
(编码公式)和(非原始公式)
不能满足要求。不幸的是,情况似乎并非如此;我有一个反例,这个检查实际上返回
sat


这是z3中的一个bug,是我用错了,还是我的任何假设都是无效的?

这是新的
tseitin cnf
策略中的一个bug。我修好了程序错误,修复程序将在下一个版本(Z3 4.1)中可用。同时,您可以通过使用多轮简化来解决该缺陷。 即使用

 (apply 
    (then (! simplify :elim-and true)
          (! simplify :elim-and true)
          tseitin-cnf))
而不是

 (apply 
    (then (! simplify :elim-and true)
          tseitin-cnf))

这可能是一个错误。你能把这个例子贴在什么地方吗?如果看不到整个例子,很难看出发生了什么。