public static Phrase ReduceDateTimeAdditionDateTime(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateTimeTemporalPrimitiveToken dateTimeA = (DateTimeTemporalPrimitiveToken) parameters["dateTimeA"];
            AdditionThirdOrderArithmeticOperatorToken addition = (AdditionThirdOrderArithmeticOperatorToken) parameters["addition"];
            DateTimeTemporalPrimitiveToken dateTimeB = (DateTimeTemporalPrimitiveToken) parameters["dateTimeB"];

            AndLogicalOperatorToken and = new AndLogicalOperatorToken() {
                Text = addition.Text,
                Similarity = addition.Similarity
            };

            return DateTimeTemporalPrimitiveToken.ReduceDateTimeAndDateTime(state, new Dictionary<String, Token>() {
                {"dateTimeA", dateTimeA},
                {"and", and},
                {"dateTimeB", dateTimeB}
            });
        }
        public static Phrase ReduceDateTimeAtDateTime(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateTimeTemporalPrimitiveToken dateTimeA = (DateTimeTemporalPrimitiveToken) parameters["dateTimeA"];
            AtAdpositionsPrepositionsSyntaxToken at = (AtAdpositionsPrepositionsSyntaxToken) parameters["at"];
            DateTimeTemporalPrimitiveToken dateTimeB = (DateTimeTemporalPrimitiveToken) parameters["dateTimeB"];

            AndLogicalOperatorToken and = new AndLogicalOperatorToken() {
                Text = at.Text,
                Similarity = at.Similarity
            };

            return DateTimeTemporalPrimitiveToken.ReduceDateTimeAndDateTime(state, new Dictionary<String, Token>() {
                {"dateTimeA", dateTimeA},
                {"and", and},
                {"dateTimeB", dateTimeB}
            });
        }
        public static Phrase ReduceDateTimeAtNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateTimeTemporalPrimitiveToken dateTimeA = (DateTimeTemporalPrimitiveToken) parameters["dateTimeA"];
            AtAdpositionsPrepositionsSyntaxToken at = (AtAdpositionsPrepositionsSyntaxToken) parameters["at"];
            FloatNumericPrimitiveToken number = (FloatNumericPrimitiveToken) parameters["number"];

            int definitiveHour = (int) number.ToFloat().ConvertTo(typeof (int));

            if (number.ToFloat() < 12) {
                // If PM
                if (DateTime.Now.Hour > 12) {
                    definitiveHour += 12;
                }
            }

            HourVariableTemporalPrimitiveToken hour = new HourVariableTemporalPrimitiveToken() {
                Pattern = new FuzzyDateTimePattern() {
                    Rule = TimeType.Definitive,
                    Hour = definitiveHour,
                    Minute = 0,
                    Second = 0
                },
                Text = number.Text,
                Similarity = number.Similarity
            };

            AndLogicalOperatorToken and = new AndLogicalOperatorToken() {
                Text = at.Text,
                Similarity = at.Similarity
            };

            return DateTimeTemporalPrimitiveToken.ReduceDateTimeAndDateTime(state, new Dictionary<String, Token>() {
                {"dateTimeA", dateTimeA},
                {"and", and},
                {"hour", hour}
            });
        }
        public static Phrase ReduceDateTimePlusDateTime(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateTimeTemporalPrimitiveToken dateTimeA = (DateTimeTemporalPrimitiveToken) parameters["dateTimeA"];
            PlusTypographySyntaxToken plus = (PlusTypographySyntaxToken) parameters["plus"];
            DateTimeTemporalPrimitiveToken dateTimeB = (DateTimeTemporalPrimitiveToken) parameters["dateTimeB"];

            AndLogicalOperatorToken and = new AndLogicalOperatorToken() {
                Text = plus.Text,
                Similarity = plus.Similarity
            };

            return DateTimeTemporalPrimitiveToken.ReduceDateTimeAndDateTime(state, new Dictionary<String, Token>() {
                {"dateTimeA", dateTimeA},
                {"and", and},
                {"dateTimeB", dateTimeB}
            });
        }