我需要建模数组的长度。所以我声明了一个函数
(declare-fun LEN ((Array Int Int)) Int)
同时,我想使用define-fun
定义一些宏。
但是,当我在Z3上稍微测试一下时,define-fun
和declare-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)
有人知道如何解决这个问题吗?
答案 0 :(得分:2)
declare-fun
和define-fun
可以一起使用。
问题是你有一个缺少的括号。
它应该是
(declare-fun LEN ((Array Int Int)) Int)
而不是
(declare-fun LEN ((Array Int Int) Int)
由于缺少括号,第二个实际上是使用两个参数(数组和整数)声明函数LEN
,然后Z3在找到此声明的结果排序时会生成错误。
以下是完整示例的链接:http://rise4fun.com/Z3/TjNS