diff --git a/info4/kapitel-4/DPDA.ipynb b/info4/kapitel-4/DPDA.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..28c43b8853f836ea9da6c880ab4cf8dfb595e9a3 --- /dev/null +++ b/info4/kapitel-4/DPDA.ipynb @@ -0,0 +1,651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DPDA\n", + "\n", + "Ein __deterministischer Kellerautomat__ \n", + "(kurz DPDA für __deterministic push-down automaton__) ist ein $7$-Tupel \n", + " $M = (\\Sigma, \\Gamma, Z, \\delta , z_0, \\#,F)$, wobei\n", + "* $\\Sigma$ das Eingabe-Alphabet ist, \n", + "* $\\Gamma$ das Kelleralphabet, \n", + "* $Z$ eine endliche Menge von Zuständen,\n", + "* $\\delta : Z \\times (\\Sigma \\cup \\{\\lambda\\}) \\times \\Gamma\n", + " \\rightarrow \\mathfrak{P}_e(Z \\times \\Gamma^{\\ast})$ die\n", + " Überführungsfunktion,\n", + "* $z_0 \\in Z$ der Startzustand,\n", + "* $\\# \\in \\Gamma$ das Bottom-Symbol im Keller,\n", + "* $F \\subseteq Z$ sind die Endzustände\n", + "\n", + "wo gilt:\n", + "* $(\\forall a \\in \\Sigma)\\, (\\forall A \\in \\Gamma)\\, (\\forall z \\in\n", + " Z)\\, [ \\|\\delta(z, a, A)\\| + \\|\\delta(z, \\lambda , A)\\| \\leq 1]$\n", + "\n", + "Anmerkung: $\\mathfrak{P}_e(Z \\times \\Gamma^{\\ast})$ ist die Menge aller\n", + " __endlichen__ Teilmengen von $Z \\times \\Gamma^{\\ast}$." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Loaded machine: DPDA" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "::load\n", + "MACHINE DPDA\n", + "/* B Modell eines PDA */\n", + "SETS\n", + " Z = {z0,z1,ze}; // die Zustände des Automaten, z0 ist der Startzustand\n", + " SYMBOLE={a,b, A, BOT, lambda} /* BOT = # = Bottom-Symbol im Keller*/\n", + "DEFINITIONS\n", + " ANIMATION_FUNCTION_DEFAULT == {(1,1,z)};\n", + " ANIMATION_FUNCTION == {2}*α ∪ {3}*(γ);\n", + " ANIMATION_FUNCTION1 == {(1,0,\"z: \"),(2,0,\"α:\"),(3,0,\"γ:\")};\n", + " ANIMATION_STR_JUSTIFY_LEFTx == TRUE;\n", + " SET_PREF_PP_SEQUENCES == TRUE\n", + "CONSTANTS δ, F, Σ, Γ\n", + "PROPERTIES\n", + " Σ = {a,b} // das Eingabe-Alphabet\n", + " ∧\n", + " Γ = {A,BOT} // das Kelleralphabet\n", + " ∧\n", + " /* Der PDA für {a^m b^m| m>=1} ; Beispiel von Info 4 (Folie 95ff) */\n", + " δ = { (z0,a,BOT) ↦ (z0,[A,BOT]),\n", + " (z0,a,A) ↦ (z0,[A,A]),\n", + " (z0,b,A) ↦ (z1,[]),\n", + " (z1,lambda,BOT) ↦ (ze,[]),\n", + " (z1,b,A) ↦ (z1,[]) } ∧\n", + " F = {ze} // die Endzustände\n", + " // Anmerkung: δ ist hier als Relation anstatt als Funktion zu Mengen definiert\n", + " // Deshalb entspricht δ[{(z,a,g)}] in der B Maschine δ(z,a,g) aus dem Skript\n", + "ASSERTIONS\n", + " !(a,A,z).(a∈Σ ∧ A∈Γ ∧ z∈Z => card(δ[{(z,a,A)}]) + card(δ[{(z,a,A)}]) ≤ 1)\n", + " /*@desc Die Überführungsfunktion ist deterministisch */\n", + "VARIABLES \n", + " z, α, γ // Konfiguration in dem sich der PDA befindet\n", + "INVARIANT\n", + " z ∈ Z ∧ // der aktuelle Zustand\n", + " α ∈ seq(Σ) ∧ // der noch zu lesende Teil des Eingabeworts\n", + " γ ∈ seq(Γ) // aktuelle Kellerinhalt\n", + "INITIALISATION\n", + " z := z0 ||\n", + " γ := [BOT] || // Initialisierung des Stapels\n", + " α := [a,a,b,b] // das Eingabewort\n", + "OPERATIONS\n", + " // die Operationen Schritt und LambdaSchritt modellieren\n", + " // Schritte in der Ableitungsrelation\n", + " Schritt(z‘,s) = PRE α ≠ ∅ ∧ γ ≠ ∅ ∧\n", + " z‘↦s ∈ δ[{(z,first(α),first(γ))}] THEN\n", + " z := z‘ || // in den neuen Zustand wechseln\n", + " α := tail(α) || // das erste Symbol auf der Eingabe löschen\n", + " γ := s^tail(γ) // s auf den Stapel packen\n", + " END;\n", + " LambdaSchritt(z‘,s) = PRE γ ≠ ∅ ∧\n", + " z‘↦s ∈ δ[{(z,lambda,first(γ))}] THEN\n", + " z := z‘ || // in den neuen Zustand wechseln\n", + " γ := s^tail(γ) // s auf den Stapel packen\n", + " END;\n", + " Akzeptieren = PRE γ = ∅ ∧ z∈F THEN \n", + " /* Wir akzeptieren wenn Eingabe leer und wir in einem Endzustand sind */\n", + " skip END;\n", + " AkzeptierenMitLeeremKeller = PRE γ = ∅ ∧ α = ∅ THEN \n", + " /* Wir akzeptieren wenn Eingabe und Stapel leer sind */\n", + " skip END\n", + "END\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine constants set up using operation 0: $setup_constants()" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":constants" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine initialised using operation 1: $initialise_machine()" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":init" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wir prüfen nun ob der PDA auch wirklich deterministisch ist:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "$\\mathit{TRUE}$" + ], + "text/plain": [ + "TRUE" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "!(a,A,z).(a∈Σ ∧ A∈Γ ∧ z∈Z => card(δ[{(z,a,A)}]) + card(δ[{(z,lambda,A)}]) ≤ 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wir können uns auch tabellarisch für jede Kombination an Symbolen und Zuständen die Kardinalität der möglichen Übergange ausgeben:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "|a|A|z|ca|cl|\n", + "|---|---|---|---|---|\n", + "|$\\mathit{a}$|$\\mathit{A}$|$\\mathit{z0}$|$1$|$0$|\n", + "|$\\mathit{a}$|$\\mathit{A}$|$\\mathit{z1}$|$0$|$0$|\n", + "|$\\mathit{a}$|$\\mathit{A}$|$\\mathit{ze}$|$0$|$0$|\n", + "|$\\mathit{a}$|$\\mathit{BOT}$|$\\mathit{z0}$|$1$|$0$|\n", + "|$\\mathit{a}$|$\\mathit{BOT}$|$\\mathit{z1}$|$0$|$1$|\n", + "|$\\mathit{a}$|$\\mathit{BOT}$|$\\mathit{ze}$|$0$|$0$|\n", + "|$\\mathit{b}$|$\\mathit{A}$|$\\mathit{z0}$|$1$|$0$|\n", + "|$\\mathit{b}$|$\\mathit{A}$|$\\mathit{z1}$|$1$|$0$|\n", + "|$\\mathit{b}$|$\\mathit{A}$|$\\mathit{ze}$|$0$|$0$|\n", + "|$\\mathit{b}$|$\\mathit{BOT}$|$\\mathit{z0}$|$0$|$0$|\n", + "|$\\mathit{b}$|$\\mathit{BOT}$|$\\mathit{z1}$|$0$|$1$|\n", + "|$\\mathit{b}$|$\\mathit{BOT}$|$\\mathit{ze}$|$0$|$0$|\n" + ], + "text/plain": [ + "a\tA\tz\tca\tcl\n", + "a\tA\tz0\t1\t0\n", + "a\tA\tz1\t0\t0\n", + "a\tA\tze\t0\t0\n", + "a\tBOT\tz0\t1\t0\n", + "a\tBOT\tz1\t0\t1\n", + "a\tBOT\tze\t0\t0\n", + "b\tA\tz0\t1\t0\n", + "b\tA\tz1\t1\t0\n", + "b\tA\tze\t0\t0\n", + "b\tBOT\tz0\t0\t0\n", + "b\tBOT\tz1\t0\t1\n", + "b\tBOT\tze\t0\t0\n" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":table {a,A,z,ca,cl| a∈Σ ∧ A∈Γ ∧ z∈Z ∧ ca=card(δ[{(z,a,A)}]) & cl = card(δ[{(z,lambda,A)}])}" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine: DPDA\n", + "Sets: Z, SYMBOLE\n", + "Constants: δ, F, Σ, Γ\n", + "Variables: z, α, γ\n", + "Operations: \n", + "Schritt(z0,[A,BOT])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":browse" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: Schritt(z0,[A,BOT])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec Schritt" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">z: </td>\n", + "<td style=\"padding:10px\">z0</td>\n", + "<td style=\"padding:0px\"></td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">α:</td>\n", + "<td style=\"padding:10px\">a</td>\n", + "<td style=\"padding:10px\">b</td>\n", + "<td style=\"padding:10px\">b</td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">γ:</td>\n", + "<td style=\"padding:10px\">A</td>\n", + "<td style=\"padding:10px\">BOT</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: Schritt(z0,[A,A])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec Schritt" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">z: </td>\n", + "<td style=\"padding:10px\">z0</td>\n", + "<td style=\"padding:0px\"></td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">α:</td>\n", + "<td style=\"padding:10px\">b</td>\n", + "<td style=\"padding:10px\">b</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">γ:</td>\n", + "<td style=\"padding:10px\">A</td>\n", + "<td style=\"padding:10px\">A</td>\n", + "<td style=\"padding:10px\">BOT</td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: Schritt(z1,[])" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec Schritt" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">z: </td>\n", + "<td style=\"padding:10px\">z1</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">α:</td>\n", + "<td style=\"padding:10px\">b</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">γ:</td>\n", + "<td style=\"padding:10px\">A</td>\n", + "<td style=\"padding:10px\">BOT</td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: Schritt(z1,[])" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec Schritt" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">z: </td>\n", + "<td style=\"padding:10px\">z1</td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">α:</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">γ:</td>\n", + "<td style=\"padding:10px\">BOT</td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine: DPDA\n", + "Sets: Z, SYMBOLE\n", + "Constants: δ, F, Σ, Γ\n", + "Variables: z, α, γ\n", + "Operations: \n", + "LambdaSchritt(ze,[])" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":browse" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: LambdaSchritt(ze,[])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec LambdaSchritt" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">z: </td>\n", + "<td style=\"padding:10px\">ze</td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">α:</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">γ:</td>\n", + "<td style=\"padding:0px\"></td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine: DPDA\n", + "Sets: Z, SYMBOLE\n", + "Constants: δ, F, Σ, Γ\n", + "Variables: z, α, γ\n", + "Operations: \n", + "Akzeptieren()\n", + "AkzeptierenMitLeeremKeller()" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":browse" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: Akzeptieren()" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec Akzeptieren" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ProB 2", + "language": "prob", + "name": "prob2" + }, + "language_info": { + "codemirror_mode": "prob2_jupyter_repl", + "file_extension": ".prob", + "mimetype": "text/x-prob2-jupyter-repl", + "name": "prob" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}