我正在使用 Microsoft 的 Z3 对动态观察进行一些简单的分析。作为其中的一部分,如果我可以将一些公式从使用一组变量转换为另一组目标变量,那将会很有帮助。
我对 Z3 真的很陌生,但我知道它有一些内部简化规则和其他转换公式的方法......基本上,我想知道是否可以进行一些转换,例如:
(declare-const local Real)
(declare-const x Real)
(declare-const y Real)
(declare-const midstep Real)
(declare-const local_1 Real)
(declare-const foo_ret Real)
(assert (= local (/ x y)))
(assert (= midstep local))
(assert (= local_1 (+ midstep 1.0)))
(assert (= foo_ret local_1) :name toTransform)
; this is what I'd love to do - give Z3 a formula and a target set of variables
(special-simplify (= foo_ret local_1) (foo_ret x y))
; and have Z3 do the appropriate substitutions, etc to spit back
; a "simplified" version in terms of foo_ret, x, and y, e.g.:
; (= foo_ret (+ (/ x y) 1.0))
我认识到这并不是 Z3 的真正主要目标,但我知道它已经有一些简化/解决的能力......从帮助文本来看,我的印象是有一些方法可以设计目标状态和策略到达他们,但我真的无法根据 Z3 的(help)
命令找到有关如何做到这一点的信息(除非我遗漏了一些东西......)。
我真的不想做任何复杂的事情——只是简单地替换/消除不在目标集中的符号......我想知道是否有某种方法可以诱使该工具执行此操作?