z3python:使用数学库

时间:2014-03-28 00:31:34

标签: python math z3 z3py

我试图用z3python使用python的数学库,我做的是

import z3
import math
a,b = z3.Reals('a b')
solve(b == math.factorial(a), b == 6)

它返回的错误消息是AttributeError:ArithRef实例没有属性' float '。

我的目的并不是真正使用Z3中的阶乘函数,而是我很好奇数学库中的函数是否可以与Z3一起使用。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

一般来说,不,这是不可能的。原因是Python函数没有转换为逻辑约束(在理论上可以通过fixed-point engine完成),但它需要大量的工作并且本质上是(通常不可判定的)模型的编码 - 检查问题。另见Leo对相关问题here)的出色回答。

在此特定示例中,请注意a是符号,即它表示任何可能的实数。 math.factorial不知道如何处理这些信息,因为它的实现只处理具体的实数。

对于某些特定功能,当然可以为Z3提供精确的编码。例如,Z3支持取幂,Python API提供__pow__运算符。请注意,此运算符可能与Python的__pow__ on(浮点抽象)实数具有完全相同的语义,并且它不是从Python的__pow__实现派生的。