我正在尝试了解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))
。
答案 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)))