Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
 internal bool IsStartOfNotDecreasingCircle(VirtualConfiguration <U, V> circleEndConfig)
 {
     return(circleEndConfig.state.Id == state.Id && stack.Count() <= circleEndConfig.stack.Count());
 }
Exemplo n.º 3
0
        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);
        }