public bool RemoveRule(GrammarRule rule)
        {
            HashSet<Word> insertions;
            if (rules.TryGetValue(rule.WordToReplace, out insertions) &&
                insertions.Remove(rule.WordToInsert))
            {
                if (insertions.Count == 0)
                    rules.Remove(rule.WordToReplace);
                return true;
            }

            return false;
        }
        public bool AddRule(GrammarRule rule)
        {
            if (rule.WordToReplace == rule.WordToInsert)
                return false;

            HashSet<Word> insertions;
            if (!rules.TryGetValue(rule.WordToReplace, out insertions))
            {
                insertions = new HashSet<Word>();
                rules[rule.WordToReplace] = insertions;
            }

            return insertions.Add(rule.WordToInsert);
        }