在z3中映射用户定义的函数

在z3中映射用户定义的函数,z3,Z3,我很好奇z3的map操作符有什么限制。根据z3教程(),“z3在数组上提供了一个参数化映射函数。它允许对数组范围应用任意函数。” 当我映射内置函数或使用(declare fun…语法声明的函数时,Map似乎起作用。当我尝试将map与使用(define fun…语法定义的函数(真正的宏)一起使用时,我收到错误无效的函数声明引用,无法引用命名表达式(也称为宏)。 是否有一种标准方法可以将用户定义的函数映射到数组上 下面是一些说明我的困惑的代码: ;simple function, equivalen

我很好奇z3的map操作符有什么限制。根据z3教程(),“z3在数组上提供了一个参数化映射函数。它允许对数组范围应用任意函数。”

当我映射内置函数或使用
(declare fun…
语法声明的函数时,Map似乎起作用。当我尝试将map与使用
(define fun…
语法定义的函数(真正的宏)一起使用时,我收到错误无效的函数声明引用,无法引用命名表达式(也称为宏)。

是否有一种标准方法可以将用户定义的函数映射到数组上

下面是一些说明我的困惑的代码:

;simple function, equivalent to or
(define-fun my-or ((x Bool) (y Bool)) Bool (or x y))
(assert (forall ((x Bool) (y Bool)) (= (my-or x y) (or x y))))
(check-sat)

;mapping or with map works just fine
(define-sort Set () (Array Int Bool))
(declare-const a Set)
(assert ( = a ((_ map or) a a) ))
(check-sat)

;but this fails with error
(assert ( = a ((_ map my-or) a a) ))
我目前正在解决这样的问题:

(define-fun my-or-impl ((x Bool) (y Bool)) Bool (or x y))
(declare-fun my-or (Bool Bool) Bool)
(assert (forall ((x Bool) (y Bool)) (= (my-or x y) (my-or-impl x y))))
(check-sat)

但我希望有一种方法可以解决这个问题,它不涉及通用量词。

不幸的是,
定义乐趣
只是Z3中的一个宏定义。它们在Z3 SMT 2.0解析器中实现。它们不是Z3内核的一部分。也就是说,Z3解算器甚至不“查看”这些定义。 使用
declare fun
和量词的方法是有效的,但是正如您所说的,我们应该避免使用量词,因为它们会产生性能问题,而且使用量词很容易产生Z3无法解决的问题。
最好的选择是使用
(\umap或)

不幸的是,
define fun
只是Z3中的一个宏定义。它们在Z3 SMT 2.0解析器中实现。它们不是Z3内核的一部分。也就是说,Z3解算器甚至不“查看”这些定义。 使用
declare fun
和量词的方法是有效的,但是正如您所说的,我们应该避免使用量词,因为它们会产生性能问题,而且使用量词很容易产生Z3无法解决的问题。 最好的选择是使用
(\umap或)

最好的选择是使用(uu映射或)

除非你想在数组上映射一个非内置函数。。。我想
declare fun
plus
assert
是唯一的出路

最好的选择是使用(uu映射或)


除非你想在数组上映射一个非内置函数。。。我想
declare-fun
plus
assert
是唯一的方法?

我意识到这是一个旧的响应,但我想签入:如果我想表达属性,例如数组中元素的按项求和,那么当前映射功能是否可行?我意识到这是一个旧的响应,但是我想签入:如果我想表达属性,比如数组中元素的逐项求和,那么这在当前的映射功能中是可行的吗?