自新的 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。
新的 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。