private static void AddTransitionPushingOne(Transition <A, S> transition, SDA <A, TripleStackSymbol <S> > sda, PDA <A, S> dpda, Dictionary <string, TripleStackSymbol <S> > stackSymbols)
 {
     foreach (var r in dpda.States)
     {
         var stackSymbolIn   = stackSymbols[TripleStackSymbol <S> .GetKey(transition.Origin.Id, transition.StackSymbolIn, r.Key)];
         var stackSymbolsOut = new TripleStackSymbol <S>[]
         {
             stackSymbols[TripleStackSymbol <S> .GetKey(transition.Target.Id, transition.StackSymbolsWritten.First(), r.Key)]
         };
         sda.AddTransition(transition.SymbolIn.GetSymbol(), stackSymbolIn, stackSymbolsOut);
     }
 }
        private static Dictionary <string, TripleStackSymbol <S> > CreateStackSymbols(PDA <A, S> dpda)
        {
            var res = new Dictionary <string, TripleStackSymbol <S> >();

            foreach (var state1 in dpda.States)
            {
                foreach (var stackSymbol in dpda.AllStackSymbols)
                {
                    foreach (var state2 in dpda.States)
                    {
                        res.Add(TripleStackSymbol <S> .GetKey(state1.Key, stackSymbol, state2.Key),
                                new TripleStackSymbol <S>(state1.Key, stackSymbol, state2.Key));
                    }
                }
            }

            return(res);
        }
        private static IEnumerable <TripleStackSymbol <S> > RemoveEpsilonSymbolsFromRightHandSide(SDA <A, TripleStackSymbol <S> > sda, PDA <A, S> dpda, Dictionary <string, TripleStackSymbol <S> > stackSymbols)
        {
            var epsilonSymbols = new List <TripleStackSymbol <S> >();

            var transitions = dpda.States.SelectMany(s => s.Value.Transitions).ToList();

            foreach (var t in transitions.Where(t => t.SymbolIn.IsEmpty()))
            {
                var epsilonSymbol = stackSymbols[TripleStackSymbol <S> .GetKey(t.Origin.Id, t.StackSymbolIn, t.Target.Id)];

                epsilonSymbols.Add(epsilonSymbol);

                foreach (var sdaTransition in sda.Transitions.Where(sdaTransition => sdaTransition.StackSymbolsWritten.Contains(epsilonSymbol)))
                {
                    sdaTransition.RemoveEpsilonSymbol(epsilonSymbol);
                }
            }

            return(epsilonSymbols);
        }
        private static IEnumerable <StackSymbolSequence <TripleStackSymbol <S> > > ConvertInitialConfigurationToSDAConfiguration(Dictionary <string, TripleStackSymbol <S> > allStackSymbols, Dictionary <string, TripleStackSymbol <S> > epsilonStackSymbols, PDA <A, S> dpda, S initialStackSymbol)
        {
            var res = new List <StackSymbolSequence <TripleStackSymbol <S> > >();

            foreach (var s in dpda.States)
            {
                var tripleKey = TripleStackSymbol <S> .GetKey(dpda.InitialState.Id, initialStackSymbol, s.Key);

                if (allStackSymbols.ContainsKey(tripleKey))
                {
                    var triple = allStackSymbols[tripleKey];
                    res.Add(new StackSymbolSequence <TripleStackSymbol <S> >(triple));
                }
                else if (epsilonStackSymbols.ContainsKey(tripleKey))
                {
                    res.Add(new StackSymbolSequence <TripleStackSymbol <S> >());
                }
            }

            Assertion.Assert(res.All(s => s.StackSequence.Length > 0) || res.Count == 1, "if a configuration set contains the empty sequence (Epsilon), then it is only admissible if this is the only element");

            return(res);
        }
        private static void AddTransitionPushingNone(Transition <A, S> transition, SDA <A, TripleStackSymbol <S> > sda, Dictionary <string, TripleStackSymbol <S> > stackSymbols)
        {
            var stackSymbolIn = stackSymbols[TripleStackSymbol <S> .GetKey(transition.Origin.Id, transition.StackSymbolIn, transition.Target.Id)];

            sda.AddTransition(transition.SymbolIn.GetSymbol(), stackSymbolIn);
        }