在Tseitin编码下满足模型

时间:2012-06-18 16:46:32

标签: z3

我在z3 4.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的一个子句,即所有这些表达式应该合并以产生实际的公式。我将这个连词称为“编码”公式。

显然,原始公式和编码公式不相等,因为编码公式包含执行Tseitin编码的新变量k!0, k!1, ...。但是,我期待它们是完全可以满足的,或者实际上他们对相同的模型感到满意(当忽略k!i个变量时)。

即,我期待(encoded formula) AND (NOT original formula)不可满足。不幸的是,情况似乎并非如此;我有一个反例,其中此检查实际返回sat

这是z3中的错误,我使用它是错误的,还是我的任何假设无效?

1 个答案:

答案 0 :(得分:4)

这是新tseitin-cnf策略中的一个错误。我修复了错误,修复程序将在下一个版本中提供(Z3 4.1)。在此期间,您可以通过使用简化轮次来解决这个问题。 也就是说,使用

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

而不是

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