自新的 SMT-LIB 标准以来,如何在 z3 Python API 中定义函数?

How can I define a function in z3 Python API since the new SMT-LIB standard?

新的 SMT-LIB 标准允许以下形式的函数定义命令:

(define-fun f ((x1 σ1) · · · (xn σn)) σ t) 

规范阐明这在语义上等同于

(declare-fun f (σ1 · · · σn) σ)
(assert (forall ((x1 σ1) · · · (xn σn)) (= ( f x1 · · · xn) t))

目前我会使用 Python z3 API 定义一个函数,如下所示:

s = z3.Solver()
f = z3.Function("f", [σ1 ... σn, σ])
s.add(z3.ForAll([x1, ...,xn], t == f(x1, ..., xn)))

这是规范的处理方式还是有更直接或更有效的处理方式?

通常,只需使用 Python 函数即可。此函数 returns 根据其符号输入的结果,以某种方式在 z3 甚至看到它之前展开定义。

一个例外情况是,如果您想定义一个递归函数,其终止取决于符号参数。请注意,即使您的函数不是递归的,您也可以使用相同的工具,这可以解决来自其他来源的定义问题。有关详细信息,请参阅 RecAddDefinition