public void ToSDAInNormalFormTest()
        {
            var dpda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'Z', false, "ZA");

            dpda.AddState(1, false);

            dpda.HasNormalForm();

            dpda.AddTransition().From(0).To(0).Read('a').Pop('Z').Push("AZ");
            dpda.AddTransition().From(0).To(0).Read('a').Pop('A').Push("AA");
            dpda.AddTransition().From(0).To(1).Read('b').Pop('A').Push("A");
            dpda.AddTransition().From(1).To(1).Read('c').Pop('A').Push();
            dpda.AddTransition().From(1).To(1).Read().Pop('Z').Push();

            var symbols = new Dictionary <string, TripleStackSymbol <char> >()
            {
                { "0A1", new TripleStackSymbol <char>(0, 'A', 1) },
                { "0Z1", new TripleStackSymbol <char>(0, 'Z', 1) },
                { "1A1", new TripleStackSymbol <char>(1, 'A', 1) }
            };

            var exp = new SDA <char, TripleStackSymbol <char> >(symbols.Values);

            exp.AddTransition('a', symbols["0Z1"], new TripleStackSymbol <char>[] { symbols["0A1"] });
            exp.AddTransition('a', symbols["0A1"], new TripleStackSymbol <char>[] { symbols["0A1"], symbols["1A1"] });
            exp.AddTransition('b', symbols["0A1"], new TripleStackSymbol <char>[] { symbols["1A1"] });
            exp.AddTransition('c', symbols["1A1"]);

            var act = DPDAInNormalFormToSDAConverter <char, char> .ToSDAInNormalForm(dpda).sda;

            Assert.IsTrue(exp.Equals(act));

            var actPDA = act.ToPDA(symbols["0Z1"]);

            actPDA.CreateRunner();
            dpda.CreateRunner();

            var equalityResult = new PDAEqualityResult <char, TripleStackSymbol <char> >(dpda, actPDA, "abc", 7, 300000, 3000);

            Assert.IsTrue(equalityResult.AreEqual);

            var actDeterminisedSDA = DeterminisedSDA <char, TripleStackSymbol <char> > .FromSDAInNormalForm(act);

            actDeterminisedSDA.CalculateShortestWordsOfStackSymbols();

            Assert.IsTrue(actDeterminisedSDA.ShortestWordsOfStackSymbols[symbols["1A1"]].SequenceEqual("c"));
            Assert.IsTrue(actDeterminisedSDA.ShortestWordsOfStackSymbols[symbols["0A1"]].SequenceEqual("bc"));
            Assert.IsTrue(actDeterminisedSDA.ShortestWordsOfStackSymbols[symbols["0Z1"]].SequenceEqual("abc"));
        }
Esempio n. 2
0
        public void FromSDATest()
        {
            var sda = new SDA <char, char>("ZAB");

            sda.AddTransition('a', 'Z', "ZZ");
            sda.AddTransition('a', 'Z', "ZZ");
            sda.AddTransition('a', 'Z', "AZ");
            sda.AddTransition('b', 'A');
            sda.AddTransition('b', 'A', "B");
            sda.AddTransition('c', 'B');
            sda.AddTransition('d', 'Z');

            var exp = new DeterminisedSDA <char, char>("ZAB");

            exp.AddTransition('a', 'Z', new StackSymbolSequenceSet <char>(new StackSymbolSequence <char>[] { new StackSymbolSequence <char>("ZZ"), new StackSymbolSequence <char>("AZ") }));
            exp.AddTransition('b', 'A', new StackSymbolSequenceSet <char>(new StackSymbolSequence <char>[] { new StackSymbolSequence <char>(""), new StackSymbolSequence <char>("B") }));
            exp.AddTransition('c', 'B', new StackSymbolSequenceSet <char>(new StackSymbolSequence <char>[] { new StackSymbolSequence <char>("") }));
            exp.AddTransition('d', 'Z', new StackSymbolSequenceSet <char>(new StackSymbolSequence <char>[] { new StackSymbolSequence <char>("") }));

            var act = DeterminisedSDA <char, char> .FromSDAInNormalForm(sda);

            Assert.IsTrue(exp.Equals(act));

            Assert.IsTrue(act.ShortestWordsOfStackSymbols['Z'].SequenceEqual("d"));
            Assert.IsTrue(act.ShortestWordsOfStackSymbols['B'].SequenceEqual("c"));
            Assert.IsTrue(act.ShortestWordsOfStackSymbols['A'].SequenceEqual("b"));
        }
 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 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);
        }