/** * Author: Georg Hofferek <georg.hofferek@iaik.tugraz.at> */ package at.iaik.suraq.smtlib.formula; import java.io.BufferedWriter; import java.io.IOException; import java.io.Serializable; import java.io.Writer; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import at.iaik.suraq.exceptions.SuraqException; import at.iaik.suraq.sexp.SExpression; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.smtlib.SMTLibObject; import at.iaik.suraq.util.FormulaCache; import at.iaik.suraq.util.HashTagContainer; /** * A class representing domain variables. * * @author Georg Hofferek <georg.hofferek@iaik.tugraz.at> * */ public class DomainVariable extends DomainTerm implements Serializable { /** * unique serial number */ private static final long serialVersionUID = -2173510375009985016L; /** * The name of the variable. */ private final String varName; private final int hashCode; public static DomainVariable create(String varName) { return FormulaCache.domainVarFormula.put(new DomainVariable(varName)); } public static DomainVariable create(Token name) { return FormulaCache.domainVarFormula.put(new DomainVariable(name .toString())); } public static DomainVariable create(String varName, int assertPartition) { return FormulaCache.domainVarFormula.put(new DomainVariable(varName, assertPartition)); } public static DomainVariable create(Token name, int assertPartition) {// called // > // 2Mrd. // times return FormulaCache.domainVarFormula.put(new DomainVariable(name .toString(), assertPartition)); } /** * * Constructs a new <code>DomainVariable</code>. * * @param varName * the name of the variable. */ private DomainVariable(String varName) { this.varName = varName; hashCode = varName.hashCode(); } /** * * Constructs a new <code>DomainVariable</code>. * * @param name * the <code>String</code> representing the variable name. * @param assertPartition * the assert partition of the <code>DomainVariable</code>. */ private DomainVariable(String name, int assertPartition) { this.varName = name; this.assertPartition = assertPartition; hashCode = varName.hashCode(); } /** * Get the variable name. * * @return the <code>varName</code> */ public String getVarName() { return varName; } /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof DomainVariable)) return false; if (this.hashCode != ((DomainVariable) obj).hashCode) return false; // TODO: chillebold 01.08.2012 // added by chillebold: // if(this.assertPartition != ((DomainVariable)obj).assertPartition) // return false; return varName.equals(((DomainVariable) obj).varName); } /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return hashCode; } /** * @see at.iaik.suraq.smtlib.formula.DomainTerm#isEvar(java.util.Collection) */ @Override public boolean isEvar(Collection<DomainVariable> uVars) { return !uVars.contains(this); } /** * @see at.iaik.suraq.smtlib.formula.Term#deepTermCopy() */ @Override public DomainTerm deepTermCopy() { return this; // experimental // return DomainVariable.create(new String(varName), // this.assertPartition); } /** * @see at.iaik.suraq.smtlib.formula.Term#getArrayVariables() */ @Override public void getArrayVariables(Set<ArrayVariable> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.formula.Term#getDomainVariables() */ @Override public void getDomainVariables(Set<DomainVariable> result, Set<SMTLibObject> done) { result.add(this); } /** * @see at.iaik.suraq.smtlib.formula.Term#getPropositionalVariables() */ @Override public void getPropositionalVariables(Set<PropositionalVariable> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.formula.Term#getFunctionMacroNames() */ @Override public void getFunctionMacros(Set<FunctionMacro> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.formula.Term#getFunctionMacros() */ @Override public void getFunctionMacroNames(Set<String> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.formula.Term#getUninterpretedFunctionNames() */ @Override public void getUninterpretedFunctionNames(Set<String> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.SMTLibObject#getUninterpretedFunctions(java.util.Set, * java.util.Set) */ @Override public void getUninterpretedFunctions(Set<UninterpretedFunction> result, Set<SMTLibObject> done) { return; } /** * @see at.iaik.suraq.smtlib.formula.Term#getIndexSet() */ @Override public Set<DomainTerm> getIndexSet() throws SuraqException { return new HashSet<DomainTerm>(); } /** * @see at.iaik.suraq.smtlib.formula.Term#substituteTerm(Map) */ @Override public Term substituteTerm(Map<Token, ? extends Term> paramMap, Map<SMTLibObject, SMTLibObject> done) { if (done.containsKey(this)) { assert (done.get(this) != null); assert (done.get(this) instanceof Term); return (Term) done.get(this); } Term result; if (paramMap.containsKey(Token.generate(varName))) result = paramMap.get(Token.generate(varName)); else result = this; assert (result != null); done.put(this, result); return result; } /** * @see at.iaik.suraq.smtlib.formula.Term#toSmtlibV2() */ @Override public SExpression toSmtlibV2() { return Token.generate(varName); } /** * @see at.iaik.suraq.smtlib.formula.Term#arrayPropertiesToFiniteConjunctions(java.util.Set) */ @Override public Term arrayPropertiesToFiniteConjunctionsTerm(Set<DomainTerm> indexSet) { // nothing to do here return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#removeArrayEqualitiesTerm() */ @Override public Term removeArrayEqualitiesTerm() { // nothing to do here return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#removeArrayWrites(at.iaik.suraq.smtlib.formula.Formula) */ @Override public Term removeArrayWritesTerm(Formula topLevelFormula, Set<Formula> constraints, Set<Token> noDependenceVars) { // nothing to do return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#arrayReadsToUninterpretedFunctions() */ @Override public Term arrayReadsToUninterpretedFunctionsTerm( Set<Token> noDependenceVars) { // nothing to do return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#substituteUninterpretedFunction(Token, * at.iaik.suraq.smtlib.formula.UninterpretedFunction) */ @Override public DomainTerm substituteUninterpretedFunction( Map<Token, UninterpretedFunction> substitutions, Map<SMTLibObject, SMTLibObject> done) { return this; } /** * @see at.iaik.suraq.smtlib.SMTLibObject#uninterpretedFunctionsBackToArrayReads(java.util.Set, * java.util.Map) */ @Override public SMTLibObject uninterpretedFunctionsBackToArrayReads( Set<ArrayVariable> arrayVars, Map<SMTLibObject, SMTLibObject> done) { return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#flatten() */ @Override public Term flatten() { return this; // experimental // return DomainVariable.create(varName); } /** * @see at.iaik.suraq.smtlib.formula.Term#makeArrayReadsSimple(at.iaik.suraq.smtlib.formula.Formula, * java.util.Set, java.util.Set) */ @Override public Term makeArrayReadsSimpleTerm(Formula topLevelFormula, Set<Formula> constraints, Set<Token> noDependenceVars) { return this; } /** * @see at.iaik.suraq.smtlib.formula.DomainTerm#uninterpretedPredicatesToAuxiliaryVariables(at.iaik.suraq.smtlib.formula.Formula, * java.util.Set, java.util.Set) */ /* * @Override public DomainTerm uninterpretedPredicatesToAuxiliaryVariables( * Formula topLeveFormula, Set<Formula> constraints, Set<Token> * noDependenceVars) { return DomainVariable.create(varName); } */ /** * Returns the elements assert-partition. * * @return assert-partition of the element. */ @Override public Set<Integer> getPartitionsFromSymbols() { Set<Integer> partitions = new TreeSet<Integer>(); partitions.add(assertPartition); return partitions; } /** * @see at.iaik.suraq.formula.DomainTerm#uninterpretedPredicatesToAuxiliaryVariables() */ @Override public Term uninterpretedPredicatesToAuxiliaryVariablesTerm( Formula topLeveFormula, Map<String, List<PropositionalVariable>> predicateInstances, Map<PropositionalVariable, List<DomainTerm>> instanceParameters, Set<Token> noDependenceVars) { return this; } /** * @see at.iaik.suraq.formula.DomainTerm#uninterpretedPredicatesToAuxiliaryVariables(at.iaik.suraq.formula.Formula, * java.util.Set, java.util.Set) */ @Override public Term uninterpretedFunctionsToAuxiliaryVariablesTerm( Formula topLeveFormula, Map<String, List<DomainVariable>> functionInstances, Map<DomainVariable, List<DomainTerm>> instanceParameters, Set<Token> noDependenceVars) { return this; } /** * @see at.iaik.suraq.smtlib.formula.DomainTerm#removeDomainITE(at.iaik.suraq.smtlib.formula.Formula, * java.util.Set, java.util.List) */ @Override public DomainVariable removeDomainITE(Formula topLevelFormula, Set<Token> noDependenceVars, List<Formula> andPreList) { return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#removeArrayITE(at.iaik.suraq.smtlib.formula.Formula, * java.util.Set, java.util.Collection) */ @Override public DomainVariable removeArrayITE(Formula topLevelFormula, Set<Token> noDependenceVars, Collection<Formula> constraints) { return this; } /** * @see at.iaik.suraq.smtlib.formula.Term#writeOut(java.io.BufferedWriter, * at.iaik.suraq.util.HashTagContainer, boolean) */ @Override public void writeOut(BufferedWriter writer, HashTagContainer tagContainer) throws IOException { writer.append(varName); writer.append(' '); } /** * @see at.iaik.suraq.smtlib.formula.Term#writeTo(java.io.Writer) */ @Override public void writeTo(Writer writer) throws IOException { writer.write(varName); } }