private static Matrix ParseTwoTermProposition(string aExpression, CollectedItems aCollectedItems)
        {
            RegexMatch lMatch = TwoTermProposition.Exec(aExpression);

            Term lSubject = Factory.AllAndOnly(
                aCollectedItems.AddUnaryPredicate(lMatch[2][0]),
                lMatch[1].Length > 0);
            Term lPredicate = Factory.AllAndOnly(
                aCollectedItems.AddUnaryPredicate(lMatch[5][0]),
                lMatch[4].Length > 0);
            bool lModernInterpretation = lMatch[6].Length > 0;

            return(FormTwoTermProposition(lSubject, lPredicate, lMatch[3][0], lModernInterpretation));
        }
        private static Matrix ParsePropositionalSubexpression(
            string aExpression,
            CollectedItems aCollectedItems,
            VariableDictionary aBoundVariables)
        {
            if (aExpression.Matches(TwoTermProposition))
            {
                return(ParseTwoTermProposition(aExpression, aCollectedItems));
            }

            if (aExpression.Matches(Is))
            {
                return(aCollectedItems.AddUnaryPredication(
                           aCollectedItems.AddUnaryPredicate(aExpression[0]),
                           FindVariable(aExpression[1], aBoundVariables, aCollectedItems)));
            }

            if (aExpression.Matches(Are))
            {
                return(aCollectedItems.AddBinaryPredication(
                           aCollectedItems.AddBinaryPredicate(aExpression[1]),
                           FindVariable(aExpression[0], aBoundVariables, aCollectedItems),
                           FindVariable(aExpression[2], aBoundVariables, aCollectedItems)));
            }

            if (aExpression.Matches(TrueThat))
            {
                return(aCollectedItems.AddNullPredicate(aExpression[0]));
            }

            if (aExpression.Matches(IsTheSameAs))
            {
                return(aCollectedItems.AddIdentification(
                           FindVariable(aExpression[0], aBoundVariables, aCollectedItems),
                           FindVariable(aExpression[2], aBoundVariables, aCollectedItems)));
            }

            if (aExpression.Matches(ThereAreThisManyOfThese))
            {
                return(Factory.ThereAreThisManyOfThese(
                           UInt32.Parse(aExpression.Substring(0, aExpression.Length - 1)),
                           aCollectedItems.AddUnaryPredicate(aExpression[aExpression.Length - 1])));
            }

            if (aExpression.Matches(ThisManyOfTheseAreTrue))
            {
                List <Matrix> lPredicates = new List <Matrix>();
                RegexMatch    lMatch      = ThisManyOfTheseAreTrue.Exec(aExpression);
                for (int i = 0; i < lMatch[2].Length; i++)
                {
                    lPredicates.Add(aCollectedItems.AddNullPredicate(lMatch[2][i]));
                }
                return(Factory.ThisManyOfTheseAreTrue(UInt32.Parse(lMatch[1]), lPredicates));
            }

            if (aExpression.Matches(ParenthesizedExpression))
            {
                return(Parse(
                           aExpression.Substring(1, aExpression.Length - 2).GetSubexpressions(),
                           aCollectedItems,
                           aBoundVariables));
            }

            throw new ParseError("Expected predication or parenthesized expression, found \"{0}\"", aExpression);
        }