/* * 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 de.uni_freiburg.informatik.ultimate.logic.AnnotatedTerm; import de.uni_freiburg.informatik.ultimate.logic.Annotation; import de.uni_freiburg.informatik.ultimate.logic.ApplicationTerm; import de.uni_freiburg.informatik.ultimate.logic.ConstantTerm; import de.uni_freiburg.informatik.ultimate.logic.LetTerm; import de.uni_freiburg.informatik.ultimate.logic.NonRecursive; import de.uni_freiburg.informatik.ultimate.logic.NonRecursive.TermWalker; 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 NamedHelper { private final class NamedCollector extends TermWalker { public NamedCollector(Term term) { super(term); } @Override public void walk(NonRecursive walker, ConstantTerm term) { // Cannot contain names } @Override public void walk(NonRecursive walker, AnnotatedTerm term) { for (final Annotation annot : term.getAnnotations()) { if (annot.getKey().equals(":named")) { mNames.put(annot.getValue().toString(), mCmd); } } } @Override public void walk(NonRecursive walker, ApplicationTerm term) { for (final Term t : term.getParameters()) { walker.enqueueWalker(new NamedDetector(t)); } } @Override public void walk(NonRecursive walker, LetTerm term) { for (final Term t : term.getValues()) { walker.enqueueWalker(new NamedDetector(t)); } walker.enqueueWalker(new NamedDetector(term.getSubTerm())); } @Override public void walk(NonRecursive walker, QuantifiedFormula term) { walker.enqueueWalker(new NamedDetector(term.getSubformula())); } @Override public void walk(NonRecursive walker, TermVariable term) { // Cannot contain names } } private final class NamedDetector extends TermWalker { public NamedDetector(Term term) { super(term); } @Override public void walk(NonRecursive walker, ConstantTerm term) { // Cannot contain names } @Override public void walk(NonRecursive walker, AnnotatedTerm term) { for (final Annotation annot : term.getAnnotations()) { if (annot.getKey().equals(":named")) { mHasNames = true; } } } @Override public void walk(NonRecursive walker, ApplicationTerm term) { for (final Term t : term.getParameters()) { walker.enqueueWalker(new NamedDetector(t)); } } @Override public void walk(NonRecursive walker, LetTerm term) { for (final Term t : term.getValues()) { walker.enqueueWalker(new NamedDetector(t)); } walker.enqueueWalker(new NamedDetector(term.getSubTerm())); } @Override public void walk(NonRecursive walker, QuantifiedFormula term) { walker.enqueueWalker(new NamedDetector(term.getSubformula())); } @Override public void walk(NonRecursive walker, TermVariable term) { // Cannot contain names } } private boolean mHasNames; private Map<String, Cmd> mNames; private Cmd mCmd; public boolean checkTerm(Term t) { mHasNames = false; new NonRecursive().run(new NamedDetector(t)); return mHasNames; } public void addNames(Term t, Map<String, Cmd> context, Cmd cmd) { mNames = context; mCmd = cmd; new NonRecursive().run(new NamedCollector(t)); } }