簡體   English   中英

簡化表達式:Z3 SMT Solver

[英]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) 這就是為什么您會看到模型中的變量有兩個單獨的約束,而不僅僅是一個等式。
  • 整數求解器將減法或否定項重寫為乘以 -1。 這就是為什么您會在第一個約束中看到這些否定,以及為什么運算符是加法而不是減法。
  • 算術表達式被重寫,以便比較運算符的第二個參數始終是一個常量值。

簡而言之,您所看到的可能是算術理論求解器如何在內部表示約束的人工制品。

由於您的實例的輸出是一個目標而不是模型或證明,因此這些表達式可能尚未完全簡化,因為我相信中間目標並不總是簡化(但我對求解器的這部分沒有經驗)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM