我正在尝试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
。我可以在这里混合使用qe
或qe2
,但这些人在这里感觉像是过分杀人了,并且通常会花很多时间解决非平凡的问题。
如果我以最大的冗长程度来做一个简单的(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"))
)
我希望其中一些步骤可以建议我可以运用自己的策略,但事实并非如此。
这有很好的策略吗?