问题描述
F(x1)> a;
F(x2)
∀t,F'(x)> = 0(导数);
(p)F(x)= ∑ ci * x ^ i; (i∈[0,n]; c是一个常数)解决方法
您的问题非常模棱两可,如果您展示自己尝试过的内容和遇到的问题,则堆栈溢出的效果最佳。
不过,以下是使用z3的Python接口可以为特定功能F = 2x^3 + 3x + 4
编写问题的方法:
from z3 import *
# Represent F as a function. Here we have 2x^3 + 3x + 4
def F(x):
return 2*x*x*x + 3*x + 4
# Similarly,derivative of F: 6x^2 + 3
def dF(x):
return 6*x*x + 3
x1,x2,a,b = Ints('x1 x2 a b')
s = Solver()
s.add(F(x1) > a)
s.add(F(x2) < b)
t = Int('t')
s.add(ForAll([t],dF(t) >= 0))
r = s.check()
if r == sat:
print s.model()
else:
print ("Solver said: %s" % r)
请注意,我将您的∀t,F'(x) >= 0
条件翻译为∀t. F'(t) >= 0
。我假设您在绑定变量中有一个错字。
运行此命令时,我得到:
[x1 = 0,x2 = 0,b = 5,a = 3]
该方法可以明显地推广到具有常数系数的任意多项式,但这主要是关于编程而不是z3。 (请注意,在SMTLib中这样做要困难得多。这是诸如Python等宿主语言的功能发挥作用的地方。)
请注意,此问题实质上是非线性的。 (变量与变量相乘。)因此,SMT求解器可能不是最佳选择,因为它们不能很好地处理非线性运算。但是您可以处理以后出现的那些问题。希望这可以帮助您入门!