我试图用z3python使用python的数学库,我做的是
import z3
import math
a,b = z3.Reals('a b')
solve(b == math.factorial(a), b == 6)
它返回的错误消息是AttributeError:ArithRef实例没有属性' float '。
我的目的并不是真正使用Z3中的阶乘函数,而是我很好奇数学库中的函数是否可以与Z3一起使用。任何建议都表示赞赏。
答案 0 :(得分:1)
一般来说,不,这是不可能的。原因是Python函数没有转换为逻辑约束(在理论上可以通过fixed-point engine完成),但它需要大量的工作并且本质上是(通常不可判定的)模型的编码 - 检查问题。另见Leo对相关问题here)的出色回答。
在此特定示例中,请注意a
是符号,即它表示任何可能的实数。 math.factorial
不知道如何处理这些信息,因为它的实现只处理具体的实数。
对于某些特定功能,当然可以为Z3提供精确的编码。例如,Z3支持取幂,Python API提供__pow__
运算符。请注意,此运算符可能与Python的__pow__
on(浮点抽象)实数具有完全相同的语义,并且它不是从Python的__pow__
实现派生的。