2016-11-07 1 views
0

sm3 형식의 z3 해석기를 사용하여 비트 벡터 수식에 대한 여러 모델을 생성하는 방법은 무엇입니까?smt2 형식 예제에서 z3 해석기에 대한 여러 솔루션을 얻는 방법은 무엇입니까?

비트 벡터 용 IDEA 코드를 구현하는 동안 하나의 모델이 생성됩니다.

가능한 모든 모델을 생성하는 방법은 있습니까?

ex.smt2 파일

(set-logic QF_BV) 
(set-info :smt-lib-version 2.0) 
(declare-const A0 (_ BitVec 16)) 
(declare-const A1 (_ BitVec 16)) 
(declare-const A2 (_ BitVec 16)) 

(declare-const B0 (_ BitVec 16)) 
(declare-const B1 (_ BitVec 16)) 
(declare-const B2 (_ BitVec 16)) 

(declare-const C0 (_ BitVec 16)) 
(declare-const C1 (_ BitVec 16)) 
(declare-const C2 (_ BitVec 16)) 

(declare-const D0 (_ BitVec 16)) 
(declare-const D1 (_ BitVec 16)) 
(declare-const D2 (_ BitVec 16)) 

(declare-const k11 (_ BitVec 16)) 
(declare-const k12 (_ BitVec 16)) 
(declare-const k13 (_ BitVec 16)) 
(declare-const k14 (_ BitVec 16)) 
(declare-const k15 (_ BitVec 16)) 
(declare-const k16 (_ BitVec 16)) 
(declare-const k21 (_ BitVec 16)) 
(declare-const k22 (_ BitVec 16)) 
(declare-const k23 (_ BitVec 16)) 
(declare-const k24 (_ BitVec 16)) 
(declare-const k25 (_ BitVec 16)) 
(declare-const k26 (_ BitVec 16)) 

(declare-const E11 (_ BitVec 16)) 
(declare-const E12 (_ BitVec 16)) 
(declare-const E13 (_ BitVec 16)) 
(declare-const E21 (_ BitVec 16)) 
(declare-const E22 (_ BitVec 16)) 
(declare-const E23 (_ BitVec 16)) 

(declare-const F11 (_ BitVec 16)) 
(declare-const F12 (_ BitVec 16)) 
(declare-const F13 (_ BitVec 16)) 
(declare-const F21 (_ BitVec 16)) 
(declare-const F22 (_ BitVec 16)) 
(declare-const F23 (_ BitVec 16)) 

(declare-const t11 (_ BitVec 16)) 
(declare-const t12 (_ BitVec 16)) 
(declare-const t13 (_ BitVec 16)) 
(declare-const t14 (_ BitVec 16)) 
(declare-const t15 (_ BitVec 16)) 
(declare-const t16 (_ BitVec 16)) 
(declare-const t21 (_ BitVec 16)) 
(declare-const t22 (_ BitVec 16)) 
(declare-const t23 (_ BitVec 16)) 
(declare-const t24 (_ BitVec 16)) 
(declare-const t25 (_ BitVec 16)) 
(declare-const t26 (_ BitVec 16)) 

;round------ 1 ------- 
(assert (= t11 (bvmul A0 k11))) 
(assert (= t12 (bvadd B0 k12))) 
(assert (= t13 (bvadd C0 k13))) 
(assert (= t14 (bvmul D0 k14))) 
(assert (= E11 (bvxor t11 t13))) 
(assert (= F11 (bvxor t12 t14))) 
(assert (= E12 (bvmul E11 k15))) 
(assert (= F12 (bvadd F11 E12))) 
(assert (= E13 (bvadd E12 F13))) 
(assert (= F13 (bvmul F12 k16))) 
(assert (= A1 (bvxor t11 F13))) 
(assert (= t15 (bvxor t12 E13))) 
(assert (= B1 t16)) 
(assert (= t16 (bvxor t13 F13))) 
(assert (= C1 t15)) 
(assert (= D1 (bvxor t14 E13))) 

;round------ 2 ------- 
(assert (= t21 (bvmul A1 k21))) 
(assert (= t22 (bvadd B1 k22))) 
(assert (= t23 (bvadd C1 k23))) 
(assert (= t24 (bvmul D1 k24))) 
(assert (= E12 (bvxor t21 t23))) 
(assert (= F12 (bvxor t22 t24))) 
(assert (= E13 (bvmul E12 k25))) 
(assert (= F13 (bvadd F12 E13))) 
(assert (= E21 (bvadd E13 F21))) 
(assert (= F21 (bvmul F13 k26))) 
(assert (= A2 (bvxor t21 F21))) 
(assert (= t25 (bvxor t22 E21))) 
(assert (= B2 t26)) 
(assert (= t26 (bvxor t23 F21))) 
(assert (= C2 t25)) 
(assert (= D2 (bvxor t24 E21))) 

(assert (= A0 #xb621)) 
(assert (= B0 #xdf47)) 
(assert (= C0 #xa779)) 
(assert (= D0 #xac41)) 

(check-sat) 

(get-value (k11)) 
(get-value (k12)) 
(get-value (k13)) 
(get-value (k14)) 
(get-value (k15)) 
(get-value (k16)) 

(get-value (k21)) 
(get-value (k22)) 
(get-value (k23)) 
(get-value (k24)) 
(get-value (k25)) 
(get-value (k26)) 

(exit) 
+0

이 질문은'python'과'z3py'로 표시되어 있으므로 [this] (http://stackoverflow.com/questions/11867611/z3py-checking-all-solutions-for-equation)와 [this ] (http://stackoverflow.com/questions/13395391/z3-finding-all-satisfying-models) 답변은 관련성이있을 수 있습니다. –

답변

0

일반적인 방법은 첫 번째 모델을 제외하는 새로운 제약 조건을 추가하는 것입니다. 이 예에서는 다음과 같이 표시됩니다.

(check-sat) 

(assert (and (not (= k16 #x2c7d)) (not (= ...)) 
(check-sat) 

모든 솔루션 또는 솔루션 수를 얻는 SMT2 명령은 없습니다. 어떤 속성이 모든 솔루션에 대해 보유한다는 사실에 따라 무언가가 달라지는 경우 수량을 사용하여 인코딩 할 수 있습니다 (예 :

(assert (forall ((x (_ BitVec 16))) (... property depending on x ...))) 

그러나 이러한 유형의 문제는 물론 풀기가 어려우며 Z3에서는 다양한 결정 절차를 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 이 논리를 적용하여 여러 모델을 만들었습니다. 이제는 매 라운드마다 확산 요구 사항을 만족하는지 확인하고 싶습니다. smt2에 명령이 있습니까? –

+0

아니요, Z3은 확산에 대해 알지 못합니다. 직접 작성해야합니다. 확산을 위해서는 가능한 모든 입력을 유지할 수있는 무언가가 필요하기 때문에 비트 벡터에 대한 수량 한정 기호가 필요할 것입니다. –

+0

const k16> 0x0010 및 k16 <0x1000을 넣고 싶습니다. 이 제한을 smt2 형식으로 어떻게 추가 할 것입니까? –

관련 문제