z3中的declare-fun和define-fun无法一起工作?

时间:2012-12-04 05:39:08

标签: z3 theorem-proving

我需要建模数组的长度。所以我声明了一个函数

(declare-fun LEN ((Array Int Int)) Int)

同时,我想使用define-fun定义一些宏。

但是,当我在Z3上稍微测试一下时,define-fundeclare-fun似乎不能存在于同一个源文件中?

以下代码可以正常使用:

(define-fun mymax ((a Int) (b Int)) Int
  (ite (> a b) a b))

(assert (= (mymax 100 7) 100))
(check-sat)

(src:http://rise4fun.com/Z3/jRzs

但是,无论插入LEN的位置如何,都会出现错误:

;(declare-fun LEN ((Array Int Int) Int) 
;unknown sort 'assert'  
(define-fun mymax ((a Int) (b Int)) Int
  (ite (> a b) a b))
; (declare-fun LEN ((Array Int Int) Int) 
;unknown sort 'assert'
(assert (= (mymax 4 7) 7))
; (declare-fun LEN ((Array Int Int) Int) 
;;unknown sort 'check-assert'
(check-sat)
;(declare-fun LEN ((Array Int Int) Int) 
 ;invalid sort, symbol, '_' or '(' expected

(src:http://rise4fun.com/Z3/HdEy

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

declare-fundefine-fun可以一起使用。 问题是你有一个缺少的括号。 它应该是

(declare-fun LEN ((Array Int Int)) Int) 

而不是

(declare-fun LEN ((Array Int Int) Int) 

由于缺少括号,第二个实际上是使用两个参数(数组和整数)声明函数LEN,然后Z3在找到此声明的结果排序时会生成错误。

以下是完整示例的链接:http://rise4fun.com/Z3/TjNS