在下面的例子中,我尝试使用未解释的布尔函数,如“(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
我知道使用布尔函数是不可能的(不支持)。那背后有什么理由吗?有不同的方法吗?
答案 0 :(得分:3)
我们有这个限制,因为Z3在解决问题之前应用了许多简化。其中一些将重写公式和术语。 Z3实际解决的问题通常与输入问题完全不同。我们会将简化的假设追溯到原始假设,或引入辅助变量。限制为布尔文字避免了这个问题,并使界面非常干净。请注意,此限制不会限制表现力。如果您认为声明许多布尔变量来跟踪不同的断言太烦人了。我建议你看一下Z3的新Python前端Z3Py。它比SMT 2.0更方便使用。以下是Z3Py中的示例:http://rise4fun.com/Z3Py/cL
在这个例子中,不是创建一个未解释的谓词p
,而是一个“向量”(实际上,它是一个Python列表)o创建了布尔常量。
Z3Py online tutorial包含许多示例。
也可以在Z3Py中实现创建辅助变量的方法。
这是诀窍的脚本。我定义了一个完成所有管道工作的函数check_ext
。 http://rise4fun.com/Z3Py/B4