EvaluatedFunctionFactory.java

package edu.udel.cis.vsl.tass.symbolic.function;

import java.util.HashMap;
import java.util.Map;

import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicFunctionTypeIF;
import edu.udel.cis.vsl.tass.symbolic.constant.SymbolicConstantExpression;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpressionKey;

public class EvaluatedFunctionFactory {

	private Map<SymbolicExpressionKey<EvaluatedFunctionExpression>, EvaluatedFunctionExpression> evaluatedFunctionMap = new HashMap<SymbolicExpressionKey<EvaluatedFunctionExpression>, EvaluatedFunctionExpression>();

	private Map<SymbolicExpressionKey<LambdaExpression>, LambdaExpression> lambdaMap = new HashMap<SymbolicExpressionKey<LambdaExpression>, LambdaExpression>();

	/**
	 * Treats function as an uninterpreted function and returns a symbolic
	 * expression representing the application of function to the arguments.
	 */
	public EvaluatedFunctionExpression evaluatedFunction(
			TreeExpressionIF function, TreeExpressionIF[] arguments) {
		return SymbolicExpression.flyweight(evaluatedFunctionMap,
				new EvaluatedFunctionExpression(function, arguments));
	}

	/**
	 * Returns a lambda expression, which is a function of one variable, whose
	 * value is defined by an expression which may refer to that variable.
	 */
	public LambdaExpression lambda(SymbolicFunctionTypeIF functionType,
			SymbolicConstantExpression variable, TreeExpressionIF expression) {
		return SymbolicExpression.flyweight(lambdaMap, new LambdaExpression(
				functionType, variable, expression));
	}

}