package models.algebra;

import java.util.HashMap;

public abstract class Expression implements Cloneable {
	public abstract Expression getSubTerm(Position pos);
	/**
	 * Get the unification between this expression and another expression.
	 * @param another another expression
	 * @return unified expression
	 */
	public abstract Expression unify(Expression another);
	/**
	 * Get the inverse map to obtain a sub-term of a given output value back from the output value itself.
	 * @param outputValue an output value (usually a term)
	 * @param targetPos a position in outputValue
	 * @return inverse map
	 */
	public abstract Expression getInverseMap(Expression outputValue, Position targetPos);
	public abstract boolean contains(Expression exp);
	public abstract Object clone();
	public abstract <T extends Expression> HashMap<Position, T> getSubTerms(Class<T> clazz);
	
	public HashMap<Position, Variable> getVariables() {
		return getSubTerms(Variable.class);
	}
	
	/**
	 * Get the implementation of this expression.
	 * @param sideEffects an array with an optional implementation that should be written before the evaluation of this expression
	 * @return the implementation to represent the value of this expression
	 */
	public String toImplementation(String[] sideEffects) {
		return toString();
	}
}
