通过 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 ...))
这就是我想要做的。
假设我想在类似于以下的表达式中使用 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 ...))