private void StepBin(ISet<Production> productions) {
List<Production> finalProductions = new List<Production>();
foreach (var production in productions) {
if (production.Rhs.Count < 3) {
finalProductions.Add(production);
continue;
}
var rhs = production.Rhs;
var curr = production.Lhs;
for (int i = 0; i < rhs.Count - 2; i++) {
var weight = (curr == production.Lhs) ? production.Weight : 1.0;
var left = rhs[i];
var newFresh = GetFresh();
finalProductions.Add(
new Production(curr, new Sentence { left, newFresh }, weight)
);
curr = newFresh;
}
finalProductions.Add(
new Production(curr, new Sentence { rhs[rhs.Count - 2], rhs[rhs.Count - 1] })
);
}
productions.Clear();
productions.UnionWith(finalProductions);
}