@Override public AbstractState getVariableExpandedStateForProofChecking( AbstractState pRootState, Block pReducedContext, AbstractState pReducedState) { PredicateAbstractState rootState = (PredicateAbstractState) pRootState; PredicateAbstractState reducedState = (PredicateAbstractState) pReducedState; if (!reducedState.isAbstractionState()) { return reducedState; } AbstractionFormula rootAbstraction = rootState.getAbstractionFormula(); AbstractionFormula reducedAbstraction = reducedState.getAbstractionFormula(); // create region predicates for every atom in formula pamgr.extractPredicates(reducedAbstraction.asInstantiatedFormula()); Collection<AbstractionPredicate> rootPredicates = pamgr.extractPredicates(rootAbstraction.asInstantiatedFormula()); Collection<AbstractionPredicate> relevantRootPredicates = cpa.getRelevantPredicatesComputer().getRelevantPredicates(pReducedContext, rootPredicates); // for each removed predicate, we have to lookup the old (expanded) value and insert it to the // reducedStates region PathFormula oldPathFormula = reducedState.getPathFormula(); SSAMap oldSSA = oldPathFormula.getSsa(); // pathFormula.getSSa() might not contain index for the newly added variables in predicates; // while the actual index is not really important at this point, // there still should be at least _some_ index for each variable of the abstraction formula. SSAMapBuilder builder = oldSSA.builder(); SSAMap rootSSA = rootState.getPathFormula().getSsa(); for (String var : rootSSA.allVariables()) { // if we do not have the index in the reduced map.. if (!oldSSA.containsVariable(var)) { // add an index (with the value of rootSSA) builder.setIndex(var, rootSSA.getType(var), rootSSA.getIndex(var)); } } SSAMap newSSA = builder.build(); PathFormula newPathFormula = pmgr.makeNewPathFormula(pmgr.makeEmptyPathFormula(), newSSA); Region reducedRegion = pamgr.buildRegionFromFormula(reducedAbstraction.asFormula()); Region rootRegion = pamgr.buildRegionFromFormula(rootAbstraction.asFormula()); AbstractionFormula newAbstractionFormula = pamgr.expand( reducedRegion, rootRegion, relevantRootPredicates, newSSA, reducedAbstraction.getBlockFormula()); PersistentMap<CFANode, Integer> abstractionLocations = rootState.getAbstractionLocationsOnPath(); return PredicateAbstractState.mkAbstractionState( newPathFormula, newAbstractionFormula, abstractionLocations); }