/**
* 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);
}
}