public StackSymbolSequenceSet <S> ApplySymbolToStackSymbolSequenceSet(StackSymbolSequenceSet <S> stackSequenceSet, A symbol) { var res = stackSequenceSet.StackSequenceSet.Select(stackSequence => { if (stackSequence.IsEpsilon()) { return(new StackSymbolSequenceSet <S>()); } var first = stackSequence.StackSequence.First(); var enterableTransitions = transitions.Where(t => t.CanBeEntered(symbol, first)); Assertion.Assert(enterableTransitions.Count() <= 1, "in a determinised SDA, only one transition can be entered for a specific configuration"); if (enterableTransitions.Count() == 0) { return(new StackSymbolSequenceSet <S>()); } var stackSymbolsSetWritten = enterableTransitions.First().StackSymbolsSetWritten; var remainingStackSequence = new StackSymbolSequence <S>(stackSequence.StackSequence.Skip(1).ToList()); return(stackSymbolsSetWritten.Multiply(remainingStackSequence)); }); return(StackSymbolSequenceSet <S> .Flatten(res)); }
public StackSymbolSequenceSet(StackSymbolSequence <S> stackSequence) { StackSequenceSet = new List <StackSymbolSequence <S> >() { stackSequence }; }
public StackSymbolSequenceSet <S> ApplyWordToStackSymbolSequence(StackSymbolSequence <S> stackSymbolSequence, IEnumerable <A> word) { return(ApplyWordToStackSymbolSequenceSet(new StackSymbolSequenceSet <S>(stackSymbolSequence), word)); }
public StackSymbolSequenceSet <S> Multiply(StackSymbolSequence <S> stackSequence) { var res = StackSequenceSet.Select(s => new StackSymbolSequence <S>(s.StackSequence.Concat(stackSequence.StackSequence).ToList())); return(new StackSymbolSequenceSet <S>(res)); }
} //the first element of a stack sequence is the top of the new stack string KeySelector(StackSymbolSequence <S> s) => s.Id;