消除琐碎的存在量词的适当Z3策略

时间:2019-03-23 22:45:37

标签: z3 smt

我正在尝试Z3策略,并且想知道哪种策略可以简化以下琐碎的存在量词:

(declare-datatypes () ((Value none (some (val String)))))
(declare-const foo Value)

(assert (exists ((x String)) (and (= foo (some x)) (= x "bar"))))

我尝试过类似以下的简单操作:

(apply (repeat (then (or-else split-clause skip) propagate-values simplify)))

但是它并没有摆脱exists。我可以在这里混合使用qeqe2,但这些人在这里感觉像是过分杀人了,并且通常会花很多时间解决非平凡的问题。

如果我以最大的冗长程度来做一个简单的(check-sat),则Z3可以很轻松地解决它:

(simplifier :num-exprs 8 :num-asts 174 :time 0.00 :before-memory 2.78 :after-memory 2.78)
(smt.tactic start)
(smt.propagate-values)
(smt.nnf-cnf)
(smt.reduce-asserted)
(smt.lift-ite)
(smt.reducing)
(smt.refine-injectivity)
(smt.cheap-fourier-motzkin)
(smt.reducing)
(smt.pattern-inference)
(smt.maximizing-bv-sharing)
(smt.reduce-asserted)
(smt.simplifier-done)
(smt.searching)
sat
(model 
  (define-fun foo () Value
    (some "bar"))
)

我希望其中一些步骤可以建议我可以运用自己的策略,但事实并非如此。

这有很好的策略吗?

0 个答案:

没有答案