如何在输入文件上调用Z3

时间:2012-01-22 02:40:57

标签: z3

我有一个包含以下内容的文件:

(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(declare-const d Real)
(declare-const e Real)
(assert (> a (+ b 2)))
(assert (= a (+ (* 2 c) 10)))
(assert (<= (+ c b) 1000))
(assert (>= d e))
(check-sat)
(get-model)

并且,根据在线教程,在此文件上运行z3应返回:

sat
(model
    (define-fun c () Int
        (- 5))
    (define-fun a () Int
        0)
    (define-fun b () Int
        (- 3))
    (define-fun d ()
        Real 0.0)
    (define-fun e ()
        Real 0.0)
)

所以我知道这是合法的Z3输入。但是,每当我运行“z3 [option]”时,无论选择何种选项,我得到的都是错误消息 - 包括无。有人能告诉我如何在输入文件上正确调用Z3吗?

问候。

1 个答案:

答案 0 :(得分:5)

Z3支持多种输入格式。它使用文件扩展名来猜测将使用哪个解析器。如果扩展名为.smt2。它将使用SMT 2.0解析器。您还可以指定应使用哪个解析器。选项-smt2将强制Z3使用SMT 2.0解析器。最后,Z3默认不启用模型构建。因此,您应该使用选项MODEL=true,或在脚本的开头添加命令(set-option :produce-models true)

如果您想使用非常旧版本的Z3,则必须使用SMT 1.0格式。 此格式在:http://goedel.cs.uiowa.edu/smtlib/papers/format-v1.2-r06.08.30.pdf

中描述

话虽如此,我强烈建议您升级。 SMT 1.0不是非常用户友好,SMT的大多数文档/教程都是SMT 2.0格式。

以下是此格式的示例:

(benchmark file
  :extrafuns ((a Int) (b Int) (c Int) (d Real) (e Real))
  :assumption (> a (+ b 2))
  :assumption (= a (+ (* 2 c) 10))
  :assumption (<= (+ c b) 1000)
  :assumption (>= d e)
  :formula true)