Z3 对日志使用unterpret函数

Z3 对日志使用unterpret函数,z3,Z3,我试图学习Z3未解释函数如何工作,以显示n=2k+1=>log(m)+k*log(m*m)==n*log(m)。为此,我使用了如下方法 mylog = Function('mylog', IntSort(), IntSort()) mylog_rule1 = mylog(x*y) == mylog(x) + mylog(y) mylog_rule2 = mylog(x**y) == y*mylog(x) #mylog_rule3 = y*mylog(x) == mylog(x**y) #is

我试图学习Z3未解释函数如何工作,以显示
n=2k+1=>log(m)+k*log(m*m)==n*log(m)
。为此,我使用了如下方法

mylog = Function('mylog', IntSort(), IntSort())
mylog_rule1 = mylog(x*y) == mylog(x) + mylog(y)
mylog_rule2 = mylog(x**y) == y*mylog(x)
#mylog_rule3 = y*mylog(x) == mylog(x**y)  #is this rule needed ? 



rules = And(mylog_rule1, mylog_rule2, mylog_rule3)
prop = Implies(n==2*k+1, log(m) + k*log(m*m) == n*log(m))
prove(rules, prop)

我的方法肯定有问题,因为这不太管用。事实上,我甚至不能做
证明(暗示(mylog(x*y)=mylog(x)+mylog(y),mylog(m*n)==mylog(m)+mylog(n))
,只要更改变量名。

Z3将无法有效解决此类问题。 Z3有一个用于非线性算术()的解算器。但是,此解算器不支持量词和未解释的函数。Z3将来将支持这一点。 因此,当问题包含未解释的函数(如
mylog
)时,Z3将使用不同(且不完整)的解算器进行非线性运算。该解算器将在简单的非线性问题上失败

您的示例的另一个问题是,您没有在规则中使用通用量词。 简单的例子
prove(意味着(mylog(x*y)=mylog(x)+mylog(y),mylog(m*n)==mylog(m)+mylog(n))
即使在使用非线性算法的不完全解算器时也可以得到证明。 下面是正确的Z3Py脚本()


变量x、y、m、n是什么?它们是量化的吗?也许你想假设量化的公式,使log的属性公理化。另外,你的例子混合了mylog和log这两个不同的函数符号
mylog = Function('mylog', RealSort(), RealSort())
x, y = Reals('x y')
m, n = Reals('m n')
prove(Implies(ForAll([x,y], mylog(x*y) == mylog(x) + mylog(y)), 
      mylog(m*n) == mylog(m) + mylog(n)))