/*
* Copyright (C) 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.convert;
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.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 SubtermChecker extends NonRecursive {
private static final class IsSubterm extends TermWalker {
public IsSubterm(Term term) {
super(term);
}
@Override
public void walk(NonRecursive walker) {
final SubtermChecker sc = (SubtermChecker) walker;
if (getTerm() == sc.mSubTerm) {
sc.mFound = true;
// Clear the todo stack
sc.done();
} else if (getTerm() instanceof SMTAffineTerm) {
final SMTAffineTerm at = (SMTAffineTerm) getTerm();
for (final Term s : at.getSummands().keySet()) {
walker.enqueueWalker(new IsSubterm(s));
}
} else {
super.walk(walker);
}
}
@Override
public void walk(NonRecursive walker, ConstantTerm term) {
// Already checked in walk
}
@Override
public void walk(NonRecursive walker, AnnotatedTerm term) {
walker.enqueueWalker(new IsSubterm(term.getSubterm()));
}
@Override
public void walk(NonRecursive walker, ApplicationTerm term) {
for (final Term p : term.getParameters()) {
walker.enqueueWalker(new IsSubterm(p));
}
}
@Override
public void walk(NonRecursive walker, LetTerm term) {
throw new InternalError("LetTerms should not be present!");
}
@Override
public void walk(NonRecursive walker, QuantifiedFormula term) {
walker.enqueueWalker(new IsSubterm(term.getSubformula()));
}
@Override
public void walk(NonRecursive walker, TermVariable term) {
// Already checked in walk
}
}
private final Term mSubTerm;
private boolean mFound = false;
public SubtermChecker(Term subterm) {
mSubTerm = subterm;
}
public boolean findSubterm(Term where) {
run(new IsSubterm(where));
return mFound;
}
@Override
public void reset() {
super.reset();
mFound = false;
}
private void done() {
super.reset();
}
}