boolean isRedundant = false;
Expr lambdaExp = getExprWithoutParen(lambda.getDefiningExpr());
if(lambdaExp instanceof Application) {
Application definingExpr = (Application)lambdaExp;
isRedundant = (definingExpr.getNExpressions() >= lambda.getNParameters() + 1);
// Walk backwards along the parameters so that we catch cases like
// (\x -> map add x)
int i = lambda.getNParameters() - 1;
int j = definingExpr.getNExpressions() - 1;
for(;isRedundant && i >= 0 && j >= 1;i--, j--) {
if(!isParameterVar(lambda.getNthParameter(i), definingExpr.getNthExpression(j))) {
isRedundant = false;
}
}
} else if(lambdaExp instanceof BinaryOp) {
BinaryOp definingExpr = (BinaryOp)lambdaExp;
if(lambda.getNParameters() == 2 &&
isParameterVar(lambda.getNthParameter(0), definingExpr.getLeftExpr()) &&
isParameterVar(lambda.getNthParameter(1), definingExpr.getRightExpr())) {
isRedundant = true;
} else if(lambda.getNParameters() == 1 &&
isParameterVar(lambda.getNthParameter(0), definingExpr.getRightExpr()) &&
!containsParameterReference(lambda.getNthParameter(0), definingExpr.getLeftExpr())) {
isRedundant = true;
}
} else if(lambdaExp instanceof UnaryOp) {
UnaryOp definingExpr = (UnaryOp)lambdaExp;
if(lambda.getNParameters() == 1 &&
isParameterVar(lambda.getNthParameter(0), definingExpr.getExpr())) {
isRedundant = true;
}
}