@@ -406,31 +406,50 @@ static obligationst property_obligations_rec(
406
406
}
407
407
else if (property_expr.id () == ID_sva_until || property_expr.id () == ID_weak_U)
408
408
{
409
- // we expand: p W q ≡ q ∨ ( p ∧ X(p W q) )
410
- auto &p = to_binary_expr (property_expr) .lhs ();
411
- auto &q = to_binary_expr (property_expr) .rhs ();
409
+ auto &binary_expr = to_binary_expr (property_expr);
410
+ auto &p = binary_expr .lhs ();
411
+ auto &q = binary_expr .rhs ();
412
412
413
- // Once we reach the end of the unwinding, replace X(p W q) by 'true'.
414
- auto tmp = or_exprt{
415
- q,
416
- (current + 1 ) < no_timeframes ? and_exprt{p, X_exprt{property_expr}} : p};
413
+ // p has to to be true until (not including) q is true
414
+ exprt::operandst q_disjuncts;
415
+ obligationst obligations;
417
416
418
- return property_obligations_rec (tmp, current, no_timeframes);
417
+ for (mp_integer j = current; j < no_timeframes; ++j)
418
+ {
419
+ auto q_rec = property_obligations_rec (q, j, no_timeframes);
420
+ q_disjuncts.push_back (q_rec.conjunction ().second );
421
+
422
+ auto p_rec = property_obligations_rec (p, j, no_timeframes);
423
+ auto cond =
424
+ or_exprt{p_rec.conjunction ().second , disjunction (q_disjuncts)};
425
+
426
+ obligations.add (current, cond);
427
+ }
428
+
429
+ return obligations;
419
430
}
420
431
else if (property_expr.id () == ID_R)
421
432
{
422
- // we expand: p R q <=> q ∧ (p ∨ X(p R q))
423
433
auto &R_expr = to_R_expr (property_expr);
424
434
auto &p = R_expr.lhs ();
425
435
auto &q = R_expr.rhs ();
426
436
427
- // Once we reach the end of the unwinding, we replace X(p R q) by
428
- // true, and hence the expansion becomes "q" only.
429
- exprt expansion = (current + 1 ) < no_timeframes
430
- ? and_exprt{q, or_exprt{p, X_exprt{property_expr}}}
431
- : q;
437
+ // q has to be true until (including) p is true
438
+ exprt::operandst p_disjuncts;
439
+ obligationst obligations;
432
440
433
- return property_obligations_rec (expansion, current, no_timeframes);
441
+ for (mp_integer j = current; j < no_timeframes; ++j)
442
+ {
443
+ auto q_rec = property_obligations_rec (q, j, no_timeframes);
444
+ auto cond =
445
+ or_exprt{q_rec.conjunction ().second , disjunction (p_disjuncts)};
446
+ obligations.add (current, cond);
447
+
448
+ auto p_rec = property_obligations_rec (p, j, no_timeframes);
449
+ p_disjuncts.push_back (p_rec.conjunction ().second );
450
+ }
451
+
452
+ return obligations;
434
453
}
435
454
else if (property_expr.id () == ID_strong_R)
436
455
{
0 commit comments