Z3 不';检查sat和x27;是否支持布尔函数作为假设?

Z3 不';检查sat和x27;是否支持布尔函数作为假设?,z3,Z3,在下面的示例中,我尝试对每个假设使用未解释的布尔函数,如“(declare const p(Int)Bool)”,而不是单个布尔常量。但它不起作用(它会导致编译错误) 我知道不可能(不支持)使用布尔函数。这背后有什么原因吗?有不同的方法吗?我们有这个限制,因为Z3在解决问题之前应用了许多简化。他们中的一些人将重写公式和术语。Z3实际解决的问题通常与输入问题大不相同。我们将把简化的假设追溯到原始假设,或者引入辅助变量。限制为布尔文本可以避免这个问题,并使接口非常干净。请注意,此限制并不限制表达能力

在下面的示例中,我尝试对每个假设使用未解释的布尔函数,如“(declare const p(Int)Bool)”,而不是单个布尔常量。但它不起作用(它会导致编译错误)


我知道不可能(不支持)使用布尔函数。这背后有什么原因吗?有不同的方法吗?

我们有这个限制,因为Z3在解决问题之前应用了许多简化。他们中的一些人将重写公式和术语。Z3实际解决的问题通常与输入问题大不相同。我们将把简化的假设追溯到原始假设,或者引入辅助变量。限制为布尔文本可以避免这个问题,并使接口非常干净。请注意,此限制并不限制表达能力。如果您认为声明许多布尔变量来跟踪不同的断言太烦人了。我建议您看看Z3的新Python前端,称为Z3Py。使用起来比SMT2.0方便得多。以下是您在Z3Py中的示例: 在本例中,将创建布尔常量的“向量”(实际上是Python列表),而不是创建一个未解释的谓词
p

其中包含许多示例

也可以在Z3Py中实现创建辅助变量的方法。
下面是实现这个技巧的脚本。我定义了一个函数
check\u ext
,用于处理所有管道

这些链接似乎断了。你能把实际代码发出去吗?
(set-option :produce-unsat-cores true)
(set-option :produce-models true)

(declare-fun p (Int) Bool) 
             ;(declare-const p1 Bool) 
             ;(declare-const p2 Bool)
             ; (declare-const p3 Bool)

;; We assert (=> p C) to track C using p
(declare-const x Int)
(declare-const y Int)
(assert (=> (p 1) (> x 10)))
;; An Boolean constant may track more than one formula
(assert (=> (p 1) (> y x)))

(assert (=> (p 2) (< y 5)))
(assert (=> (p 3) (> y 0)))

(check-sat (p 1) (p 2) (p 3))
(get-unsat-core)
Z3(18, 16): ERROR: invalid check-sat command, 'not' expected, assumptions must be Boolean literals
Z3(19, 19): ERROR: unsat core is not available