z3을 사용하여 배우려고합니다. 그래서이 질문은 어리석은 일입니다.SSA에서 z3 bvsmod 동작 이해
다음 코드에서 bvsmod를 bvadd와 비교했을 때 Z3에서 x___0에 대한 예기치 않은 값이 나타나는 이유는 무엇입니까? SSA를 사용하여 여기에서 실행 흐름을 구현합니다.
Z3 지침 :
(set-option :pp.bv-literals false)
;
; The code
; x %= 5
; x * 2 == 8
; Implement SSA
; x1 = x0 % 5
; x1 * 2 == 8
;
(push)
(set-info :status unknown)
(declare-const x___0 (_ BitVec 32))
(declare-const x___1 (_ BitVec 32))
(assert (= x___1 (bvsmod x___0 (_ bv5 32))))
(assert (= (bvmul x___1 (_ bv2 32)) (_ bv8 32)))
(check-sat)
(get-model)
(pop)
;
; The code
; x += 1
; x * 2 == 8
; Implement SSA
; x1 = x0 + 1
; x1 * 2 == 8
;
(push)
(declare-const x___0 (_ BitVec 32))
(declare-const x___1 (_ BitVec 32))
(assert (= x___1 (bvadd x___0 (_ bv1 32))))
(assert (= (bvmul x___1 (_ bv2 32)) (_ bv8 32)))
(check-sat)
(get-model)
(pop)
결과 :
sat
(model
(define-fun x___1() (_ BitVec 32)
(_ bv4 32))
(define-fun x___0() (_ BitVec 32)
(_ bv3720040335 32))
)
sat
(model
(define-fun x___1() (_ BitVec 32)
(_ bv4 32))
(define-fun x___0() (_ BitVec 32)
(_ bv3 32))
)
내가 의미가 값 3를 얻을 x___0 bvadd 사용 방정식의 경우.
bvsmod의 경우 값이 인데, 예상되는 값 근처의 값, 즉 4로 끝나는 값이없는 이유는 무엇입니까?
이러한 제약 조건을 추가 할 것입니다. '(assert (bvslt x___0 (_ bv5 32)))'와'(assert (bvsgt x___0 (_ bv0 32)))'를 호출합니다. – Deepak