有没有办法将简化应用于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的定义,我们可以得到它 f通过以下推导等于第二个参数(x!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))
感谢您的帮助。 问候, 的Oswaldo。
答案 0 :(得分:4)
一种选择是让Z3评估(f x y)
表达式x
,其中y
和eval
是新的布尔常量。 (f x y)
命令将在当前模型中评估y
,并在您的示例中生成(declare-fun f (Bool Bool) Bool)
; x and y are free Boolean constants that will be used to create the expression (f x y)
(declare-const x Bool)
(declare-const y Bool)
(assert (forall ((b1 Bool) (b2 Bool))
(implies b2 (f b1 b2))))
(assert (exists ((b1 Bool) (b2 Bool))
(not (f b1 b2))))
(check-sat)
(eval (f x y))
。以下是完整示例(也可在线提供here):
{{1}}