1#include "storm-config.h"
13TEST(Z3ExpressionAdapter, StormToZ3Basic) {
16 z3::expr conjecture = ctx.bool_val(
false);
19 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
22 z3::expr z3True = ctx.bool_val(
true);
23 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprTrue), z3True)));
25 ASSERT_TRUE(s.check() == z3::unsat);
29 z3::expr z3False = ctx.bool_val(
false);
30 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFalse), z3False)));
32 ASSERT_TRUE(s.check() == z3::unsat);
38 z3::expr z3Conjunction = (ctx.bool_const(
"x") && ctx.bool_const(
"y"));
40 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprConjunction), z3Conjunction)));
42 ASSERT_TRUE(s.check() == z3::unsat);
46 z3::expr z3Nor = !(ctx.bool_const(
"x") || ctx.bool_const(
"y"));
47 ASSERT_NO_THROW(adapter.translateExpression(exprNor));
48 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprNor), z3Nor)));
50 ASSERT_TRUE(s.check() == z3::unsat);
54TEST(Z3ExpressionAdapter, StormToZ3Integer) {
57 z3::expr conjecture = ctx.bool_val(
false);
60 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
66 z3::expr z3Add = (ctx.int_const(
"x") + ctx.int_const(
"y") < -ctx.int_const(
"y"));
67 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprAdd), z3Add)));
69 ASSERT_TRUE(s.check() == z3::unsat);
73 z3::expr z3Mult = !(ctx.int_const(
"x") * ctx.int_const(
"y") == ctx.int_const(
"y"));
74 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprMult), z3Mult)));
76 ASSERT_TRUE(s.check() == z3::unsat);
80TEST(Z3ExpressionAdapter, StormToZ3Real) {
83 z3::expr conjecture = ctx.bool_val(
false);
86 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
92 z3::expr z3Add = (ctx.real_const(
"x") + ctx.real_const(
"y") < -ctx.real_const(
"y"));
93 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprAdd), z3Add)));
95 ASSERT_TRUE(s.check() == z3::unsat);
99 z3::expr z3Mult = !(ctx.real_const(
"x") * ctx.real_const(
"y") == ctx.real_const(
"y"));
100 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprMult), z3Mult)));
102 ASSERT_TRUE(s.check() == z3::unsat);
106TEST(Z3ExpressionAdapter, StormToZ3FloorCeil) {
109 z3::expr conjecture = ctx.bool_val(
false);
112 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
118 z3::expr z3Floor = ctx.int_val(4) == ctx.int_const(
"i");
120 conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFloor), z3Floor));
121 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFloor), z3Floor)));
125 ASSERT_TRUE(s.check() == z3::sat);
127 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_implies(ctx, adapter.translateExpression(exprFloor), z3Floor)));
131 ASSERT_TRUE(s.check() == z3::unsat);
135 z3::expr z3Ceil = ctx.int_val(5) == ctx.int_const(
"i");
137 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprCeil), z3Ceil)));
140 ASSERT_TRUE(s.check() == z3::sat);
142 ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_implies(ctx, adapter.translateExpression(exprCeil), z3Ceil)));
146 ASSERT_TRUE(s.check() == z3::unsat);
150TEST(Z3ExpressionAdapter, Z3ToStormBasic) {
154 manager->declareBooleanVariable(
"x");
155 manager->declareBooleanVariable(
"y");
156 storm::adapters::Z3ExpressionAdapter adapter(*manager, ctx);
158 z3::expr z3True = ctx.bool_val(
true);
160 exprTrue = adapter.translateExpression(z3True);
161 ASSERT_TRUE(exprTrue.
isTrue());
163 z3::expr z3False = ctx.bool_val(
false);
165 exprFalse = adapter.translateExpression(z3False);
166 ASSERT_TRUE(exprFalse.
isFalse());
168 z3::expr z3Conjunction = (ctx.bool_const(
"x") && ctx.bool_const(
"y"));
170 (exprConjunction = adapter.translateExpression(z3Conjunction));
177 z3::expr z3Nor = !(ctx.bool_const(
"x") || ctx.bool_const(
"y"));
179 (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.