使用uninterpret函数进行日志

时间:2013-02-28 23:13:07

标签: 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 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)

我的方法肯定有问题,因为这不太合适。事实上,我甚至不能只更改变量名prove(Implies(mylog(x*y) == mylog(x) + mylog(y), mylog(m*n) == mylog(m) + mylog(n))

1 个答案:

答案 0 :(得分:1)

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

您的示例的另一个问题是您没有在规则中使用通用量词。 即使使用非线性算法的不完全求解器,也可以证明简单示例prove(Implies(mylog(x*y) == mylog(x) + mylog(y), mylog(m*n) == mylog(m) + mylog(n))。 这是正确的Z3Py脚本(also available online here

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)))