/* * Copyright (C) 2012-2013 University of Freiburg * * This file is part of SMTInterpol. * * SMTInterpol is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SMTInterpol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SMTInterpol. If not, see <http://www.gnu.org/licenses/>. */ package de.uni_freiburg.informatik.ultimate.smtinterpol.delta; import java.util.Map; import java.util.Set; import de.uni_freiburg.informatik.ultimate.logic.AnnotatedTerm; import de.uni_freiburg.informatik.ultimate.logic.ApplicationTerm; import de.uni_freiburg.informatik.ultimate.logic.ConstantTerm; import de.uni_freiburg.informatik.ultimate.logic.FunctionSymbol; import de.uni_freiburg.informatik.ultimate.logic.LetTerm; import de.uni_freiburg.informatik.ultimate.logic.NonRecursive; import de.uni_freiburg.informatik.ultimate.logic.QuantifiedFormula; import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.logic.TermVariable; public class DefinitionTracker extends NonRecursive { private class Walker extends TermWalker { public Walker(Term term) { super(term); } @Override public void walk(NonRecursive walker, ConstantTerm term) { // Does not need definitions } @Override public void walk(NonRecursive walker, AnnotatedTerm term) { walker.enqueueWalker(new Walker(term.getSubterm())); } @Override public void walk(NonRecursive walker, ApplicationTerm term) { final FunctionSymbol fs = term.getFunction(); if (!fs.isIntern()) { track(fs.getName()); } for (final Term p : term.getParameters()) { walker.enqueueWalker(new Walker(p)); } } @Override public void walk(NonRecursive walker, LetTerm term) { for (final Term bound : term.getValues()) { walker.enqueueWalker(new Walker(bound)); } walker.enqueueWalker(new Walker(term.getSubTerm())); } @Override public void walk(NonRecursive walker, QuantifiedFormula term) { walker.enqueueWalker(new Walker(term.getSubformula())); } @Override public void walk(NonRecursive walker, TermVariable term) { // Does not need definitions } } private final Map<String, Cmd> mCtx; private final Set<Cmd> mUsed; public DefinitionTracker(Map<String, Cmd> ctx, Set<Cmd> used) { mCtx = ctx; mUsed = used; } public void track(Term t) { run(new Walker(t)); } private void track(String fun) { final Cmd definition = mCtx.get(fun); if (definition == null) { throw new InternalError("No definition found for " + fun); } mUsed.add(definition); } }