2011-12-09 11 views
4

Z3でソフト制約とハード制約をどのように表現できますか?私はAPIから、仮定(ソフト制約)を持つことが可能であることを知っていますが、コマンドラインツールを使用するときはこれを表現できません。私はz3/smt2/siを使用して呼び出していますZ3のソフト/ハード制約

答えて

10

前提条件はSMT 2.0フロントエンドで利用できます。それらは不満足なコアを抽出するために使用されます。彼らはまた、仮定を "後退させる"ために使われるかもしれない。 仮定は実際には「ソフト制約」ではありませんが、それらを実装するために使用できます。 Z3ディストリビューションのmaxsatの例(subdir maxsat)を参照してください。 これは、Z3 SMT 2.0のフロントエンドで仮定を使用する方法の例です。

;; Must enable unsat core generation 
(set-option :produce-unsat-cores true) 
(set-option :produce-models true) 
;; Declare three Boolean constants to "assumptions" 
(declare-const p1 Bool) 
(declare-const p2 Bool) 
(declare-const p3 Bool) 
;; We assert (=> p C) to track C using p 
(declare-const x Int) 
(declare-const y Int) 
(assert (=> p1 (> x 10))) 
;; An Boolean constant may track more than one formula 
(assert (=> p1 (> y x))) 

(assert (=> p2 (< y 5))) 
(assert (=> p3 (> y 0))) 

(check-sat p1 p2 p3) 
(get-unsat-core) ;; produce core (p1 p2) 

(check-sat p1 p3) ;; "retrack" p2 
(get-model) 
+0

私はあなたの意見を参照してください。基本的には、セレクタ変数を使用して、チェックするときにどのアサーションを考慮する必要があるかを切り替えます。ありがとう、それは私のために働くでしょう。 – leco