Z3求解器指南(二)

配置

set-option命令用来配置z3,该命令有几个选项去控制z3的行为。这些选项中的一部分只能够在断言和申明命令之前设定。使用reset命令可以擦出所有的断言和申明,在使用reset命令后,所有的配置选项都可以设置了。

(set-option :print-success true) 
(set-option :produce-unsat-cores true) ; enable generation of unsat cores
(set-option :produce-models true) ; enable model generation
(set-option :produce-proofs true) ; enable proof generation
(declare-const x Int)
(set-option :produce-proofs false) ; error, cannot change this option after a declaration or assertion
(echo "before reset")
(reset)
(set-option :produce-proofs false) ; ok

其中配置选项print-success true是相当有用的,这个选项可以用来判断你的输入文件中的命令是否有错误,如果命令没有错误,会输出success,有错的话则会报出具体的出错位置。

命题逻辑

z3中预定义的类型Bool是所有的Boolean命题表达式的类型。Z3支持常用的Boolean运算符and,or,xor,not,=>(蕴含),ite(if-than-else)。蕴含式通常用=表示。下面的例子中我们展示了如何证明这个命题:如果p蕴含q并且q蕴含r,那么p蕴含r。我们通过证明该命题的否命题是不满足的方式来证明该命题。注意该例子中我们给定了函数conjecture一个具体的定义。

(declare-const p Bool)
(declare-const q Bool)
(declare-const r Bool)
(define-fun conjecture () Bool
    (=> (and (=> p q) (=> q r))
        (=> p r)))
(assert (not conjecture))
(check-sat)

无解释的函数与常量

SMT公式的基本构建单元就是常量和函数,常量说白了就是没有参数的函数,所以,基本的构建单元事实上都是函数。

(declare-fun f (Int) Int)
(declare-fun a () Int) ; a is a constant
(declare-const b Int) ; syntax sugar for (declare-fun b () Int)
(assert (> a 20))
(assert (> b a))
(assert (= (f 10) 1))
(check-sat)
(get-model)

不像程序语言,函数有边际效应,能够抛异常或者没有返回值,传统的一阶逻辑表达式函数没有边际效应,它是完整的。

纯的一阶逻辑函数和常量是无解释的,或者说是自由的,这意味着没有一个先天的解释是附加在改表达式上的。这和那些有理论签名的函数形成对比,比如数学上函数+有一个固定的标准的解释(对两个数进行加操作)。无解释的函数和常量是最大限度自由的,它们允许任何和约束一致的解释。

为了说明无解释的类型,在下面的例子中,我们定义了一个无解释的类型A,并且定义了两个类型为A的常量x和y。

(declare-sort A)
(declare-const x A)
(declare-const y A)
(declare-fun f (A) A)
(assert (= (f (f x)) x))
(assert (= (f x) y))
(assert (not (= x y)))
(check-sat)
(get-model)

求解该约束集得到的结果如下:

sat
(model 
  ;; universe for A:
  ;;   A!val!0 A!val!1 
  ;; -----------
  ;; definitions for universe elements:
  (declare-fun A!val!0 () A)
  (declare-fun A!val!1 () A)
  ;; cardinality constraint:
  (forall ((x A)) (or (= x A!val!0) (= x A!val!1)))
  ;; -----------
  (define-fun y () A
    A!val!1)
  (define-fun x () A
    A!val!0)
  (define-fun f ((x!1 A)) A
    (ite (= x!1 A!val!0) A!val!1
    (ite (= x!1 A!val!1) A!val!0
      A!val!1)))
)

结果模型中为A给定了一个抽象的值,因为A是无解释的。

你可能感兴趣的:(z3求解器)