private static bool CheckIfStackIsEmpty <U, V>(PDA <U, V> pda, Transition <U, V> epsilonTransition, VirtualConfiguration <U, V> currentConfig) where U : IEquatable <U> where V : IEquatable <V> { if (currentConfig.stack.Count() == 0) { pda.RemoveTransition(epsilonTransition); pda.AddTransition().From(epsilonTransition.Origin.Id).To(currentConfig.state.Id).Read().Pop(epsilonTransition.StackSymbolIn).Push(); return(true); } return(false); }
internal bool IsStartOfNotDecreasingCircle(VirtualConfiguration <U, V> circleEndConfig) { return(circleEndConfig.state.Id == state.Id && stack.Count() <= circleEndConfig.stack.Count()); }
private static bool CheckIfConfigIsStable <U, V>(PDA <U, V> pda, Transition <U, V> epsilonTransition, VirtualConfiguration <U, V> currentConfig) where U : IEquatable <U> where V : IEquatable <V> { var enterableTransitions = currentConfig.GetEnterableTransitions(); var enterableEpsilonTransitions = enterableTransitions.Where(t => t.SymbolIn.IsEmpty()).ToList(); Assertion.Assert(enterableEpsilonTransitions.Count <= 1, "a DPDA can only have one enterable epsilon transition in each configuration"); if (enterableEpsilonTransitions.Count == 0) { pda.RemoveTransition(epsilonTransition); foreach (var transition in enterableTransitions) { Assertion.Assert(!transition.SymbolIn.IsEmpty(), "there should be no epsilon transitions at this point"); var newStack = transition.StackSymbolsWritten.Concat(currentConfig.stack.Skip(1).ToList()).ToList(); pda.AddTransition().From(epsilonTransition.Origin.Id).To(transition.Target.Id).Read(transition.SymbolIn).Pop(epsilonTransition.StackSymbolIn).Push(newStack); } return(true); } return(false); }