private Tuple <bool, ISymbol> TransformBinary(BinaryOperation op) { BinaryOperation output = op; var transformOp1 = TransformGeneric(output.Operand1); if (transformOp1.Item1) { output = op.ReplaceOperand1(transformOp1.Item2) as BinaryOperation; } var transformOp2 = TransformGeneric(output.Operand2); if (transformOp2.Item1) { output = op.ReplaceOperand2(transformOp2.Item2) as BinaryOperation; } var transformOccurred = transformOp1.Item1 || transformOp2.Item1; if (!output.Matches(_constraint)) { return(new Tuple <bool, ISymbol>(transformOccurred, output)); } var transformed = RunTransformOn(output); return(new Tuple <bool, ISymbol>(true, transformed)); }