diff --git a/.idea/runConfigurations/Export_A4_No_Code.xml b/.idea/runConfigurations/Export_A4_No_Code.xml
new file mode 100644
index 0000000..4fd10f6
--- /dev/null
+++ b/.idea/runConfigurations/Export_A4_No_Code.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment 4.ipynb b/Assignment 4.ipynb
new file mode 100644
index 0000000..e8479f7
--- /dev/null
+++ b/Assignment 4.ipynb
@@ -0,0 +1,495 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "initial_id",
+ "metadata": {
+ "collapsed": true,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.367829600Z",
+ "start_time": "2024-02-17T00:51:01.209832800Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Helpers and imports\n",
+ "from automata.fa.nfa import NFA\n",
+ "\n",
+ "debug = False\n",
+ "\n",
+ "def nfa_test(nfa: NFA, str_arr: list[str]):\n",
+ " for s in str_arr:\n",
+ " if s == \"\":\n",
+ " print(f'ε is accepted: {nfa.accepts_input(s)}')\n",
+ " else:\n",
+ " print(f'{s} is accepted: {nfa.accepts_input(s)}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Q22\n",
+ "## (a)"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "2a3d28941b3eac7d"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": ">"
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q22a = NFA(\n",
+ " states={'q0', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6'},\n",
+ " input_symbols={'0', '1'},\n",
+ " transitions={\n",
+ " 'q0': {'0': {'q1'}},\n",
+ " 'q1': {'1': {'q2'}},\n",
+ " 'q2': {'1': {'q3'}},\n",
+ " 'q3': {'0': {'q3', 'q4'}, '1': {'q3'}},\n",
+ " 'q4': {'0': {'q5'}},\n",
+ " 'q5': {'0': {'q6'}}\n",
+ " },\n",
+ " initial_state='q0',\n",
+ " final_states={'q6'}\n",
+ ")\n",
+ "# Should be true\n",
+ "t = [\n",
+ " \"011000\",\n",
+ " \"0110000\",\n",
+ " \"011010000\",\n",
+ " \"011011010000\"\n",
+ "]\n",
+ "# Should be false\n",
+ "f = [\n",
+ " \"\",\n",
+ " \"0\",\n",
+ " \"1\",\n",
+ " \"0110\",\n",
+ " \"0110001\",\n",
+ " \"011010001\",\n",
+ " \"011011010001\"\n",
+ "]\n",
+ "if debug:\n",
+ " nfa_test(q22a, t)\n",
+ " print('-'*20)\n",
+ " nfa_test(q22a, f)\n",
+ "q22a.show_diagram()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.419829300Z",
+ "start_time": "2024-02-17T00:51:01.419829300Z"
+ }
+ },
+ "id": "8ec96b76671bd51f",
+ "execution_count": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## (b)"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "4c318b8332558fe6"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": ">"
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q22b = NFA(\n",
+ " states={'q0', 'q1', 'q2', 'q3', 'q4'},\n",
+ " input_symbols={'a', 'b', 'c'},\n",
+ " transitions={\n",
+ " 'q0': {'a': {'q1'}, 'b': {'q2'}, 'c': {'q3'}},\n",
+ " 'q1': {'a': {'q1', 'q4'}, 'b': {'q1'}, 'c': {'q1'}},\n",
+ " 'q2': {'a': {'q2'}, 'b': {'q2', 'q4'}, 'c': {'q2'}},\n",
+ " 'q3': {'a': {'q3'}, 'b': {'q3'}, 'c': {'q3', 'q4'}},\n",
+ " 'q4': {}\n",
+ " },\n",
+ " initial_state='q0',\n",
+ " final_states={'q4'}\n",
+ ")\n",
+ "\n",
+ "# Should be true\n",
+ "t = [\n",
+ " \"aa\",\n",
+ " \"bb\",\n",
+ " \"cc\",\n",
+ " \"aba\",\n",
+ " \"bab\",\n",
+ " \"cac\",\n",
+ " \"aabca\",\n",
+ " \"bcbab\",\n",
+ " \"ccccc\",\n",
+ "]\n",
+ "f = [\n",
+ " \"\",\n",
+ " \"a\",\n",
+ " \"b\",\n",
+ " \"c\",\n",
+ " \"abc\",\n",
+ " \"ab\",\n",
+ " \"bc\",\n",
+ " \"ca\",\n",
+ " \"ac\",\n",
+ " \"ba\",\n",
+ " \"abbbbbc\",\n",
+ " \"aaaaaaaaaaaabbbbbbbbbbbbcccccccccccccccc\",\n",
+ " \"abcabac\",\n",
+ " \"bbbbbbbbbbba\",\n",
+ "]\n",
+ "if debug:\n",
+ " nfa_test(q22b, t)\n",
+ " print('-'*20)\n",
+ " nfa_test(q22b, f)\n",
+ "q22b.show_diagram()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.425828900Z",
+ "start_time": "2024-02-17T00:51:01.419829300Z"
+ }
+ },
+ "id": "b36d3c2c58fe93b7",
+ "execution_count": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "$\\pagebreak$"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "5a3996c26ce8cfbc"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Q23"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "9551c6ce7a0990"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": ">"
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q23 = NFA(\n",
+ " states={'q0', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7'},\n",
+ " input_symbols={'0', '1'},\n",
+ " transitions={\n",
+ " 'q0': {'': {'q1', 'q5'}},\n",
+ " 'q1': {'0': {'q1', 'q2'}, '1': {'q1', 'q3'}},\n",
+ " 'q2': {'0': {'q4'}},\n",
+ " 'q3': {'1': {'q4'}},\n",
+ " 'q5': {'0': {'q6'}, '1': {'q6'}},\n",
+ " 'q6': {'0': {'q7'}, '1': {'q7'}},\n",
+ " 'q7': {'0': {'q5'}, '1': {'q5'}}\n",
+ " },\n",
+ " initial_state='q0',\n",
+ " final_states={'q4', 'q7'}\n",
+ ")\n",
+ "t = [\n",
+ " '00',\n",
+ " '11',\n",
+ " '01',\n",
+ " '00000',\n",
+ " '11111',\n",
+ " '01010',\n",
+ " '01111100',\n",
+ " '10010111',\n",
+ " '011100',\n",
+ " '10010',\n",
+ " '10001011',\n",
+ "]\n",
+ "f = [\n",
+ " '',\n",
+ " '0',\n",
+ " '1',\n",
+ " '101',\n",
+ " '010',\n",
+ " '0001',\n",
+ " '1110',\n",
+ " '0101',\n",
+ " '0111110',\n",
+ "]\n",
+ "if debug:\n",
+ " nfa_test(q23, t)\n",
+ " print('-'*20)\n",
+ " nfa_test(q23, f)\n",
+ "q23.show_diagram()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.456829Z",
+ "start_time": "2024-02-17T00:51:01.428830800Z"
+ }
+ },
+ "id": "7055f3d7e013c8bf",
+ "execution_count": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "$\\pagebreak$"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "35ed9908c8809b00"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Q24\n",
+ "## (a) \n",
+ "The language for this graph is:\n",
+ "$$L = \\{ w \\in \\{ 0, 1, 2 \\}^* \\ | \\text{ The fourth last symbol in } w \\text{ is } 0 \\text { and the second last symbol in } w \\text{ is } 2 \\}$$\n",
+ "\n",
+ "## (b)\n",
+ "The language for this graph is:\n",
+ "$$L = \\{ w \\in \\{ a, b, c \\}^* \\ | \\ w \\text{ contains the substring } ab \\text { or } w \\text{ contains the substring } ac \\}$$"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "d359a31d044ce735"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "$\\pagebreak$"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "144bcb36426add4a"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Q26\n",
+ "## (a)"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "233aa8019cdbe103"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": ">"
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q26a = NFA(\n",
+ "\tstates={'q00', 'q01', 'q02', 'q03', 'q04', 'q05', 'q06', 'q07', 'q08', 'q09', 'q10', 'q11', 'q12', 'q13'},\n",
+ " input_symbols={'a', 'b', 'c', 'd'},\n",
+ " transitions={\n",
+ " 'q00': {'a': {'q00', 'q01'}, 'b': {'q00', 'q02'}, 'c': {'q00', 'q03'}, 'd': {'q00', 'q04'}},\n",
+ " 'q01': {'a': {'q05'}},\n",
+ " 'q02': {'b': {'q06'}},\n",
+ " 'q03': {'c': {'q07'}},\n",
+ " 'q04': {'d': {'q08'}},\n",
+ "\t 'q05': {'a': {'q09'}},\n",
+ " 'q06': {'b': {'q10'}},\n",
+ " 'q07': {'c': {'q11'}},\n",
+ " 'q08': {'d': {'q12'}},\n",
+ " 'q09': {'a': {'q13'}},\n",
+ " 'q10': {'b': {'q13'}},\n",
+ " 'q11': {'c': {'q13'}},\n",
+ " 'q12': {'d': {'q13'}},\n",
+ " 'q13': {'a': {'q13'}, 'b': {'q13'}, 'c': {'q13'}, 'd': {'q13'}},\n",
+ " },\n",
+ " initial_state='q00',\n",
+ " final_states={'q13'},\n",
+ ")\n",
+ "t = [\n",
+ " 'aaaa',\n",
+ " 'bbbb',\n",
+ " 'cccc',\n",
+ " 'dddd',\n",
+ " 'abbbba',\n",
+ " 'acccca',\n",
+ " 'adddda',\n",
+ " 'abbbbabbbba',\n",
+ " 'accccacccca',\n",
+ " 'addddadddda',\n",
+ " 'aaabbbcccdddd',\n",
+ "]\n",
+ "f = [\n",
+ " 'abcd',\n",
+ " 'abdc',\n",
+ " 'acbd',\n",
+ " 'acdb',\n",
+ " 'aaabb',\n",
+ " 'abbbc',\n",
+ " 'abbbd',\n",
+ "]\n",
+ "if debug:\n",
+ " nfa_test(q26a, t)\n",
+ " print('-'*20)\n",
+ " nfa_test(q26a, f)\n",
+ "q26a.show_diagram()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.510831200Z",
+ "start_time": "2024-02-17T00:51:01.457831400Z"
+ }
+ },
+ "id": "ba55249fa215010e",
+ "execution_count": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## (b)"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "c55b1fd818f8da4e"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": ">"
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q26b = NFA(\n",
+ "\tstates={'q0', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8'},\n",
+ "\tinput_symbols={'a', 'b', 'c'},\n",
+ "\ttransitions={\n",
+ "\t\t'q0': {'a': {'q1'}, 'b': {'q5'}},\n",
+ "\t\t'q1': {'a': {'q2'}, 'b': {'q3'}},\n",
+ "\t\t'q2': {'a': {'q1'}},\n",
+ "\t\t'q3': {'b': {'q4'}},\n",
+ "\t\t'q4': {'b': {'q3'}},\n",
+ "\t\t'q5': {'b': {'q5'}, 'c': {'q6'}},\n",
+ "\t\t'q6': {'c': {'q7'}},\n",
+ "\t\t'q7': {'c': {'q8'}},\n",
+ "\t\t'q8': {'c': {'q6'}},\n",
+ "\t},\n",
+ "\tinitial_state='q0',\n",
+ "\tfinal_states={'q0', 'q3', 'q5', 'q8'},\n",
+ ")\n",
+ "t = [\n",
+ " 'ab',\n",
+ " 'aaabbb',\n",
+ " 'aaaaabbbbb',\n",
+ " 'b',\n",
+ " 'bb',\n",
+ " 'bbccc',\n",
+ " 'bbcccccc',\n",
+ "]\n",
+ "f = [\n",
+ " 'a',\n",
+ " 'aaa',\n",
+ " 'aaaa',\n",
+ " 'bba',\n",
+ " 'ca',\n",
+ " 'cb',\n",
+ " 'cc',\n",
+ " 'ccca',\n",
+ " 'bbba',\n",
+ " 'bbbbbc',\n",
+ "]\n",
+ "if debug:\n",
+ " nfa_test(q26b, t)\n",
+ " print('-'*20)\n",
+ " nfa_test(q26b, f)\n",
+ "\n",
+ "q26b.show_diagram()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-17T00:51:01.566831900Z",
+ "start_time": "2024-02-17T00:51:01.509831400Z"
+ }
+ },
+ "id": "b44d21890b7c5fe6",
+ "execution_count": 6
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Drawing/A4.xcf b/Drawing/A4.xcf
new file mode 100644
index 0000000..b86c110
Binary files /dev/null and b/Drawing/A4.xcf differ