1#include "storm-config.h"
12TEST(Z3ExpressionAdapter, StormToZ3Basic) {
15 z3::expr conjecture = ctx.bool_val(
false);
18 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
21 z3::expr z3True = ctx.bool_val(
true);
22 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprTrue), z3True)));
24 ASSERT_TRUE(s.check() == z3::unsat);
28 z3::expr z3False = ctx.bool_val(
false);
29 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFalse), z3False)));
31 ASSERT_TRUE(s.check() == z3::unsat);
37 z3::expr z3Conjunction = (ctx.bool_const(
"x") && ctx.bool_const(
"y"));
39 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprConjunction), z3Conjunction)));
41 ASSERT_TRUE(s.check() == z3::unsat);
45 z3::expr z3Nor = !(ctx.bool_const(
"x") || ctx.bool_const(
"y"));
46 ASSERT_NO_THROW(adapter.translateExpression(exprNor));
47 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprNor), z3Nor)));
49 ASSERT_TRUE(s.check() == z3::unsat);
53TEST(Z3ExpressionAdapter, StormToZ3Integer) {
56 z3::expr conjecture = ctx.bool_val(
false);
59 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
65 z3::expr z3Add = (ctx.int_const(
"x") + ctx.int_const(
"y") < -ctx.int_const(
"y"));
66 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprAdd), z3Add)));
68 ASSERT_TRUE(s.check() == z3::unsat);
72 z3::expr z3Mult = !(ctx.int_const(
"x") * ctx.int_const(
"y") == ctx.int_const(
"y"));
73 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprMult), z3Mult)));
75 ASSERT_TRUE(s.check() == z3::unsat);
79TEST(Z3ExpressionAdapter, StormToZ3Real) {
82 z3::expr conjecture = ctx.bool_val(
false);
85 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
91 z3::expr z3Add = (ctx.real_const(
"x") + ctx.real_const(
"y") < -ctx.real_const(
"y"));
92 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprAdd), z3Add)));
94 ASSERT_TRUE(s.check() == z3::unsat);
98 z3::expr z3Mult = !(ctx.real_const(
"x") * ctx.real_const(
"y") == ctx.real_const(
"y"));
99 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprMult), z3Mult)));
101 ASSERT_TRUE(s.check() == z3::unsat);
105TEST(Z3ExpressionAdapter, StormToZ3FloorCeil) {
108 z3::expr conjecture = ctx.bool_val(
false);
111 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
117 z3::expr z3Floor = ctx.int_val(4) == ctx.int_const(
"i");
119 conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFloor), z3Floor));
120 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFloor), z3Floor)));
124 ASSERT_TRUE(s.check() == z3::sat);
126 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_implies(ctx, adapter.translateExpression(exprFloor), z3Floor)));
130 ASSERT_TRUE(s.check() == z3::unsat);
134 z3::expr z3Ceil = ctx.int_val(5) == ctx.int_const(
"i");
136 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprCeil), z3Ceil)));
139 ASSERT_TRUE(s.check() == z3::sat);
141 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_implies(ctx, adapter.translateExpression(exprCeil), z3Ceil)));
145 ASSERT_TRUE(s.check() == z3::unsat);
149TEST(Z3ExpressionAdapter, Z3ToStormBasic) {
153 manager->declareBooleanVariable(
"x");
154 manager->declareBooleanVariable(
"y");
155 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
157 z3::expr z3True = ctx.bool_val(
true);
159 exprTrue = adapter.translateExpression(z3True);
160 ASSERT_TRUE(exprTrue.
isTrue());
162 z3::expr z3False = ctx.bool_val(
false);
164 exprFalse = adapter.translateExpression(z3False);
165 ASSERT_TRUE(exprFalse.
isFalse());
167 z3::expr z3Conjunction = (ctx.bool_const(
"x") && ctx.bool_const(
"y"));
169 (exprConjunction = adapter.translateExpression(z3Conjunction));
176 z3::expr z3Nor = !(ctx.bool_const(
"x") || ctx.bool_const(
"y"));
178 (exprNor = adapter.translateExpression(z3Nor));
bool isVariable() const
Retrieves whether the expression is a variable.
OperatorType getOperator() const
Retrieves the operator of a function application.
Expression getOperand(uint_fast64_t operandIndex) const
Retrieves the given operand from the expression.
std::string const & getIdentifier() const
Retrieves the identifier associated with this expression.
bool isFalse() const
Checks if the expression is equal to the boolean literal false.
bool isTrue() const
Checks if the expression is equal to the boolean literal true.
This class is responsible for managing a set of typed variables and all expressions using these varia...
Expression ceil(Expression const &first)
Expression floor(Expression const &first)
SettingsManager const & manager()
Retrieves the settings manager.