제 연구에 z3을 사용하고 있는데 다음과 같은 문제가 있습니다. 배열과 해석되지 않은 함수가 포함 된 만족스러운 수식 모델을 분석합니다. 특정 배열 항목을 검사하고 싶습니다.z3 모델의 배열 용어 값
z3 가이드의 예제에서 이러한 값에 액세스 할 수 있습니다.
예컨대,
(get-value ((select my_array 0)))
같은 질문에 대한 위치 0
에서 my_array
의 값이 1
것을 나타내는
(((select my_array 0) 1))
같은 답변을 얻을 수 있습니다.
그러나, 내가 할 대답은 전혀 매우 도움이되지 않습니다
(((select my_array 0) (select Array!val!0 0)))
것 같습니다. ,
;; universe for (Array Int Int):
;; Array!val!10 Array!val!6 Array!val!0 Array!val!5 Array!val!9 Array!val!1 Array!val!11 Array!val!4 Array!val!2 Array!val!7 Array!val!3 Array!val!8
;; -----------
;; definitions for universe elements:
(declare-fun Array!val!10() (Array Int Int))
(declare-fun Array!val!6() (Array Int Int))
(declare-fun Array!val!0() (Array Int Int))
(declare-fun Array!val!5() (Array Int Int))
(declare-fun Array!val!9() (Array Int Int))
(declare-fun Array!val!1() (Array Int Int))
(declare-fun Array!val!11() (Array Int Int))
(declare-fun Array!val!4() (Array Int Int))
(declare-fun Array!val!2() (Array Int Int))
(declare-fun Array!val!7() (Array Int Int))
(declare-fun Array!val!3() (Array Int Int))
(declare-fun Array!val!8() (Array Int Int))
;; cardinality constraint:
(forall ((x (Array Int Int)))
(and (= x Array!val!10)
(= x Array!val!6)
(= x Array!val!0)
(= x Array!val!5)
(= x Array!val!9)
(= x Array!val!1)
(= x Array!val!11)
(= x Array!val!4)
(= x Array!val!2)
(= x Array!val!7)
(= x Array!val!3)
(= x Array!val!8)))
;; -----------
난 정말 이것의 의미를 이해하지 않지만, 어떻게 든이 내 문제에 관련이있는 것으로 보인다
또한, 모델의 시작 부분에 I는 다음과 같다 블록을 얻을 비슷한 블록이 이 아니기 때문에이 가이드의 간단한 예를 들어보십시오. 누구든지 z3의 이러한 동작을 어떻게 유발하는지 또는 피할 수있는 방법을 알고 있습니까?
몇 가지 실험을 한 후 원하지 않는 동작을 나타내는 "최소"예제를 발견했습니다. 그것은 인덱스 표현식에서 해석되지 않은 함수를 사용하는 것과 관련이있는 것 같습니다. 이것에
(declare-fun my_function ((Int)(Int)) Int)
(declare-fun my_array() (Array Int Int))
(assert
(=
(select my_array (my_function 0 1))
(select my_array (my_function 1 0))
)
)
(check-sat)
(get-model)
(get-value ((select my_array (my_function 0 1))))
(get-value ((my_function 0 1)))
Z3의 반응은 다음과 같습니다
SMT에서sat
(model
;; universe for (Array Int Int):
;; Array!val!0
;; -----------
;; definitions for universe elements:
(declare-fun Array!val!0() (Array Int Int))
;; cardinality constraint:
(forall ((x (Array Int Int))) (= x Array!val!0))
;; -----------
(define-fun my_array() (Array Int Int)
Array!val!0)
(define-fun my_function ((x!1 Int) (x!2 Int)) Int
(ite (and (= x!1 0) (= x!2 1)) 2
(ite (and (= x!1 1) (= x!2 0)) 3
2)))
)
(((select my_array (my_function 0 1)) (select Array!val!0 2)))
(((my_function 0 1) 2))
고맙습니다. 그게 도움이 됐어! – Georg