public bool InsertRuleWithANewSymbol(Grammar grammar)
        {
            for (var i = 0; i < NumberOfRetries; i++)
            {
                var existingLHSNonTerminal = grammar.GetRandomRule().Name.NonTerminal;
                if (existingLHSNonTerminal == grammar.StartSymbol) continue;

                var newLHSNonTerminal = grammar.GetNextAvailableProjectionName();

                var typeOfExistingLHS = grammar.NonTerminalsTypeDictionary[existingLHSNonTerminal];

                grammar.AddProjectionTypeToTypeDictionary(newLHSNonTerminal, typeOfExistingLHS);

                //grammar.AddRule(new Rule(0, grammar.StartSymbol, new[] { newLHSNonTerminal, grammar.StartSymbol }, 0, 1));
                // grammar.AddRule(new Rule(0, grammar.StartSymbol, new[] { newLHSNonTerminal }, 0, 0));

                grammar.AddRule(new Rule(0, newLHSNonTerminal, new[] {existingLHSNonTerminal}, 0, 0));


                return true;
            }
            return false;
        }
        public bool ChangeHeadOfRule(Grammar grammar)
        {
            for (var i = 0; i < NumberOfRetries; i++)
            {
                var rule = grammar.GetRandomRule();
                if (!rule.IsInitialRule()) continue; //do not change complements of schematic rules. (push/pop)

                if (rule.Production.Length > 1)
                {
                    var newRule = new Rule(rule);
                    newRule.HeadPosition = (rule.HeadPosition + 1)%rule.Production.Length;

                    if (grammar.AreHeadRelationsConsistent(newRule))
                    {
                        grammar.DeleteRule(rule);
                        grammar.AddRule(newRule);
                        return true;
                    }
                }
            }
            return false;
        }
        public bool AddMoveable(Grammar grammar)
        {
            for (var i = 0; i < NumberOfRetries; i++)
            {
                var rule = grammar.GetRandomRule();

                //if movement symbol is LHS for some rule..
                if (!grammar.Moveables.Contains(rule.Name.NonTerminal))
                {
                    grammar.AddMoveable(rule.Name.NonTerminal);
                    return true;
                }
            }
            return false;
        }
        public bool AddRuleToLandingSites(Grammar grammar)
        {
            for (var i = 0; i < NumberOfRetries; i++)
            {
                var rule = grammar.GetRandomRule();
                //var movementSymbol = rule.NonComplementTerm;

                //if movement symbol is LHS for some rule..
                if (!grammar.LandingSites.Contains(rule.Name.NonTerminal))
                {
                    grammar.AddNonTerminalToLandingSites(rule.Name.NonTerminal);
                    return true;
                }
            }
            return false;
        }
        public bool ChangeComplementOfRule(Grammar grammar)
        {
            for (var i = 0; i < NumberOfRetries; i++)
            {
                var rule = grammar.GetRandomRule();

                if (!rule.IsInitialRule()) continue; //do not change complements of schematic rules. (push/pop)

                if (rule.Production.Length > 1)
                {
                    rule.ComplementPosition = (rule.ComplementPosition + 1)%rule.Production.Length;
                    return true;
                }
            }
            return false;
        }
 public bool DeleteRule(Grammar grammar)
 {
     var rule = grammar.GetRandomRule();
     grammar.DeleteRule(rule);
     return true;
 }