public override Expression Reduce(Dictionary <string, bool> values = null) { Expression LeftReduced = Left.Reduce(values); Expression RightReduced = Right.Reduce(values); if (RightReduced.IsEqual(LeftReduced)) { return(true); } else if (RightReduced.IsNegation(LeftReduced)) { return(false); } else if (LeftReduced is ValueExpression LeftValue) { if (LeftValue.Evaluate()) { return(RightReduced); } else { return(!RightReduced); } } else if (RightReduced is ValueExpression RightValue) { if (RightValue.Evaluate()) { return(LeftReduced); } else { return(!LeftReduced); } } else { return(new Iff(LeftReduced, RightReduced)); } }