26
26
#endif
27
27
28
28
typedef exprt (
29
- *assume_function)(abstract_environmentt &, exprt, const namespacet &);
30
-
31
- exprt assume_eq (abstract_environmentt &env, exprt expr, const namespacet &ns);
32
- exprt assume_noteq (
29
+ *assume_function)(abstract_environmentt &, const exprt &, const namespacet &);
30
+
31
+ static exprt
32
+ assume_not (abstract_environmentt &env, const exprt &expr, const namespacet &ns);
33
+ static exprt
34
+ assume_or (abstract_environmentt &env, const exprt &expr, const namespacet &ns);
35
+ static exprt
36
+ assume_and (abstract_environmentt &env, const exprt &expr, const namespacet &ns);
37
+ static exprt
38
+ assume_eq (abstract_environmentt &env, const exprt &expr, const namespacet &ns);
39
+ static exprt assume_noteq (
40
+ abstract_environmentt &env,
41
+ const exprt &expr,
42
+ const namespacet &ns);
43
+ static exprt assume_less_than (
33
44
abstract_environmentt &env,
34
- exprt expr,
45
+ const exprt &expr,
46
+ const namespacet &ns);
47
+ static exprt assume_greater_than (
48
+ abstract_environmentt &env,
49
+ const exprt &expr,
35
50
const namespacet &ns);
36
- exprt assume_le (abstract_environmentt &env, exprt expr, const namespacet &ns);
37
- exprt assume_lt (abstract_environmentt &env, exprt expr, const namespacet &ns);
38
- exprt assume_ge (abstract_environmentt &env, exprt expr, const namespacet &ns);
39
- exprt assume_gt (abstract_environmentt &env, exprt expr, const namespacet &ns);
40
51
41
52
abstract_value_pointert as_value (const abstract_object_pointert &obj);
42
53
bool is_value (const abstract_object_pointert &obj);
@@ -258,51 +269,20 @@ bool abstract_environmentt::assume(const exprt &expr, const namespacet &ns)
258
269
}
259
270
260
271
static auto assume_functions =
261
- std::map<dstringt, assume_function>{{ID_equal, assume_eq},
272
+ std::map<dstringt, assume_function>{{ID_not, assume_not},
273
+ {ID_and, assume_and},
274
+ {ID_or, assume_or},
275
+ {ID_equal, assume_eq},
262
276
{ID_notequal, assume_noteq},
263
- {ID_le, assume_le },
264
- {ID_lt, assume_lt },
265
- {ID_ge, assume_ge },
266
- {ID_gt, assume_gt }};
277
+ {ID_le, assume_less_than },
278
+ {ID_lt, assume_less_than },
279
+ {ID_ge, assume_greater_than },
280
+ {ID_gt, assume_greater_than }};
267
281
268
- exprt abstract_environmentt::do_assume (exprt expr, const namespacet &ns)
282
+ exprt abstract_environmentt::do_assume (const exprt & expr, const namespacet &ns)
269
283
{
270
284
auto expr_id = expr.id ();
271
285
272
- if (expr_id == ID_not)
273
- {
274
- auto not_expr = to_not_expr (expr);
275
- auto result = do_assume (not_expr.op (), ns);
276
- if (result.is_boolean ())
277
- result = result.is_true () ? exprt (false_exprt ()) : true_exprt ();
278
- return result;
279
- }
280
- if (expr_id == ID_and)
281
- {
282
- auto and_expr = to_and_expr (expr);
283
- for (auto const &operand : and_expr.operands ())
284
- {
285
- auto result = do_assume (operand, ns);
286
- if (result.is_nil () || result.is_false ())
287
- return result;
288
- }
289
- return true_exprt ();
290
- }
291
- if (expr_id == ID_or)
292
- {
293
- exprt or_result = false_exprt ();
294
- auto or_expr = to_or_expr (expr);
295
- for (auto const &operand : or_expr.operands ())
296
- {
297
- auto result = do_assume (operand, ns);
298
- if (result.is_nil ())
299
- return result;
300
- if (result.is_true ())
301
- or_result = true_exprt ();
302
- }
303
- return or_result;
304
- }
305
-
306
286
auto fn = assume_functions[expr_id];
307
287
308
288
if (fn)
@@ -557,9 +537,57 @@ bool is_value(const abstract_object_pointert &obj)
557
537
return as_value (obj) != nullptr ;
558
538
}
559
539
560
- exprt assume_eq (abstract_environmentt &env, exprt expr, const namespacet &ns)
540
+ exprt assume_not (
541
+ abstract_environmentt &env,
542
+ const exprt &expr,
543
+ const namespacet &ns)
544
+ {
545
+ auto not_expr = to_not_expr (expr);
546
+ auto result = env.do_assume (not_expr.op (), ns);
547
+ if (result.is_boolean ())
548
+ result = result.is_true () ? exprt (false_exprt ()) : true_exprt ();
549
+ return result;
550
+ }
551
+
552
+ exprt assume_and (
553
+ abstract_environmentt &env,
554
+ const exprt &expr,
555
+ const namespacet &ns)
556
+ {
557
+ auto and_expr = to_and_expr (expr);
558
+ for (auto const &operand : and_expr.operands ())
559
+ {
560
+ auto result = env.do_assume (operand, ns);
561
+ if (result.is_nil () || result.is_false ())
562
+ return result;
563
+ }
564
+ return true_exprt ();
565
+ }
566
+
567
+ exprt assume_or (
568
+ abstract_environmentt &env,
569
+ const exprt &expr,
570
+ const namespacet &ns)
571
+ {
572
+ exprt or_result = false_exprt ();
573
+ auto or_expr = to_or_expr (expr);
574
+ for (auto const &operand : or_expr.operands ())
575
+ {
576
+ auto result = env.do_assume (operand, ns);
577
+ if (result.is_nil ())
578
+ return result;
579
+ if (result.is_true ())
580
+ or_result = true_exprt ();
581
+ }
582
+ return or_result;
583
+ }
584
+
585
+ exprt assume_eq (
586
+ abstract_environmentt &env,
587
+ const exprt &expr,
588
+ const namespacet &ns)
561
589
{
562
- auto equal_expr = to_binary_expr (expr);
590
+ auto const & equal_expr = to_binary_expr (expr);
563
591
564
592
auto left = env.eval (equal_expr.lhs (), ns);
565
593
auto right = env.eval (equal_expr.rhs (), ns);
@@ -581,9 +609,12 @@ exprt assume_eq(abstract_environmentt &env, exprt expr, const namespacet &ns)
581
609
return true_exprt ();
582
610
}
583
611
584
- exprt assume_noteq (abstract_environmentt &env, exprt expr, const namespacet &ns)
612
+ exprt assume_noteq (
613
+ abstract_environmentt &env,
614
+ const exprt &expr,
615
+ const namespacet &ns)
585
616
{
586
- auto notequal_expr = to_binary_expr (expr);
617
+ auto const & notequal_expr = to_binary_expr (expr);
587
618
588
619
auto left = env.eval (notequal_expr.lhs (), ns);
589
620
auto right = env.eval (notequal_expr.rhs (), ns);
@@ -601,7 +632,7 @@ exprt assume_noteq(abstract_environmentt &env, exprt expr, const namespacet &ns)
601
632
return false_exprt ();
602
633
}
603
634
604
- struct left_and_right_values
635
+ struct left_and_right_valuest
605
636
{
606
637
abstract_value_pointert left;
607
638
abstract_value_pointert right;
@@ -621,12 +652,12 @@ struct left_and_right_values
621
652
}
622
653
};
623
654
624
- left_and_right_values eval_operands_as_values (
655
+ left_and_right_valuest eval_operands_as_values (
625
656
abstract_environmentt &env,
626
- exprt expr,
657
+ const exprt & expr,
627
658
const namespacet &ns)
628
659
{
629
- auto relationship_expr = to_binary_expr (expr);
660
+ auto const & relationship_expr = to_binary_expr (expr);
630
661
631
662
auto left = env.eval (relationship_expr.lhs (), ns);
632
663
auto right = env.eval (relationship_expr.rhs (), ns);
@@ -637,7 +668,10 @@ left_and_right_values eval_operands_as_values(
637
668
return {as_value (left), as_value (right)};
638
669
}
639
670
640
- exprt assume_le (abstract_environmentt &env, exprt expr, const namespacet &ns)
671
+ exprt assume_less_than (
672
+ abstract_environmentt &env,
673
+ const exprt &expr,
674
+ const namespacet &ns)
641
675
{
642
676
auto operands = eval_operands_as_values (env, expr, ns);
643
677
if (!operands.are_good ())
@@ -646,24 +680,15 @@ exprt assume_le(abstract_environmentt &env, exprt expr, const namespacet &ns)
646
680
auto left_lower = operands.left_interval ().get_lower ();
647
681
auto right_upper = operands.right_interval ().get_upper ();
648
682
649
- auto reduced_le_expr = binary_relation_exprt (left_lower, ID_le, right_upper);
683
+ auto reduced_le_expr =
684
+ binary_relation_exprt (left_lower, expr.id (), right_upper);
650
685
return env.eval (reduced_le_expr, ns)->to_constant ();
651
686
}
652
687
653
- exprt assume_lt (abstract_environmentt &env, exprt expr, const namespacet &ns)
654
- {
655
- auto operands = eval_operands_as_values (env, expr, ns);
656
- if (!operands.are_good ())
657
- return nil_exprt ();
658
-
659
- auto left_lower = operands.left_interval ().get_lower ();
660
- auto right_upper = operands.right_interval ().get_upper ();
661
-
662
- auto reduced_lt_expr = binary_relation_exprt (left_lower, ID_lt, right_upper);
663
- return env.eval (reduced_lt_expr, ns)->to_constant ();
664
- }
665
-
666
- exprt assume_ge (abstract_environmentt &env, exprt expr, const namespacet &ns)
688
+ exprt assume_greater_than (
689
+ abstract_environmentt &env,
690
+ const exprt &expr,
691
+ const namespacet &ns)
667
692
{
668
693
auto operands = eval_operands_as_values (env, expr, ns);
669
694
if (!operands.are_good ())
@@ -672,19 +697,7 @@ exprt assume_ge(abstract_environmentt &env, exprt expr, const namespacet &ns)
672
697
auto left_upper = operands.left_interval ().get_upper ();
673
698
auto right_lower = operands.right_interval ().get_lower ();
674
699
675
- auto reduced_ge_expr = binary_relation_exprt (left_upper, ID_ge, right_lower);
700
+ auto reduced_ge_expr =
701
+ binary_relation_exprt (left_upper, expr.id (), right_lower);
676
702
return env.eval (reduced_ge_expr, ns)->to_constant ();
677
703
}
678
-
679
- exprt assume_gt (abstract_environmentt &env, exprt expr, const namespacet &ns)
680
- {
681
- auto operands = eval_operands_as_values (env, expr, ns);
682
- if (!operands.are_good ())
683
- return nil_exprt ();
684
-
685
- auto left_upper = operands.left_interval ().get_upper ();
686
- auto right_lower = operands.right_interval ().get_lower ();
687
-
688
- auto reduced_gt_expr = binary_relation_exprt (left_upper, ID_gt, right_lower);
689
- return env.eval (reduced_gt_expr, ns)->to_constant ();
690
- }
0 commit comments