private static Tuple<PDA<A, S>, PDA<A, S>> ConvertDPDAsToEmptyStack(PDA<A, S> pda1, PDA<A, S> pda2, A furtherAlphabetSymbol) { if (pda1.AcceptanceCondition.IsEmptyStack() && pda2.AcceptanceCondition.IsEmptyStack()) { return new Tuple<PDA<A, S>, PDA<A, S>>(pda1, pda2); } if (pda1.AcceptanceCondition.IsFinalState() && pda2.AcceptanceCondition.IsEmptyStack()) { var newPda1 = PDATransformer<A, S>.ToDPDAWithEmptyStack(pda1, furtherAlphabetSymbol); var newPda2 = PDATransformer<A, S>.ToDPDAWithAddedAlphabetSymbol(pda2, furtherAlphabetSymbol); return new Tuple<PDA<A, S>, PDA<A, S>>(newPda1, newPda2); } if (pda1.AcceptanceCondition.IsEmptyStack() && pda2.AcceptanceCondition.IsFinalState()) { var newPda1 = PDATransformer<A, S>.ToDPDAWithAddedAlphabetSymbol(pda1, furtherAlphabetSymbol); var newPda2 = PDATransformer<A, S>.ToDPDAWithEmptyStack(pda2, furtherAlphabetSymbol); return new Tuple<PDA<A, S>, PDA<A, S>>(newPda1, newPda2); } if (pda1.AcceptanceCondition.IsFinalState() && pda2.AcceptanceCondition.IsFinalState()) { var newPda1 = PDATransformer<A, S>.ToDPDAWithEmptyStack(pda1, furtherAlphabetSymbol); var newPda2 = PDATransformer<A, S>.ToDPDAWithEmptyStack(pda2, furtherAlphabetSymbol); return new Tuple<PDA<A, S>, PDA<A, S>>(newPda1, newPda2); } throw new InvalidOperationException("the given pdas have wrong configuration"); }
internal static bool CheckEquivalence(PDA<A, S> pda1, PDA<A, S> pda2, S initialStackSymbol1, S initialStackSymbol2, A furtherAlphabetSymbol) { Assertion.Assert(pda1.Deterministic, String.Format(NotDeterministicError, "first")); Assertion.Assert(pda2.Deterministic, String.Format(NotDeterministicError, "second")); bool pdaDoesNotHaveSymbol(PDA<A, S> pda, A symbol) => pda.States.All(s => s.Value.Transitions.All(t => t.SymbolIn.IsEmpty() || !t.SymbolIn.GetSymbol().Equals(symbol))); Assertion.Assert(pdaDoesNotHaveSymbol(pda1, furtherAlphabetSymbol) && pdaDoesNotHaveSymbol(pda2, furtherAlphabetSymbol), FurtherAlphabetSymbolInvalidError); //TODO: the PDAs have both acceptance conditions, check also the equivalence of this pda with itself (and the other acceptance condition) var convertedPDAs = ConvertDPDAsToEmptyStack(pda1, pda2, furtherAlphabetSymbol); var mergedDPDA = PDATransformer<A, S>.MergeDPDAsWithEmptyStack(convertedPDAs.Item1, convertedPDAs.Item2, initialStackSymbol1, initialStackSymbol2); var mergedDPDAInNormalForm = DPDAToNormalFormConverter<A, S>.ToNormalForm(mergedDPDA); var initialStackSymbol1NormalForm = GetStackSymbol(mergedDPDAInNormalForm, initialStackSymbol1); var initialStackSymbol2NormalForm = GetStackSymbol(mergedDPDAInNormalForm, initialStackSymbol2); var determinisedSDAResult = DPDAInNormalFormToSDAConverter<A, StackSymbolSequence<S>>.ToDeterminisedSDA(mergedDPDAInNormalForm, initialStackSymbol1NormalForm, initialStackSymbol2NormalForm); //TODO: create in the FromPDA-method already the partition (see Fact 3.2 in the paper) if it is necessary; //maybe remove the own step of the creation of the SDA and integrate this into the determinisedSDA, //as the partition depends on the DPDA that the SDA is created of return false; //FIXME }
public void MergeDPDAsWithEmptyStackTest() { var dpda1 = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'A', false, "ABC", 'Z'); dpda1.AddState(1, false); dpda1.AddState(2, false); dpda1.AddState(3, false); dpda1.AddState(4, false); dpda1.AddState(5, false); dpda1.AddState(6, false); dpda1.AddState(7, false); dpda1.AddTransition().From(0).To(1).Read().Pop('A').Push("AAA"); dpda1.AddTransition().From(1).To(2).Read('a').Pop('A').Push(); dpda1.AddTransition().From(2).To(3).Read('a').Pop('A').Push(); dpda1.AddTransition().From(3).To(4).Read().Pop('A').Push("BBCC"); dpda1.AddTransition().From(4).To(4).Read('b').Pop('B').Push(); dpda1.AddTransition().From(4).To(4).Read('c').Pop('C').Push(); dpda1.AddTransition().From(1).To(5).Read().Pop('B').Push(); dpda1.AddTransition().From(2).To(6).Read().Pop('B').Push("B"); dpda1.AddTransition().From(6).To(7).Read().Pop('B').Push("B"); dpda1.AddTransition().From(7).To(6).Read().Pop('B').Push("B"); var dpda2 = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'A', false, "ABC", 'Z'); dpda2.AddState(1, false); dpda2.AddState(2, false); dpda2.AddState(3, false); dpda2.AddState(4, false); dpda2.AddTransition().From(0).To(1).Read().Pop('A').Push("AAA"); dpda2.AddTransition().From(1).To(2).Read('a').Pop('A').Push(); dpda2.AddTransition().From(2).To(3).Read('a').Pop('A').Push(); dpda2.AddTransition().From(3).To(4).Read().Pop('A').Push("BBCC"); dpda2.AddTransition().From(4).To(4).Read('b').Pop('B').Push(); dpda2.AddTransition().From(4).To(4).Read('c').Pop('C').Push(); var mergedDPDAForSimulationOf1 = PDATransformer <char, char> .MergeDPDAsWithEmptyStack(dpda1, dpda2, 'X', 'Y'); dpda1.CreateRunner(); mergedDPDAForSimulationOf1.CreateRunner(); var equalityResult1 = new PDAEqualityResult <char, char>(dpda1, mergedDPDAForSimulationOf1, "abc", 10, 400000, 3000); Assert.IsTrue(equalityResult1.AreEqual); var mergedDPDAForSimulationOf2 = PDATransformer <char, char> .MergeDPDAsWithEmptyStack(dpda2, dpda1, 'X', 'Y'); dpda2.CreateRunner(); mergedDPDAForSimulationOf2.CreateRunner(); var equalityResult2 = new PDAEqualityResult <char, char>(dpda2, mergedDPDAForSimulationOf2, "abc", 10, 400000, 3000); Assert.IsTrue(equalityResult2.AreEqual); }
private static SimulationPath <A, char> RunSimulationWithCFGForFinalState(PDA <A, char> pda, A[] word, CancellationToken token) { Assertion.Assert(pda.AcceptanceCondition.IsFinalState(), "the pda has not final state as acceptance condition"); var pdaWithEmptyStack = PDATransformer <A, char> .ToPDAWithEmptyStack(pda); var path = RunSimulationWithCFGForEmptyStack(pdaWithEmptyStack, word, token); return(ConvertEmptyStackSimulationPathBackToFinalState(path, pda)); }
internal PDARunnerWithCFG(PDA <A, S> pda, CancellationToken token) { if (pda.AcceptanceCondition.IsEmptyStack()) { AddCFGOfPDA(pda, AcceptanceCondition.EmptyStack.GetId(), token); } if (pda.AcceptanceCondition.IsFinalState()) { AddCFGOfPDA(PDATransformer <A, S> .ToPDAWithEmptyStack(pda), AcceptanceCondition.FinalState.GetId(), token); } }
public void ToDPDAWithAddedAlphabetSymbolTest() { var dpda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'Z', false, "ZYX"); dpda.AddState(1, false); dpda.AddState(2, false); 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('x').Pop('Z').Push("Z"); dpda.AddTransition().From(0).To(1).Read('x').Pop('X').Push("X"); dpda.AddTransition().From(0).To(1).Read('x').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(); var act = PDATransformer <char, char> .ToDPDAWithAddedAlphabetSymbol(dpda, '$'); act.CreateRunner(); Assert.IsFalse(act.AcceptsWord("").Accepts()); Assert.IsFalse(act.AcceptsWord("ax").Accepts()); Assert.IsFalse(act.AcceptsWord("aaxa").Accepts()); Assert.IsFalse(act.AcceptsWord("xa").Accepts()); Assert.IsFalse(act.AcceptsWord("axaa").Accepts()); Assert.IsFalse(act.AcceptsWord("ax$").Accepts()); Assert.IsFalse(act.AcceptsWord("aaxa$").Accepts()); Assert.IsFalse(act.AcceptsWord("xa$").Accepts()); Assert.IsFalse(act.AcceptsWord("axaa$").Accepts()); Assert.IsFalse(act.AcceptsWord("$").Accepts()); Assert.IsTrue(act.AcceptsWord("x$").Accepts()); Assert.IsTrue(act.AcceptsWord("axa$").Accepts()); Assert.IsTrue(act.AcceptsWord("aaxaa$").Accepts()); Assert.IsTrue(act.AcceptsWord("aaaxaaa$").Accepts()); }
public void ToDPDAWithEmptyStackTest() { var dpda = new PDA <char, char>(new AcceptanceCondition.FinalState(), true, 'Z', false, "ZYX", 'B'); 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('x').Pop('Z').Push("Z"); dpda.AddTransition().From(0).To(1).Read('x').Pop('X').Push("X"); dpda.AddTransition().From(0).To(1).Read('x').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("Z"); var exp = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'B', false, "BZYX"); exp.AddState(1, false); exp.AddState(2, false); exp.AddState(3, false); exp.AddState(4, false); exp.AddTransition().From(0).To(1).Read().Pop('B').Push("ZB"); exp.AddTransition().From(1).To(1).Read('a').Pop('Z').Push("XZ"); exp.AddTransition().From(1).To(1).Read('a').Pop('X').Push("XX"); exp.AddTransition().From(1).To(1).Read('a').Pop('Y').Push("XY"); exp.AddTransition().From(1).To(1).Read('b').Pop('Z').Push("YZ"); exp.AddTransition().From(1).To(1).Read('b').Pop('X').Push("YX"); exp.AddTransition().From(1).To(1).Read('b').Pop('Y').Push("YY"); exp.AddTransition().From(1).To(2).Read('x').Pop('Z').Push("Z"); exp.AddTransition().From(1).To(2).Read('x').Pop('X').Push("X"); exp.AddTransition().From(1).To(2).Read('x').Pop('Y').Push("Y"); exp.AddTransition().From(2).To(2).Read('a').Pop('X').Push(""); exp.AddTransition().From(2).To(2).Read('b').Pop('Y').Push(""); exp.AddTransition().From(2).To(3).Read().Pop('Z').Push("Z"); exp.AddTransition().From(3).To(4).Read('$').Pop('Z').Push(); exp.AddTransition().From(3).To(4).Read('$').Pop('X').Push(); exp.AddTransition().From(3).To(4).Read('$').Pop('Y').Push(); exp.AddTransition().From(3).To(4).Read('$').Pop('B').Push(); exp.AddTransition().From(4).To(4).Read().Pop('Y').Push(); exp.AddTransition().From(4).To(4).Read().Pop('X').Push(); exp.AddTransition().From(4).To(4).Read().Pop('Z').Push(); exp.AddTransition().From(4).To(4).Read().Pop('B').Push(); var act = PDATransformer <char, char> .ToDPDAWithEmptyStack(dpda, '$'); Assert.IsTrue(act.Equals(exp)); act.CreateRunner(); Assert.IsFalse(act.AcceptsWord("").Accepts()); Assert.IsFalse(act.AcceptsWord("ax").Accepts()); Assert.IsFalse(act.AcceptsWord("aaxa").Accepts()); Assert.IsFalse(act.AcceptsWord("xa").Accepts()); Assert.IsFalse(act.AcceptsWord("axaa").Accepts()); Assert.IsFalse(act.AcceptsWord("ax$").Accepts()); Assert.IsFalse(act.AcceptsWord("aaxa$").Accepts()); Assert.IsFalse(act.AcceptsWord("xa$").Accepts()); Assert.IsFalse(act.AcceptsWord("axaa$").Accepts()); Assert.IsFalse(act.AcceptsWord("$").Accepts()); Assert.IsTrue(act.AcceptsWord("x$").Accepts()); Assert.IsTrue(act.AcceptsWord("axa$").Accepts()); Assert.IsTrue(act.AcceptsWord("aaxaa$").Accepts()); Assert.IsTrue(act.AcceptsWord("aaaxaaa$").Accepts()); }