私は動的観測のいくつかの簡単な分析に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)
(何かが足りない場合を除いて...)。
私は実際には複雑なことをするつもりはありません-ターゲットセットにないシンボルの単純な置換/削除...これを行うためにツールを誘導する方法があるのだろうか?