'check-sat'不支持布尔函数作为假设吗?

时间:2012-03-28 06:36:51

标签: z3

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

(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

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

1 个答案:

答案 0 :(得分:3)

我们有这个限制,因为Z3在解决问题之前应用了许多简化。其中一些将重写公式和术语。 Z3实际解决的问题通常与输入问题完全不同。我们会将简化的假设追溯到原始假设,或引入辅助变量。限制为布尔文字避免了这个问题,并使界面非常干净。请注意,此限制不会限制表现力。如果您认为声明许多布尔变量来跟踪不同的断言太烦人了。我建议你看一下Z3的新Python前端Z3Py。它比SMT 2.0更方便使用。以下是Z3Py中的示例:http://rise4fun.com/Z3Py/cL 在这个例子中,不是创建一个未解释的谓词p,而是一个“向量”(实际上,它是一个Python列表)o创建了布尔常量。

Z3Py online tutorial包含许多示例。

也可以在Z3Py中实现创建辅助变量的方法。 这是诀窍的脚本。我定义了一个完成所有管道工作的函数check_exthttp://rise4fun.com/Z3Py/B4