/*
* Created on Apr 19, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package cs227b.teamIago.resolver;
/**
* @author Nick
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Variable extends Term {
// protected Atom name;
protected long varNum;
protected final int VAR_HASH_SEED = 2147001823;
/**
* @param name
*/
public Variable(long varNum) {
this.varNum = varNum;
}
public Variable(Atom name) {
this.varNum = name.hashCode();
}
public Variable(String name){
this(new Atom(name));
}
public Variable(Variable copy) {
this.varNum = copy.varNum;
}
/**
* @return Returns the name.
*/
public long getNum() {
return varNum;
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Formula#mgu(cs227b.teamIago.resolver.Formula, cs227b.teamIago.resolver.Substitution)
*/
public Substitution mgu(Expression target, Substitution sigma, Theory t) {
Expression subThis = apply(sigma);
Expression subThis2 = this;
while (!subThis.equals(subThis2)) {
subThis2 = subThis;
subThis = subThis2.apply(sigma);
}
Expression subTarget = target.apply(sigma);
Expression subTarget2 = target;
while (!subTarget.equals(subTarget2)) {
subTarget2 = subTarget;
subTarget = subTarget2.apply(sigma);
}
if (!subThis.equals(this)) return subThis.mgu(subTarget,sigma,t);
else if (subTarget.occurs(this)) return null;
else if (subTarget instanceof Variable) {
Variable newV = t.generateVar();
Substitution psi = new Substitution(sigma);
psi.addAssoc(this,newV);
psi.addAssoc((Variable)subTarget,newV);
return psi;
}
else
{
Substitution psi = new Substitution(sigma);
psi.addAssoc(this,subTarget);
return psi;
}
}
public Substitution mapTo(Substitution sigma, Expression e) {
Expression subThis = apply(sigma);
Expression subThis2 = this;
while (!subThis.equals(subThis2)) {
subThis2 = subThis;
subThis = subThis2.apply(sigma);
}
Expression subTarget = e.apply(sigma);
Expression subTarget2 = e;
while (!subTarget.equals(subTarget2)) {
subTarget2 = subTarget;
subTarget = subTarget2.apply(sigma);
}
if (!subThis.equals(this)) {
return subThis.mapTo(sigma,subTarget);
}
else
{
Substitution psi = new Substitution(sigma);
psi.addAssoc(this,subTarget);
return psi;
}
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#apply(cs227b.teamIago.resolver.Substitution)
*/
public Expression apply(Substitution sigma) {
if (sigma == null) return this;
Expression e = sigma.maps(this);
if (e == null) return this;
else return e;
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#occurs(cs227b.teamIago.resolver.Variable, cs227b.teamIago.resolver.Substitution)
*/
public boolean occurs(Variable var) {
if (equals(var)) return true;
else return false;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
if (!(o instanceof Variable)) return false;
return ((Variable) o).varNum == varNum;
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#getMaxVarNum()
*/
public long getMaxVarNum() {
// TODO Auto-generated method stub
return varNum;
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#getVars()
*/
public ExpList getVars() {
ExpList ret = new ExpList();
ret.add(this);
return ret;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return "Var#(" + varNum + ")";
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return (int) varNum * VAR_HASH_SEED % HASH_QUAD;
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#buildVolatile()
*/
public boolean buildVolatile(boolean impliedVol) {
return true; // variables are always volatile
}
/* (non-Javadoc)
* @see cs227b.teamIago.resolver.Expression#isVolatile()
*/
public boolean isVolatile() {
return true; // variables are always volatile
}
}