python的math库中的数学函数,z3python:使用数学库

I was trying to use python's math library with z3python, what I did was

import z3

import math

a,b = z3.Reals('a b')

solve(b == math.factorial(a), b == 6)

The error message it returns is AttributeError: ArithRef instance has no attribute 'float'.

My purpose is not really using the factorial function in Z3, rather I am curious if the functions from the math library can be used with Z3 in general. Any suggestion is appreciated.

解决方案

In general, no, this is not possible. The reason is that there is no translation for Python functions to logical constraints (which in theory could be done, e.g., via the fixed-point engine), but it would require substantial effort and essentially an encoding of (in general undecidable) model-checking problems. See also Leo's excellent answer to a related question here).

In this particular example, note that a is symbolic, i.e., it represents any possible real number. math.factorial does not know what to do with this information, because it's implementation only handles concrete real numbers.

For some particular functions, it may of course be possible to provide a precise encoding to Z3. For example, Z3 supports exponentiation and the Python API provides a __pow__ operator. Note that this operator however, may not have exactly the same semantics as Python's __pow__ on (floating-point abstractions of) real numbers, and it is not derived from Python's implementation of __pow__.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值