如何在z3py中表示对数公式

如何在z3py中表示对数公式,z3,smt,z3py,Z3,Smt,Z3py,我对z3py很陌生。我试图用z3py编写以下对数表达式 log(x,y) 我确实经常搜索堆栈溢出,并遇到了一个类似的问题,但不幸的是,我没有得到足够令人满意的答案。请帮帮我 更一般地说,我们如何用Z3定义日志 我得到任何牵引力的唯一方法是使用e的近似值,将exp(x)定义为(^ex),然后将log定义为与exp相反的总函数。在SMT-LIB 2中: (define-fun exp ((x Real)) Real (^ 2.718281828459045 x)) (declare-fun log

我对z3py很陌生。我试图用z3py编写以下对数表达式

log(x,y)

我确实经常搜索堆栈溢出,并遇到了一个类似的问题,但不幸的是,我没有得到足够令人满意的答案。请帮帮我

更一般地说,我们如何用Z3定义日志

我得到任何牵引力的唯一方法是使用
e
的近似值,将
exp(x)
定义为
(^ex)
,然后将
log
定义为与
exp
相反的总函数。在SMT-LIB 2中:

(define-fun exp ((x Real)) Real (^ 2.718281828459045 x))
(declare-fun log (Real) Real)
(assert (forall ((x Real)) (= (log (exp x)) x)))
(assert (forall ((x Real)) (= (exp (log x)) x)))
在Z3Py中:

from z3 import *
from math import e

# This is an approximation
def Z3_exp(x):
    return e ** x

s = Solver()

# We define Z3_log as a total function that is the inverse of Z3_exp
Z3_log = Function('log', RealSort(), RealSort())
x = Real('x')
s.add(ForAll([x], Z3_log(Z3_exp(x)) == x))
s.add(ForAll([x], Z3_exp(Z3_log(x)) == x))
明显的问题是,它引入了
e
的近似值,这将导致一些不正确的结果,具体取决于您试图证明的内容。此外,由于它使用未解释的函数来定义
log
,因此将不使用最强大的非线性求解器(nlsat),而且,由于负参数将存在典型的奇怪域问题

另一种方法是简单地绑定
e
,但这仍然不准确,而且可能会有更糟糕的行为。Z3中还有一个未记录的内置符号
euler
,但目前它基本上不起作用。

你所说的
log(x,y)
log(x)
相对是什么意思?其中一个论点应该是基础吗?