diff --git a/info4/kapitel-3/PDA_nach_kfG.ipynb b/info4/kapitel-3/PDA_nach_kfG.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a93094d9c6be41f6df863c38cc7bcbab31d446dc --- /dev/null +++ b/info4/kapitel-3/PDA_nach_kfG.ipynb @@ -0,0 +1,228 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PDA nach kfG\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Loaded machine: PDA_to_CFG" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "::load\n", + "MACHINE PDA_to_CFG\n", + "/* Translating a PDA to a CFG */\n", + "SETS\n", + " STATES = {z0,z1, symbol};\n", + " SYMBOLS={a,b, A, BOT, lambda, S} /* BOT = # = bottom of stack*/\n", + "DEFINITIONS\n", + " CFG_Alphabet == (STATES*(SYMBOLS-{lambda})*STATES);\n", + " Σ == {a,b};\n", + " Γ == {A,BOT};\n", + " ANIMATION_FUNCTION1 == {r,c,i| r=1 ∧ c∈dom(cur) ∧ i=prj1(STATES,SYMBOLS)(prj1(STATES*SYMBOLS,STATES)(cur(c)))};\n", + " ANIMATION_FUNCTION2 == {r,c,i| r=2 ∧ c∈dom(cur) ∧ i=prj2(STATES,SYMBOLS)(prj1(STATES*SYMBOLS,STATES)(cur(c)))};\n", + " ANIMATION_FUNCTION3 == {r,c,i| r=3 ∧ c∈dom(cur) ∧ i=prj2(STATES*SYMBOLS,STATES)(cur(c))};\n", + " ANIMATION_STR_JUSTIFY_LEFT == TRUE;\n", + " SET_PREF_PP_SEQUENCES == TRUE;\n", + " PDA_STATES == (STATES-{symbol});\n", + "\n", + " SYMS(s) == IF (s=lambda) THEN [] ELSE [SYM(s)] END;\n", + " SYM(s) == (symbol,s,symbol);\n", + " TERMINALS == {x|∃t.(t∈Σ ∧ x=SYM(t))}\n", + "CONSTANTS delta, Productions\n", + "PROPERTIES\n", + " /* A PDA accepting {a^mb^m| m≥1} ; Beispiel von Info 4 (Folie 95ff) */\n", + " delta = { (z0,a,BOT) ↦ (z0,[A,BOT]),\n", + " (z0,a,A) ↦ (z0,[A,A]),\n", + " (z0,b,A) ↦ (z1,[]),\n", + " (z1,lambda,BOT) ↦ (z1,[]),\n", + " (z1,b,A) ↦ (z1,[]) } ∧\n", + "\n", + "\n", + " Productions = /* Punkt 1 Folie 109 */\n", + " { lhs,rhs | ∃z.(z∈PDA_STATES ∧ lhs=SYM(S) ∧ rhs = [(z0,BOT,z)])}\n", + " ∪\n", + " /* Punkt 2 Folie 109 */\n", + " { lhs,rhs | ∃(z,a,A,z2).((z,a,A)↦(z2,[])∈delta ∧\n", + " lhs=(z,A,z2) ∧ rhs = SYMS(a)) }\n", + " ∪\n", + " /* Punkt 3 Folie 110 */\n", + " { lhs,rhs | ∃(z,a,A,B,z1,z2).((z,a,A)↦(z1,[B])∈delta ∧ z2∈PDA_STATES ∧\n", + " lhs=(z,A,z2) ∧ rhs = SYMS(a)^[(z1,B,z2)]) }\n", + " ∪\n", + " /* Punkt 4 Folie 110 */\n", + " { lhs,rhs | ∃(z,a,A,B,C,z1,z2,z3).((z,a,A)↦(z1,[B,C])∈delta ∧ \n", + " z2∈PDA_STATES ∧ z3∈PDA_STATES ∧\n", + " lhs=(z,A,z3) ∧ rhs = SYMS(a)^[(z1,B,z2),(z2,C,z3)]) }\n", + "VARIABLES cur\n", + "INVARIANT\n", + " cur ∈ seq(CFG_Alphabet)\n", + "INITIALISATION cur:=SYMS(S)\n", + "OPERATIONS\n", + " ApplyRule(LHS,RHS,pre,post) = PRE LHS↦RHS ∈ Productions ∧\n", + " cur = pre^[LHS]^post ∧\n", + " ran(pre) ⊆ TERMINALS /* Links Ableitung */\n", + " THEN\n", + " cur := pre^RHS^post\n", + " END\n", + "END\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine constants set up using operation 0: $setup_constants()" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":constants" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine initialised using operation 1: $initialise_machine()" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":init" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<table style=\"font-family:monospace\"><tbody>\n", + "<tr>\n", + "<td style=\"padding:10px\">symbol</td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">S</td>\n", + "</tr>\n", + "<tr>\n", + "<td style=\"padding:10px\">symbol</td>\n", + "</tr>\n", + "</tbody></table>" + ], + "text/plain": [ + "<Animation function visualisation>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":show" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Machine: PDA_to_CFG\n", + "Sets: STATES, SYMBOLS\n", + "Constants: delta, Productions\n", + "Variables: cur\n", + "Operations: \n", + "ApplyRule((symbol|->S|->symbol),[(z0|->BOT|->z0)],[],[])\n", + "ApplyRule((symbol|->S|->symbol),[(z0|->BOT|->z1)],[],[])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":browse" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Executed operation: ApplyRule((symbol|->S|->symbol),[(z0|->BOT|->z0)],[],[])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ":exec ApplyRule" + ] + }, + { + "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 +}