设置一些简单的公式并用Z3解决它们

时间:2018-02-27 16:53:42

标签: java z3

我想基于三个约束设置一个简单的约束网,并希望它可以用Z3解决。 我正在使用汽车的一个例子:

  • 约束1:Price.Car = Price.Engine + Price.Tires + Price.Body 而每个价格都有下面代码中定义的范围。

  • 约束2:

    enter image description here

    速度,功率和前部区域的依赖性。 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.

0 个答案:

没有答案