4
z3에 정의 된 해석되지 않은 함수에 간소화를 적용 할 수있는 방법이 있습니까?Z3에서 해석되지 않은 함수 단순화
나는 다음과 같은 Z3 코드를 가지고 :
(declare-fun f (Bool Bool) Bool)
(assert (forall ((b1 Bool) (b2 Bool))
(implies b2 (f b1 b2))))
(assert (exists ((b1 Bool) (b2 Bool))
(not (f b1 b2))))
(check-sat)
(get-model)
그리고 나는 다음과 같은 출력을 얻을 :
sat
(model
(define-fun b1!1() Bool
false)
(define-fun b2!0() Bool
false)
(define-fun k!7 ((x!1 Bool)) Bool
false)
(define-fun f!8 ((x!1 Bool) (x!2 Bool)) Bool
(ite (and (= x!1 false) (= x!2 true)) true
false))
(define-fun k!6 ((x!1 Bool)) Bool
(ite (= x!1 false) false
true))
(define-fun f ((x!1 Bool) (x!2 Bool)) Bool
(f!8 (k!7 x!1) (k!6 x!2)))
)
그것은에 의해 밝혀를 F의 정의에 재 작성 규칙을 pplying, 우리는 f는 두 번째 인수와 동일한 것을 얻을 수있는 다음과 같은 유도로 (× 2!) :
(f!8 (k!7 x!1) (k!6 x!2))
= (f!8 false (k!6 x!2))
= (f!8 false x!2)
=(x!2)
가 어떤 방법으로 다음과 같은 정의를 생성하는 Z3 얻을 수 자동으로? 당신의 도움에 대한
(define-fun f ((x!1 Bool) (x!2 Bool)) Bool
(x!2))
감사합니다. 감사합니다, 오스왈도.
고마워, 저에게 도움이됩니다! – user2158237