简化Z3中未解释的功能

时间:2013-03-11 19:46:14

标签: 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的定义,我们可以得到它 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。

1 个答案:

答案 0 :(得分:4)

一种选择是让Z3评估(f x y)表达式x,其中yeval是新的布尔常量。 (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}}