@@ -189,10 +189,7 @@ class Expression
189
189
190
190
static Expression ite (Expression _condition, Expression _trueValue, Expression _falseValue)
191
191
{
192
- if (_trueValue.sort ->kind == Kind::Int)
193
- smtAssert (_trueValue.sort ->kind == _falseValue.sort ->kind , " " );
194
- else
195
- smtAssert (*_trueValue.sort == *_falseValue.sort , " " );
192
+ smtAssert (areCompatible (*_trueValue.sort , *_falseValue.sort ));
196
193
SortPointer sort = _trueValue.sort ;
197
194
return Expression (" ite" , std::vector<Expression>{
198
195
std::move (_condition), std::move (_trueValue), std::move (_falseValue)
@@ -216,10 +213,7 @@ class Expression
216
213
std::shared_ptr<ArraySort> arraySort = std::dynamic_pointer_cast<ArraySort>(_array.sort );
217
214
smtAssert (arraySort, " " );
218
215
smtAssert (_index.sort , " " );
219
- if (arraySort->domain ->kind == Kind::Int)
220
- smtAssert (arraySort->domain ->kind == _index.sort ->kind , " " );
221
- else
222
- smtAssert (*arraySort->domain == *_index.sort , " " );
216
+ smtAssert (areCompatible (*arraySort->domain , *_index.sort ));
223
217
return Expression (
224
218
" select" ,
225
219
std::vector<Expression>{std::move (_array), std::move (_index)},
@@ -235,11 +229,8 @@ class Expression
235
229
smtAssert (arraySort, " " );
236
230
smtAssert (_index.sort , " " );
237
231
smtAssert (_element.sort , " " );
238
- smtAssert (*arraySort->domain == *_index.sort , " " );
239
- if (arraySort->domain ->kind == Kind::Int)
240
- smtAssert (arraySort->range ->kind == _element.sort ->kind , " " );
241
- else
242
- smtAssert (*arraySort->range == *_element.sort , " " );
232
+ smtAssert (areCompatible (*arraySort->domain , *_index.sort ));
233
+ smtAssert (areCompatible (*arraySort->range , *_element.sort ));
243
234
return Expression (
244
235
" store" ,
245
236
std::vector<Expression>{std::move (_array), std::move (_index), std::move (_element)},
@@ -254,10 +245,7 @@ class Expression
254
245
auto arraySort = std::dynamic_pointer_cast<ArraySort>(sortSort->inner );
255
246
smtAssert (sortSort && arraySort, " " );
256
247
smtAssert (_value.sort , " " );
257
- if (arraySort->domain ->kind == Kind::Int)
258
- smtAssert (arraySort->range ->kind == _value.sort ->kind , " " );
259
- else
260
- smtAssert (*arraySort->range == *_value.sort , " " );
248
+ smtAssert (areCompatible (*arraySort->range , *_value.sort ));
261
249
return Expression (
262
250
" const_array" ,
263
251
std::vector<Expression>{std::move (_sort), std::move (_value)},
@@ -501,6 +489,12 @@ class Expression
501
489
SortPointer sort;
502
490
503
491
private:
492
+ // / Helper method for checking sort compatibility when creating expressions
493
+ // / Signed and unsigned Int sorts are compatible even though they are not same
494
+ static bool areCompatible (Sort const & s1, Sort const & s2)
495
+ {
496
+ return s1.kind == Kind::Int ? s1.kind == s2.kind : s1 == s2;
497
+ }
504
498
// / Manual constructors, should only be used by SolverInterface and this class itself.
505
499
Expression (std::string _name, std::vector<Expression> _arguments, Kind _kind):
506
500
Expression (std::move(_name), std::move(_arguments), std::make_shared<Sort>(_kind)) {}
0 commit comments