저는 Z3의 QBVF 솔버를 가지고 놀고 있으며 실존 적 어설 션에서 값을 추출 할 수 있는지 궁금합니다. 재치하기 위해, 다음과 같은 I가 있다고 가정 해 봅시다 :Z3 : 실존 적 모델 값 추출하기
는(assert (exists ((x (_ BitVec 16))) (forall ((y (_ BitVec 16))) (bvuge y x))))
이 기본적으로 "최소"16 비트 부호없는 값이 있음을 말한다.
(check-sat)
(get-model)
을 그리고 Z3-3.0 행복하게 응답 : 그럼, 내가 말할 수있는 정말 멋진
sat
(model (define-fun x!0() (_ BitVec 16)
#x0000)
)
합니다. 그러나 내가하고 싶은 것은 get-value를 통해 해당 모델의 조각을 추출 할 수 있어야한다는 것입니다. 당연히, 다음 중 어느 것도 Z3는 바로 그러한 상수가 없습니다 불평 각각의 경우에
(get-value (x))
(get-value (x!0))
을 제대로 작동하지 않습니다. 분명히 Z3은 (check-sat)
호출에 대한 응답으로 입증 된 정보를 가지고 있습니다. get-value
또는 다른 메커니즘을 통해 실존 값에 자동으로 액세스 할 수 있습니까?
감사합니다 .. Z3에서
감사합니다. 레오나르도. 실존론이 보편보다 선행하는 경우, 특히 스콜화가 사소한 경우에 특히 유용한 속임수입니다. 일반적으로 중첩/교대 한정 기호의 경우 사용자가 ACL2의 힌트와 비슷한 방식으로 명시 적으로 "표시"하는 것이 더 나은 해결책 일 수 있습니다. 노드가 고유하게 표시되어 있는지 확인하는 것은 사용자의 몫입니다. '(x (_ BitVec 16) : model_name "x")) ... ' 이것은 SMT-Lib과의 호환성을 손상시킬 수 있지만 좋은 것일 수 있습니다. (pseudo SMT-Lib2 구문) 여하튼 Z3가 어떻게 경계를 추진하고 있는지를 감안할 때 타협 –
제안 해 주셔서 감사합니다. Z3의 향후 버전에 대한 가능성을 고려할 것입니다. 그러나 사용자는 Z3에 의해 생성 된 skolem 함수 기호의 서명을 제어 할 수 없습니다. Z3은 스콜화 전에 많은 단순화를 수행하며 스콜화 단계는 범용 변수에 대한 종속성 수를 최소화하려고 시도합니다. 범용 한정 기호에 중첩 된 실존 변수를 추출하는 방법에 대한 예제로 나의 대답을 업데이트했습니다. –