Skip to content

Commit

Permalink
#295, support introduction of loc-array inititalization in disjunctiv…
Browse files Browse the repository at this point in the history
…e formulas, too (only if they are in DNF, however)
  • Loading branch information
alexandernutz committed Aug 28, 2018
1 parent 154ac10 commit c337f3a
Showing 1 changed file with 31 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,31 +189,41 @@ public TransformulaTransformationResult transform(final IIcfgTransition<? extend
transitionFormulaWithLocUpdates = tf.getFormula();
}


// conjoin initialization code for unconstrained loc array variables
if (!SmtUtils.isNNF(tf.getFormula()) || SmtUtils.containsFunctionApplication(tf.getFormula(), "or")) {
throw new AssertionError("the code below only works for conjunctive formulas");
}
final Term transitionFormulaWithLocUpdatesAndLocInitialization;
{
final Set<TermVariable> unconstrainedVars = mEdgeToUnconstrainedVars.getImage(edgeInfo);
final List<Term> tfWithUpdatesAndInitConjuncts = new ArrayList<>();
tfWithUpdatesAndInitConjuncts.add(transitionFormulaWithLocUpdates);
for (final TermVariable ucv : unconstrainedVars) {
final MultiDimensionalSort mds = new MultiDimensionalSort(ucv.getSort());
final int dimensionality = mds.getDimension();
assert dimensionality > 0;
for (int dim = 0; dim < dimensionality; dim++) {
final LocArrayInfo locArray = mLocArrayManager.getOrConstructLocArray(edgeInfo, ucv, dim);
final Term initConjunct = SmtUtils.binaryEquality(mMgdScript.getScript(),
locArray.getTerm(),
locArray.getInitializingConstantArray());
// mLocArrayManager.getInitConstantArrayForLocArray(locArray));
tfWithUpdatesAndInitConjuncts.add(initConjunct);

// assuming the formula is in DNF
final List<Term> disjunctsWithLocUpdatesAndLocInitialization = new ArrayList<>();
for (final Term disjunct : SmtUtils.getDisjuncts(tf.getFormula())) {
if (!SmtUtils.isNNF(disjunct) || SmtUtils.containsFunctionApplication(disjunct, "or")) {
throw new AssertionError("the code below only works for conjunctive formulas");
}

final Term disjunctWithLocUpdatesAndLocInitialization;
{
final Set<TermVariable> unconstrainedVars = mEdgeToUnconstrainedVars.getImage(edgeInfo);
final List<Term> tfWithUpdatesAndInitConjuncts = new ArrayList<>();
tfWithUpdatesAndInitConjuncts.add(transitionFormulaWithLocUpdates);
for (final TermVariable ucv : unconstrainedVars) {
final MultiDimensionalSort mds = new MultiDimensionalSort(ucv.getSort());
final int dimensionality = mds.getDimension();
assert dimensionality > 0;
for (int dim = 1; dim <= dimensionality; dim++) {
final LocArrayInfo locArray = mLocArrayManager.getOrConstructLocArray(edgeInfo, ucv, dim);
final Term initConjunct = SmtUtils.binaryEquality(mMgdScript.getScript(),
locArray.getTerm(),
locArray.getInitializingConstantArray());
// mLocArrayManager.getInitConstantArrayForLocArray(locArray));
tfWithUpdatesAndInitConjuncts.add(initConjunct);
}
}
disjunctWithLocUpdatesAndLocInitialization =
SmtUtils.and(mMgdScript.getScript(), tfWithUpdatesAndInitConjuncts);
}
transitionFormulaWithLocUpdatesAndLocInitialization =
SmtUtils.and(mMgdScript.getScript(), tfWithUpdatesAndInitConjuncts);
disjunctsWithLocUpdatesAndLocInitialization.add(disjunctWithLocUpdatesAndLocInitialization);
}
final Term transitionFormulaWithLocUpdatesAndLocInitialization =
SmtUtils.or(mMgdScript.getScript(), disjunctsWithLocUpdatesAndLocInitialization);

final Map<IProgramVar, TermVariable> newInVars;
{
Expand Down

0 comments on commit c337f3a

Please sign in to comment.