StandardSimplificationSelector.java

package dev.civl.sarl.simplify.simplification;

import java.util.Arrays;
import java.util.List;

import dev.civl.sarl.IF.expr.SymbolicExpression;
import dev.civl.sarl.IF.expr.SymbolicExpression.SymbolicOperator;
import dev.civl.sarl.ideal.IF.Polynomial;
import dev.civl.sarl.ideal.IF.RationalExpression;

public class StandardSimplificationSelector implements SimplificationSelector {

	private LambdaSimplification lambdaSimp() {
		return new LambdaSimplification();
	}
	private ArrayLambdaSimplification arrayLambdaSimp() {
		return new ArrayLambdaSimplification();
	}
	private ArrayReadSimplification arrayReadSimp() {
		return new ArrayReadSimplification();
	}
	private SubContextSimplification subContextSimp() {
		return new SubContextSimplification();
	}
	private GenericSimplification genericSimp() {
		return new GenericSimplification();
	}
	private QuantifierSimplification quantifierSimp() {
		return new QuantifierSimplification();
	}
	private PowerSimplification powerSimp() {
		return new PowerSimplification();
	}
	private RationalPowerSimplification rationalPowerSimp() {
		return new RationalPowerSimplification();
	}
	private ConditionalSimplification2 conditionalSimp() {
		return new ConditionalSimplification2();
	}
	private OrSimplification orSimp() {
		return new OrSimplification();
	}
	private ComputerModuloSimplification computerModuloSimp() {
		return new ComputerModuloSimplification();
	}
	private PolynomialSimplification polynomialSimp() {
		return new PolynomialSimplification();
	}

	@Override
	public List<Simplification> select(SymbolicExpression symbExpr) {
		SymbolicOperator op = symbExpr.operator();

		switch (op) {
			case LAMBDA :
				return Arrays.asList(lambdaSimp());
			case ARRAY_LAMBDA :
				return Arrays.asList(arrayLambdaSimp());
			case ARRAY_READ :
				return Arrays.asList(arrayReadSimp());
			case AND :
			case LESS_THAN :
			case LESS_THAN_EQUALS :
			case NEQ :
				return Arrays.asList(subContextSimp());
			case EQUALS :
				if (((SymbolicExpression) symbExpr.argument(0)).type()
						.isNumeric())
					return Arrays.asList(subContextSimp());
				else
					return Arrays.asList(genericSimp());
			case FORALL :
			case EXISTS :
				return Arrays.asList(quantifierSimp());
			case POWER :
				return Arrays.asList(genericSimp(), powerSimp(), rationalPowerSimp());
			case COND : {
				// struggling to find the "right" way to simplify p?a:b...
				// return Arrays.asList(conditionalSimplification());
				return Arrays.asList(conditionalSimp());
				// return Arrays.asList(genericSimplification());
			}
			case OR :
				return Arrays.asList(genericSimp(), orSimp(), subContextSimp());// numericOrSimplification());
			case MODULO :
				return Arrays.asList(genericSimp(), rationalPowerSimp(),
						computerModuloSimp());
			default :
		}
		if (symbExpr instanceof Polynomial)
			return Arrays.asList(genericSimp(), polynomialSimp(),
					rationalPowerSimp());
		if (symbExpr instanceof RationalExpression)
			return Arrays.asList(genericSimp(), rationalPowerSimp());
		return Arrays.asList(genericSimp());
	}

}