Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MathsatExpressionAdapterTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#ifdef STORM_HAVE_MSAT
5#include "mathsat.h"
9
10TEST(MathsatExpressionAdapter, StormToMathsatBasic) {
11 msat_config config = msat_create_config();
12 msat_env env = msat_create_env(config);
13 ASSERT_FALSE(MSAT_ERROR_ENV(env));
14 msat_destroy_config(config);
15
16 std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
17 storm::adapters::MathsatExpressionAdapter adapter(*manager, env);
18
19 storm::expressions::Expression exprTrue = manager->boolean(true);
20 msat_term msatTrue = msat_make_true(env);
21 msat_term conjecture;
22 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, msatTrue, adapter.translateExpression(exprTrue))));
23 msat_assert_formula(env, conjecture);
24 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
25 msat_reset_env(env);
26
27 storm::expressions::Expression exprFalse = manager->boolean(false);
28 msat_term msatFalse = msat_make_false(env);
29 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprFalse), msatFalse)));
30 msat_assert_formula(env, conjecture);
31 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
32 msat_reset_env(env);
33
34 storm::expressions::Variable x = manager->declareBooleanVariable("x");
35 storm::expressions::Variable y = manager->declareBooleanVariable("y");
36 storm::expressions::Expression exprConjunction = x && y;
37 msat_term msatConjunction = msat_make_and(env, msat_make_constant(env, msat_declare_function(env, "x", msat_get_bool_type(env))),
38 msat_make_constant(env, msat_declare_function(env, "y", msat_get_bool_type(env))));
39
40 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprConjunction), msatConjunction)));
41 msat_assert_formula(env, conjecture);
42 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
43 msat_reset_env(env);
44
45 storm::expressions::Expression exprNor = !(x || y);
46 msat_term msatNor = msat_make_not(env, msat_make_or(env, msat_make_constant(env, msat_declare_function(env, "x", msat_get_bool_type(env))),
47 msat_make_constant(env, msat_declare_function(env, "y", msat_get_bool_type(env)))));
48 ASSERT_NO_THROW(adapter.translateExpression(exprNor)); // Variables already created in adapter.
49 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprNor), msatNor)));
50 msat_assert_formula(env, conjecture);
51 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
52 msat_reset_env(env);
53}
54
55TEST(MathsatExpressionAdapter, StormToMathsatInteger) {
56 msat_config config = msat_create_config();
57 msat_env env = msat_create_env(config);
58 ASSERT_FALSE(MSAT_ERROR_ENV(env));
59 msat_destroy_config(config);
60
61 std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
62 storm::adapters::MathsatExpressionAdapter adapter(*manager, env);
63
64 storm::expressions::Variable x = manager->declareIntegerVariable("x");
65 storm::expressions::Variable y = manager->declareIntegerVariable("y");
66
67 storm::expressions::Expression exprAdd = x + y < -y;
68 msat_decl xDecl = msat_declare_function(env, "x", msat_get_integer_type(env));
69 msat_term xVar = msat_make_constant(env, xDecl);
70 msat_decl yDecl = msat_declare_function(env, "y", msat_get_integer_type(env));
71 msat_term yVar = msat_make_constant(env, yDecl);
72 msat_term minusY = msat_make_times(env, msat_make_number(env, "-1"), yVar);
73 msat_term msatAdd = msat_make_plus(env, xVar, yVar);
74 msat_term msatLess = msat_make_and(env, msat_make_leq(env, msatAdd, minusY), msat_make_not(env, msat_make_equal(env, msatAdd, minusY)));
75 msat_term conjecture;
76 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprAdd), msatLess)));
77 msat_assert_formula(env, conjecture);
78 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
79 msat_reset_env(env);
80
81 storm::expressions::Expression exprMult = !(x * y == y);
82 msat_term msatTimes = msat_make_times(env, xVar, yVar);
83 msat_term msatNotEqual = msat_make_not(env, msat_make_equal(env, msatTimes, yVar));
84 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprMult), msatNotEqual)));
85 msat_assert_formula(env, conjecture);
86 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
87 msat_reset_env(env);
88}
89
90TEST(MathsatExpressionAdapter, StormToMathsatReal) {
91 msat_config config = msat_create_config();
92 msat_env env = msat_create_env(config);
93 ASSERT_FALSE(MSAT_ERROR_ENV(env));
94 msat_destroy_config(config);
95
96 std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
97 storm::adapters::MathsatExpressionAdapter adapter(*manager, env);
98
99 storm::expressions::Variable x = manager->declareRationalVariable("x");
100 storm::expressions::Variable y = manager->declareRationalVariable("y");
101
102 storm::expressions::Expression exprAdd = x + y < -y;
103 msat_decl xDecl = msat_declare_function(env, "x", msat_get_rational_type(env));
104 msat_term xVar = msat_make_constant(env, xDecl);
105 msat_decl yDecl = msat_declare_function(env, "y", msat_get_rational_type(env));
106 msat_term yVar = msat_make_constant(env, yDecl);
107 msat_term minusY = msat_make_times(env, msat_make_number(env, "-1"), yVar);
108 msat_term msatAdd = msat_make_plus(env, xVar, yVar);
109 msat_term msatLess = msat_make_and(env, msat_make_leq(env, msatAdd, minusY), msat_make_not(env, msat_make_equal(env, msatAdd, minusY)));
110 msat_term conjecture;
111 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprAdd), msatLess)));
112 msat_assert_formula(env, conjecture);
113 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
114 msat_reset_env(env);
115
116 storm::expressions::Expression exprMult = !(x * y == y);
117 msat_term msatTimes = msat_make_times(env, xVar, yVar);
118 msat_term msatNotEqual = msat_make_not(env, msat_make_equal(env, msatTimes, yVar));
119 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprMult), msatNotEqual)));
120 msat_assert_formula(env, conjecture);
121 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
122 msat_reset_env(env);
123}
124
125TEST(MathsatExpressionAdapter, StormToMathsatFloorCeil) {
126 msat_config config = msat_create_config();
127 msat_env env = msat_create_env(config);
128 ASSERT_FALSE(MSAT_ERROR_ENV(env));
129 msat_destroy_config(config);
130
131 std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
132 storm::adapters::MathsatExpressionAdapter adapter(*manager, env);
133
134 storm::expressions::Variable d = manager->declareRationalVariable("d");
135 storm::expressions::Variable i = manager->declareIntegerVariable("i");
136
137 storm::expressions::Expression exprFloor = storm::expressions::floor(d) == i && d > manager->rational(4.1) && d < manager->rational(4.991);
138 msat_decl iDecl = msat_declare_function(env, "i", msat_get_integer_type(env));
139 msat_term iVar = msat_make_constant(env, iDecl);
140 msat_term msatEqualsFour = msat_make_equal(env, msat_make_number(env, "4"), iVar);
141 msat_term conjecture;
142 msat_term translatedExpr = adapter.translateExpression(exprFloor);
143 msat_term msatIff = msat_make_iff(env, translatedExpr, msatEqualsFour);
144 ASSERT_NO_THROW(conjecture = msat_make_not(env, msatIff));
145 msat_assert_formula(env, conjecture);
146
147 // It is not logically equivalent, so this should be satisfiable.
148 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_SAT);
149 msat_reset_env(env);
150 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_or(env, msat_make_not(env, adapter.translateExpression(exprFloor)), msatEqualsFour)));
151 msat_assert_formula(env, conjecture);
152
153 // However, the left part implies the right one, which is why this should be unsatisfiable.
154 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_UNSAT);
155 msat_reset_env(env);
156
157 storm::expressions::Expression exprCeil = storm::expressions::ceil(d) == i && d > manager->rational(4.1) && d < manager->rational(4.991);
158 msat_term msatEqualsFive = msat_make_equal(env, msat_make_number(env, "5"), iVar);
159
160 ASSERT_NO_THROW(conjecture = msat_make_not(env, msat_make_iff(env, adapter.translateExpression(exprFloor), msatEqualsFive)));
161 msat_assert_formula(env, conjecture);
162
163 // It is not logically equivalent, so this should be satisfiable.
164 ASSERT_TRUE(msat_solve(env) == msat_result::MSAT_SAT);
165 msat_reset_env(env);
166 ASSERT_NO_THROW(conjecture = msat_make_or(env, msat_make_not(env, adapter.translateExpression(exprFloor)), msatEqualsFive));
167 msat_assert_formula(env, conjecture);
168 msat_reset_env(env);
169}
170
171TEST(MathsatExpressionAdapter, MathsatToStormBasic) {
172 msat_config config = msat_create_config();
173 msat_env env = msat_create_env(config);
174 ASSERT_FALSE(MSAT_ERROR_ENV(env));
175 msat_destroy_config(config);
176
177 std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
178 manager->declareBooleanVariable("x");
179 manager->declareBooleanVariable("y");
180 storm::adapters::MathsatExpressionAdapter adapter(*manager, env);
181
182 msat_term msatTrue = msat_make_true(env);
184 ASSERT_NO_THROW(exprTrue = adapter.translateExpression(msatTrue));
185 ASSERT_TRUE(exprTrue.isTrue());
186
187 msat_term msatFalse = msat_make_false(env);
189 ASSERT_NO_THROW(exprTrue = adapter.translateExpression(msatFalse));
190 ASSERT_TRUE(exprTrue.isFalse());
191
192 msat_decl xDecl = msat_declare_function(env, "x", msat_get_bool_type(env));
193 msat_term x = msat_make_constant(env, xDecl);
194 msat_decl yDecl = msat_declare_function(env, "y", msat_get_bool_type(env));
195 msat_term y = msat_make_constant(env, yDecl);
196 msat_term msatConjunction = msat_make_and(env, x, y);
197 storm::expressions::Expression exprConjunction;
198 ASSERT_NO_THROW(exprConjunction = adapter.translateExpression(msatConjunction));
199 ASSERT_EQ(storm::expressions::OperatorType::And, exprConjunction.getOperator());
200 ASSERT_TRUE(exprConjunction.getOperand(0).isVariable());
201 ASSERT_EQ("x", exprConjunction.getOperand(0).getIdentifier());
202 ASSERT_TRUE(exprConjunction.getOperand(1).isVariable());
203 ASSERT_EQ("y", exprConjunction.getOperand(1).getIdentifier());
204
205 msat_term msatNor = msat_make_not(env, msat_make_or(env, x, y));
207 ASSERT_NO_THROW(exprNor = adapter.translateExpression(msatNor));
210 ASSERT_TRUE(exprNor.getOperand(0).getOperand(0).isVariable());
211 ASSERT_EQ("x", exprNor.getOperand(0).getOperand(0).getIdentifier());
212 ASSERT_TRUE(exprNor.getOperand(0).getOperand(1).isVariable());
213 ASSERT_EQ("y", exprNor.getOperand(0).getOperand(1).getIdentifier());
214}
215#endif
TEST(OrderTest, Simple)
Definition OrderTest.cpp:8
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.