public void TestDPDARunnerForFinalStateAndEmptyStack() { var dpda = new PDA <char, char>(new AcceptanceCondition.FinalStateAndEmptyStack(), true, 'Z', false, "ZXY"); dpda.AddState(1, false); dpda.AddState(2, true); dpda.AddTransition().From(0).To(0).Read('a').Pop('Z').Push("XZ"); dpda.AddTransition().From(0).To(0).Read('a').Pop('X').Push("XX"); dpda.AddTransition().From(0).To(0).Read('a').Pop('Y').Push("XY"); dpda.AddTransition().From(0).To(0).Read('b').Pop('Z').Push("YZ"); dpda.AddTransition().From(0).To(0).Read('b').Pop('X').Push("YX"); dpda.AddTransition().From(0).To(0).Read('b').Pop('Y').Push("YY"); dpda.AddTransition().From(0).To(1).Read('v').Pop('Z').Push("Z"); dpda.AddTransition().From(0).To(1).Read('v').Pop('X').Push("X"); dpda.AddTransition().From(0).To(1).Read('v').Pop('Y').Push("Y"); dpda.AddTransition().From(1).To(1).Read('a').Pop('X').Push(); dpda.AddTransition().From(1).To(1).Read('b').Pop('Y').Push(); dpda.AddTransition().From(1).To(2).Read().Pop('Z').Push(""); dpda.CreateRunner(); Assert.IsFalse(dpda.AcceptsWord("").Accepts()); Assert.IsFalse(dpda.AcceptsWord("ababababababvbabababababab").Accepts()); Assert.IsTrue(dpda.AcceptsWord("abbabaababbabbbbbaaaaabbbbbabaaabbbabaaababbbabvbabbbabaaababbbaaababbbbbaaaaabbbbbabbabaababba").Accepts()); Assert.IsTrue(dpda.AcceptsWord("abavaba").Accepts()); }
public void TestPDA2() { var pda = new PDA <char, char>(new AcceptanceCondition.FinalState(), false, 'Z', false, "Z", furtherSymbol); pda.AddState(1, false); pda.AddState(2, false); pda.AddState(3, false); pda.AddState(4, false); pda.AddState(5, true); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZ"); pda.AddTransition().From(0).To(1).Read().Pop('Z').Push(); pda.AddTransition().From(1).To(2).Read().Pop('Z').Push(); pda.AddTransition().From(1).To(3).Read('a').Pop('Z').Push(); pda.AddTransition().From(3).To(4).Read('a').Pop('Z').Push(); pda.AddTransition().From(4).To(5).Read('a').Pop('Z').Push(); pda.CreateRunner(); Assert.IsTrue(pda.AcceptsWord("aaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("").Accepts()); Assert.IsFalse(pda.AcceptsWord("a").Accepts()); Assert.IsFalse(pda.AcceptsWord("aa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("b").Accepts()); Assert.IsFalse(pda.AcceptsWord("ab").Accepts()); Assert.IsFalse(pda.AcceptsWord("aab").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaab").Accepts()); }
public void TestPDAManyInfLoops() { var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZX", furtherSymbol); pda.AddState(1, false); pda.AddState(2, false); pda.AddState(3, false); pda.AddState(4, false); pda.AddState(5, false); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("XZ"); pda.AddTransition().From(0).To(0).Read().Pop('X').Push("XX"); pda.AddTransition().From(1).To(1).Read().Pop('X').Push("XX"); pda.AddTransition().From(2).To(2).Read().Pop('X').Push("XX"); pda.AddTransition().From(3).To(3).Read().Pop('X').Push("XX"); pda.AddTransition().From(4).To(4).Read().Pop('X').Push("XX"); pda.AddTransition().From(5).To(5).Read().Pop('X').Push("XX"); pda.AddTransition().From(0).To(1).Read().Pop('X').Push("XX"); pda.AddTransition().From(1).To(2).Read().Pop('X').Push("XX"); pda.AddTransition().From(2).To(3).Read().Pop('X').Push("XX"); pda.AddTransition().From(3).To(4).Read().Pop('X').Push("XX"); pda.AddTransition().From(4).To(5).Read().Pop('X').Push("XX"); pda.AddTransition().From(5).To(1).Read().Pop('X').Push("XX"); pda.AddTransition().From(0).To(3).Read().Pop('X').Push("XX"); pda.AddTransition().From(2).To(5).Read().Pop('X').Push("XX"); pda.AddTransition().From(5).To(2).Read().Pop('X').Push("XX"); pda.CreateRunner(); Assert.IsFalse(pda.AcceptsWord("").Accepts()); Assert.IsFalse(pda.AcceptsWord("a").Accepts()); Assert.IsFalse(pda.AcceptsWord("aa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts()); }
public void TestPerformance() { var pdaWithShorterSequence = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZXY"); pdaWithShorterSequence.AddState(1, false); pdaWithShorterSequence.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZZZ"); pdaWithShorterSequence.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z"); pdaWithShorterSequence.AddTransition().From(1).To(1).Read().Pop('Z').Push(); pdaWithShorterSequence.AddTransition().From(1).To(1).Read('a').Pop('Z').Push(); pdaWithShorterSequence.CreateRunner(); var stopwatch = new Stopwatch(); stopwatch.Start(); Assert.IsTrue(pdaWithShorterSequence.AcceptsWord("a").Accepts()); stopwatch.Stop(); Console.WriteLine("Runtime for shorter:" + stopwatch.Elapsed); var pdaWithLongerSequence = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZXY"); pdaWithLongerSequence.AddState(1, false); pdaWithLongerSequence.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZZZZZ"); pdaWithLongerSequence.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z"); pdaWithLongerSequence.AddTransition().From(1).To(1).Read().Pop('Z').Push(); pdaWithLongerSequence.AddTransition().From(1).To(1).Read('a').Pop('Z').Push(); pdaWithLongerSequence.CreateRunner(); var stopwatch2 = new Stopwatch(); stopwatch2.Start(); Assert.IsTrue(pdaWithLongerSequence.AcceptsWord("a").Accepts()); stopwatch2.Stop(); Console.WriteLine("Runtime for longer:" + stopwatch2.Elapsed); }
public static SimulationPath <A, S> RunSimulation(PDA <A, S> pda, A[] word) { var acceptanceResult = pda.AcceptsWord(word); if (!acceptanceResult.Accepts()) { throw new NoAcceptanceException("the pda does not accept the word, therefore, a simulation is not possible"); } var initialNode = SimulationNode <A, S> .InitialNode( new Configuration <A, S>(pda.InitialState, new Word <A>(word), CurrentStack <S> .WithSingleSymbol(pda.FirstStackSymbol)), pda.AcceptanceCondition); var frontChain = new List <SimulationNode <A, S> > { initialNode }; while (frontChain.Count() > 0) { var nodesAcceptedWord = frontChain.Where(node => node.HasAcceptedWord).ToList(); if (nodesAcceptedWord.Count() > 0) { return(SimulationPathFromFinalNode(nodesAcceptedWord.First())); } foreach (var node in frontChain) { node.DoStep(); } frontChain = frontChain.SelectMany(node => node.Children).ToList(); } throw new InvalidOperationException("the given pda does not accept the word, therefore a simulation is not possible"); }
public void TestDPDARunnerForEmptyLanguage() { var dpda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'Z', false, "Z"); dpda.AddTransition().From(0).To(0).Read().Pop('Z').Push("Z"); dpda.CreateRunner(); Assert.IsFalse(dpda.AcceptsWord("").Accepts()); }
public void TestSlowPDA() { var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZYX"); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZ"); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push(); pda.AddTransition().From(0).To(0).Read('a').Pop('Z').Push(); pda.CreateRunner(); Assert.IsTrue(pda.AcceptsWord("aaaaaaaaaaaaaaa").Accepts()); }
public void TestPDA20() { var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "Z", furtherSymbol); pda.AddState(1, false); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZ"); pda.AddTransition().From(0).To(1).Read().Pop('Z').Push("ZZ"); pda.AddTransition().From(1).To(0).Read().Pop('Z').Push("ZZ"); pda.AddTransition().From(1).To(1).Read().Pop('Z').Push("ZZ"); pda.CreateRunner(); Assert.IsFalse(pda.AcceptsWord("").Accepts()); Assert.IsFalse(pda.AcceptsWord("a").Accepts()); Assert.IsFalse(pda.AcceptsWord("aa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaaaaaaaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("b").Accepts()); Assert.IsFalse(pda.AcceptsWord("ab").Accepts()); Assert.IsFalse(pda.AcceptsWord("aab").Accepts()); }
public void TestPDA13() { var pda = new PDA <char, char>(new AcceptanceCondition.FinalState(), false, 'Z', false, stackAlphabet, furtherSymbol); pda.AddState(1, false); pda.AddState(2, false); pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZY"); pda.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z"); pda.AddTransition().From(1).To(1).Read().Pop('Z').Push("ZX"); pda.AddTransition().From(1).To(2).Read().Pop('Z').Push("Z"); pda.AddTransition().From(2).To(2).Read().Pop('Z').Push(); pda.AddTransition().From(2).To(2).Read().Pop('X').Push(); pda.AddTransition().From(2).To(2).Read().Pop('Y').Push("Z"); pda.CreateRunner(); Assert.IsFalse(pda.AcceptsWord("").Accepts()); Assert.IsFalse(pda.AcceptsWord("a").Accepts()); Assert.IsFalse(pda.AcceptsWord("aa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts()); Assert.IsFalse(pda.AcceptsWord("b").Accepts()); Assert.IsFalse(pda.AcceptsWord("ab").Accepts()); Assert.IsFalse(pda.AcceptsWord("aab").Accepts()); }
private static int CheckWordsNotInLanguage(IEnumerable <string> words, HashSet <char> alphabet, PDA <char, char> pda, List <string> feedback) { return(CheckWords(words, alphabet, word => !pda.AcceptsWord(word).Accepts(), feedback, ErrorWordInLanguage)); }