LambdaSimplification.java

package edu.udel.cis.vsl.sarl.simplify.simplification;

import edu.udel.cis.vsl.sarl.IF.expr.SymbolicConstant;
import edu.udel.cis.vsl.sarl.IF.expr.SymbolicExpression;
import edu.udel.cis.vsl.sarl.IF.expr.SymbolicExpression.SymbolicOperator;
import edu.udel.cis.vsl.sarl.simplify.simplifier.Context;
import edu.udel.cis.vsl.sarl.simplify.simplifier.IdealSimplifierWorker;

public class LambdaSimplification extends Simplification {

	public LambdaSimplification(IdealSimplifierWorker worker) {
		super(worker);
	}

	@Override
	public SymbolicExpression apply(SymbolicExpression expr) {
		if (expr.operator() == SymbolicOperator.LAMBDA) {
			// lambda x . e;
			SymbolicConstant boundVar = (SymbolicConstant) expr.argument(0);
			SymbolicExpression body = (SymbolicExpression) expr.argument(1);
			Context subContext = newSubContext();
			SymbolicExpression body2 = subContext.simplify(body);

			if (body2 == body)
				return expr;
			return universe().lambda(boundVar, body2);
		} else {
			return expr;
		}
	}

	@Override
	public SimplificationKind kind() {
		return SimplificationKind.LAMBDA;
	}

}