简化Z3中未解释的函数

简化Z3中未解释的函数,z3,Z3,有没有办法将简化应用于z3中定义的未解释的函数,而不是目标和子目标 我有以下z3代码: 我得到以下输出: 事实证明,通过对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自动生成以下定义 谢谢你的帮助。 当做 Oswaldo.一个选项是要求Z3计算表达式(f x y),其中x和y是新的

有没有办法将简化应用于z3中定义的未解释的函数,而不是目标和子目标

我有以下z3代码:



我得到以下输出:



事实证明,通过对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自动生成以下定义



谢谢你的帮助。 当做
Oswaldo.

一个选项是要求Z3计算表达式
(f x y)
,其中
x
y
是新的布尔常量。
eval
命令将在当前模型中计算
(f x y)
,并在示例中生成
y
。以下是完整的示例(也可在线获取):

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!8 (k!7 x!1) (k!6 x!2))
= (f!8 false (k!6 x!2))
= (f!8 false x!2)
=(x!2) 
(define-fun f ((x!1 Bool) (x!2 Bool)) Bool
  (x!2))
(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))