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

Defining a function in Z3 by its Java implementation?

这就是我想要做的。

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

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

所以我想在 op 变量上调用函数 foo 并检查函数 return 的 op 值 2. 我想定义一个函数 foo 在Java 并认为 Z3 存在一种访问这些函数定义的方法。我想这样做是因为这些函数实际上是在 HashMap 中查找,这在 Java.

中很容易实现

由于我是一般 SMT 求解器的初学者,所以我可能想做一些无法完成的事情。所以我愿意接受有关该主题的所有建议。

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

如果有那就太好了,但目前 Z3 不能使用其他 languages/APIs 的函数定义。对于查找表的情况,它应该很容易,因为它们可以很容易地编码为 if-then-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 执行此操作的最简单方法是使用函数声明设置问题,然后通过 macro-finder 策略识别的通用量词提供宏定义:

;; 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 ...))