通过其Java实现在Z3中定义函数?

通过其Java实现在Z3中定义函数?,z3,smt,Z3,Smt,这就是我要做的 假设我想在一个类似以下的表达式中使用Z3(及其Java绑定)查找op的值: ((exists(op Int))(=(foo op)2) 因此,我想在op变量上调用函数foo,检查函数返回的op值2。我想在Java中定义一个函数foo,并认为Z3有一种方法可以访问这些函数定义。我想这样做,因为函数实际上是在HashMap中查找的,而ch很容易用Java实现 由于我是SMT解决方案的初学者,所以我可能想做一些做不到的事情,所以我愿意接受所有关于这个话题的建议 提前感谢您的时间和回答!

这就是我要做的

假设我想在一个类似以下的表达式中使用Z3(及其Java绑定)查找
op
的值:

((exists(op Int))(=(foo op)2)

因此,我想在
op
变量上调用函数
foo
,检查函数返回的op值2。我想在Java中定义一个函数foo,并认为Z3有一种方法可以访问这些函数定义。我想这样做,因为函数实际上是在HashMap中查找的,而ch很容易用Java实现

由于我是SMT解决方案的初学者,所以我可能想做一些做不到的事情,所以我愿意接受所有关于这个话题的建议


提前感谢您的时间和回答!

这将是非常好的选择,但目前Z3无法使用其他语言/API的函数定义。不过,对于查找表来说,这应该很容易,因为它们可以很容易地编码为else级联,例如:

;; define foo
(define-fun foo ((x Int)) Int
    (ite (= x 1) 42
    (ite (= x 2) 43
    ;; ...
                 78)))

;; use foo
(assert (exists ((op Int)) (= (foo op) 43)))
(apply skip)
产生

(goal
  (exists ((op Int)) (= (ite (= op 1) 42 (ite (= op 2) 43 78)) 43))
  :precision precise :depth 0)
)
(问题也很快得到解决。)

通过API执行此操作的最简单方法是设置函数声明的问题,然后通过
宏查找器识别的通用量词提供宏定义
策略:

;; declare foo
(declare-fun foo ((Int)) Int)

;; define foo
(assert (forall ((x Int)) (= (foo x)
    (ite (= x 1) 42
    (ite (= x 2) 43
    ;; ...
                 78)))))

;; use foo
(assert (exists ((op Int)) (= (foo op) 43)))
(apply macro-finder) ;; replaces foo with it's definition
为了让宏查找器获取函数定义,量词必须具有

(forall ((x ...)) (= (foo x) (... definition ...))

感谢您花时间回答这个问题。我也想到了这个解决方案,但我认为这会带来太多的开销…无论如何,我必须这样做。嘿,我已经开始使用Java绑定来实现它,但遇到了一个问题。我想使用您指定的示例中的宏,但是我似乎无法解决这个问题找到一种使用API将参数映射到返回值的函数体定义函数(宏)的方法,因为mkFuncDecl提供了一种声明函数但不定义函数体的方法。好的观点!我认为最简单的方法是应用宏查找器策略。我将把它添加到示例中。