Z3固定小数点エンジンの2つの異なる入力フォーマットがどのように関連しているのか混乱して苦労します。短い例:負の数の存在を証明したいとします。私は非負の数値に対して1、負に0を返し、関数が0を返す引数があれば失敗するように求める関数を宣言します。しかし、1つの制約があります:少なくとも1つが存在するときにソルバーがsat
すべての数値が負でない場合はunsat
となります。Z3固定小数点エンジンを使った∃-クエリと∀-クエリ
はdeclare-rel
とquery
フォーマットを使用して自明である。
(declare-rel f (Int Int))
(declare-rel fail())
(declare-var n Int)
(declare-var m Int)
(rule (=> (< n 0) (f n 0)))
(rule (=> (>= n 0) (f n 1)))
(rule (=> (and (f n m) (= m 0)) fail))
(query fail)
しかし(forall
有する)の純粋なSMT-LIB2フォーマットを使用しながら、それがトリッキーになります。たとえば、簡単な
(set-logic HORN)
(declare-fun f (Int Int) Bool)
(declare-fun fail() Bool)
(assert (forall ((n Int))
(=> (< n 0) (f n 0))))
(assert (forall ((n Int))
(=> (>= n 0) (f n 1))))
(assert (forall ((n Int) (m Int))
(=> (and (f n m) (= m 0)) fail)))
(assert (not fail))
(check-sat)
はunsat
を返します。当然、(= m 0)
を(= m 1)
に変更すると同じ結果になります。 sat
は、fail
を暗示するだけです。(= m 2)
です。問題は私が理解できないことです。このフォーマットを使用して解決方法を求める方法。答えsat
すなわち、我々は唯一∀・解決策を見つけるために頼むことができるforall
- 体を使用している間、私は、現時点ではそれを理解していますどのように
は、ソルバが解釈(または不変)すべてために、すべてのアサーションをsatisfiyingを見つけることができたことを意味しますの値であり、unsat
はそのような機能がないことを意味します。つまり、をと証明し、モデルに「証明」(不変式)を入れようとします(明らかに、sat
の場合)。 declare-rel
形式ソルバーでソリューションをINGの一方
query
は制約が∃-数量詞の下にあるいくつかの変数、同じよう
のためのソリューションを検索します。換言すれば、のカウンタの例はです。 unsat
の場合にのみ不変量を印刷できます。 私が質問のカップルしている:私はそれが正しい
- を理解するだろうか?私はいくつかの重要なアイデアを逃すような気がする。たとえば、
(assert (forall ...))
の形で(query ...)
をどのように表現するかという一般的な考え方は本当に役に立ちます(質問2を自動的に回答します)。 - 純粋なSMT-LIB2形式でこのような∃-制約を解決する方法(反例が見つかると
sat
)がありますか?はいの場合はどうですか?
Nikolaj、ありがとうございました。 – dvvrd