49 lines
2.1 KiB
49 lines
2.1 KiB
#include "gtest/gtest.h"
|
|
#include "storm-config.h"
|
|
|
|
#include "z3++.h"
|
|
#include "src/adapters/Z3ExpressionAdapter.h"
|
|
#include "src/settings/Settings.h"
|
|
|
|
TEST(Z3ExpressionAdapter, StormToZ3) {
|
|
#ifdef STORM_HAVE_Z3
|
|
z3::context ctx;
|
|
z3::solver s(ctx);
|
|
z3::expr conjecture = ctx.bool_val(false);
|
|
|
|
storm::adapters::Z3ExpressionAdapter adapter(ctx, {});
|
|
|
|
storm::expressions::Expression exprTrue = storm::expressions::Expression::createTrue();
|
|
z3::expr z3True = ctx.bool_val(true);
|
|
ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprTrue), z3True)));
|
|
s.add(conjecture);
|
|
ASSERT_TRUE(s.check() == z3::unsat);
|
|
s.reset();
|
|
|
|
storm::expressions::Expression exprFalse = storm::expressions::Expression::createFalse();
|
|
z3::expr z3False = ctx.bool_val(false);
|
|
ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprFalse), z3False)));
|
|
s.add(conjecture);
|
|
ASSERT_TRUE(s.check() == z3::unsat);
|
|
s.reset();
|
|
|
|
storm::expressions::Expression exprConjunction = (storm::expressions::Expression::createBooleanVariable("x") && storm::expressions::Expression::createBooleanVariable("y"));
|
|
z3::expr z3Conjunction = (ctx.bool_const("x") && ctx.bool_const("y"));
|
|
ASSERT_THROW( adapter.translateExpression(exprConjunction, false), std::out_of_range ); //variables not yet created in adapter
|
|
ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprConjunction, true), z3Conjunction)));
|
|
s.add(conjecture);
|
|
ASSERT_TRUE(s.check() == z3::unsat);
|
|
s.reset();
|
|
|
|
storm::expressions::Expression exprNor = !(storm::expressions::Expression::createBooleanVariable("x") || storm::expressions::Expression::createBooleanVariable("y"));
|
|
z3::expr z3Nor = !(ctx.bool_const("x") || ctx.bool_const("y"));
|
|
ASSERT_NO_THROW(adapter.translateExpression(exprNor, false)); //variables already created in adapter
|
|
ASSERT_NO_THROW(conjecture = !z3::expr(ctx, Z3_mk_iff(ctx, adapter.translateExpression(exprNor, true), z3Nor)));
|
|
s.add(conjecture);
|
|
ASSERT_TRUE(s.check() == z3::unsat);
|
|
s.reset();
|
|
#else
|
|
ASSERT_TRUE(false) << "StoRM built without Z3 support.";
|
|
#endif
|
|
}
|
|
|