我想基于三个约束设置一个简单的约束网,并希望它可以用Z3解决。 我正在使用汽车的一个例子:
约束1:Price.Car = Price.Engine + Price.Tires + Price.Body
而每个价格都有下面代码中定义的范围。
约束2:
速度,功率和前部区域的依赖性。 v
:速度,P
:功率,A
:汽车前部区域,C w 空气阻力系数,rho
中等空气密度。
附带问题:如何在Z3中表达第三个根?
约束3:P=ax
电力和价格之间的依赖关系。 P
:权力,a
:比例常数,x
:价格。为简单起见,结果是线性化的,但也可以从关系表中获取。
我想要在Z3中表达的依赖关系,并且它针对各种变量进行了优化,例如使用引擎的最小价格等最高速度等。如何在Z3中执行此操作? 我很感激一个完整的代码示例,因为我是Z3的新手。
我从以下代码开始,但不知道如何继续:
IntExpr PriceEngine = ctx.mkIntConst("PriceEngine");
IntExpr PriceBody = ctx.mkIntConst("PriceBody");
IntExpr PriceTires = ctx.mkIntConst("PriceTires");
IntExpr LowerBoundPriceCar = ctx.mkInt(1550);
IntExpr UpperBoundPriceCar = ctx.mkInt(3200);
IntExpr LowerBoundPriceEngine = ctx.mkInt(500);
IntExpr UpperBoundPriceEngine = ctx.mkInt(1000);
IntExpr LowerBoundPriceBody = ctx.mkInt(1000);
IntExpr UpperBoundPriceBody = ctx.mkInt(2000);
IntExpr LowerBoundPriceTires = ctx.mkInt(50);
IntExpr UpperBoundPriceTires = ctx.mkInt(200);
//ArithExpr y_plus_one = ctx.mkAdd(y, one);
//BoolExpr boundPriceCar1 = ctx.mkLt(PriceCar, UpperBoundPriceCar);
//BoolExpr boundPriceCar2 = ctx.mkGt(PriceCar, LowerBoundPriceCar);
BoolExpr boundPriceEngine1 = ctx.mkLt(PriceEngine, UpperBoundPriceEngine);
BoolExpr boundPriceEngine2 = ctx.mkGt(PriceEngine, LowerBoundPriceEngine);
BoolExpr boundPriceBody1 = ctx.mkLt(PriceBody, UpperBoundPriceBody);
BoolExpr boundPriceBody2 = ctx.mkGt(PriceBody, LowerBoundPriceBody);
BoolExpr boundPriceTires1 = ctx.mkLt(PriceTires, UpperBoundPriceTires);
BoolExpr boundPriceTires2 = ctx.mkGt(PriceTires, LowerBoundPriceTires);
//BoolExpr bothBoundsPriceCar = ctx.mkAnd(boundPriceCar1, boundPriceCar2);
BoolExpr bothBoundsPriceEngine = ctx.mkAnd(boundPriceEngine1, boundPriceEngine2);
BoolExpr bothBoundsPriceBody = ctx.mkAnd(boundPriceBody1, boundPriceBody2);
BoolExpr bothBoundsPriceTires = ctx.mkAnd(boundPriceTires1, boundPriceTires2);
ArithExpr PriceCar = ctx.mkAdd(PriceEngine, PriceBody, PriceTires);
//ArithExpr Speed = ctx.