public virtual bool UndefineRule([NotNull] Rule r)
{
if (r.index < 0 || r.index >= indexToRule.Count || indexToRule[r.index] != r)
{
return false;
}
Debug.Assert(rules.ContainsKey(r.name) && rules[r.name] == r);
rules.Remove(r.name);
indexToRule.RemoveAt(r.index);
for (int i = r.index; i < indexToRule.Count; i++)
{
Debug.Assert(indexToRule[i].index == i + 1);
indexToRule[i].index--;
}
ruleNumber--;
return true;
}