[英]Simplfying Expression : Z3 SMT Solver
使用 Z3 求解器執行以下查詢:
(declare-const c0 Int)
(declare-const c1 Int)
(declare-const c2 Int)
(assert (exists ((c0_s Int) (c1_s Int) (c2_s Int))
(and
(= (+ c0 c1 c2) 5) (>= c0 0) (>= c1 1) (>= c2 1)
(= c0_s c0) (= c1_s (- c1 1)) (= c2_s (+ c2 1))
(= c2_s 3) (= (+ c0_s c1_s) 2)
))
)
(apply (then qe ctx-solver-simplify propagate-ineqs))
產生以下輸出:
(goals
(goal
(>= c0 0)
(<= c0 2)
(>= c1 1)
(<= c1 3)
(<= (+ (* (- 1) c0) (* (- 1) c1)) (- 3))
(<= (+ c1 c0) 3)
(= c2 2)
:precision precise :depth 3)
)
我期待 Z3 求解器的結果是這樣的:
(goals
(goal
(>= c0 0)
(<= c0 2)
(>= c1 1)
(<= c1 3)
(= (+ c1 c0) 3)
(= c2 2)
:precision precise :depth 3)
)
誰能解釋為什么 Z3 產生如此復雜的結果而不是我的預期? 有沒有辦法讓 Z3 簡化這個輸出?
您可能會從核心 Z3 團隊的成員那里得到更詳細的答案,但根據我在低級別使用 Z3 整數求解器的經驗,我可以對為什么會發生這種情況給出一些直覺。
簡而言之,為了求解整數方程,Z3 的整數理論求解器希望其所有約束都以非常特殊和受限的形式出現。 不遵循這種形式的表達式在呈現給求解器之前必須重寫。 通常,這由理論重寫器在內部發生,並且可以在輸入約束集中使用任何表達式而不會出現問題。
此處適用的限制(我知道)有助於解釋為什么您會看到這個看起來很奇怪的輸出,如下所示:
(= ab)
為兩個單獨的不等式約束(<= ab)
和(>= ab)
。 這就是為什么您會看到模型中的變量有兩個單獨的約束,而不僅僅是一個等式。簡而言之,您所看到的可能是算術理論求解器如何在內部表示約束的人工制品。
由於您的實例的輸出是一個目標而不是模型或證明,因此這些表達式可能尚未完全簡化,因為我相信中間目標並不總是簡化(但我對求解器的這部分沒有經驗)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.