From 6c7cf916e0cc9167e5d5a9c34beb11aebf430a66 Mon Sep 17 00:00:00 2001 From: Wieger Wesselink Date: Fri, 24 Sep 2021 13:58:00 +0200 Subject: [PATCH] Initial commit --- .gitignore | 129 ++++ README.md | 92 +++ doc/images/nfa2dfa.png | Bin 0 -> 71931 bytes doc/specifications.pdf | Bin 0 -> 353532 bytes examples/cfg1.cfg | 12 + examples/cfg2.cfg | 3 + examples/chomsky1.cfg | 6 + examples/complement.dfa | 11 + examples/dfa1.dfa | 23 + examples/dfa2.dfa | 8 + examples/intersection1.dfa | 10 + examples/intersection2.dfa | 11 + examples/nfa1.nfa | 17 + examples/nfa2.nfa | 9 + examples/pda-simple.pda | 11 + examples/pda1.pda | 18 + examples/pda2.pda | 19 + examples/pda3.pda | 18 + examples/pda4.pda | 19 + examples/regexp1.regexp | 6 + examples/reverse.dfa | 15 + examples/sipser-1.6b.dfa | 23 + examples/symmetric_difference1.dfa | 13 + examples/symmetric_difference2.dfa | 13 + examples/test1.cfg | 6 + examples/test1.dfa | 8 + examples/test2.dfa | 6 + examples/tm1.tm | 24 + examples/union1.dfa | 13 + examples/union2.dfa | 15 + notebooks/make_notebook.py | 327 ++++++++ notebooks/notebooks.batch | 88 +++ notebooks/templates/cfg-cyk-algorithm.ipynb | 108 +++ notebooks/templates/cfg-derivation.ipynb | 81 ++ notebooks/templates/cfg-for-language.ipynb | 64 ++ .../templates/cfg-leftmost-derivation.ipynb | 79 ++ .../templates/cfg-rightmost-derivation.ipynb | 79 ++ notebooks/templates/cfg-to-chomsky.ipynb | 199 +++++ notebooks/templates/dfa-complement.ipynb | 97 +++ notebooks/templates/dfa-for-language.ipynb | 87 +++ notebooks/templates/dfa-intersection.ipynb | 117 +++ notebooks/templates/dfa-reverse.ipynb | 98 +++ .../templates/dfa-symmetric_difference.ipynb | 117 +++ notebooks/templates/dfa-to-regexp.ipynb | 95 +++ notebooks/templates/dfa-union.ipynb | 117 +++ notebooks/templates/nfa-for-language.ipynb | 78 ++ notebooks/templates/nfa-to-dfa.ipynb | 97 +++ notebooks/templates/pda-for-language.ipynb | 78 ++ notebooks/templates/regexp-for-language.ipynb | 62 ++ notebooks/templates/tm-for-language.ipynb | 85 ++ .../with-answers/cfg-cyk-algorithm.ipynb | 108 +++ notebooks/with-answers/cfg-derivation.ipynb | 81 ++ notebooks/with-answers/cfg-for-language.ipynb | 64 ++ .../cfg-leftmost-derivation.ipynb | 79 ++ .../cfg-rightmost-derivation.ipynb | 79 ++ notebooks/with-answers/cfg-to-chomsky.ipynb | 199 +++++ notebooks/with-answers/dfa-complement.ipynb | 97 +++ notebooks/with-answers/dfa-for-language.ipynb | 87 +++ notebooks/with-answers/dfa-intersection.ipynb | 117 +++ notebooks/with-answers/dfa-reverse.ipynb | 98 +++ .../dfa-symmetric_difference.ipynb | 117 +++ notebooks/with-answers/dfa-to-regexp.ipynb | 95 +++ notebooks/with-answers/dfa-union.ipynb | 117 +++ notebooks/with-answers/nfa-for-language.ipynb | 78 ++ notebooks/with-answers/nfa-to-dfa.ipynb | 97 +++ notebooks/with-answers/pda-for-language.ipynb | 78 ++ .../with-answers/regexp-for-language.ipynb | 62 ++ notebooks/with-answers/tm-for-language.ipynb | 85 ++ .../without-answers/cfg-cyk-algorithm.ipynb | 108 +++ .../without-answers/cfg-derivation.ipynb | 81 ++ .../without-answers/cfg-for-language.ipynb | 64 ++ .../cfg-leftmost-derivation.ipynb | 79 ++ .../cfg-rightmost-derivation.ipynb | 79 ++ .../without-answers/cfg-to-chomsky.ipynb | 199 +++++ .../without-answers/dfa-complement.ipynb | 97 +++ .../without-answers/dfa-for-language.ipynb | 87 +++ .../without-answers/dfa-intersection.ipynb | 117 +++ notebooks/without-answers/dfa-reverse.ipynb | 98 +++ .../dfa-symmetric_difference.ipynb | 117 +++ notebooks/without-answers/dfa-to-regexp.ipynb | 95 +++ notebooks/without-answers/dfa-union.ipynb | 117 +++ .../without-answers/nfa-for-language.ipynb | 78 ++ notebooks/without-answers/nfa-to-dfa.ipynb | 97 +++ .../without-answers/pda-for-language.ipynb | 78 ++ .../without-answers/regexp-for-language.ipynb | 62 ++ .../without-answers/tm-for-language.ipynb | 85 ++ pyproject.toml | 6 + requirements.txt | 5 + setup.cfg | 25 + src/gambatools/CFG.g4 | 24 + src/gambatools/CFGLexer.py | 66 ++ src/gambatools/CFGParser.py | 464 +++++++++++ src/gambatools/CFGVisitor.py | 53 ++ src/gambatools/__init__.py | 0 src/gambatools/algorithms.py | 13 + src/gambatools/automata_checker.py | 46 ++ src/gambatools/automaton.py | 27 + src/gambatools/automaton_algorithms.py | 242 ++++++ src/gambatools/automaton_io.py | 67 ++ src/gambatools/cfg.py | 175 +++++ src/gambatools/cfg_algorithms.py | 723 ++++++++++++++++++ src/gambatools/cfg_parser.py | 82 ++ src/gambatools/dfa.py | 73 ++ src/gambatools/dfa_algorithms.py | 501 ++++++++++++ src/gambatools/dfa_io.py | 35 + src/gambatools/draw_sigma.py | 356 +++++++++ src/gambatools/generate_parser_code | 5 + src/gambatools/gnfa.py | 51 ++ src/gambatools/identifier_generator.py | 12 + src/gambatools/language_algorithms.py | 70 ++ src/gambatools/language_generator.py | 63 ++ src/gambatools/list_utility.py | 24 + src/gambatools/nfa.py | 47 ++ src/gambatools/nfa_algorithms.py | 335 ++++++++ src/gambatools/nfa_io.py | 29 + src/gambatools/notebook.py | 397 ++++++++++ src/gambatools/notebook_cfg.py | 157 ++++ src/gambatools/notebook_chomsky.py | 90 +++ src/gambatools/notebook_dfa.py | 168 ++++ src/gambatools/notebook_experimental.py | 71 ++ src/gambatools/notebook_nfa2dfa.py | 99 +++ src/gambatools/notebook_sigma.py | 29 + src/gambatools/pda.py | 69 ++ src/gambatools/pda_algorithms.py | 497 ++++++++++++ src/gambatools/printing.py | 16 + src/gambatools/regexp.g4 | 18 + src/gambatools/regexp.py | 164 ++++ src/gambatools/regexpLexer.py | 70 ++ src/gambatools/regexpParser.py | 340 ++++++++ src/gambatools/regexpVisitor.py | 48 ++ src/gambatools/regexp_algorithms.py | 265 +++++++ src/gambatools/regexp_parser.py | 61 ++ src/gambatools/regexp_simple.g4 | 19 + src/gambatools/regexp_simpleLexer.py | 71 ++ src/gambatools/regexp_simpleParser.py | 337 ++++++++ src/gambatools/regexp_simpleVisitor.py | 48 ++ src/gambatools/regexp_simple_parser.py | 62 ++ src/gambatools/regular_expressionsLexer.py | 89 +++ src/gambatools/text_utility.py | 34 + src/gambatools/tm.py | 89 +++ src/gambatools/tm_algorithms.py | 182 +++++ tests/__init__.py | 0 tests/test_automata.py | 28 + tests/test_automaton_algorithms.py | 26 + tests/test_cfg.py | 67 ++ tests/test_cfg_algorithms.py | 327 ++++++++ tests/test_dfa_algorithms.py | 178 +++++ tests/test_language_algorithms.py | 22 + tests/test_nfa_algorithms.py | 107 +++ tests/test_pda_algorithms.py | 260 +++++++ tests/test_regexp.py | 52 ++ tests/test_regexp_algorithms.py | 184 +++++ tests/test_tm_algorithms.py | 83 ++ 153 files changed, 14630 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 doc/images/nfa2dfa.png create mode 100644 doc/specifications.pdf create mode 100644 examples/cfg1.cfg create mode 100644 examples/cfg2.cfg create mode 100644 examples/chomsky1.cfg create mode 100644 examples/complement.dfa create mode 100644 examples/dfa1.dfa create mode 100644 examples/dfa2.dfa create mode 100644 examples/intersection1.dfa create mode 100644 examples/intersection2.dfa create mode 100644 examples/nfa1.nfa create mode 100644 examples/nfa2.nfa create mode 100644 examples/pda-simple.pda create mode 100644 examples/pda1.pda create mode 100644 examples/pda2.pda create mode 100644 examples/pda3.pda create mode 100644 examples/pda4.pda create mode 100644 examples/regexp1.regexp create mode 100644 examples/reverse.dfa create mode 100644 examples/sipser-1.6b.dfa create mode 100644 examples/symmetric_difference1.dfa create mode 100644 examples/symmetric_difference2.dfa create mode 100644 examples/test1.cfg create mode 100644 examples/test1.dfa create mode 100644 examples/test2.dfa create mode 100644 examples/tm1.tm create mode 100644 examples/union1.dfa create mode 100644 examples/union2.dfa create mode 100755 notebooks/make_notebook.py create mode 100644 notebooks/notebooks.batch create mode 100644 notebooks/templates/cfg-cyk-algorithm.ipynb create mode 100644 notebooks/templates/cfg-derivation.ipynb create mode 100644 notebooks/templates/cfg-for-language.ipynb create mode 100644 notebooks/templates/cfg-leftmost-derivation.ipynb create mode 100644 notebooks/templates/cfg-rightmost-derivation.ipynb create mode 100644 notebooks/templates/cfg-to-chomsky.ipynb create mode 100644 notebooks/templates/dfa-complement.ipynb create mode 100644 notebooks/templates/dfa-for-language.ipynb create mode 100644 notebooks/templates/dfa-intersection.ipynb create mode 100644 notebooks/templates/dfa-reverse.ipynb create mode 100644 notebooks/templates/dfa-symmetric_difference.ipynb create mode 100644 notebooks/templates/dfa-to-regexp.ipynb create mode 100644 notebooks/templates/dfa-union.ipynb create mode 100644 notebooks/templates/nfa-for-language.ipynb create mode 100644 notebooks/templates/nfa-to-dfa.ipynb create mode 100644 notebooks/templates/pda-for-language.ipynb create mode 100644 notebooks/templates/regexp-for-language.ipynb create mode 100644 notebooks/templates/tm-for-language.ipynb create mode 100644 notebooks/with-answers/cfg-cyk-algorithm.ipynb create mode 100644 notebooks/with-answers/cfg-derivation.ipynb create mode 100644 notebooks/with-answers/cfg-for-language.ipynb create mode 100644 notebooks/with-answers/cfg-leftmost-derivation.ipynb create mode 100644 notebooks/with-answers/cfg-rightmost-derivation.ipynb create mode 100644 notebooks/with-answers/cfg-to-chomsky.ipynb create mode 100644 notebooks/with-answers/dfa-complement.ipynb create mode 100644 notebooks/with-answers/dfa-for-language.ipynb create mode 100644 notebooks/with-answers/dfa-intersection.ipynb create mode 100644 notebooks/with-answers/dfa-reverse.ipynb create mode 100644 notebooks/with-answers/dfa-symmetric_difference.ipynb create mode 100644 notebooks/with-answers/dfa-to-regexp.ipynb create mode 100644 notebooks/with-answers/dfa-union.ipynb create mode 100644 notebooks/with-answers/nfa-for-language.ipynb create mode 100644 notebooks/with-answers/nfa-to-dfa.ipynb create mode 100644 notebooks/with-answers/pda-for-language.ipynb create mode 100644 notebooks/with-answers/regexp-for-language.ipynb create mode 100644 notebooks/with-answers/tm-for-language.ipynb create mode 100644 notebooks/without-answers/cfg-cyk-algorithm.ipynb create mode 100644 notebooks/without-answers/cfg-derivation.ipynb create mode 100644 notebooks/without-answers/cfg-for-language.ipynb create mode 100644 notebooks/without-answers/cfg-leftmost-derivation.ipynb create mode 100644 notebooks/without-answers/cfg-rightmost-derivation.ipynb create mode 100644 notebooks/without-answers/cfg-to-chomsky.ipynb create mode 100644 notebooks/without-answers/dfa-complement.ipynb create mode 100644 notebooks/without-answers/dfa-for-language.ipynb create mode 100644 notebooks/without-answers/dfa-intersection.ipynb create mode 100644 notebooks/without-answers/dfa-reverse.ipynb create mode 100644 notebooks/without-answers/dfa-symmetric_difference.ipynb create mode 100644 notebooks/without-answers/dfa-to-regexp.ipynb create mode 100644 notebooks/without-answers/dfa-union.ipynb create mode 100644 notebooks/without-answers/nfa-for-language.ipynb create mode 100644 notebooks/without-answers/nfa-to-dfa.ipynb create mode 100644 notebooks/without-answers/pda-for-language.ipynb create mode 100644 notebooks/without-answers/regexp-for-language.ipynb create mode 100644 notebooks/without-answers/tm-for-language.ipynb create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 setup.cfg create mode 100644 src/gambatools/CFG.g4 create mode 100644 src/gambatools/CFGLexer.py create mode 100644 src/gambatools/CFGParser.py create mode 100644 src/gambatools/CFGVisitor.py create mode 100644 src/gambatools/__init__.py create mode 100644 src/gambatools/algorithms.py create mode 100644 src/gambatools/automata_checker.py create mode 100644 src/gambatools/automaton.py create mode 100644 src/gambatools/automaton_algorithms.py create mode 100644 src/gambatools/automaton_io.py create mode 100644 src/gambatools/cfg.py create mode 100644 src/gambatools/cfg_algorithms.py create mode 100644 src/gambatools/cfg_parser.py create mode 100644 src/gambatools/dfa.py create mode 100644 src/gambatools/dfa_algorithms.py create mode 100644 src/gambatools/dfa_io.py create mode 100644 src/gambatools/draw_sigma.py create mode 100755 src/gambatools/generate_parser_code create mode 100644 src/gambatools/gnfa.py create mode 100644 src/gambatools/identifier_generator.py create mode 100644 src/gambatools/language_algorithms.py create mode 100644 src/gambatools/language_generator.py create mode 100644 src/gambatools/list_utility.py create mode 100644 src/gambatools/nfa.py create mode 100644 src/gambatools/nfa_algorithms.py create mode 100644 src/gambatools/nfa_io.py create mode 100644 src/gambatools/notebook.py create mode 100644 src/gambatools/notebook_cfg.py create mode 100644 src/gambatools/notebook_chomsky.py create mode 100644 src/gambatools/notebook_dfa.py create mode 100644 src/gambatools/notebook_experimental.py create mode 100644 src/gambatools/notebook_nfa2dfa.py create mode 100644 src/gambatools/notebook_sigma.py create mode 100644 src/gambatools/pda.py create mode 100644 src/gambatools/pda_algorithms.py create mode 100644 src/gambatools/printing.py create mode 100644 src/gambatools/regexp.g4 create mode 100644 src/gambatools/regexp.py create mode 100644 src/gambatools/regexpLexer.py create mode 100644 src/gambatools/regexpParser.py create mode 100644 src/gambatools/regexpVisitor.py create mode 100644 src/gambatools/regexp_algorithms.py create mode 100644 src/gambatools/regexp_parser.py create mode 100644 src/gambatools/regexp_simple.g4 create mode 100644 src/gambatools/regexp_simpleLexer.py create mode 100644 src/gambatools/regexp_simpleParser.py create mode 100644 src/gambatools/regexp_simpleVisitor.py create mode 100644 src/gambatools/regexp_simple_parser.py create mode 100644 src/gambatools/regular_expressionsLexer.py create mode 100644 src/gambatools/text_utility.py create mode 100644 src/gambatools/tm.py create mode 100644 src/gambatools/tm_algorithms.py create mode 100644 tests/__init__.py create mode 100644 tests/test_automata.py create mode 100644 tests/test_automaton_algorithms.py create mode 100644 tests/test_cfg.py create mode 100644 tests/test_cfg_algorithms.py create mode 100644 tests/test_dfa_algorithms.py create mode 100644 tests/test_language_algorithms.py create mode 100644 tests/test_nfa_algorithms.py create mode 100644 tests/test_pda_algorithms.py create mode 100644 tests/test_regexp.py create mode 100644 tests/test_regexp_algorithms.py create mode 100644 tests/test_tm_algorithms.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6e4761 --- /dev/null +++ b/.gitignore @@ -0,0 +1,129 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..6680979 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# GAMBA tools + +The `gambatools` package is a Python 3 package that aims to +support education in theoretical computer science at +[Eindhoven University of Technology](https://www.tue.nl/en/). +It contains a library for +DFAs, NFAs, PDAs, Turing machines, context free grammars and +regular expressions. Moreover, the package provides Jupyter notebooks with +exercises. The library has been developed by Wieger Wesselink, +and it was designed together with Erik de Vink. + +# GAMBA +The code was developed as part of the GAMBA project, which stands for: +*Grammars and Automata Made Boffo and Assessible*. The goals of the project are +to support + +* practising and assessing formal language techniques +* self-paced learning outside contact hours +* immediate feedback while practising +* automated grading for assessment + +(*boffo*: extremely successful, sensational) + +# License +The code is distributed under the `GPL-3.0-or-later` license. + +# Installation +The package can be installed using +``` +pip install gambatools +``` +The required python packages can be found in `requirements.txt`. + +# Rendering images +For visualization the [graphviz](https://pypi.org/project/graphviz/) python +package is used. **To render the generated DOT source code, you also need to install +Graphviz**. See the [Graphviz website](https://graphviz.org/) for further instructions. +Make sure that the directory containing the `dot` executable is on your systems’ path. + +# Documentation +The file `doc/specifications.pdf` contains formal specifications +of the algorithms in the library. Note that the code maps almost one-to-one +to the specifications, so in order to understand the code please consult the +pseudocode specifications. + +# Notebooks +The directory `notebooks` contains a number of Jupyter notebooks +with exercises. In `notebooks/with-answers` the correct answers are +already given, while in `notebooks/without-answers` they have been +left out. +The answers to the exercises are checked automatically. +Whenever the user makes a mistake, appropriate feedback is given. + +![NFA to DFA](doc/images/nfa2dfa.png) + +For specifying a DFA, NFA, etc. a line based textual input format is used, +see the example below. The documentation contains a section that describes +the syntax, while in the `examples` directory a number of examples can be found. +``` +input_symbols 0 1 +states qA qB qC qD + +initial qA +final qC + +qA qB 0 +qA qD 1 +qB qB 0 +qB qC 1 +qC qB 0 +qC qC 1 +qD qD 0 +qD qD 1 +``` + +# Notebook generation +For convenience there is a mechanism to automatically generate notebooks from +templates. +The notebooks in `notebooks/with-answers` and `notebooks/without-answers` +have been generated using the commands +``` +make_notebook.py -o without-answers notebooks.batch +make_notebook.py --with-answers -o with-answers notebooks.batch +``` +The templates contain tags of the form `<>` that are substituted by +the `make_notebook.py` script. This generation is still experimental, and +there is currently no documentation available for this. + +# Contact +If you are interested in using the package for education or have questions +or feedback, the authors can be reached by email: + or . diff --git a/doc/images/nfa2dfa.png b/doc/images/nfa2dfa.png new file mode 100644 index 0000000000000000000000000000000000000000..148ab84e6df6dc3433149d225cf4d11f6a6c204c GIT binary patch literal 71931 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

i-{K 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 MboFyt=akR{0G1b#=l}o! literal 0 HcmV?d00001 diff --git a/doc/specifications.pdf b/doc/specifications.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b30c7447d2bf8e6cbd8706bb333b9ed488eddd22 GIT binary patch literal 353532 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

!~BA6h5}61Ow2xxzW|#37|Xi0W^J` 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 ! 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й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 z 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 P%uMXCu literal 0 HcmV?d00001 diff --git a/examples/cfg1.cfg b/examples/cfg1.cfg new file mode 100644 index 0000000..72b8bda --- /dev/null +++ b/examples/cfg1.cfg @@ -0,0 +1,12 @@ +%% language = \lbrace \, a^{\mkern1mu n} \mkern1mu b^{\mkern1mu m} c^{\mkern1mu \ell} \mid n = m \lor m = \ell \lor n = \ell \, \rbrace +%% accepted = _ aaa bb c aabb bc aabc aabbbcc aaaccc +%% rejected = bcc aab aabbbc ccaaabb bbccaa abab cb aaacccc +%% question = Give a CFG that generates the language $@language@$. + +S -> XC | AY | Z +X -> aXb | ε +Y -> bYc | ε +Z -> aZc | B +A -> aA | ε +B -> bB | ε +C -> cC | ε diff --git a/examples/cfg2.cfg b/examples/cfg2.cfg new file mode 100644 index 0000000..805b1a1 --- /dev/null +++ b/examples/cfg2.cfg @@ -0,0 +1,3 @@ +S -> ASA | aB +A -> B | S +B -> b | ε diff --git a/examples/chomsky1.cfg b/examples/chomsky1.cfg new file mode 100644 index 0000000..7b94932 --- /dev/null +++ b/examples/chomsky1.cfg @@ -0,0 +1,6 @@ +T -> AC | AS | SA | DB | a +S -> AS | SA | DB | a | AC +B -> b +A -> AC | AS | SA | DB | a | b +C -> SA +D -> a diff --git a/examples/complement.dfa b/examples/complement.dfa new file mode 100644 index 0000000..243ee09 --- /dev/null +++ b/examples/complement.dfa @@ -0,0 +1,11 @@ +%% language = \{ \, w \in \{a,b\}^\ast \mid \#_a(w) \geqslant 2 \, \} + +input_symbols a b +states q0 q1 q2 +initial q0 +final q2 +q0 q0 b +q0 q1 a +q1 q1 b +q1 q2 a +q2 q2 a b diff --git a/examples/dfa1.dfa b/examples/dfa1.dfa new file mode 100644 index 0000000..3062b73 --- /dev/null +++ b/examples/dfa1.dfa @@ -0,0 +1,23 @@ +%% Sipser Exercise 1.6a +%% 0.(0+1)*.1 + +%% question = Give a DFA that generates the language $@language@$. +%% language = \{ w \in {0,1}^\ast \mid w \text{ starts with } 0 \text{ and ends with } 1 \} + +%% selected_word = 0101 + +input_symbols 0 1 +states qA qB qC qD + +initial qA +final qC + +qA qB 0 +qA qD 1 +qB qB 0 +qB qC 1 +qC qB 0 +qC qC 1 +qD qD 0 +qD qD 1 + diff --git a/examples/dfa2.dfa b/examples/dfa2.dfa new file mode 100644 index 0000000..940912f --- /dev/null +++ b/examples/dfa2.dfa @@ -0,0 +1,8 @@ +%% alphabet = \{a,b\} + +initial q0 +final q1 +q0 q1 a +q1 q1 a b +q0 q2 b +q2 q2 a b diff --git a/examples/intersection1.dfa b/examples/intersection1.dfa new file mode 100644 index 0000000..0df32a9 --- /dev/null +++ b/examples/intersection1.dfa @@ -0,0 +1,10 @@ +%% language = \{ \, w \in \{a,b\}^\ast \mid \mbox{$\#_a(w)$ even} \, \} + +input_symbols a b +states q0 q1 +initial q0 +final q0 +q0 q0 b +q0 q1 a +q1 q0 a +q1 q1 b diff --git a/examples/intersection2.dfa b/examples/intersection2.dfa new file mode 100644 index 0000000..d89b3de --- /dev/null +++ b/examples/intersection2.dfa @@ -0,0 +1,11 @@ +%% language = \{ \, w \in \{a,b\}^\ast \mid \#_b(w) \geqslant 2 \, \} + +input_symbols a b +states q0 q1 q2 +initial q0 +final q2 +q0 q0 a +q0 q1 b +q1 q1 a +q1 q2 b +q2 q2 a b diff --git a/examples/nfa1.nfa b/examples/nfa1.nfa new file mode 100644 index 0000000..572b26f --- /dev/null +++ b/examples/nfa1.nfa @@ -0,0 +1,17 @@ +%% language = \{ w \in \{0,1\}^* \mid \#_0(w) \geq 2, \#_1(w) \leq 1 \}^* +%% question = Give an NFA that accepts the language $@language@$. + +initial s6 +final s2 s5 s6 +s0 s1 0 +s0 s3 1 +s1 s2 0 +s1 s4 1 +s2 s0 ε +s2 s2 0 +s2 s5 1 +s3 s4 0 +s4 s5 0 +s5 s0 ε +s5 s5 0 +s6 s0 ε diff --git a/examples/nfa2.nfa b/examples/nfa2.nfa new file mode 100644 index 0000000..e584ead --- /dev/null +++ b/examples/nfa2.nfa @@ -0,0 +1,9 @@ +%% question = Give the DFA obtained from the given NFA using the NFA to DFA procedure. Use set notation like `{q0,q1}` (without spaces) for the states in the DFA. + +input_symbols a b +initial q0 +final q2 +q0 q0 a b +q0 q1 ε +q1 q1 a +q1 q2 b diff --git a/examples/pda-simple.pda b/examples/pda-simple.pda new file mode 100644 index 0000000..b8abb7d --- /dev/null +++ b/examples/pda-simple.pda @@ -0,0 +1,11 @@ +%% language = \{ \, a^{\mkern1mu n} b^{\mkern1mu n} \mid n \geqslant 0 \, \} +%% question = Give a PDA that accepts the language $@language@$. + +initial q0 +final q3 + +q0 q1 e,e$ +q1 q1 a,eX +q1 q2 e,ee +q2 q2 b,Xe +q2 q3 e,$e diff --git a/examples/pda1.pda b/examples/pda1.pda new file mode 100644 index 0000000..1b3472c --- /dev/null +++ b/examples/pda1.pda @@ -0,0 +1,18 @@ +%% language = \{ w \in \{a,b\}^\ast \mid \#_a(w) = 2\#_b(w) \} +%% question = Give a PDA that generates the language $@language@$. + +initial q0 +final q6 +q0 q1 ε,ε$ +q1 q2 ε,$$ +q1 q3 ε,$$ +q1 q6 ε,$ε +q2 q1 ε,$$ +q2 q2 a,nε +q2 q5 b,εn +q3 q1 ε,$$ +q3 q3 a,εp +q3 q4 b,pε +q4 q3 ε,pε +q4 q5 ε,$$ +q5 q2 ε,εn diff --git a/examples/pda2.pda b/examples/pda2.pda new file mode 100644 index 0000000..c1f3847 --- /dev/null +++ b/examples/pda2.pda @@ -0,0 +1,19 @@ +%% language = \{ w \in \{a,b\}^\ast \mid \#_a(w) = 2\#_b(w) \} +%% question = Give a PDA that generates the language $@language@$. + +epsilon ε +initial q0 +final q6 +q0 q1 ε,ε$ +q1 q2 ε,$$ +q1 q3 ε,$$ +q1 q6 ε,$ε +q2 q1 ε,$$ +q2 q2 a,nε +q2 q5 b,εn +q3 q1 ε,$$ +q3 q3 a,εp +q3 q4 b,pε +q4 q3 ε,pε +q4 q5 ε,$$ +q5 q2 ε,εn diff --git a/examples/pda3.pda b/examples/pda3.pda new file mode 100644 index 0000000..afcc7b7 --- /dev/null +++ b/examples/pda3.pda @@ -0,0 +1,18 @@ +%% language = \{ w \in \{a,b\}^\ast \mid \#_a(w) = 2\#_b(w) \} +%% question = Give a PDA that generates the language $@language@$. + +initial q0 +final q6 +q0 q1 _,_$ +q1 q2 _,$$ +q1 q3 _,$$ +q1 q6 _,$ε +q2 q1 _,$$ +q2 q2 a,n_ +q2 q5 b,_n +q3 q1 _,$$ +q3 q3 a,_p +q3 q4 b,p_ +q4 q3 _,p_ +q4 q5 _,$$ +q5 q2 _,_n diff --git a/examples/pda4.pda b/examples/pda4.pda new file mode 100644 index 0000000..671b9bf --- /dev/null +++ b/examples/pda4.pda @@ -0,0 +1,19 @@ +%% language = \{ w \in \{a,b\}^\ast \mid \#_a(w) = 2\#_b(w) \} +%% question = Give a PDA that generates the language $@language@$. + +epsilon _ +initial q0 +final q6 +q0 q1 _,_$ +q1 q2 _,$$ +q1 q3 _,$$ +q1 q6 _,$ε +q2 q1 _,$$ +q2 q2 a,n_ +q2 q5 b,_n +q3 q1 _,$$ +q3 q3 a,_p +q3 q4 b,p_ +q4 q3 _,p_ +q4 q5 _,$$ +q5 q2 _,_n diff --git a/examples/regexp1.regexp b/examples/regexp1.regexp new file mode 100644 index 0000000..9cc7034 --- /dev/null +++ b/examples/regexp1.regexp @@ -0,0 +1,6 @@ +%% Sipser 1.18/1.6d + +%% language = \{ \, w \in \{a,b\}^\ast \mid |w| \geqslant 3 \land w[2] = a \, \} +%% question = (Sipser 1.18/1.6d) Give a regular expression over the alphabet $\{a,b\}$ that generates the language $@language@$. + +(a+b)(a+b)a(a+b)* diff --git a/examples/reverse.dfa b/examples/reverse.dfa new file mode 100644 index 0000000..5814fc9 --- /dev/null +++ b/examples/reverse.dfa @@ -0,0 +1,15 @@ +%% language = \{ \, abw \mid w \in \{a,b\}^\ast \, \} \cup \{ \, w \in \{a,b\}^\ast \mid \mbox{$\#_a(w)$ even} \, \} + +input_symbols a b +states q0 q1 q2 q3 q4 +initial q0 +final q0 q2 q3 q4 +q0 q1 a +q0 q3 b +q1 q2 b +q1 q3 a +q2 q2 a b +q3 q3 b +q3 q4 a +q4 q3 a +q4 q4 b diff --git a/examples/sipser-1.6b.dfa b/examples/sipser-1.6b.dfa new file mode 100644 index 0000000..3661231 --- /dev/null +++ b/examples/sipser-1.6b.dfa @@ -0,0 +1,23 @@ +%% source = Sipser Exercise 1.6b +%% title = DFA for { w \in {0,1}* \mid #_1(w) \geq 3 } +%% language = \{ \, w \in \{0,1\}^\ast \mid \#_1(w) \geqslant 3 \,\} +%% question = Enter a DFA for the language $\{ \, w \in \{0,1\}^\ast \mid \#_1(w) \geqslant 3 \,\}$, i.e. the language of strings of 0's and 1's with at least three 1's. + +input_symbols 0 1 +states qA qB qC qD + +initial qA +final qD + +qA qA 0 +qA qB 1 +qB qB 0 +qB qC 1 +qC qC 0 +qC qD 1 +qD qD 0 +qD qD 1 + + +%% accepted = 01110 1111 +%% rejected = 1000 diff --git a/examples/symmetric_difference1.dfa b/examples/symmetric_difference1.dfa new file mode 100644 index 0000000..9e8e255 --- /dev/null +++ b/examples/symmetric_difference1.dfa @@ -0,0 +1,13 @@ +%% language = \{ \, w \in \{a,b\}^\ast \mid \mbox{$w$ has substring $aba$} \, \} + +input_symbols a b +states q0 q1 q2 q3 +initial q0 +final q2 +q0 q0 b +q0 q1 a +q1 q1 a +q1 q2 b +q2 q0 b +q2 q3 a +q3 q3 a b diff --git a/examples/symmetric_difference2.dfa b/examples/symmetric_difference2.dfa new file mode 100644 index 0000000..02e2217 --- /dev/null +++ b/examples/symmetric_difference2.dfa @@ -0,0 +1,13 @@ +%% language = \{ \, w \in \{a,b\}^\ast \mid \mbox{$w$ has substring bab$} \, \} + +input_symbols a b +states q0 q1 q2 q3 +initial q0 +final q2 +q0 q0 a +q0 q1 b +q1 q1 b +q1 q2 a +q2 q0 a +q2 q3 b +q3 q3 a b diff --git a/examples/test1.cfg b/examples/test1.cfg new file mode 100644 index 0000000..fe9ade0 --- /dev/null +++ b/examples/test1.cfg @@ -0,0 +1,6 @@ +S -> X | Y +X -> AZ | ZA | XX +Y -> BZ | ZB | YY +Z -> aZb | bZa | ZZ | ε +A -> aA | a +B -> bB | b diff --git a/examples/test1.dfa b/examples/test1.dfa new file mode 100644 index 0000000..3234e36 --- /dev/null +++ b/examples/test1.dfa @@ -0,0 +1,8 @@ +input_symbols a b +initial q0 +final q1 +states q0 q1 +q0 q0 a +q0 q1 b +q1 q1 a +q1 q0 b diff --git a/examples/test2.dfa b/examples/test2.dfa new file mode 100644 index 0000000..02749c6 --- /dev/null +++ b/examples/test2.dfa @@ -0,0 +1,6 @@ +input_symbols c +initial s0 +final s1 +states s0 s1 +s0 s1 c +s1 s1 c diff --git a/examples/tm1.tm b/examples/tm1.tm new file mode 100644 index 0000000..e6def97 --- /dev/null +++ b/examples/tm1.tm @@ -0,0 +1,24 @@ +%% language = \{ w\#w \mid w \in \{0,1\}^\ast \} +%% question = Give a Turing Machine that generates the language $@language@$. + +initial q1 +accept q_accept +input_symbols 0 1 # +tape_symbols 0 1 # x □ +q1 q2 0x,R +q1 q3 1x,R +q1 q8 ##,R +q2 q2 00,R 11,R +q2 q4 ##,R +q3 q3 00,R 11,R +q3 q5 ##,R +q4 q4 xx,R +q4 q6 0x,L +q5 q5 xx,R +q5 q6 1x,L +q6 q6 00,L 11,L xx,L +q6 q7 ##,L +q7 q7 00,L 11,L +q7 q1 xx,R +q8 q8 xx,R +q8 q_accept □□,R diff --git a/examples/union1.dfa b/examples/union1.dfa new file mode 100644 index 0000000..5012b51 --- /dev/null +++ b/examples/union1.dfa @@ -0,0 +1,13 @@ +%% language = \{ \, awb \mid w \in \{a,b\}^\ast \, \} + +input_symbols a b +states q0 q1 q2 q3 +initial q0 +final q2 +q0 q1 a +q0 q3 b +q1 q1 a +q1 q2 b +q2 q1 a +q2 q2 b +q3 q3 a b diff --git a/examples/union2.dfa b/examples/union2.dfa new file mode 100644 index 0000000..e8a1c27 --- /dev/null +++ b/examples/union2.dfa @@ -0,0 +1,15 @@ +%% language = \{ w \in \{a,b\}^\ast \mid \mbox{$w$ has substring $abba$} \, \} + +input_symbols a b +states q0 q1 q2 q3 q4 +initial q0 +final q4 +q0 q0 b +q0 q1 a +q1 q1 a +q1 q2 b +q2 q1 a +q2 q3 b +q3 q4 a +q3 q0 b +q4 q4 a b diff --git a/notebooks/make_notebook.py b/notebooks/make_notebook.py new file mode 100755 index 0000000..f69c12d --- /dev/null +++ b/notebooks/make_notebook.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python3 + +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +import argparse +import os +import re +import json +from typing import Dict, List, Union, Tuple, Optional + +from gambatools.cfg import CFG +from gambatools.cfg_algorithms import parse_simple_cfg, cfg_print_simple, cfg_cyk_matrix, cfg_print_cyk_matrix, \ + cfg_derive_word +from gambatools.dfa import DFA +from gambatools.dfa_algorithms import parse_dfa, print_dfa, dfa_union, dfa_intersection, \ + dfa_symmetric_difference, dfa_complement, dfa_reverse +from gambatools.nfa import NFA +from gambatools.nfa_algorithms import parse_nfa, nfa_to_dfa, print_nfa +from gambatools.notebook_chomsky import cfg_apply_chomsky +from gambatools.pda import PDA +from gambatools.pda_algorithms import parse_pda +from gambatools.regexp import Regexp +from gambatools.regexp_algorithms import dfa_to_regexp, print_regexp_simple +from gambatools.regexp_simple_parser import parse_simple_regexp +from gambatools.text_utility import read_utf8_text, write_utf8_text, remove_comments +from gambatools.language_generator import generate_language +from gambatools.tm import TM +from gambatools.tm_algorithms import parse_tm + + +default_notebook_settings: Dict[str, str] = { + 'length': '8', + 'states': '0', +} + + +class SmartFormatter(argparse.HelpFormatter): + + def _split_lines(self, text, width): + if text.startswith('R|'): + return text[2:].splitlines() + # this is the RawTextHelpFormatter._split_lines + return argparse.HelpFormatter._split_lines(self, text, width) + + +def parse_language_file(filename: str) -> Union[DFA, NFA, PDA, CFG, TM, Regexp]: + text = read_utf8_text(filename) + if filename.endswith('.dfa'): + return parse_dfa(text) + elif filename.endswith('.nfa'): + return parse_nfa(text) + elif filename.endswith('.pda'): + return parse_pda(text) + elif filename.endswith('.tm'): + return parse_tm(text) + elif filename.endswith('.cfg'): + return parse_simple_cfg(text) + elif filename.endswith('.regexp'): + return parse_simple_regexp(text) + + +def read_paragraphs(file): + text = read_utf8_text(file).strip() + + # TODO: make removal of comments configurable + text = re.sub(r'^%.*?$', '', text, flags=re.MULTILINE) + + paragraphs = re.split('\n\s*\n', text) + return paragraphs + + +def extension(filename): + m = re.search(r'\.(\w+)$', filename) + if m: + return m.group(1) + else: + return '' + + +def remove_extension(filename): + return re.sub(r'\.\w+$', '', filename) + + +def unquote(word: str) -> str: + if len(word) >= 2 and word[0] == '"' and word[-1] == '"': + return word[1:-1] + return word + + +def apply_command(command: str, arguments: List[str]) -> str: + if command is None: + return arguments[0] + elif command == 'load': + return remove_comments(read_utf8_text(arguments[0])) + elif command == 'generate': + filename, length = arguments[0], arguments[1] + length = int(length) + words = generate_language(parse_language_file(filename), length) + words = [word if word else 'ε' for word in words] + return ' '.join(words) + elif command == 'nfa2dfa': + filename = arguments[0] + N = parse_nfa(read_utf8_text(filename)) + D: DFA = nfa_to_dfa(N) + return print_dfa(D) + elif command == 'dfa2regexp': + filename = arguments[0] + D = parse_dfa(read_utf8_text(filename)) + R = dfa_to_regexp(D) + return print_regexp_simple(R) + elif command == 'dfa_union': + inputfile1, inputfile2 = arguments + D1 = parse_dfa(read_utf8_text(inputfile1)) + D2 = parse_dfa(read_utf8_text(inputfile2)) + D = dfa_union(D1, D2) + return print_dfa(D) + elif command == 'dfa_intersection': + inputfile1, inputfile2 = arguments + D1 = parse_dfa(read_utf8_text(inputfile1)) + D2 = parse_dfa(read_utf8_text(inputfile2)) + D = dfa_intersection(D1, D2) + return print_dfa(D) + elif command == 'dfa_symmetric_difference': + inputfile1, inputfile2 = arguments + D1 = parse_dfa(read_utf8_text(inputfile1)) + D2 = parse_dfa(read_utf8_text(inputfile2)) + D = dfa_symmetric_difference(D1, D2) + return print_dfa(D) + elif command == 'dfa_complement': + inputfile = arguments[0] + D = parse_dfa(read_utf8_text(inputfile)) + D = dfa_complement(D) + return print_dfa(D) + elif command == 'dfa_reverse': + inputfile = arguments[0] + D = parse_dfa(read_utf8_text(inputfile)) + N = dfa_reverse(D) + return print_nfa(N) + elif command == 'cfg_cyk_matrix': + inputfile, word = arguments + G = parse_language_file(inputfile) + if not G.is_chomsky(): + raise RuntimeError('the grammar is not in Chomsky format') + X = cfg_cyk_matrix(G, word) + return cfg_print_cyk_matrix(X, len(word)) + elif command == 'cfg_start_symbol': + inputfile = arguments[0] + G = parse_language_file(inputfile) + return G.S + elif command in ['cfg_leftmost_derivation', 'cfg_rightmost_derivation']: + derivation_type = command.replace('cfg_','').replace('_derivation', '') + inputfile, word = arguments + G = parse_language_file(inputfile) + if G.is_chomsky(): + derivation = cfg_derive_word(G, word, derivation_type) + derivation = ' => '.join(''.join(element) for element in derivation) + else: + derivation = '{} => '.format(G.S) + print('Warning: no derivation was generated for the word "{}", because the grammar is not in Chomsky format.'.format(word)) + return derivation + elif command in ['chomsky1', 'chomsky2', 'chomsky3', 'chomsky4', 'chomsky5']: + filename, start_variable = arguments[0], arguments[1] + G = parse_language_file(filename) + phase = int(command[-1]) + return cfg_print_simple(cfg_apply_chomsky(G, phase, start_variable)) + raise RuntimeError('unknown notebook command {}'.format(command)) + + +# Parse a tag like <> or <> +def parse_template_tag(text: str) -> Tuple[Optional[str], List[str], bool]: + optional = text.endswith('?') + if optional: + text = text[:-1] + if '(' in text: + m = re.fullmatch(r'(\w+)\((.*)\)', text) + if not m: + raise RuntimeError('Error: the tag {} is ill formed'.format(text)) + name = m.group(1) + arguments = m.group(2).split(',') + arguments = [arg.strip() for arg in arguments] + else: + name = None + arguments = [text] + return name, arguments, optional + + +def make_notebook(outputfile, notebook_settings: Dict[str, str], with_answers: bool) -> None: + if not 'templatefile' in notebook_settings: + raise RuntimeError('Error: a paragraph must have an entry templatefile') + template_file = notebook_settings['templatefile'] + text = read_utf8_text(template_file) + + for m in re.finditer(r'<<(.*?)>>', text, flags=re.MULTILINE): + source = m.group(0) + key = m.group(1) + command, arguments, optional = parse_template_tag(key) + if optional and not with_answers: + target = '' + else: + for arg in arguments: + if not arg in notebook_settings: + raise RuntimeError('Error: the following tag was not specified: {}'.format(arg)) + arguments = [notebook_settings[arg] for arg in arguments] + target = apply_command(command, arguments) + + text = text.replace(source, unquote(json.dumps(target))) + write_utf8_text(outputfile, text) + + +def extract_template_keys(notebook_file) -> List[str]: + result = set() + text = read_utf8_text(notebook_file) + for key in re.findall(r'<<.*?>>', text, flags=re.DOTALL): + key = key[2:-2] + command, arguments, optional = parse_template_tag(key) + for arg in arguments: + result.add(arg) + return list(result) + + +def extract_key_value_pairs(text: str, prefix=r'\s*') -> Dict[str, str]: + result = {} + for m in re.finditer(prefix + r'(\w+?)\s*=(.*)$', text, flags=re.MULTILINE): + key = m.group(1) + value = m.group(2).strip() + result[key] = value + return result + + +def parse_paragraph(paragraph: str) -> Dict[str, str]: + paragraph_tags = extract_key_value_pairs(paragraph) + notebook_settings = default_notebook_settings.copy() + + # if the tag 'inputfile' exists, extract the key/value pairs from it + if 'inputfile' in paragraph_tags: + input_file = paragraph_tags['inputfile'] + input_tags = extract_key_value_pairs(read_utf8_text(input_file), prefix=r'%%\s*') + notebook_settings.update(input_tags) + + # tags in the paragraph have priority over tags in the answer file + notebook_settings.update(paragraph_tags) + + # apply @key@ substitutions + sigma = dict() + for key, value in notebook_settings.items(): + for m in re.finditer(r'(@\w+?@)', value): + source = m.group(1) + if source[1:-1] not in notebook_settings: + raise ('Error: cannot find a replacement for @{}@'.format(source)) + target = notebook_settings[source[1:-1]] + notebook_settings[key] = notebook_settings[key].replace(source, target) + + return notebook_settings + + +def generate_latex(outputfile: str, questions: List[str]): + questions = ['\\item ' + question for question in questions] + text = '''\\section*{{Exercise set: }} + +\\begin{{enumerate}} +{} +\\end{{enumerate}}'''.format('\n\n'.join(questions)) + print('Creating {}'.format(outputfile)) + write_utf8_text(outputfile, text) + + +def main(): + cmdline_parser = argparse.ArgumentParser(formatter_class=SmartFormatter) + cmdline_parser.add_argument('inputfile', metavar='FILE', type=str, + help='R|The input file. It should contain paragraphs like this:\n' + ' key1 = value1\n' + ' key2 = value2\n' + '\n' + 'The following key/value pairs are supported:\n' + ' accepted: a list of accepted words\n' + ' inputfile: may contain additional entries "%%%% key = value"\n' + ' language: a description of the language in LaTeX format\n' + ' generate_words: the maximum length of generated words\n' + ' name: the name of the output file\n' + ' rejected: a list of rejected words\n' + ' templatefile: the file that is used to generate the notebook"\n' + ) + cmdline_parser.add_argument('-w', '--working-directory', metavar='DIR', type=str, action = 'store', + help='the working directory. If specified, files are relative to this directory') + cmdline_parser.add_argument('-o', '--output-directory', metavar='DIR', type=str, action = 'store', help='the directory where the generated output is stored') + cmdline_parser.add_argument('--with-answers', help="insert the answer in the notebook", action="store_true") + cmdline_parser.add_argument('--latex', help="generate LaTeX output containing a list of the questions", action="store_true") + args = cmdline_parser.parse_args() + + output_directory = args.output_directory or 'output' + if not os.path.isabs(output_directory): + output_directory = os.path.join(os.getcwd(), output_directory) + if not os.path.exists(output_directory): + print('Creating output directory {}'.format(output_directory)) + os.makedirs(output_directory) + + if args.working_directory: + os.chdir(args.working_directory) + + questions = [] + + for i, paragraph in enumerate(read_paragraphs(args.inputfile)): + try: + notebook_settings = parse_paragraph(paragraph) + questions.append(notebook_settings.get('question', 'question {}'.format(i))) + + # determine the output file + name = notebook_settings.get('name', None) + if not name: + input_file = notebook_settings.get('inputfile', None) + name = remove_extension(os.path.basename(input_file)) if input_file else 'exercise{}'.format(i) + outputfile = os.path.join(output_directory, '{}.ipynb'.format(name)) + + print('Creating {}'.format(outputfile)) + make_notebook(outputfile, notebook_settings, args.with_answers) + except Exception as e: + print('Error: {}'.format(e)) + + if args.latex: + outputfile = remove_extension(args.inputfile) + '.tex' + generate_latex(outputfile, questions) + + +if __name__ == '__main__': + main() diff --git a/notebooks/notebooks.batch b/notebooks/notebooks.batch new file mode 100644 index 0000000..6392288 --- /dev/null +++ b/notebooks/notebooks.batch @@ -0,0 +1,88 @@ +templatefile = templates/cfg-for-language.ipynb +inputfile = ../examples/cfg1.cfg +name = cfg-for-language + +% This is a comment +templatefile = templates/dfa-for-language.ipynb +inputfile = ../examples/dfa1.dfa +length = 7 +name = dfa-for-language + +% This is another comment + +templatefile = templates/nfa-for-language.ipynb +inputfile = ../examples/nfa1.nfa +length = 7 +states = 8 +name = nfa-for-language + +templatefile = templates/pda-for-language.ipynb +inputfile = ../examples/pda2.pda +name = pda-for-language + +templatefile = templates/tm-for-language.ipynb +inputfile = ../examples/tm1.tm +name = tm-for-language + +templatefile = templates/regexp-for-language.ipynb +inputfile = ../examples/regexp1.regexp +name = regexp-for-language + +templatefile = templates/nfa-to-dfa.ipynb +inputfile = ../examples/nfa2.nfa +name = nfa-to-dfa + +templatefile = templates/dfa-to-regexp.ipynb +inputfile = ../examples/dfa2.dfa +name = dfa-to-regexp + +% N.B. length=8 is too much for this grammar +templatefile = templates/cfg-to-chomsky.ipynb +inputfile = ../examples/cfg2.cfg +start_variable = T +length=5 +name = cfg-to-chomsky + +templatefile = templates/cfg-cyk-algorithm.ipynb +inputfile = ../examples/chomsky1.cfg +word = aab +name = cfg-cyk-algorithm + +templatefile = templates/cfg-leftmost-derivation.ipynb +inputfile = ../examples/chomsky1.cfg +word = aab +name = cfg-leftmost-derivation + +templatefile = templates/cfg-rightmost-derivation.ipynb +inputfile = ../examples/chomsky1.cfg +word = aabb +name = cfg-rightmost-derivation + +templatefile = templates/cfg-derivation.ipynb +inputfile = ../examples/chomsky1.cfg +word = aab +name = cfg-derivation + +templatefile = templates/dfa-union.ipynb +inputfile1 = ../examples/union1.dfa +inputfile2 = ../examples/union2.dfa +name = dfa-union + +templatefile = templates/dfa-intersection.ipynb +inputfile1 = ../examples/intersection1.dfa +inputfile2 = ../examples/intersection2.dfa +name = dfa-intersection + +templatefile = templates/dfa-symmetric_difference.ipynb +inputfile1 = ../examples/symmetric_difference1.dfa +inputfile2 = ../examples/symmetric_difference2.dfa +name = dfa-symmetric_difference + +templatefile = templates/dfa-complement.ipynb +inputfile = ../examples/complement.dfa +name = dfa-complement + +templatefile = templates/dfa-reverse.ipynb +inputfile = ../examples/reverse.dfa +name = dfa-reverse + diff --git a/notebooks/templates/cfg-cyk-algorithm.ipynb b/notebooks/templates/cfg-cyk-algorithm.ipynb new file mode 100644 index 0000000..40f8e96 --- /dev/null +++ b/notebooks/templates/cfg-cyk-algorithm.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following context free grammar $G = (V, \\Sigma, R, S)$ in Chomsky normal form. We use the convention that variables in $V$ are in uppercase and symbols in $\\Sigma$ are in lowercase. The start symbol is the left hand side of the first production." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Apply the CYK algorithm to the word $<>$, in order to determine if this word is in the language of $G$.\n", + "Draw the triangular table $X$, that is defined using\n", + "$X_{ij} = \\{ A \\in V \\mid A \\Rightarrow^*_G w_i w_{i+1} \\ldots w_j \\}$, where $n = |w|$. Use the following layout:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$X = \\begin{bmatrix} \n", + " X_{1n} & ~ & ~ \\\\\n", + " \\vdots & \\ddots & \\\\\n", + " X_{11} & \\dots & X_{nn} \n", + " \\end{bmatrix}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hint: start the computation with the bottom row. Then continue by using the observation that if $B \\in X_{ij}$ and $C \\in X_{jk}$ and $A \\rightarrow BC$, then $A \\in X_{ik}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If $X_{ij}$ contains variables $A$, $B$ and $C$, then write the matrix element as `{A,B,C}`, without spaces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cyk_matrix(cfg, '<>', X)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/cfg-derivation.ipynb b/notebooks/templates/cfg-derivation.ipynb new file mode 100644 index 0000000..a350bc4 --- /dev/null +++ b/notebooks/templates/cfg-derivation.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a derivation of the word $<>$. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = '<>'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, '<>', 'any')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/cfg-for-language.ipynb b/notebooks/templates/cfg-for-language.ipynb new file mode 100644 index 0000000..981590e --- /dev/null +++ b/notebooks/templates/cfg-for-language.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda cfg: check_cfg_accepts_rejects(cfg, '<>', '<>')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/cfg-leftmost-derivation.ipynb b/notebooks/templates/cfg-leftmost-derivation.ipynb new file mode 100644 index 0000000..433322d --- /dev/null +++ b/notebooks/templates/cfg-leftmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a leftmost derivation of the word $<>$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = '<>'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, '<>')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/cfg-rightmost-derivation.ipynb b/notebooks/templates/cfg-rightmost-derivation.ipynb new file mode 100644 index 0000000..c936e08 --- /dev/null +++ b/notebooks/templates/cfg-rightmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a rightmost derivation of the word $<>$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = '<>'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, '<>', 'rightmost')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/cfg-to-chomsky.ipynb b/notebooks/templates/cfg-to-chomsky.ipynb new file mode 100644 index 0000000..d1a23c0 --- /dev/null +++ b/notebooks/templates/cfg-to-chomsky.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_chomsky import *\n", + "check_answer = lambda cfg, cfg1, phase: cfg_check_chomsky(cfg, cfg1, phase, '<>', <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below. We will convert it into Chomsky normal form in a number of steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the convention that variables are in uppercase and symbols in lowercase. The start symbol is the left hand side of the first production. Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "In the first step, introduce a new start variable named `<>`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg1 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg, cfg1, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the second step, eliminate all epsilon productions, i.e. productions of the shape `A -> ε`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg2 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg2, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the third step, eliminate all unit productions, i.e. rules of he shape `A -> B`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg3 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fourth step, eliminate productions with a right hand side of length greater than two." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg4 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg4, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fifth and last step, replace terminals by variables to make sure that each production is of the shape `A -> a` or `A -> BC`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg5 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg5, 5)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-complement.ipynb b/notebooks/templates/dfa-complement.ipynb new file mode 100644 index 0000000..124d151 --- /dev/null +++ b/notebooks/templates/dfa-complement.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a DFA that accepts the complement of dfa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "complement = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(complement)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_complement(dfa, complement)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-for-language.ipynb b/notebooks/templates/dfa-for-language.ipynb new file mode 100644 index 0000000..8a2d1ca --- /dev/null +++ b/notebooks/templates/dfa-for-language.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda dfa: check_dfa_language_from_words(dfa, '<>', <>, <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the DFA above is not OK, inspect its execution for a selected word, e.g. $<>$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "simulate_dfa(dfa,'<>')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-intersection.ipynb b/notebooks/templates/dfa-intersection.ipynb new file mode 100644 index 0000000..5d1bc2b --- /dev/null +++ b/notebooks/templates/dfa-intersection.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the intersection of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_intersection(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-reverse.ipynb b/notebooks/templates/dfa-reverse.ipynb new file mode 100644 index 0000000..e937297 --- /dev/null +++ b/notebooks/templates/dfa-reverse.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *\n", + "check_answer = lambda dfa, nfa: check_dfa_reverse(dfa, nfa, <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give an NFA that accepts the reverse of the language accepted by this DFA. Hint: reverse the arrows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-symmetric_difference.ipynb b/notebooks/templates/dfa-symmetric_difference.ipynb new file mode 100644 index 0000000..059254e --- /dev/null +++ b/notebooks/templates/dfa-symmetric_difference.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the symmetric difference of dfa1 and dfa2. Use a notation like `(q0,q1)` (without spaces) to denote a product state." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_symmetric_difference(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-to-regexp.ipynb b/notebooks/templates/dfa-to-regexp.ipynb new file mode 100644 index 0000000..6eedd21 --- /dev/null +++ b/notebooks/templates/dfa-to-regexp.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import show, check_dfa2regexp as check_answer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following DFA over the alphabet $<>$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Apply the procedure using GNFAs to convert the DFA into an equivalent regular expression." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify whether the regular expression and DFA are indeed equivalent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/dfa-union.ipynb b/notebooks/templates/dfa-union.ipynb new file mode 100644 index 0000000..b66c018 --- /dev/null +++ b/notebooks/templates/dfa-union.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the union of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_union(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/nfa-for-language.ipynb b/notebooks/templates/nfa-for-language.ipynb new file mode 100644 index 0000000..49670b3 --- /dev/null +++ b/notebooks/templates/nfa-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda nfa: check_nfa_language_from_words(nfa, '<>', <>, <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/nfa-to-dfa.ipynb b/notebooks/templates/nfa-to-dfa.ipynb new file mode 100644 index 0000000..9ff525e --- /dev/null +++ b/notebooks/templates/nfa-to-dfa.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_nfa2dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the NFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_nfa2dfa(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_nfa2dfa(nfa, dfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/pda-for-language.ipynb b/notebooks/templates/pda-for-language.ipynb new file mode 100644 index 0000000..79fbf47 --- /dev/null +++ b/notebooks/templates/pda-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda pda: check_pda_language_from_words(pda, '<>', <>, <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pda = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(pda)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(pda)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/regexp-for-language.ipynb b/notebooks/templates/regexp-for-language.ipynb new file mode 100644 index 0000000..2db72b5 --- /dev/null +++ b/notebooks/templates/regexp-for-language.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda regexp: check_regexp_language_from_words(regexp, '<>', <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/templates/tm-for-language.ipynb b/notebooks/templates/tm-for-language.ipynb new file mode 100644 index 0000000..3931ecb --- /dev/null +++ b/notebooks/templates/tm-for-language.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda tm: check_tm_language_from_words(tm, '<>', <>, <>)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `□` or `_` to denote the blank symbol, but not both. A different symbol like `#` can be chosen by adding a line `blank #`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tm = '''\n", + "<>\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(tm)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(tm)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can simulate the run of the tm above on an example string <your_string> by running the command \"simulate_tm(tm,'<your_string>')\" in the cell below." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-cyk-algorithm.ipynb b/notebooks/with-answers/cfg-cyk-algorithm.ipynb new file mode 100644 index 0000000..7ddd35c --- /dev/null +++ b/notebooks/with-answers/cfg-cyk-algorithm.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following context free grammar $G = (V, \\Sigma, R, S)$ in Chomsky normal form. We use the convention that variables in $V$ are in uppercase and symbols in $\\Sigma$ are in lowercase. The start symbol is the left hand side of the first production." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Apply the CYK algorithm to the word $aab$, in order to determine if this word is in the language of $G$.\n", + "Draw the triangular table $X$, that is defined using\n", + "$X_{ij} = \\{ A \\in V \\mid A \\Rightarrow^*_G w_i w_{i+1} \\ldots w_j \\}$, where $n = |w|$. Use the following layout:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$X = \\begin{bmatrix} \n", + " X_{1n} & ~ & ~ \\\\\n", + " \\vdots & \\ddots & \\\\\n", + " X_{11} & \\dots & X_{nn} \n", + " \\end{bmatrix}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hint: start the computation with the bottom row. Then continue by using the observation that if $B \\in X_{ij}$ and $C \\in X_{jk}$ and $A \\rightarrow BC$, then $A \\in X_{ik}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If $X_{ij}$ contains variables $A$, $B$ and $C$, then write the matrix element as `{A,B,C}`, without spaces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X = '''\n", + "{A,C,S,T}\n{A,C,S,T} {A,C,S,T}\n{A,D,S,T} {A,D,S,T} {A,B} \n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cyk_matrix(cfg, 'aab', X)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-derivation.ipynb b/notebooks/with-answers/cfg-derivation.ipynb new file mode 100644 index 0000000..a0fee54 --- /dev/null +++ b/notebooks/with-answers/cfg-derivation.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a derivation of the word $aab$. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = 'T => AC => aC => aSA => aaA => aab'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aab', 'any')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-for-language.ipynb b/notebooks/with-answers/cfg-for-language.ipynb new file mode 100644 index 0000000..c18fdfd --- /dev/null +++ b/notebooks/with-answers/cfg-for-language.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda cfg: check_cfg_accepts_rejects(cfg, '_ aaa bb c aabb bc aabc aabbbcc aaaccc', 'bcc aab aabbbc ccaaabb bbccaa abab cb aaacccc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a CFG that generates the language $\\lbrace \\, a^{\\mkern1mu n} \\mkern1mu b^{\\mkern1mu m} c^{\\mkern1mu \\ell} \\mid n = m \\lor m = \\ell \\lor n = \\ell \\, \\rbrace$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "S -> XC | AY | Z\nX -> aXb | \u03b5\nY -> bYc | \u03b5\nZ -> aZc | B\nA -> aA | \u03b5\nB -> bB | \u03b5\nC -> cC | \u03b5\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-leftmost-derivation.ipynb b/notebooks/with-answers/cfg-leftmost-derivation.ipynb new file mode 100644 index 0000000..2dc6106 --- /dev/null +++ b/notebooks/with-answers/cfg-leftmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a leftmost derivation of the word $aab$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = 'T => AC => aC => aSA => aaA => aab'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aab')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-rightmost-derivation.ipynb b/notebooks/with-answers/cfg-rightmost-derivation.ipynb new file mode 100644 index 0000000..7e65556 --- /dev/null +++ b/notebooks/with-answers/cfg-rightmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a rightmost derivation of the word $aabb$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = 'T => AC => ASA => ASb => ASAb => ASbb => Aabb => aabb'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aabb', 'rightmost')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/cfg-to-chomsky.ipynb b/notebooks/with-answers/cfg-to-chomsky.ipynb new file mode 100644 index 0000000..277429f --- /dev/null +++ b/notebooks/with-answers/cfg-to-chomsky.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_chomsky import *\n", + "check_answer = lambda cfg, cfg1, phase: cfg_check_chomsky(cfg, cfg1, phase, 'T', 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below. We will convert it into Chomsky normal form in a number of steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "S -> ASA | aB\nA -> B | S\nB -> b | \u03b5\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the convention that variables are in uppercase and symbols in lowercase. The start symbol is the left hand side of the first production. Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "In the first step, introduce a new start variable named `T`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg1 = '''\n", + "T -> S\nS -> ASA | aB\nA -> B | S\nB -> b | \u03b5\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg, cfg1, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the second step, eliminate all epsilon productions, i.e. productions of the shape `A -> ε`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg2 = '''\n", + "T -> S\nS -> ASA | AS | SA | S | aB | a\nA -> B | S\nB -> b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg2, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the third step, eliminate all unit productions, i.e. rules of he shape `A -> B`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg3 = '''\n", + "T -> ASA | AS | SA | aB | a\nS -> AS | SA | aB | a | ASA\nB -> b\nA -> ASA | AS | SA | aB | a | b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fourth step, eliminate productions with a right hand side of length greater than two." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg4 = '''\n", + "T -> AC | AS | SA | aB | a\nS -> AS | SA | aB | a | AC\nB -> b\nA -> AC | AS | SA | aB | a | b\nC -> SA\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg4, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fifth and last step, replace terminals by variables to make sure that each production is of the shape `A -> a` or `A -> BC`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg5 = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg5, 5)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-complement.ipynb b/notebooks/with-answers/dfa-complement.ipynb new file mode 100644 index 0000000..c377703 --- /dev/null +++ b/notebooks/with-answers/dfa-complement.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "input_symbols a b\nstates q0 q1 q2\ninitial q0\nfinal q2\nq0 q0 b\nq0 q1 a\nq1 q1 b\nq1 q2 a\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a DFA that accepts the complement of dfa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "complement = '''\n", + "states q0 q1 q2\nfinal q0 q1\ninitial q0\ninput_symbols a b\nq0 q0 b\nq0 q1 a\nq1 q1 b\nq1 q2 a\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(complement)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_complement(dfa, complement)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-for-language.ipynb b/notebooks/with-answers/dfa-for-language.ipynb new file mode 100644 index 0000000..988ff84 --- /dev/null +++ b/notebooks/with-answers/dfa-for-language.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda dfa: check_dfa_language_from_words(dfa, '0000001 0101111 001101 0001011 0101001 0001111 00111 01001 0001101 010101 011 011101 00011 0111001 0011 011111 010111 01 0111 0011111 0101101 0111111 0010101 0000011 0110011 0100011 001011 000001 0001 01101 0110001 0111101 01011 0000111 0010011 0110101 0101 0100001 0001001 0100111 0110111 0011101 0010001 0011011 000101 001 001001 0111011 011011 0011001 00001 000011 011001 0101011 000111 0100101 010011 00101 0010111 001111 0000101 01111 010001', 7, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a DFA that generates the language $\\{ w \\in {0,1}^\\ast \\mid w \\text{ starts with } 0 \\text{ and ends with } 1 \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "input_symbols 0 1\nstates qA qB qC qD\ninitial qA\nfinal qC\nqA qB 0\nqA qD 1\nqB qB 0\nqB qC 1\nqC qB 0\nqC qC 1\nqD qD 0\nqD qD 1\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the DFA above is not OK, inspect its execution for a selected word, e.g. $0101$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "simulate_dfa(dfa,'0101')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-intersection.ipynb b/notebooks/with-answers/dfa-intersection.ipynb new file mode 100644 index 0000000..a86e48f --- /dev/null +++ b/notebooks/with-answers/dfa-intersection.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1\ninitial q0\nfinal q0\nq0 q0 b\nq0 q1 a\nq1 q0 a\nq1 q1 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2\ninitial q0\nfinal q2\nq0 q0 a\nq0 q1 b\nq1 q1 a\nq1 q2 b\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the intersection of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "states (q0,q0) (q0,q1) (q0,q2) (q1,q0) (q1,q1) (q1,q2)\nfinal (q0,q2)\ninitial (q0,q0)\ninput_symbols a b\n(q0,q0) (q0,q1) b\n(q0,q0) (q1,q0) a\n(q0,q1) (q0,q2) b\n(q0,q1) (q1,q1) a\n(q0,q2) (q0,q2) b\n(q0,q2) (q1,q2) a\n(q1,q0) (q0,q0) a\n(q1,q0) (q1,q1) b\n(q1,q1) (q0,q1) a\n(q1,q1) (q1,q2) b\n(q1,q2) (q0,q2) a\n(q1,q2) (q1,q2) b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_intersection(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-reverse.ipynb b/notebooks/with-answers/dfa-reverse.ipynb new file mode 100644 index 0000000..7d2dbf0 --- /dev/null +++ b/notebooks/with-answers/dfa-reverse.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *\n", + "check_answer = lambda dfa, nfa: check_dfa_reverse(dfa, nfa, 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3 q4\ninitial q0\nfinal q0 q2 q3 q4\nq0 q1 a\nq0 q3 b\nq1 q2 b\nq1 q3 a\nq2 q2 a b\nq3 q3 b\nq3 q4 a\nq4 q3 a\nq4 q4 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give an NFA that accepts the reverse of the language accepted by this DFA. Hint: reverse the arrows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "states q0 q1 q2 q3 q4 q5\nfinal q0\ninitial q5\ninput_symbols a b\nepsilon \u03b5\nq1 q0 a\nq2 q1 b\nq2 q2 b a\nq3 q0 b\nq3 q1 a\nq3 q3 b\nq3 q4 a\nq4 q3 a\nq4 q4 b\nq5 q0 \u03b5\nq5 q2 \u03b5\nq5 q3 \u03b5\nq5 q4 \u03b5\n\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-symmetric_difference.ipynb b/notebooks/with-answers/dfa-symmetric_difference.ipynb new file mode 100644 index 0000000..6f72bba --- /dev/null +++ b/notebooks/with-answers/dfa-symmetric_difference.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q0 b\nq0 q1 a\nq1 q1 a\nq1 q2 b\nq2 q0 b\nq2 q3 a\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q0 a\nq0 q1 b\nq1 q1 b\nq1 q2 a\nq2 q0 a\nq2 q3 b\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the symmetric difference of dfa1 and dfa2. Use a notation like `(q0,q1)` (without spaces) to denote a product state." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "states (q0,q0) (q0,q1) (q0,q2) (q0,q3) (q1,q0) (q1,q1) (q1,q2) (q1,q3) (q2,q0) (q2,q1) (q2,q2) (q2,q3) (q3,q0) (q3,q1) (q3,q2) (q3,q3)\nfinal (q0,q2) (q1,q2) (q2,q0) (q2,q1) (q2,q3) (q3,q2)\ninitial (q0,q0)\ninput_symbols a b\n(q0,q0) (q0,q1) b\n(q0,q0) (q1,q0) a\n(q0,q1) (q0,q1) b\n(q0,q1) (q1,q2) a\n(q0,q2) (q0,q3) b\n(q0,q2) (q1,q0) a\n(q0,q3) (q0,q3) b\n(q0,q3) (q1,q3) a\n(q1,q0) (q1,q0) a\n(q1,q0) (q2,q1) b\n(q1,q1) (q1,q2) a\n(q1,q1) (q2,q1) b\n(q1,q2) (q1,q0) a\n(q1,q2) (q2,q3) b\n(q1,q3) (q1,q3) a\n(q1,q3) (q2,q3) b\n(q2,q0) (q0,q1) b\n(q2,q0) (q3,q0) a\n(q2,q1) (q0,q1) b\n(q2,q1) (q3,q2) a\n(q2,q2) (q0,q3) b\n(q2,q2) (q3,q0) a\n(q2,q3) (q0,q3) b\n(q2,q3) (q3,q3) a\n(q3,q0) (q3,q0) a\n(q3,q0) (q3,q1) b\n(q3,q1) (q3,q1) b\n(q3,q1) (q3,q2) a\n(q3,q2) (q3,q0) a\n(q3,q2) (q3,q3) b\n(q3,q3) (q3,q3) a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_symmetric_difference(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-to-regexp.ipynb b/notebooks/with-answers/dfa-to-regexp.ipynb new file mode 100644 index 0000000..3d8dbf6 --- /dev/null +++ b/notebooks/with-answers/dfa-to-regexp.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import show, check_dfa2regexp as check_answer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following DFA over the alphabet $\\{a,b\\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "initial q0\nfinal q1\nq0 q1 a\nq1 q1 a b\nq0 q2 b\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Apply the procedure using GNFAs to convert the DFA into an equivalent regular expression." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "a(a+b)*\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify whether the regular expression and DFA are indeed equivalent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/dfa-union.ipynb b/notebooks/with-answers/dfa-union.ipynb new file mode 100644 index 0000000..434192b --- /dev/null +++ b/notebooks/with-answers/dfa-union.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q1 a\nq0 q3 b\nq1 q1 a\nq1 q2 b\nq2 q1 a\nq2 q2 b\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3 q4\ninitial q0\nfinal q4\nq0 q0 b\nq0 q1 a\nq1 q1 a\nq1 q2 b\nq2 q1 a\nq2 q3 b\nq3 q4 a\nq3 q0 b\nq4 q4 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the union of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "states (q0,q0) (q0,q1) (q0,q2) (q0,q3) (q0,q4) (q1,q0) (q1,q1) (q1,q2) (q1,q3) (q1,q4) (q2,q0) (q2,q1) (q2,q2) (q2,q3) (q2,q4) (q3,q0) (q3,q1) (q3,q2) (q3,q3) (q3,q4)\nfinal (q0,q4) (q1,q4) (q2,q0) (q2,q1) (q2,q2) (q2,q3) (q2,q4) (q3,q4)\ninitial (q0,q0)\ninput_symbols a b\n(q0,q0) (q1,q1) a\n(q0,q0) (q3,q0) b\n(q0,q1) (q1,q1) a\n(q0,q1) (q3,q2) b\n(q0,q2) (q1,q1) a\n(q0,q2) (q3,q3) b\n(q0,q3) (q1,q4) a\n(q0,q3) (q3,q0) b\n(q0,q4) (q1,q4) a\n(q0,q4) (q3,q4) b\n(q1,q0) (q1,q1) a\n(q1,q0) (q2,q0) b\n(q1,q1) (q1,q1) a\n(q1,q1) (q2,q2) b\n(q1,q2) (q1,q1) a\n(q1,q2) (q2,q3) b\n(q1,q3) (q1,q4) a\n(q1,q3) (q2,q0) b\n(q1,q4) (q1,q4) a\n(q1,q4) (q2,q4) b\n(q2,q0) (q1,q1) a\n(q2,q0) (q2,q0) b\n(q2,q1) (q1,q1) a\n(q2,q1) (q2,q2) b\n(q2,q2) (q1,q1) a\n(q2,q2) (q2,q3) b\n(q2,q3) (q1,q4) a\n(q2,q3) (q2,q0) b\n(q2,q4) (q1,q4) a\n(q2,q4) (q2,q4) b\n(q3,q0) (q3,q0) b\n(q3,q0) (q3,q1) a\n(q3,q1) (q3,q1) a\n(q3,q1) (q3,q2) b\n(q3,q2) (q3,q1) a\n(q3,q2) (q3,q3) b\n(q3,q3) (q3,q0) b\n(q3,q3) (q3,q4) a\n(q3,q4) (q3,q4) a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_union(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/nfa-for-language.ipynb b/notebooks/with-answers/nfa-for-language.ipynb new file mode 100644 index 0000000..73ef7f3 --- /dev/null +++ b/notebooks/with-answers/nfa-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda nfa: check_nfa_language_from_words(nfa, '\u03b5 001010 100 000 0100010 0000001 010100 0000000 1000001 010000 100100 0011000 1000000 01000 1000010 000100 00 0010000 0001000 0100 0010 00000 100001 0100000 000010 010010 0001 000001 0101000 0100100 0010010 1001000 0001001 0100001 10000 0000100 0010001 100010 00100 001 001001 0010100 00010 010 00001 0000010 1000100 0000 001100 000000 0001100 1000 0001010 100000 001000 010001', 7, 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give an NFA that accepts the language $\\{ w \\in \\{0,1\\}^* \\mid \\#_0(w) \\geq 2, \\#_1(w) \\leq 1 \\}^*$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "initial s6\nfinal s2 s5 s6\ns0 s1 0\ns0 s3 1\ns1 s2 0\ns1 s4 1\ns2 s0 \u03b5\ns2 s2 0\ns2 s5 1\ns3 s4 0\ns4 s5 0\ns5 s0 \u03b5\ns5 s5 0\ns6 s0 \u03b5\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/nfa-to-dfa.ipynb b/notebooks/with-answers/nfa-to-dfa.ipynb new file mode 100644 index 0000000..199e790 --- /dev/null +++ b/notebooks/with-answers/nfa-to-dfa.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_nfa2dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the NFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "input_symbols a b\ninitial q0\nfinal q2\nq0 q0 a b\nq0 q1 \u03b5\nq1 q1 a\nq1 q2 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the DFA obtained from the given NFA using the NFA to DFA procedure. Use set notation like `{q0,q1}` (without spaces) for the states in the DFA." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "states {q0,q1,q2} {q0,q1}\nfinal {q0,q1,q2}\ninitial {q0,q1}\ninput_symbols a b\n{q0,q1,q2} {q0,q1,q2} b\n{q0,q1,q2} {q0,q1} a\n{q0,q1} {q0,q1,q2} b\n{q0,q1} {q0,q1} a\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_nfa2dfa(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_nfa2dfa(nfa, dfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/pda-for-language.ipynb b/notebooks/with-answers/pda-for-language.ipynb new file mode 100644 index 0000000..3c9fc87 --- /dev/null +++ b/notebooks/with-answers/pda-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda pda: check_pda_language_from_words(pda, '\u03b5 baaaab aba aabaab aabbaa aab aaaabb abaaab bbaaaa baa abbaaa baaaba abaaba ababaa aaabab babaaa aaabba aababa baabaa', 8, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a PDA that generates the language $\\{ w \\in \\{a,b\\}^\\ast \\mid \\#_a(w) = 2\\#_b(w) \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pda = '''\n", + "epsilon \u03b5\ninitial q0\nfinal q6\nq0 q1 \u03b5,\u03b5$\nq1 q2 \u03b5,$$\nq1 q3 \u03b5,$$\nq1 q6 \u03b5,$\u03b5\nq2 q1 \u03b5,$$\nq2 q2 a,n\u03b5\nq2 q5 b,\u03b5n\nq3 q1 \u03b5,$$\nq3 q3 a,\u03b5p\nq3 q4 b,p\u03b5\nq4 q3 \u03b5,p\u03b5\nq4 q5 \u03b5,$$\nq5 q2 \u03b5,\u03b5n\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(pda)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(pda)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/regexp-for-language.ipynb b/notebooks/with-answers/regexp-for-language.ipynb new file mode 100644 index 0000000..d0a48b0 --- /dev/null +++ b/notebooks/with-answers/regexp-for-language.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda regexp: check_regexp_language_from_words(regexp, 'abaaabab bbabbb baaaaabb baaaabbb ababaaba abaab baaaabab bbaaaba abaabaaa aaabab baaaabba bbabbaab bbaabaa baaaab bbabab ababbb abaabbb abaaabaa ababbbbb bbaaabab baaabbab bbababaa baabb bbaaaaa aaababab aaaabbb abaababa abaabab aaaaaabb ababbba aaabaaab bbaaabbb bbaabab aaabaaaa baabaaa bbaababa aaababa aaabaaa abaababb aaabaaba ababb bbababbb aaabbbb abaaabb aaaaaaaa aaaaabba baabbbb baabba baabaa aaabb aaaabbbb bbabbaa bbabaaab aaaaaaba ababbbba bbaaaabb ababaaab abaaabbb baabbbaa bbaabbba baaaaaba abaabbbb baaababa aaabbb aaaaabab bbaaaa aaabbaa bbaabbb abaabba baaaaaaa ababbaa bbaa bba bbabbbaa baaabb baabaaab baababba baaaaba abababb ababbaab baaaaaa aaaaaaab aaaaaa baaabbaa baaabbbb baabbabb baaaaab bbaaa ababbbab abababa abababba ababba baaaa baabbbab aaaabba baabbaa abaaaaaa baaaabaa aaabba abaabbab bbaabbbb abaaaa aaaabaa bbabaaa baabbbbb bbabaab bbababb abaaba baaba abababbb aaaaabaa ababaa bbabaabb abab ababaaa bbaabbaa aaabbbab aaabbaba aaababaa bbabba aaabbaaa abaaab abaaaab aaaabbab aaabbba baaababb bbabaaba bbaaaab aaaaab bbabbabb abaaa aaaabaab aaabaab aaabbbbb baababaa bbabaa aaabbaab baaabba bbaabb bbaaabaa bbabbaaa abaabbaa abaabbba baaaaaab aaaababb bbaaab ababaab abababab baaab aaaaaaa abaaaaba ababaaaa aaaaa aaaabaaa aaaa baa aaaab baabab baaabaab ababbab baabaabb aaaabbba baaaaa baababbb baabbaab baaabab aaaaabb bbabaaaa aaaaaab bbaabbab bbaaabba bbaaaaba aaa abababaa aaaabab bbaaba baababb baabbba aaabaa baaabaa bbabbab bbaabaaa baabbb aaababb baab baababab aaaaabbb baaaba ababab aaabbbba bbababa abaabb bbaaaaaa bbaaabb aaaababa bbabbbbb baabbaba bbab abaaaba bbababab baaabbba baaabaaa baabbbba baabaaba bbaba aaaabb bbabbbab abaabaa ababbbaa bbabbba abaaaaa aaaaaba baabaaaa baabaab baaaabb bbaababb ababbaba ababaabb abaaaaab bbababba aaabbab aaabbbaa ababbaaa bbaabaab abaa ababbabb ababbbb abaabaab baababa abaaaabb aba baabbaaa baaa bbabb aaaabbaa aaabaabb baabbab aaabbabb bbaab bbabbbb abaaabba aaababba bbabbaba baaabbb aaaaba bbaaaaab aaaba aaab bbabbbba bbaabba ababa aaababbb', 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Sipser 1.18/1.6d) Give a regular expression over the alphabet $\\{a,b\\}$ that generates the language $\\{ \\, w \\in \\{a,b\\}^\\ast \\mid |w| \\geqslant 3 \\land w[2] = a \\, \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "(a+b)(a+b)a(a+b)*\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/with-answers/tm-for-language.ipynb b/notebooks/with-answers/tm-for-language.ipynb new file mode 100644 index 0000000..442efa0 --- /dev/null +++ b/notebooks/with-answers/tm-for-language.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda tm: check_tm_language_from_words(tm, '10#10 011#011 010#010 01#01 # 111#111 0#0 100#100 11#11 00#00 110#110 101#101 1#1 001#001 000#000', 8, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `□` or `_` to denote the blank symbol, but not both. A different symbol like `#` can be chosen by adding a line `blank #`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a Turing Machine that generates the language $\\{ w\\#w \\mid w \\in \\{0,1\\}^\\ast \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tm = '''\n", + "initial q1\naccept q_accept\ninput_symbols 0 1 #\ntape_symbols 0 1 # x \u25a1\nq1 q2 0x,R\nq1 q3 1x,R\nq1 q8 ##,R\nq2 q2 00,R 11,R\nq2 q4 ##,R\nq3 q3 00,R 11,R\nq3 q5 ##,R\nq4 q4 xx,R\nq4 q6 0x,L\nq5 q5 xx,R\nq5 q6 1x,L\nq6 q6 00,L 11,L xx,L\nq6 q7 ##,L\nq7 q7 00,L 11,L\nq7 q1 xx,R\nq8 q8 xx,R\nq8 q_accept \u25a1\u25a1,R\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(tm)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(tm)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can simulate the run of the tm above on an example string <your_string> by running the command \"simulate_tm(tm,'<your_string>')\" in the cell below." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-cyk-algorithm.ipynb b/notebooks/without-answers/cfg-cyk-algorithm.ipynb new file mode 100644 index 0000000..1849178 --- /dev/null +++ b/notebooks/without-answers/cfg-cyk-algorithm.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following context free grammar $G = (V, \\Sigma, R, S)$ in Chomsky normal form. We use the convention that variables in $V$ are in uppercase and symbols in $\\Sigma$ are in lowercase. The start symbol is the left hand side of the first production." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Apply the CYK algorithm to the word $aab$, in order to determine if this word is in the language of $G$.\n", + "Draw the triangular table $X$, that is defined using\n", + "$X_{ij} = \\{ A \\in V \\mid A \\Rightarrow^*_G w_i w_{i+1} \\ldots w_j \\}$, where $n = |w|$. Use the following layout:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$X = \\begin{bmatrix} \n", + " X_{1n} & ~ & ~ \\\\\n", + " \\vdots & \\ddots & \\\\\n", + " X_{11} & \\dots & X_{nn} \n", + " \\end{bmatrix}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hint: start the computation with the bottom row. Then continue by using the observation that if $B \\in X_{ij}$ and $C \\in X_{jk}$ and $A \\rightarrow BC$, then $A \\in X_{ik}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If $X_{ij}$ contains variables $A$, $B$ and $C$, then write the matrix element as `{A,B,C}`, without spaces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cyk_matrix(cfg, 'aab', X)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-derivation.ipynb b/notebooks/without-answers/cfg-derivation.ipynb new file mode 100644 index 0000000..4720ac6 --- /dev/null +++ b/notebooks/without-answers/cfg-derivation.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a derivation of the word $aab$. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = ''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aab', 'any')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-for-language.ipynb b/notebooks/without-answers/cfg-for-language.ipynb new file mode 100644 index 0000000..28849bd --- /dev/null +++ b/notebooks/without-answers/cfg-for-language.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda cfg: check_cfg_accepts_rejects(cfg, '_ aaa bb c aabb bc aabc aabbbcc aaaccc', 'bcc aab aabbbc ccaaabb bbccaa abab cb aaacccc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a CFG that generates the language $\\lbrace \\, a^{\\mkern1mu n} \\mkern1mu b^{\\mkern1mu m} c^{\\mkern1mu \\ell} \\mid n = m \\lor m = \\ell \\lor n = \\ell \\, \\rbrace$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-leftmost-derivation.ipynb b/notebooks/without-answers/cfg-leftmost-derivation.ipynb new file mode 100644 index 0000000..ce763d6 --- /dev/null +++ b/notebooks/without-answers/cfg-leftmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a leftmost derivation of the word $aab$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = ''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aab')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-rightmost-derivation.ipynb b/notebooks/without-answers/cfg-rightmost-derivation.ipynb new file mode 100644 index 0000000..3ea0523 --- /dev/null +++ b/notebooks/without-answers/cfg-rightmost-derivation.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_cfg import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "T -> AC | AS | SA | DB | a\nS -> AS | SA | DB | a | AC\nB -> b\nA -> AC | AS | SA | DB | a | b\nC -> SA\nD -> a\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "Give a rightmost derivation of the word $aabb$ for this grammar. Use this notation: `S => aTU => abU => abc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "derivation = ''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_cfg_derivation(cfg, derivation, 'aabb', 'rightmost')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/cfg-to-chomsky.ipynb b/notebooks/without-answers/cfg-to-chomsky.ipynb new file mode 100644 index 0000000..e3ed480 --- /dev/null +++ b/notebooks/without-answers/cfg-to-chomsky.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_chomsky import *\n", + "check_answer = lambda cfg, cfg1, phase: cfg_check_chomsky(cfg, cfg1, phase, 'T', 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the context free grammar below. We will convert it into Chomsky normal form in a number of steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = '''\n", + "S -> ASA | aB\nA -> B | S\nB -> b | \u03b5\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the convention that variables are in uppercase and symbols in lowercase. The start symbol is the left hand side of the first production. Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "In the first step, introduce a new start variable named `T`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg1 = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "check_answer(cfg, cfg1, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the second step, eliminate all epsilon productions, i.e. productions of the shape `A -> ε`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg2 = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg2, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the third step, eliminate all unit productions, i.e. rules of he shape `A -> B`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg3 = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fourth step, eliminate productions with a right hand side of length greater than two." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg4 = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg4, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the fifth and last step, replace terminals by variables to make sure that each production is of the shape `A -> a` or `A -> BC`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cfg5 = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(cfg, cfg5, 5)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-complement.ipynb b/notebooks/without-answers/dfa-complement.ipynb new file mode 100644 index 0000000..f6fcd4a --- /dev/null +++ b/notebooks/without-answers/dfa-complement.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "input_symbols a b\nstates q0 q1 q2\ninitial q0\nfinal q2\nq0 q0 b\nq0 q1 a\nq1 q1 b\nq1 q2 a\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a DFA that accepts the complement of dfa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "complement = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(complement)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_complement(dfa, complement)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-for-language.ipynb b/notebooks/without-answers/dfa-for-language.ipynb new file mode 100644 index 0000000..effcbb3 --- /dev/null +++ b/notebooks/without-answers/dfa-for-language.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda dfa: check_dfa_language_from_words(dfa, '011 001111 0111101 00011 0000001 01011 0001001 001 0101 0000101 0010111 0011111 011011 0111111 0011001 0010001 0101001 0100101 010101 0110011 0001011 0001 01111 00001 001011 0000011 0011101 0101101 0100001 0100111 0101011 0110111 00101 000001 001101 0101111 0001111 00111 010111 000011 010011 011101 0011011 000101 01001 001001 0110001 0011 011001 000111 0111 0000111 01101 0111001 0110101 0111011 0010011 0010101 010001 0001101 01 0100011 011111', 7, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a DFA that generates the language $\\{ w \\in {0,1}^\\ast \\mid w \\text{ starts with } 0 \\text{ and ends with } 1 \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the DFA above is not OK, inspect its execution for a selected word, e.g. $0101$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "simulate_dfa(dfa,'0101')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-intersection.ipynb b/notebooks/without-answers/dfa-intersection.ipynb new file mode 100644 index 0000000..98738d6 --- /dev/null +++ b/notebooks/without-answers/dfa-intersection.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1\ninitial q0\nfinal q0\nq0 q0 b\nq0 q1 a\nq1 q0 a\nq1 q1 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2\ninitial q0\nfinal q2\nq0 q0 a\nq0 q1 b\nq1 q1 a\nq1 q2 b\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the intersection of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_intersection(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-reverse.ipynb b/notebooks/without-answers/dfa-reverse.ipynb new file mode 100644 index 0000000..5383166 --- /dev/null +++ b/notebooks/without-answers/dfa-reverse.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *\n", + "check_answer = lambda dfa, nfa: check_dfa_reverse(dfa, nfa, 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the DFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3 q4\ninitial q0\nfinal q0 q2 q3 q4\nq0 q1 a\nq0 q3 b\nq1 q2 b\nq1 q3 a\nq2 q2 a b\nq3 q3 b\nq3 q4 a\nq4 q3 a\nq4 q4 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give an NFA that accepts the reverse of the language accepted by this DFA. Hint: reverse the arrows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-symmetric_difference.ipynb b/notebooks/without-answers/dfa-symmetric_difference.ipynb new file mode 100644 index 0000000..954972b --- /dev/null +++ b/notebooks/without-answers/dfa-symmetric_difference.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q0 b\nq0 q1 a\nq1 q1 a\nq1 q2 b\nq2 q0 b\nq2 q3 a\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q0 a\nq0 q1 b\nq1 q1 b\nq1 q2 a\nq2 q0 a\nq2 q3 b\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the symmetric difference of dfa1 and dfa2. Use a notation like `(q0,q1)` (without spaces) to denote a product state." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_symmetric_difference(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-to-regexp.ipynb b/notebooks/without-answers/dfa-to-regexp.ipynb new file mode 100644 index 0000000..749d706 --- /dev/null +++ b/notebooks/without-answers/dfa-to-regexp.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import show, check_dfa2regexp as check_answer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the following DFA over the alphabet $\\{a,b\\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "initial q0\nfinal q1\nq0 q1 a\nq1 q1 a b\nq0 q2 b\nq2 q2 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Apply the procedure using GNFAs to convert the DFA into an equivalent regular expression." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify whether the regular expression and DFA are indeed equivalent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(dfa, regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/dfa-union.ipynb b/notebooks/without-answers/dfa-union.ipynb new file mode 100644 index 0000000..b6f3490 --- /dev/null +++ b/notebooks/without-answers/dfa-union.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the two DFAs below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa1 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3\ninitial q0\nfinal q2\nq0 q1 a\nq0 q3 b\nq1 q1 a\nq1 q2 b\nq2 q1 a\nq2 q2 b\nq3 q3 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa2 = '''\n", + "input_symbols a b\nstates q0 q1 q2 q3 q4\ninitial q0\nfinal q4\nq0 q0 b\nq0 q1 a\nq1 q1 a\nq1 q2 b\nq2 q1 a\nq2 q3 b\nq3 q4 a\nq3 q0 b\nq4 q4 a b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(dfa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the product automaton that accepts the union of dfa1 and dfa2. Use the notation `(q0,s0)` for pairs of states." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_product(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_dfa_union(dfa, dfa1, dfa2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/nfa-for-language.ipynb b/notebooks/without-answers/nfa-for-language.ipynb new file mode 100644 index 0000000..0850af1 --- /dev/null +++ b/notebooks/without-answers/nfa-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda nfa: check_nfa_language_from_words(nfa, '\u03b5 1000001 0000001 100010 0001001 0010 0000000 001 1000 0000 1001000 0000010 001000 0010001 0100000 100001 0100100 010000 0001 0011000 00010 0100001 000001 010010 000 0100 000010 0000100 010100 000000 100100 0100010 10000 1000000 00100 00 0010100 0101000 0001000 1000100 0001100 100 001010 01000 100000 001100 0010010 1000010 0010000 010001 00000 000100 001001 0001010 010 00001', 7, 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give an NFA that accepts the language $\\{ w \\in \\{0,1\\}^* \\mid \\#_0(w) \\geq 2, \\#_1(w) \\leq 1 \\}^*$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(nfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/nfa-to-dfa.ipynb b/notebooks/without-answers/nfa-to-dfa.ipynb new file mode 100644 index 0000000..b9e1a66 --- /dev/null +++ b/notebooks/without-answers/nfa-to-dfa.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook_nfa2dfa import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the NFA below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nfa = '''\n", + "input_symbols a b\ninitial q0\nfinal q2\nq0 q0 a b\nq0 q1 \u03b5\nq1 q1 a\nq1 q2 b\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(nfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give the DFA obtained from the given NFA using the NFA to DFA procedure. Use set notation like `{q0,q1}` (without spaces) for the states in the DFA." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dfa = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_nfa2dfa(dfa)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_nfa2dfa(nfa, dfa)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/pda-for-language.ipynb b/notebooks/without-answers/pda-for-language.ipynb new file mode 100644 index 0000000..6b8340a --- /dev/null +++ b/notebooks/without-answers/pda-for-language.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda pda: check_pda_language_from_words(pda, '\u03b5 baa baaaab bbaaaa abaaab aabaab aaabba baabaa aabbaa ababaa baaaba aaabab aababa abaaba aaaabb abbaaa babaaa aab aba', 8, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `ε` or `_` to denote the empty string, but not both. A different symbol like `e` can be chosen by adding a line `epsilon e`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a PDA that generates the language $\\{ w \\in \\{a,b\\}^\\ast \\mid \\#_a(w) = 2\\#_b(w) \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pda = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(pda)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(pda)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/regexp-for-language.ipynb b/notebooks/without-answers/regexp-for-language.ipynb new file mode 100644 index 0000000..3a78732 --- /dev/null +++ b/notebooks/without-answers/regexp-for-language.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda regexp: check_regexp_language_from_words(regexp, 'baa bbaaaaa bbabbb bbababba aaabaa aaabaab ababaaaa baabaab bbaabab aaabbaab baababab baaa baabbbaa bbababbb abababba bbaaba abaaabba baabbb bbabb abaabab baaabaaa ababbaab baaaba aaaabb baaababb aaabbbab aaaaa bbabbaab ababaab aaababa baaaaaba aaabbbb aaabaaba ababbaa aaabba baabaa baabaaab bbaaabb bbaaaabb bbaaabba abaaa abaabaa abaabbb aaaaaab baaaa aaababb abaababa aaaaaba baabaaa baaaaba bbaababb abababaa bbabbbab baabbbab aaaababb bbabaaba baabbbbb aaabab aaab aaababbb aaabbbbb aaabb bbabaaa aaaaabaa baaabbb ababaaab aaaababa bbaabba abaabba bbaab baababba bbaaab abaaaaa bbaabaab aaaabbba ababaabb abaaab baabbaba baabaaaa aaabaaaa bbaaa bbaa baaabbbb bbabbbb bbaababa bbaabaaa abaaaaba aaaaaaab aaaaaabb bbaaabab ababb abaaabb bbaabbb baaababa bbabbbba abaaabaa baabbaab aaabbb bbaaabbb ababbab bbaabbab aaaabaaa bba aaaabbaa baaaaabb aaabbabb aaaaabba abababab baaab aaa abababa baaabaab bbabaab aaababaa aaabbaba baaaaaab aaaabab aaaaabbb baaabab abaabb ababaa baaaabaa aaabbaaa ababaaba aaababab ababbabb baaabaa ababbaaa baaabbab aaaaabb baabbaaa aaaabba baaabbaa ababaaa ababbbb abaaaab aaaaaaaa aaaaabab aaaaba baaaabba aaaabaab aaaaaaba aaabbbba ababbbaa bbaaaba baabba aaaba abaaabab baaabba baababb abaaaa bbababaa abaaba baabbabb abaabbbb baab baabbaa baabaaba abaaaba ababba abaaaabb aaabbbaa aaabbab baabbba bbabba abaa bbabaaaa baabb bbaaabaa baabbbb baaabb aaabaaa abababb aaaab bbabaabb baaaabb baaaaa abaaaaab aaaabbab bbaabb bbabbabb bbabbba ababbbab bbababab ababab aaabaaab bbaabaa bbaaaaab baaaaaa bbaba baababbb aaababba bbababb bbaaaaaa bbabbaba baababa abaaaaaa bbaabbbb abaaabbb baaaab bbabbab ababbb abaabaaa bbab bbaaaa baabbab abaababb abab baabab ababbbbb abababbb baaba abaabbba bbabab aaabbaa aaabaabb baaaabbb baaaaab bbabaa abaabaab bbabbaa bbaabbaa ababbaba baabbbba aaaaaa aaaabbb baaaabab bbabbbbb baababaa bbaaaaba aaaabaa bbabaaab baabaabb aaabbba abaabbaa bbababa ababbba baaabbba abaabbab bbaabbba abaab aaaabbbb aaaaaaa bbaaaab ababbbba ababa aaaaab baaaaaaa bbabbaaa bbabbbaa aaaa aba', 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Sipser 1.18/1.6d) Give a regular expression over the alphabet $\\{a,b\\}$ that generates the language $\\{ \\, w \\in \\{a,b\\}^\\ast \\mid |w| \\geqslant 3 \\land w[2] = a \\, \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "regexp = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(regexp)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/without-answers/tm-for-language.ipynb b/notebooks/without-answers/tm-for-language.ipynb new file mode 100644 index 0000000..caa12c9 --- /dev/null +++ b/notebooks/without-answers/tm-for-language.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gambatools.notebook import *\n", + "check_answer = lambda tm: check_tm_language_from_words(tm, '110#110 00#00 001#001 1#1 0#0 000#000 10#10 010#010 # 100#100 11#11 111#111 01#01 011#011 101#101', 8, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `□` or `_` to denote the blank symbol, but not both. A different symbol like `#` can be chosen by adding a line `blank #`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give a Turing Machine that generates the language $\\{ w\\#w \\mid w \\in \\{0,1\\}^\\ast \\}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tm = '''\n", + "\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(tm)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "check_answer(tm)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can simulate the run of the tm above on an example string <your_string> by running the command \"simulate_tm(tm,'<your_string>')\" in the cell below." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..374b58c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,6 @@ +[build-system] +requires = [ + "setuptools>=42", + "wheel" +] +build-backend = "setuptools.build_meta" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fa8481d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +antlr4-python3-runtime==4.8 +graphviz +jupyter +tabulate +ipython diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..396ae7b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,25 @@ +[metadata] +name = gambatools +version = 0.1 +author = Wieger Wesselink +author_email = j.w.wesselink@tue.nl +description = A library for formal language education. It contains support for DFAs, NFAs, PDAs, Turing machines, context free grammars and regular expressions. +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/wiegerw/gambatools +project_urls = + Bug Tracker = https://github.com/wiegerw/gambatools/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) + Operating System :: OS Independent + +[options] +package_dir = + = src +packages = find: +python_requires = >=3.6 + +[options.packages.find] +where = src + diff --git a/src/gambatools/CFG.g4 b/src/gambatools/CFG.g4 new file mode 100644 index 0000000..1a5180a --- /dev/null +++ b/src/gambatools/CFG.g4 @@ -0,0 +1,24 @@ +// (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +// Software License, (See accompanying file LICENSE or copy at +// https://www.gnu.org/licenses/gpl-3.0.txt) + +grammar CFG; + +context_free_grammar: rule_list ';'? ; + +rule_list: rule_ (';' rule_)* ; + +symbol: IDENTIFIER | '1' ; + +variable: IDENTIFIER ; + +symbol_list: symbol ('.' symbol)* ; + +alternative: symbol_list ; + +alternative_list: alternative ('|' alternative)* ; + +rule_: variable '->' alternative_list ; + +IDENTIFIER : [a-zA-Z_][a-zA-Z_0-9']* ; +WS : [ \r\n]+ -> channel(1) ; diff --git a/src/gambatools/CFGLexer.py b/src/gambatools/CFGLexer.py new file mode 100644 index 0000000..3f0ba1b --- /dev/null +++ b/src/gambatools/CFGLexer.py @@ -0,0 +1,66 @@ +# Generated from CFG.g4 by ANTLR 4.8 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\t") + buf.write("*\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3") + buf.write("\7\3\7\7\7\37\n\7\f\7\16\7\"\13\7\3\b\6\b%\n\b\r\b\16") + buf.write("\b&\3\b\3\b\2\2\t\3\3\5\4\7\5\t\6\13\7\r\b\17\t\3\2\5") + buf.write("\5\2C\\aac|\7\2))\62;C\\aac|\5\2\f\f\17\17\"\"\2+\2\3") + buf.write("\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2") + buf.write("\2\2\2\r\3\2\2\2\2\17\3\2\2\2\3\21\3\2\2\2\5\23\3\2\2") + buf.write("\2\7\25\3\2\2\2\t\27\3\2\2\2\13\31\3\2\2\2\r\34\3\2\2") + buf.write("\2\17$\3\2\2\2\21\22\7=\2\2\22\4\3\2\2\2\23\24\7\63\2") + buf.write("\2\24\6\3\2\2\2\25\26\7\60\2\2\26\b\3\2\2\2\27\30\7~\2") + buf.write("\2\30\n\3\2\2\2\31\32\7/\2\2\32\33\7@\2\2\33\f\3\2\2\2") + buf.write("\34 \t\2\2\2\35\37\t\3\2\2\36\35\3\2\2\2\37\"\3\2\2\2") + buf.write(" \36\3\2\2\2 !\3\2\2\2!\16\3\2\2\2\" \3\2\2\2#%\t\4\2") + buf.write("\2$#\3\2\2\2%&\3\2\2\2&$\3\2\2\2&\'\3\2\2\2\'(\3\2\2\2") + buf.write("()\b\b\2\2)\20\3\2\2\2\5\2 &\3\2\3\2") + return buf.getvalue() + + +class CFGLexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + T__0 = 1 + T__1 = 2 + T__2 = 3 + T__3 = 4 + T__4 = 5 + IDENTIFIER = 6 + WS = 7 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "';'", "'1'", "'.'", "'|'", "'->'" ] + + symbolicNames = [ "", + "IDENTIFIER", "WS" ] + + ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "IDENTIFIER", + "WS" ] + + grammarFileName = "CFG.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/src/gambatools/CFGParser.py b/src/gambatools/CFGParser.py new file mode 100644 index 0000000..0eb55f1 --- /dev/null +++ b/src/gambatools/CFGParser.py @@ -0,0 +1,464 @@ +# Generated from CFG.g4 by ANTLR 4.8 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\t") + buf.write("9\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b") + buf.write("\t\b\4\t\t\t\3\2\3\2\5\2\25\n\2\3\3\3\3\3\3\7\3\32\n\3") + buf.write("\f\3\16\3\35\13\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\7\6&\n\6") + buf.write("\f\6\16\6)\13\6\3\7\3\7\3\b\3\b\3\b\7\b\60\n\b\f\b\16") + buf.write("\b\63\13\b\3\t\3\t\3\t\3\t\3\t\2\2\n\2\4\6\b\n\f\16\20") + buf.write("\2\3\4\2\4\4\b\b\2\64\2\22\3\2\2\2\4\26\3\2\2\2\6\36\3") + buf.write("\2\2\2\b \3\2\2\2\n\"\3\2\2\2\f*\3\2\2\2\16,\3\2\2\2\20") + buf.write("\64\3\2\2\2\22\24\5\4\3\2\23\25\7\3\2\2\24\23\3\2\2\2") + buf.write("\24\25\3\2\2\2\25\3\3\2\2\2\26\33\5\20\t\2\27\30\7\3\2") + buf.write("\2\30\32\5\20\t\2\31\27\3\2\2\2\32\35\3\2\2\2\33\31\3") + buf.write("\2\2\2\33\34\3\2\2\2\34\5\3\2\2\2\35\33\3\2\2\2\36\37") + buf.write("\t\2\2\2\37\7\3\2\2\2 !\7\b\2\2!\t\3\2\2\2\"\'\5\6\4\2") + buf.write("#$\7\5\2\2$&\5\6\4\2%#\3\2\2\2&)\3\2\2\2\'%\3\2\2\2\'") + buf.write("(\3\2\2\2(\13\3\2\2\2)\'\3\2\2\2*+\5\n\6\2+\r\3\2\2\2") + buf.write(",\61\5\f\7\2-.\7\6\2\2.\60\5\f\7\2/-\3\2\2\2\60\63\3\2") + buf.write("\2\2\61/\3\2\2\2\61\62\3\2\2\2\62\17\3\2\2\2\63\61\3\2") + buf.write("\2\2\64\65\5\b\5\2\65\66\7\7\2\2\66\67\5\16\b\2\67\21") + buf.write("\3\2\2\2\6\24\33\'\61") + return buf.getvalue() + + +class CFGParser ( Parser ): + + grammarFileName = "CFG.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "';'", "'1'", "'.'", "'|'", "'->'" ] + + symbolicNames = [ "", "", "", "", + "", "", "IDENTIFIER", "WS" ] + + RULE_context_free_grammar = 0 + RULE_rule_list = 1 + RULE_symbol = 2 + RULE_variable = 3 + RULE_symbol_list = 4 + RULE_alternative = 5 + RULE_alternative_list = 6 + RULE_rule_ = 7 + + ruleNames = [ "context_free_grammar", "rule_list", "symbol", "variable", + "symbol_list", "alternative", "alternative_list", "rule_" ] + + EOF = Token.EOF + T__0=1 + T__1=2 + T__2=3 + T__3=4 + T__4=5 + IDENTIFIER=6 + WS=7 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + + class Context_free_grammarContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def rule_list(self): + return self.getTypedRuleContext(CFGParser.Rule_listContext,0) + + + def getRuleIndex(self): + return CFGParser.RULE_context_free_grammar + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitContext_free_grammar" ): + return visitor.visitContext_free_grammar(self) + else: + return visitor.visitChildren(self) + + + + + def context_free_grammar(self): + + localctx = CFGParser.Context_free_grammarContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_context_free_grammar) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 16 + self.rule_list() + self.state = 18 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CFGParser.T__0: + self.state = 17 + self.match(CFGParser.T__0) + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Rule_listContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def rule_(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CFGParser.Rule_Context) + else: + return self.getTypedRuleContext(CFGParser.Rule_Context,i) + + + def getRuleIndex(self): + return CFGParser.RULE_rule_list + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRule_list" ): + return visitor.visitRule_list(self) + else: + return visitor.visitChildren(self) + + + + + def rule_list(self): + + localctx = CFGParser.Rule_listContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_rule_list) + try: + self.enterOuterAlt(localctx, 1) + self.state = 20 + self.rule_() + self.state = 25 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,1,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 21 + self.match(CFGParser.T__0) + self.state = 22 + self.rule_() + self.state = 27 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,1,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SymbolContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def IDENTIFIER(self): + return self.getToken(CFGParser.IDENTIFIER, 0) + + def getRuleIndex(self): + return CFGParser.RULE_symbol + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitSymbol" ): + return visitor.visitSymbol(self) + else: + return visitor.visitChildren(self) + + + + + def symbol(self): + + localctx = CFGParser.SymbolContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_symbol) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 28 + _la = self._input.LA(1) + if not(_la==CFGParser.T__1 or _la==CFGParser.IDENTIFIER): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VariableContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def IDENTIFIER(self): + return self.getToken(CFGParser.IDENTIFIER, 0) + + def getRuleIndex(self): + return CFGParser.RULE_variable + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitVariable" ): + return visitor.visitVariable(self) + else: + return visitor.visitChildren(self) + + + + + def variable(self): + + localctx = CFGParser.VariableContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_variable) + try: + self.enterOuterAlt(localctx, 1) + self.state = 30 + self.match(CFGParser.IDENTIFIER) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Symbol_listContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def symbol(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CFGParser.SymbolContext) + else: + return self.getTypedRuleContext(CFGParser.SymbolContext,i) + + + def getRuleIndex(self): + return CFGParser.RULE_symbol_list + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitSymbol_list" ): + return visitor.visitSymbol_list(self) + else: + return visitor.visitChildren(self) + + + + + def symbol_list(self): + + localctx = CFGParser.Symbol_listContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_symbol_list) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 32 + self.symbol() + self.state = 37 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CFGParser.T__2: + self.state = 33 + self.match(CFGParser.T__2) + self.state = 34 + self.symbol() + self.state = 39 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class AlternativeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def symbol_list(self): + return self.getTypedRuleContext(CFGParser.Symbol_listContext,0) + + + def getRuleIndex(self): + return CFGParser.RULE_alternative + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitAlternative" ): + return visitor.visitAlternative(self) + else: + return visitor.visitChildren(self) + + + + + def alternative(self): + + localctx = CFGParser.AlternativeContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_alternative) + try: + self.enterOuterAlt(localctx, 1) + self.state = 40 + self.symbol_list() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Alternative_listContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def alternative(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CFGParser.AlternativeContext) + else: + return self.getTypedRuleContext(CFGParser.AlternativeContext,i) + + + def getRuleIndex(self): + return CFGParser.RULE_alternative_list + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitAlternative_list" ): + return visitor.visitAlternative_list(self) + else: + return visitor.visitChildren(self) + + + + + def alternative_list(self): + + localctx = CFGParser.Alternative_listContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_alternative_list) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 42 + self.alternative() + self.state = 47 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CFGParser.T__3: + self.state = 43 + self.match(CFGParser.T__3) + self.state = 44 + self.alternative() + self.state = 49 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Rule_Context(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def variable(self): + return self.getTypedRuleContext(CFGParser.VariableContext,0) + + + def alternative_list(self): + return self.getTypedRuleContext(CFGParser.Alternative_listContext,0) + + + def getRuleIndex(self): + return CFGParser.RULE_rule_ + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRule_" ): + return visitor.visitRule_(self) + else: + return visitor.visitChildren(self) + + + + + def rule_(self): + + localctx = CFGParser.Rule_Context(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_rule_) + try: + self.enterOuterAlt(localctx, 1) + self.state = 50 + self.variable() + self.state = 51 + self.match(CFGParser.T__4) + self.state = 52 + self.alternative_list() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + + diff --git a/src/gambatools/CFGVisitor.py b/src/gambatools/CFGVisitor.py new file mode 100644 index 0000000..dedaf9e --- /dev/null +++ b/src/gambatools/CFGVisitor.py @@ -0,0 +1,53 @@ +# Generated from CFG.g4 by ANTLR 4.8 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .CFGParser import CFGParser +else: + from CFGParser import CFGParser + +# This class defines a complete generic visitor for a parse tree produced by CFGParser. + +class CFGVisitor(ParseTreeVisitor): + + # Visit a parse tree produced by CFGParser#context_free_grammar. + def visitContext_free_grammar(self, ctx:CFGParser.Context_free_grammarContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#rule_list. + def visitRule_list(self, ctx:CFGParser.Rule_listContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#symbol. + def visitSymbol(self, ctx:CFGParser.SymbolContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#variable. + def visitVariable(self, ctx:CFGParser.VariableContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#symbol_list. + def visitSymbol_list(self, ctx:CFGParser.Symbol_listContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#alternative. + def visitAlternative(self, ctx:CFGParser.AlternativeContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#alternative_list. + def visitAlternative_list(self, ctx:CFGParser.Alternative_listContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CFGParser#rule_. + def visitRule_(self, ctx:CFGParser.Rule_Context): + return self.visitChildren(ctx) + + + +del CFGParser \ No newline at end of file diff --git a/src/gambatools/__init__.py b/src/gambatools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gambatools/algorithms.py b/src/gambatools/algorithms.py new file mode 100644 index 0000000..9f1a99b --- /dev/null +++ b/src/gambatools/algorithms.py @@ -0,0 +1,13 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import List + + +def first_index(x: List, value) -> int: + return x.index(value) + + +def last_index(x: List, value) -> int: + return len(x) - list(reversed(x)).index(value) - 1 diff --git a/src/gambatools/automata_checker.py b/src/gambatools/automata_checker.py new file mode 100644 index 0000000..c4e8f20 --- /dev/null +++ b/src/gambatools/automata_checker.py @@ -0,0 +1,46 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import Set +from gambatools.automaton import Automaton +from gambatools.dfa_algorithms import dfa_words_up_to_n, automaton_to_dfa +from gambatools.nfa_algorithms import nfa_words_up_to_n, automaton_to_nfa + + +def _compare_words(accepted_words: Set[str], expected_words: Set[str]): + if 'ε' in expected_words: + expected_words.remove('ε') + expected_words.add('') + + if accepted_words != expected_words: + accepted_minus_expected = accepted_words - expected_words + if len(accepted_minus_expected) > 0: + word = next(iter(accepted_minus_expected)) + word = word if word else 'ε' + feedback = "word '{}' should not be accepted".format(word) + else: + word = next(iter(expected_words - accepted_words)) + word = word if word else 'ε' + feedback = "word '{}' is not accepted".format(word) + return { 'correct': False, 'feedback': feedback } + return {'correct': True} + + +def check_dfa_for_given_language(states, transitions, initial_states, final_states, language: str, max_word_length=5): + try: + D = automaton_to_dfa(Automaton(states, transitions, initial_states, final_states, {})) + expected_words = set(language.split()) + accepted_words = dfa_words_up_to_n(D, max_word_length) + return _compare_words(accepted_words, expected_words) + except RuntimeError as e: + return { 'correct': False, 'feedback': str(e) } + +def check_nfa_for_given_language(states, transitions, initial_states, final_states, language: str, max_word_length=5): + try: + N = automaton_to_nfa(Automaton(states, transitions, initial_states, final_states, {})) + expected_words = set(language.split()) + accepted_words = nfa_words_up_to_n(N, max_word_length) + return _compare_words(accepted_words, expected_words) + except RuntimeError as e: + return { 'correct': False, 'feedback': str(e) } diff --git a/src/gambatools/automaton.py b/src/gambatools/automaton.py new file mode 100644 index 0000000..a57d530 --- /dev/null +++ b/src/gambatools/automaton.py @@ -0,0 +1,27 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import Set, List, Tuple, Mapping, Any + + +class Automaton(object): + def __init__(self, + states: Set[str], + transitions: List[Tuple[str, str, str]], + initial_states: Set[str], + final_states: Set[str], + items: Mapping[str, List[Any]] + ): + self.states = states + self.transitions = transitions + self.initial_states = initial_states + self.final_states = final_states + self.items = items + + def used_states(self) -> Set[str]: + result = self.initial_states | self.final_states + for (p, _, q) in self.transitions: + result.add(p) + result.add(q) + return result diff --git a/src/gambatools/automaton_algorithms.py b/src/gambatools/automaton_algorithms.py new file mode 100644 index 0000000..1d64fc6 --- /dev/null +++ b/src/gambatools/automaton_algorithms.py @@ -0,0 +1,242 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import List, FrozenSet, Set, Optional +import re + +from gambatools.automaton import Automaton + + +def default_state_label_regex() -> str: + return r'\w+' + + +def default_transition_label_regex() -> str: + return r'.+' + + +def default_symbol_regex() -> str: + return r'\w+' + + +def state_set_regex() -> str: + return r'\{[\w,]*\}' + + +def state_product_regex() -> str: + return r'\(\w+,\w+\)' + + +def dfa_keywords() -> FrozenSet[str]: + return frozenset(['input_symbols']) + + +def nfa_keywords() -> FrozenSet[str]: + return frozenset(['input_symbols', 'epsilon']) + + +def pda_keywords() -> FrozenSet[str]: + return frozenset(['input_symbols', 'stack_symbols', 'epsilon']) + + +def tm_keywords() -> FrozenSet[str]: + return frozenset(['input_symbols', 'tape_symbols', 'blank', 'accept', 'reject']) + + +def automaton_keywords() -> FrozenSet[str]: + return dfa_keywords() | nfa_keywords() | pda_keywords() | tm_keywords() + + +class AutomatonBuilder(object): + def __init__(self, A: Automaton, state_regex = default_state_label_regex(), transition_regex=default_transition_label_regex(), symbol_regex=default_symbol_regex()): + self.A = A + self.state_regex = state_regex + self.transition_regex = transition_regex + self.symbol_regex = symbol_regex + + def _fresh_state(self, states: Set[str], hint: str = 'P') -> str: + if hint not in states: + return hint + index = 1 + while True: + state = '{}{}'.format(hint, index) + if state not in states: + return state + index = index + 1 + + def _check_symbol(self, symbol): + if not re.fullmatch(self.symbol_regex, symbol): + raise RuntimeError('invalid symbol {}'.format(symbol)) + + def _check_symbols(self, symbols): + for symbol in symbols: + self._check_symbol(symbol) + + def _check_state_label(self, state) -> None: + if not re.fullmatch(self.state_regex, state): + raise RuntimeError('invalid state label {}'.format(state)) + + def _check_transition_label(self, label) -> None: + if not re.fullmatch(self.transition_regex, label): + raise RuntimeError('invalid transition label {}'.format(label)) + + def _check_state_labels(self): + A = self.A + for state in A.states: + self._check_state_label(state) + + def _check_one_initial_state(self): + A = self.A + if len(A.initial_states) == 0: + raise RuntimeError('the automaton has no initial state') + elif len(A.initial_states) > 1: + raise RuntimeError('the automaton has multiple initial states') + + def _check_states_are_declared(self): + A = self.A + used_states = A.used_states() + if len(used_states - A.states) > 0: + raise RuntimeError('the following states are not declared: {}'.format(', '.join(used_states - A.states))) + + def _check_symbols_are_declared(self, used_symbols: Set[str], declared_symbols: Set[str]): + if len(used_symbols - declared_symbols) > 0: + raise RuntimeError('the following symbols are not declared: {}'.format(', '.join(used_symbols - declared_symbols))) + + def get_symbol(self, key: str, default_value: str) -> str: + A = self.A + if key in A.items: + if len(A.items[key]) == 0: + raise RuntimeError('no value was specified for "{}"'.format(key)) + if len(A.items[key]) > 1: + print('A.items =', A.items) + raise RuntimeError('multiple values were specified for "{}"'.format(key)) + return A.items[key][0] + return default_value + + def parse_symbol(self, key='epsilon', value='ε', default_value='_'): + A = self.A + if key in A.items: + return self.get_symbol(key, default_value) + for (p, a, q) in A.transitions: + if value in a: + return value + return default_value + + + def get_symbol_set(self, key: str, used_symbols: Optional[Set[str]] = None) -> Set[str]: + A = self.A + if key in A.items: + declared_symbols = set(A.items[key]) + if used_symbols: + self._check_symbols_are_declared(used_symbols, declared_symbols) + return declared_symbols + return used_symbols + + def get_state(self, key: str, default_value: str) -> str: + A = self.A + if key in A.items: + if len(A.items[key]) == 0: + raise RuntimeError('no value was specified for "{}"'.format(key)) + if len(A.items[key]) > 1: + raise RuntimeError('multiple values were specified for "{}"'.format(key)) + return A.items[key][0] + return default_value + + def build(self) -> Automaton: + A = self.A + A.states = A.states if len(A.states) > 0 else A.used_states() + self._check_states_are_declared() + self._check_state_labels() + return A + + +class AutomatonParser(object): + def __init__(self, transition_regex=default_transition_label_regex(), state_regex=default_state_label_regex(), keywords: FrozenSet[str] = automaton_keywords()): + self.keywords = keywords + self.state_regex = state_regex + self.transition_regex = transition_regex + self.items = {} + self.states: Set[str] = set([]) + self.transitions = [] + self.initial_states: Set[str] = set([]) + self.final_states: Set[str] = set([]) + + def _check_no_duplicate_keys(self, key: str): + if key in self.items: + raise RuntimeError('the keyword "{}" is specified multiple times'.format(key)) + + def _check_no_duplicates(self, words: List[str]) -> None: + W = set([]) + for word in words: + if word in W: + raise RuntimeError('duplicate entry "{}" found in "{}"'.format(word, words)) + W.add(word) + + def _check_keys_exist(self, keys: List[str]): + for key in keys: + if not key in self.items: + raise RuntimeError('the keyword "{}" is missing'.format(key)) + + def _check_state_label(self, state) -> None: + if not re.fullmatch(self.state_regex, state): + raise RuntimeError('invalid state label {}'.format(state)) + + def _check_transition_label(self, label) -> None: + if not re.fullmatch(self.transition_regex, label): + raise RuntimeError('invalid transition label {}'.format(label)) + + def parse_state(self, state: str) -> str: + self._check_state_label(state) + return state + + def parse_state_set(self, keyword, words: List[str], check_non_empty: bool = False) -> Set[str]: + self._check_no_duplicate_keys(keyword) + self._check_no_duplicates(words) + if check_non_empty and len(words) == 0: + raise RuntimeError('the set "{}" may not be empty'.format(keyword)) + return set(self.parse_state(word) for word in words) + + def parse_transition_label(self, label: str) -> str: + self._check_transition_label(label) + return label + + def parse_transition(self, words: List[str], line: str): + if len(words) <= 2: + raise RuntimeError('incomplete transition "{}"'.format(line)) + p = self.parse_state(words[0]) + q = self.parse_state(words[1]) + for a in words[2:]: + a = self.parse_transition_label(a) + self.transitions.append((p, a, q)) + + def parse_line(self, line: str): + words = line.strip().split() + if not words or words[0].startswith('%'): + pass + elif words[0] == 'states': + self.states = self.parse_state_set('states', words[1:], check_non_empty=True) + self.items['states'] = words[1:] + elif words[0] == 'final': + self.final_states = self.parse_state_set('final', words[1:]) + self.items['final'] = words[1:] + elif words[0] == 'initial': + self.initial_states = self.parse_state_set('initial', words[1:]) + self.items['initial'] = words[1:] + elif words[0] in self.keywords: + keyword = words[0] + self._check_no_duplicate_keys(keyword) + self.items[keyword] = words[1:] + else: + self.parse_transition(words, line) + + def parse(self, text: str) -> Automaton: + lines = text.split('\n') + for line in lines: + self.parse_line(line) + return Automaton(self.states, self.transitions, self.initial_states, self.final_states, self.items) + + +def parse_automaton(text: str, transition_regex=default_transition_label_regex(), state_regex=default_state_label_regex(), symbol_regex=default_symbol_regex()) -> Automaton: + A = AutomatonParser(state_regex=state_regex, transition_regex=transition_regex).parse(text) + return AutomatonBuilder(A, state_regex=state_regex, transition_regex=transition_regex, symbol_regex=symbol_regex).build() diff --git a/src/gambatools/automaton_io.py b/src/gambatools/automaton_io.py new file mode 100644 index 0000000..1d90e7d --- /dev/null +++ b/src/gambatools/automaton_io.py @@ -0,0 +1,67 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +import re +from collections import defaultdict +from typing import Any, Callable, Set + +import graphviz + + +def make_label_default(label: str) -> str: + if len(label) == 4 and label[1] == ',': # assume it is a PDA transition + label = re.sub('_', 'ε', label) + a, _, u, v = label + return '{},{}→{}'.format(a, u, v) + elif len(label) == 4 and label[2] == ',': # assume it is a TM transition + label = re.sub('_', '□', label) + a, b, _, d = label + return '{}→{},{}'.format(a, b, d) + else: + return re.sub('_', 'ε', label) + + +def automaton_to_dot(A: Any, join_labels: bool = True, make_label: Callable[[str], str] = make_label_default) -> graphviz.Digraph: + Q = A.states + I = A.initial_states + F = A.final_states + + d = graphviz.Digraph() + d.attr(rankdir='LR') + + for q in Q: + if q in F: + d.node(q, peripheries='2', fontname='Times-Italic', fontsize='11') + else: + d.node(q, fontname='Times-Italic', fontsize='11') + if q in I: + q_fake = fresh_identifier(Q, 'fake') + d.node(q_fake, style='invisible') + d.edge(q_fake, q, fontname='Times-Italic', fontsize='11') + + if join_labels: + edge_map = defaultdict(list) + for (p, a, q) in A.transitions: + edge_map[p, q].append(make_label(a)) + transitions = [(p, a, q) for (p, q), a in edge_map.items()] + else: + transitions = [(p, [a], q) for (p, a, q) in A.transitions] + + for (p, a, q) in transitions: + label = ','.join(a) + if len(label) > 7: + label = '\n'.join(a) + d.edge(p, q, label=label, fontname='Times-Italic', fontsize='11') + return d + + +def fresh_identifier(Q: Set[str], hint: str = 'P') -> str: + if hint not in Q: + return hint + index = 1 + while True: + q = '{}{}'.format(hint, index) + if q not in Q: + return q + index = index + 1 diff --git a/src/gambatools/cfg.py b/src/gambatools/cfg.py new file mode 100644 index 0000000..cf7861b --- /dev/null +++ b/src/gambatools/cfg.py @@ -0,0 +1,175 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import List, Set, Union +from collections import defaultdict + + +class Terminal(str): + def __new__(cls, content): + return super().__new__(cls, content) + + +class Variable(str): + def __new__(cls, content): + return super().__new__(cls, content) + + +DerivationTerm = List[Union[Terminal, Variable]] + + +class Alternative(object): + def __init__(self, symbols: DerivationTerm): + self.symbols = symbols + + def __str__(self): + if not self.symbols: + return 'ε' + return '.'.join(self.symbols) + + def __eq__(self, other): + return self.symbols == other.symbols + + def __hash__(self): + return hash(str(self)) # TODO: improve this hash function + + def __lt__(self, other): + return str(self) < str(other) + + def is_chomsky(self): + """Returns true if the alternative is in Chomsky normal form""" + return (len(self.symbols) == 0) or \ + (len(self.symbols) == 1 and isinstance(self.symbols[0], Terminal)) or \ + (len(self.symbols) == 2 and isinstance(self.symbols[0], Variable) and + isinstance(self.symbols[1], Variable)) + + def is_epsilon(self): + return len(self.symbols) == 0 + + def is_variable(self): + return len(self.symbols) == 1 and isinstance(self.symbols[0], Variable) + + def is_terminal(self): + return len(self.symbols) == 1 and isinstance(self.symbols[0], Terminal) + + def terminals(self) -> Set[Terminal]: + """Returns the terminals of the alternative""" + return set([symbol for symbol in self.symbols if isinstance(symbol, Terminal)]) + + def variables(self) -> Set[Variable]: + """Returns the variables of the alternative""" + return set([symbol for symbol in self.symbols if isinstance(symbol, Variable)]) + + +def cfg_equal_alternatives(a1: List[Alternative], a2: List[Alternative]) -> bool: + symbols1 = [a.symbols for a in a1] + symbols2 = [a.symbols for a in a2] + return sorted(symbols1) == sorted(symbols2) + + +class Rule(object): + def __init__(self, variable: Variable, alternative: Alternative): + self.variable = variable + self.alternative = alternative + + def __eq__(self, other): + return self.variable == other.variable and self.alternative == other.alternative + + def __hash__(self): + return hash(str(self)) # TODO: improve this hash function + + def is_chomsky(self): + """Returns true if the rule is in Chomsky normal form""" + return self.alternative.is_chomsky() + + def is_epsilon(self): + return self.alternative.is_epsilon() + + def is_unit_rule(self): + return self.alternative.is_variable() + + def terminals(self) -> Set[Terminal]: + return self.alternative.terminals() + + def variables(self) -> Set[Variable]: + return self.alternative.variables() + + def __str__(self): + return '{} -> {}'.format(self.variable, self.alternative) + + +class CFG(object): + + def __init__(self, V: Set[Variable], Sigma: Set[Terminal], R: List[Rule], S: Variable, epsilon: Terminal = Terminal('ε'), check_validity: bool = True): + self.V = V + self.Sigma = Sigma + self.R = R + self.S = S + self.epsilon = epsilon + if check_validity: + self.check_validity() + + def ordered_variables(self): + """Returns the variables in the order of first appearance in R""" + done = set([]) + result = [] + for rule in self.R: + if rule.variable not in done: + done.add(rule.variable) + result.append(rule.variable) + return result + + def __str__(self): + rule_map = defaultdict(lambda: []) + for rule in self.R: + rule_map[rule.variable].append(rule.alternative) + rules = ['{} -> {}'.format(X, ' | '.join(list(map(str, rule_map[X])))) for X in self.ordered_variables()] + return '\n'.join(rules) + + def __eq__(self, other): + return self.V == other.V and \ + self.Sigma == other.Sigma and \ + self.S == other.S and \ + sorted(map(str, self.R)) == sorted(map(str, other.R)) + + def is_valid(self): + V = self.V + Sigma = self.Sigma + R = self.R + S = self.S + # for rule in R: + # if not rule.variables() <= V: + # print('V1', V, rule.variables() - V) + # if not rule.terminals() <= Sigma: + # print('V2', Sigma, rule.terminals() - Sigma) + # if not rule.variable in V: + # print('V3', V, rule.variable) + return all([rule.variables() <= V for rule in self.R]) \ + and all([rule.terminals() <= Sigma for rule in self.R]) \ + and all([rule.variable in V for rule in self.R]) + # and len(set([rule.variable for rule in self.R])) == len(self.R) + + def check_validity(self): + V = self.V + Sigma = self.Sigma + R = self.R + S = self.S + for rule in R: + if not rule.variables() <= V: + undeclared_variables = rule.variables() - V + raise RuntimeError('the rule {} contains undeclared variables {}'.format(rule, *undeclared_variables)) + if not rule.terminals() <= Sigma: + undeclared_terminals = rule.terminals() - Sigma + raise RuntimeError('the rule {} contains undeclared terminals {}'.format(rule, *undeclared_terminals)) + if not rule.variable in V: + raise RuntimeError('the rule {} contains undeclared variable {}'.format(rule, rule.variable)) + return all([rule.variables() <= V for rule in self.R]) \ + and all([rule.terminals() <= Sigma for rule in self.R]) \ + and all([rule.variable in V for rule in self.R]) + # and len(set([rule.variable for rule in self.R])) == len(self.R) + + def is_chomsky(self): + """Returns true if the grammar is in Chomsky normal form""" + return all([rule.is_chomsky() and self.S not in rule.variables() for rule in self.R]) and \ + all([not rule.is_epsilon() or rule.variable == self.S for rule in self.R]) diff --git a/src/gambatools/cfg_algorithms.py b/src/gambatools/cfg_algorithms.py new file mode 100644 index 0000000..f9aa0b5 --- /dev/null +++ b/src/gambatools/cfg_algorithms.py @@ -0,0 +1,723 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +import copy +import itertools +import re +import string +from collections import defaultdict +from typing import List, Set, MutableMapping, Tuple, Union, Optional, DefaultDict + +from gambatools.algorithms import last_index, first_index +from gambatools.dfa import State, Symbol, DFA +from gambatools.nfa import NFA +from gambatools.cfg import CFG, Terminal, Variable, Alternative, Rule, DerivationTerm +from gambatools.list_utility import remove_none, remove_duplicates, remove_if + + +class BaetenCFGParser(object): + + @staticmethod + def is_comment(line: str): + return line.strip().startswith('#') + + @staticmethod + def parse_variable(ch: str) -> Union[Terminal, Variable]: + return Terminal(ch) if ch.islower() else Variable(ch) + + def parse_alternative(self, text: str) -> Optional[Alternative]: + if text == '0': + return None + elif text == '1': + return Alternative([]) + return Alternative([self.parse_variable(ch) for ch in text]) + + def parse_rule(self, text: str) -> List[Rule]: + if self.is_comment(text): + return [] + words = list(filter(None, re.split(r'\s+', text))) + if len(words) < 2: + return [] + lhs = Variable(words[0]) + alternatives = remove_none([self.parse_alternative(alternative) for alternative in words[1:]]) + return [Rule(lhs, alternative) for alternative in alternatives] + + def parse_grammar(self, text: str, check_validity: bool = True): + text = re.sub('[=+]', '', text) + R = list(itertools.chain.from_iterable(self.parse_rule(line) for line in text.split('\n'))) + V = set([rule.variable for rule in R]) + Sigma = set().union(*[rule.terminals() for rule in R]) + S = R[0].variable + return CFG(V, Sigma, R, S, check_validity=check_validity) + + +class SimpleCFGParser(object): + def __init__(self): + def repeat(x): + return '(' + x + r')*' + self.epsilon = None + self.zero = '@' + self.alternative_regex = r'[\.\w]+' + self.variable_regex = r'\w+' + S = r'\s*' + A = self.alternative_regex + V = self.variable_regex + bar = r'\|' + self.rule_regex = S + V + S + '->' + S + A + repeat(S + bar + S + A + S) + + @staticmethod + def is_comment(line: str): + return line.strip().startswith('%') + + @staticmethod + def parse_variable(ch: str) -> Union[Terminal, Variable]: + return Terminal(ch) if ch.islower() else Variable(ch) + + def parse_alternative(self, text: str) -> Optional[Alternative]: + if text == self.zero: + return None + elif text == self.epsilon: + return Alternative([]) + return Alternative([self.parse_variable(ch) for ch in text]) + + def parse_rule(self, line: str) -> List[Rule]: + words = re.split(r'->', line) + if len(words) != 2: + raise RuntimeError('invalid production {}'.format(line)) + lhs = Variable(words[0].strip()) + alternatives = words[1].strip().split('|') + alternatives = remove_none([self.parse_alternative(alternative.strip()) for alternative in alternatives]) + return [Rule(lhs, alternative) for alternative in alternatives] + + def parse_epsilon(self, lines): + result = [] + for line in lines: + line = line.strip() + if not line or line.startswith('%'): + pass + elif line.startswith('epsilon'): + m = re.fullmatch(r'epsilon\s*=\s*(\w)', line) + if not m: + raise RuntimeError('invalid epsilon declaration {}'.format(line)) + self.epsilon = m.group(1) + else: + if re.fullmatch(self.rule_regex, line): + result.append(line) + else: + raise RuntimeError('invalid production {}'.format(line)) + if not self.epsilon: + self.epsilon = 'ε' if any(['ε' in line for line in result]) else '_' + return result + + def parse_grammar(self, text: str, check_validity: bool = True): + lines = text.split('\n') + lines = self.parse_epsilon(lines) + R = list(itertools.chain.from_iterable(self.parse_rule(line) for line in lines)) + if not R: + raise RuntimeError('the grammar has no rules') + V = set([rule.variable for rule in R]) + Sigma = set().union(*[rule.terminals() for rule in R]) + S = R[0].variable + return CFG(V, Sigma, R, S, epsilon=Terminal(self.epsilon), check_validity=check_validity) + + +def parse_cfg_baeten(text: str, check_validity: bool = True) -> CFG: + """ + Parse a CFG in the format used by Baeten: + + S = aA + bB + A = a + B + B = b + 1 + + Variables are upper case, 1 is the empty string. + :param text: a string containing a grammar + :param check_validity: + :return: the grammar + """ + + parser = BaetenCFGParser() + return parser.parse_grammar(text, check_validity) + + +def parse_simple_cfg(text: str, check_validity: bool = True) -> CFG: + """ + Parse a CFG in a format used by Sipser: + + S -> aA | bB + A -> a | B + B -> b | _ + + Variables are upper case, _ is the empty string. + :param text: a string containing a grammar + :param check_validity: + :return: the grammar + """ + + parser = SimpleCFGParser() + return parser.parse_grammar(text, check_validity) + + +def cfg_to_dfa(G: CFG, check_validity: bool = True) -> DFA: + def is_epsilon(alternative: Alternative): + return len(alternative.symbols) == 0 or (len(alternative.symbols) == 1 and alternative.symbols[0] == G.epsilon) + + def is_transition(alternative: Alternative) -> bool: + return len(alternative.symbols) == 2 and isinstance(alternative.symbols[0], Terminal) and isinstance(alternative.symbols[1], Variable) + + Sigma: Set[Symbol] = set([Symbol(t) for t in G.Sigma]) + Q: Set[State] = set([State(t) for t in G.V]) + delta: MutableMapping[Tuple[State, Symbol], State] = {} + F: Set[State] = set([]) + q0: State = next(q for q in Q if q == State(G.S)) + + for rule in G.R: + q = State(rule.variable) + if is_epsilon(rule.alternative): + F.add(q) + elif is_transition(rule.alternative): + a = Symbol(rule.alternative.symbols[0]) + q1 = State(rule.alternative.symbols[1]) + delta[q, a] = q1 + else: + raise RuntimeError('cga2nfa: alternative {} has the wrong format'.format(rule.alternative)) + return DFA(Q, Sigma, delta, q0, F, check_validity=check_validity) + + +def cfg_to_nfa(grammar: CFG) -> NFA: + """Transforms a CFG to an NFA. The CFG must already be in the right format.""" + def is_epsilon(alternative: Alternative): + return len(alternative.symbols) == 0 or (len(alternative.symbols) == 1 and alternative.symbols[0] == grammar.epsilon) + + def is_epsilon_transition(alternative: Alternative) -> bool: + return len(alternative.symbols) == 1 and isinstance(alternative.symbols[0], Variable) + + def is_transition(alternative: Alternative) -> bool: + return len(alternative.symbols) == 2 and isinstance(alternative.symbols[0], Terminal) and isinstance(alternative.symbols[1], Variable) + + Sigma: Set[Symbol] = set([Symbol(t) for t in grammar.Sigma]) + Q: Set[State] = set([State(t) for t in grammar.V]) + delta = defaultdict(lambda: set([])) # delta: TypedDict[Tuple[State, Symbol], Set[State]] + F: Set[State] = set([]) + q0: State = next(q for q in Q if q == State(grammar.S)) + epsilon = Symbol('') + + for rule in grammar.R: + q = State(rule.variable) + if is_epsilon(rule.alternative): + F.add(q) + elif is_epsilon_transition(rule.alternative): + q1 = State(rule.alternative.symbols[0]) + delta[q, epsilon].add(q1) + elif is_transition(rule.alternative): + a = Symbol(rule.alternative.symbols[0]) + q1 = State(rule.alternative.symbols[1]) + delta[q, a].add(q1) + else: + raise RuntimeError('cga2nfa: alternative {} has the wrong format'.format(rule.alternative)) + return NFA(Q, Sigma, delta, q0, F, epsilon) + + +def expand_nullable_variables(x: DerivationTerm, W: Set[Variable]) -> List[DerivationTerm]: + """Expands nullable variables (elements in W) in x.""" + if len(x) == 0: + return [x] + y = expand_nullable_variables(x[1:], W) + result = [[x[0]] + y_i for y_i in y] + if isinstance(x[0], Variable) and x[0] in W: + result = result + y + return result + + +def cfg_nullable_variables(G: CFG) -> Set[Variable]: + R = G.R + nullable = set([]) + + while True: + changed = False + for r in R: + if r.variable not in nullable and all(x in nullable for x in r.alternative.symbols): + nullable.add(r.variable) + changed = True + if not changed: + break + + return nullable + + +def cfg_remove_epsilon_rules_in_place(G: CFG) -> None: + R = G.R + S = G.S + + W = cfg_nullable_variables(G) + + # R1 contains the new list of rules + R1 = [] + + for rule in R: + for symbols in expand_nullable_variables(rule.alternative.symbols, W): + if not symbols and rule.variable in W - {S}: + continue + R1.append(Rule(rule.variable, Alternative(symbols))) + + R1 = remove_duplicates(R1) + R.clear() + R.extend(R1) + + +def cfg_remove_epsilon_rules(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_remove_epsilon_rules_in_place(G) + return G + + +def cfg_derivable_variables(G: CFG, A: Variable) -> Set[Variable]: + R = G.R + V = G.V + + W: Set[Variable] = set([]) + W1: Set[Variable] = set([]) + + for r in R: + if r.variable == A and len(r.alternative.symbols) == 1: + B = r.alternative.symbols[0] + if B in V: + W.add(B) + + while W1 != W: + W1 = W.copy() + for r in R: + if len(r.alternative.symbols) == 1: + C = r.variable + B = r.alternative.symbols[0] + if C in W1 and B in V: + W.add(B) + return W - {A} + + +def cfg_put_start_variable_in_front(G: CFG) -> None: + R = G.R + S = G.S + for i in range(len(R)): + if R[i].variable == S: + R[0], R[i] = R[i], R[0] + break + + +def cfg_eliminate_unit_rules_in_place(G: CFG) -> None: + R = G.R + V = G.V + R1 = R.copy() + + for A in V: + W = cfg_derivable_variables(G, A) + for r in R: + B = r.variable + if B in W and not r.is_unit_rule(): + alpha = r.alternative + r1 = Rule(A, alpha) + if not r1 in R1: + R1.append(r1) + R1 = remove_if(R1, lambda x: x.is_unit_rule()) + G.R = R1 + cfg_put_start_variable_in_front(G) + + +def cfg_eliminate_unit_rules(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_eliminate_unit_rules_in_place(G) + return G + + +def cfg_fresh_variable(G: CFG, hint: str) -> Variable: + # assert len(hint) == 1 + # assert hint.isupper() + + V = G.V + if len(V) >= 26: + index = 0 + A = Variable(hint) + while A in V: + A = Variable('{}{}'.format(hint, index)) + index = index + 1 + return A + else: + if Variable(hint) not in V: + A = Variable(hint) + return A + for A in string.ascii_uppercase: + if Variable(A) not in V: + A = Variable(A) + return A + + +def cfg_add_new_start_variable_in_place(G: CFG, hint: str = 'S') -> None: + S0 = cfg_fresh_variable(G, hint) + G.R.insert(0, Rule(S0, Alternative([G.S]))) + G.V.add(S0) + G.S = S0 + + +def cfg_add_new_start_variable(G: CFG, hint: str = 'S') -> CFG: + G = copy.deepcopy(G) + cfg_add_new_start_variable_in_place(G, hint) + return G + + +def cfg_make_rules_of_length_two_in_place(G: CFG) -> None: + def fresh_variables(hint: str, n: int) -> List[Variable]: + """Returns n fresh variables and adds them to G.V""" + result = [] + index = 0 + for i in range(n): + P = cfg_fresh_variable(G, hint) + result.append(P) + G.V.add(P) + return result + + for rule in G.R.copy(): + A = rule.variable + a = rule.alternative + u = a.symbols + n = len(u) + if n <= 2: + continue + A = fresh_variables(A, n - 2) + for k in range(n - 3): + G.R.append(Rule(A[k], Alternative([u[k + 1], A[k + 1]]))) + G.R.append(Rule(A[-1], Alternative(u[-2:]))) + a.symbols = [u[0], A[0]] + + +def cfg_make_rules_of_length_two(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_make_rules_of_length_two_in_place(G) + return G + + +def cfg_eliminate_terminals_in_place(G: CFG) -> None: + replacements: MutableMapping[Terminal, Variable] = {} + + def replace_symbol(symbol: Union[Variable, Terminal]) -> Variable: + if isinstance(symbol, Terminal): + if symbol not in replacements: + A = cfg_fresh_variable(G, symbol.upper()) + replacements[symbol] = A + G.V.add(A) + return replacements[symbol] + else: + return symbol + + for rule in G.R: + a = rule.alternative + if len(a.symbols) >= 2: + a.symbols = [replace_symbol(symbol) for symbol in a.symbols] + + for terminal, variable in replacements.items(): + A = variable + a = Alternative([terminal]) + G.R.append(Rule(A, a)) + + +def cfg_eliminate_terminals(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_eliminate_terminals_in_place(G) + return G + + +def cfg_to_chomsky_in_place(G: CFG, verbose: bool = False) -> None: + if verbose: print('--- start ---\n', G, ' V =', *G.V) + cfg_add_new_start_variable_in_place(G) + if verbose: print('--- cfg_add_new_start_variable_in_place ---\n', G, '\n variables =', *G.V) + cfg_remove_epsilon_rules_in_place(G) + if verbose: print('--- cfg_remove_epsilon_rules_in_place ---\n', G, '\n variables =', *G.V) + cfg_eliminate_unit_rules_in_place(G) + if verbose: print('--- cfg_eliminate_unit_rules_in_place ---\n', G, '\n variables =', *G.V) + cfg_make_rules_of_length_two_in_place(G) + if verbose: print('--- cfg_make_rules_of_length_two_in_place ---\n', G, '\n variables =', *G.V) + cfg_eliminate_terminals_in_place(G) + if verbose: print('--- cfg_eliminate_terminals_in_place ---\n', G, '\n variables =', *G.V) + + +def cfg_to_chomsky(G: CFG, verbose: bool = False) -> CFG: + G = copy.deepcopy(G) + cfg_to_chomsky_in_place(G, verbose) + return G + + +def cfg_cyk_matrix(G: CFG, w: str, verbose: bool = False) -> DefaultDict[Tuple[int, int], Set[Variable]]: + assert G.is_chomsky() + + V = G.V + R = G.R + n = len(w) + + # Build a mapping P of all productions + P = defaultdict(lambda: []) + for rule in R: + P[rule.variable].append(rule.alternative.symbols) + + # X[i, j] will contain { A | A -> w[i].w[i+1]...w[j] } + X = defaultdict(lambda: set([])) + for i in range(n): + w_i = [Terminal(w[i])] + X[i, i] = set(A for A in V if w_i in P[A]) + + if verbose: + print('--- start ---') + print('V = ', *V) + for i, j in X: + print('X[{}, {}] = {}'.format(i, j, X[i, j])) + + for m in range(1, n): + for i in range(n - m): + j = i + m + if verbose: print('processing X[{}, {}]'.format(i, j)) + for k in range(i, j): + if verbose: print('X[{}, {}] depends on X[{}, {}] and X[{}, {}]'.format(i, j, i, k, k + 1, j)) + for (B, C) in itertools.product(X[i, k], X[k + 1, j]): + if verbose: print('B, C = ', B, C) + X[i, j] |= set(A for A in V if [B, C] in P[A]) + if verbose: print('===> X[{}, {}] = {}'.format(i, j, X[i, j])) + + if verbose: + print('--- end ---') + for i, j in X: + print('X[{}, {}] = {}'.format(i, j, X[i, j])) + + return X + + +def cfg_print_cyk_matrix(X: DefaultDict[Tuple[int, int], Set[Variable]], n: int) -> str: + def print_set(S: Set[str]) -> str: + return '{' + ','.join(list(map(str, sorted(S)))) + '}' + + width = (max(len(V) for _, V in X.items()) * 2) + 1 + lines = [] + for i in range(n): + line = ' '.join("{:<{width}}".format(print_set(X[j-i, j]), width=width) for j in range(i, n)) + # line = ' '.join('X[{},{}]'.format(j-i, j) for j in range(i, n)) + lines.append(line) + return '\n'.join(reversed(lines)) + + +def cfg_accepts_word(G: CFG, w: str, verbose: bool = False) -> bool: + """Uses the CYK algorithm to determine if w is in L(G)""" + + if not G.is_chomsky(): + G = cfg_to_chomsky(G) + if verbose: + print('grammar converted to Chomsky:') + print(G) + + R = G.R + S = G.S + + if w == '': + return Rule(S, Alternative([])) in R + + X = cfg_cyk_matrix(G, w, verbose) + n = len(w) + return S in X[0, n - 1] + + +# Returns a derivation of the word w +def cfg_derive_word(G: CFG, w: str, derivation_type: str = 'any') -> DerivationTerm: + assert G.is_chomsky() + assert derivation_type in ['any', 'leftmost', 'rightmost'] + + def find_rule(rules, Xpm, Xmq): + for BC in rules: + B, C = BC + if B in Xpm and C in Xmq: + return B, C + return None + + def print_derivation_tree(root): + S, p, q, children = root + for child in children: + print_derivation_tree(child) + + def extract_derivation(root, leftmost: bool): + S = root[0] + element = [S] + result = [element] + todo = [root] + while todo: + A, p, q, children = todo.pop(0) if leftmost else todo.pop() + if children: + value = [child[0] for child in children] + pos = first_index(element, A) if leftmost else last_index(element, A) + element = element[:pos] + value + element[pos+1:] + result.append(element) + if leftmost: + todo = children + todo + else: + todo = todo + children + return result + + R = G.R + S = G.S + + X = cfg_cyk_matrix(G, w) + n = len(w) + if S not in X[0, n - 1]: + raise RuntimeError("the word '{}' is not accepted by the grammar".format(w)) + + # Build a mappings P1 and P2 for productions of length 1 and 2 + P = defaultdict(lambda: []) + for rule in R: + P[rule.variable].append(rule.alternative.symbols) + + root = (S, 0, n, []) + todo = [ root ] + while todo: + A, p, q, children = todo.pop() + if q - p == 1: + a = w[p] + child = (a, p, q, []) + children.append(child) + else: + for m in range(p+1, q): + Xpm = X[p, m-1] + Xmq = X[m, q-1] + BC = find_rule(P[A], Xpm, Xmq) + if not BC: + continue + B, C = BC + child1 = (B, p, m, []) + child2 = (C, m, q, []) + children.append(child1) + children.append(child2) + todo.append(child1) + todo.append(child2) + break + + # print_derivation_tree(root) + return extract_derivation(root, derivation_type in ['any', 'leftmost']) + + +def cfg_words_up_to_n(G: CFG, n: int) -> Set[str]: + if not G.is_chomsky(): + G = cfg_to_chomsky(G) + S = G.S + R = G.R + + words = set([]) + + S_empty = Rule(S, Alternative([])) + if S_empty in R: + words.add('') + + R1: DefaultDict[Variable, List[Symbol]] = defaultdict(lambda: []) + R2: DefaultDict[Variable, List[DerivationTerm]] = defaultdict(lambda: []) + for rule in R: + if len(rule.alternative.symbols) == 1: + R1[rule.variable].append(rule.alternative.symbols[0]) + elif len(rule.alternative.symbols) == 2: + R2[rule.variable].append(rule.alternative.symbols) + + # pre: x.isupper() and len(x) > 0 + # replaces variables by symbols + def make_words(x: DerivationTerm) -> Set[str]: + if len(x) == 1: + return set(R1[x[0]]) + words = make_words(x[1:]) + return set([a + word for a in R1[x[0]] for word in words]) + + # pre: x.isupper() + # replaces one variable by its right hand side + def replace(x: DerivationTerm) -> List[DerivationTerm]: + return [x[:j] + rhs + x[j+1:] for j in range(len(x)) for rhs in R2[x[j]]] + + def remove_duplicates(x: list) -> list: + x.sort() + return list(k for k, _ in itertools.groupby(x)) + + W: List[DerivationTerm] = [[G.S]] + words = words | make_words([G.S]) + + for i in range(2, n + 1): + W = remove_duplicates([x for word in W for x in replace(word)]) + words = words.union(*[make_words(word) for word in W]) + + return words + + +def cfg_is_simple(G: CFG) -> bool: + def is_simple_variable(x: str): + return len(x) == 1 and x.isupper() + + def is_simple_symbol(x: str): + return len(x) == 1 and x.islower() + + return all(is_simple_variable(x) for x in G.V) and all(is_simple_symbol(x) for x in G.Sigma) + + +def cfg_productive_variables(G: CFG) -> Set[Variable]: + productive = set([]) + + def is_productive_symbol(x: Union[Variable, Terminal]) -> bool: + return isinstance(x, Terminal) or x in productive + + while True: + changed = False + for r in G.R: + if r.variable not in productive and all(is_productive_symbol(x) for x in r.alternative.symbols): + productive.add(r.variable) + changed = True + if not changed: + break + return productive + + +def cfg_remove_inproductive_variables_in_place(G: CFG) -> None: + from gambatools.list_utility import remove_if + + productive = cfg_productive_variables(G) + + def is_productive_symbol(x: Union[Variable, Terminal]) -> bool: + return isinstance(x, Terminal) or x in productive + + def is_productive(r: Rule) -> bool: + return r.variable in productive and all(is_productive_symbol(x) for x in r.alternative.symbols) + + remove_if(G.R, lambda r: not is_productive(r)) + G.V &= productive + + +def cfg_remove_inproductive_variables(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_remove_inproductive_variables_in_place(G) + return G + + +def cfg_remove_useless_rules_in_place(G: CFG) -> None: + from gambatools.list_utility import remove_if + + def is_useless(r: Rule) -> bool: + return r.alternative.symbols == [r.variable] + + remove_if(G.R, lambda r: is_useless(r)) + + +def cfg_remove_useless_rules(G: CFG) -> CFG: + G = copy.deepcopy(G) + cfg_remove_useless_rules_in_place(G) + return G + + +def cfg_print_simple(G): + if not cfg_is_simple(G): + raise RuntimeError('the CFG is not in simple format') + + def print_alternative(a: Alternative) -> str: + if not a.symbols: + return 'ε' + return ''.join(a.symbols) + + rule_map = defaultdict(lambda: []) + for rule in G.R: + rule_map[rule.variable].append(rule.alternative) + rules = ['{} -> {}'.format(X, ' | '.join(list(map(print_alternative, rule_map[X])))) for X in G.ordered_variables()] + return '\n'.join(rules) diff --git a/src/gambatools/cfg_parser.py b/src/gambatools/cfg_parser.py new file mode 100644 index 0000000..820e106 --- /dev/null +++ b/src/gambatools/cfg_parser.py @@ -0,0 +1,82 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +#!/usr/bin/env python3 + +from gambatools.CFGLexer import * +from gambatools.CFGVisitor import * +from gambatools.CFGParser import * +from gambatools.cfg import * +from gambatools.list_utility import remove_none + + +class CFGVisitor(CFGVisitor): + + def __init__(self): + super(CFGVisitor, self).__init__() + + def visitContext_free_grammar(self, ctx: CFGParser.Context_free_grammarContext): + return self.visit(ctx.rule_list()) + + def visitRule_(self, ctx: CFGParser.Rule_Context): + variable = self.visit(ctx.variable()) + alternatives = self.visit(ctx.alternative_list()) + return (variable, alternatives) + + def visitRule_list(self, ctx: CFGParser.Rule_listContext): + return remove_none([self.visit(child) for child in ctx.children]) + + def visitSymbol(self, ctx: CFGParser.SymbolContext): + text = ctx.getText() + return text + + def visitSymbol_list(self, ctx: CFGParser.Symbol_listContext): + return remove_none([self.visit(child) for child in ctx.children]) + + def visitVariable(self, ctx: CFGParser.VariableContext): + text = ctx.getText() + return Variable(text) + + def visitAlternative(self, ctx: CFGParser.AlternativeContext): + return self.visit(ctx.symbol_list()) + + def visitAlternative_list(self, ctx: CFGParser.Alternative_listContext): + return remove_none([self.visit(child) for child in ctx.children]) + + +def parse_cfg(text): + lexer = CFGLexer(InputStream(text)) + stream = CommonTokenStream(lexer) + parser = CFGParser(stream) + grammar = parser.context_free_grammar() + visitor = CFGVisitor() + rules = visitor.visit(grammar) + + V = set([rule[0] for rule in rules]) + Sigma = set([]) + R = [] + S = rules[0][0] + + def parse_symbol(text: str) -> Union[Variable, Terminal]: + if Variable(text) in V: + return Variable(text) + else: + t = Terminal(text) + if text != '1': + Sigma.add(t) + return t + + def parse_alternative(symbols: List[str]) -> Alternative: + symbols = [parse_symbol(s) for s in symbols] + if Terminal('1') in symbols: + if len(symbols) != 1: + raise RuntimeError('Symbol 1 may only appear in isolation') + return Alternative([]) + return Alternative(symbols) + + for variable, alternatives in rules: + for symbols in alternatives: + rule = Rule(variable, parse_alternative(symbols)) + R.append(rule) + return CFG(V, Sigma, R, S) diff --git a/src/gambatools/dfa.py b/src/gambatools/dfa.py new file mode 100644 index 0000000..556ff29 --- /dev/null +++ b/src/gambatools/dfa.py @@ -0,0 +1,73 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from typing import NewType, Set, Mapping, Tuple + +State = NewType('State', str) +Symbol = NewType('Symbol', str) + + +def print_alphabet(Sigma: Set[Symbol]) -> str: + if len(Sigma) == 0: + return '{}' + return State('{{ {} }}'.format(', '.join(sorted(Sigma)))) + + +def print_state_set(Q: Set[State]) -> str: + if len(Q) == 0: + return '{}' + return '{{{}}}'.format(','.join(sorted(Q))) + + +def print_delta(delta): + if len(delta) == 0: + return 'delta = {:}' + result = [] + for (q, a) in delta: + q1 = delta[q, a] + q1 = q1 if isinstance(q1, str) else sorted(q1) + if a == '': + a = 'epsilon' + result.append('delta({}, {}) = {}'.format(q, a, q1)) + return '\n'.join(sorted(result)) + + +class DFA(object): + def __init__(self, Q: Set[State], Sigma: Set[Symbol], delta: Mapping[Tuple[State, Symbol], State], q0: State, F: Set[State], check_validity: bool = True): + self.Q = Q + self.Sigma = Sigma + self.delta = delta + self.q0 = q0 + self.F = F + + if check_validity: + self._check_validity() + + def _check_validity(self): + Q = self.Q + Sigma = self.Sigma + delta = self.delta + q0 = self.q0 + F = self.F + assert q0 in Q + assert F <= Q + for (q, a) in delta: + q1 = delta[q, a] + assert q in Q + assert a in Sigma + assert q1 in Q + assert self._is_total() + + def _is_total(self): + Q = self.Q + Sigma = self.Sigma + delta = self.delta + for q in Q: + for a in Sigma: + if (q, a) not in delta: + return False + return True + + def __str__(self): + return 'Q = {}\nSigma = {}\n{}\nq0 = {}\nF = {}'.format(print_state_set(self.Q), print_alphabet(self.Sigma), print_delta(self.delta), self.q0, print_state_set(self.F)) diff --git a/src/gambatools/dfa_algorithms.py b/src/gambatools/dfa_algorithms.py new file mode 100644 index 0000000..9700bb0 --- /dev/null +++ b/src/gambatools/dfa_algorithms.py @@ -0,0 +1,501 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +import copy +import itertools +import io +from collections import defaultdict +from typing import Set, MutableMapping, Tuple, Mapping, List + +from gambatools.automaton import Automaton +from gambatools.automaton_algorithms import default_transition_label_regex, default_state_label_regex, AutomatonParser, AutomatonBuilder +from gambatools.dfa import State, Symbol, print_state_set, DFA +from gambatools.nfa import NFA + + +def dfa_accepts_word(D: DFA, word: str) -> bool: + delta = D.delta + q0 = D.q0 + F = D.F + + q = q0 + for a in word: + q = delta[q, a] + return q in F + + +def dfa_simulate_word(D: DFA, word: str) -> List[Tuple[State, str]]: + delta = D.delta + q0 = D.q0 + + q = q0 + k = 0 + result = [(q0, word)] + for a in word: + k = k + 1 + q = delta[q, a] + result.append((q, word[:-k])) + return result + + +def dfa_words_up_to_n(D: DFA, n: int) -> Set[str]: + words = set([]) + if D.q0 in D.F: + words.add('') + W = {(D.q0, '')} + for i in range(n): + W1 = set([]) + for (q, word) in W: + for a in D.Sigma: + q1 = D.delta[q, a] + word1 = word + a + W1.add((q1, word1)) + if q1 in D.F: + words.add(word1) + W = W1 + return words + + +def dfa_make_total_in_place(D: DFA) -> None: + Q = D.Q + Sigma = D.Sigma + delta = D.delta + q_trap = fresh_state(Q, 'trap') + Q.add(q_trap) + for q in Q: + for a in Sigma: + if not (q, a) in delta: + delta[q, a] = q_trap + + +def dfa_make_total(D: DFA) -> DFA: + D = copy.deepcopy(D) + dfa_make_total(D) + return D + + +def dfa_minimize(D: DFA) -> DFA: + def print_element(table, i, j): + if j < i: + return ' ' + return '1' if table[i, j] else '0' + + def print_table(table: MutableMapping[Tuple[int, int], bool], N: int): + lines = [] + for i in range(N): + lines.append(''.join([print_element(table, i, j) for j in range(N)])) + print('\n'.join(lines)) + + Q = D.Q + Sigma = D.Sigma + delta = D.delta + F = D.F + q = list(Q) + n = len(q) + + table: MutableMapping[Tuple[int, int], bool] = {} + for i, j in itertools.combinations_with_replacement(range(n), 2): + table[i, j] = ((q[i] in F) == (q[j] in F)) + + # print_table(table, n) + + changed = True + while changed: + changed = False + for i, j in itertools.combinations(range(n), 2): + if table[i, j]: + for a in Sigma: + k = q.index(delta[q[i], a]) + l = q.index(delta[q[j], a]) + if not table[min(k, l), max(k, l)]: + table[i, j] = False + changed = True + break + + # print_table(table, n) + + return dfa_from_table(D, table) + + +def dfa_from_table(D: DFA, table: Mapping[Tuple[int, int], bool]) -> DFA: + def state(q: Set[State]) -> State: + return State(print_state_set(q)) + + Q = D.Q + Sigma = D.Sigma + delta = D.delta + q0 = D.q0 + F = D.F + q = list(Q) + n = len(q) + + Q_: List[Set[State]] = [set([]) for _ in range(n)] + R: Set[State] = set([]) + for i in range(n): + if q[i] not in R: + Q_[i].add(q[i]) + R.add(q[i]) + for j in range(i + 1, n): + if table[i, j]: + Q_[i].add(q[j]) + R.add(q[j]) + + Q_r: Set[State] = set(map(state, Q_)) + F_r: Set[State] = set(state(Q_[i]) for i in range(n) if q[i] in F) + q_r = state(next(Q_i for Q_i in Q_ if q0 in Q_i)) + delta_r: MutableMapping[Tuple[State, Symbol], State] = {} + for i in range(n): + Q_i = state(Q_[i]) + for a in Sigma: + q1 = delta[q[i], a] + Q_j = state(next(x for x in Q_ if q1 in x)) + delta_r[Q_i, a] = Q_j + + return DFA(Q_r, Sigma, delta_r, q_r, F_r) + + +def dfa_isomorphic(D1: DFA, D2: DFA) -> bool: + assert D1.Sigma == D2.Sigma + Sigma = D1.Sigma + Q1 = D1.Q + Q2 = D2.Q + F1 = D1.F + F2 = D2.F + + matching = {(q1, q2): False for (q1, q2) in itertools.product(Q1, Q2)} + + if (D1.q0 in F1) == (D2.q0 in F2): + matching[D1.q0, D2.q0] = True + to_inspect = {(D1.q0, D2.q0)} + else: + return False + + while len(to_inspect) > 0: + (q1, q2) = next(iter(to_inspect)) + to_inspect.remove((q1, q2)) + for a in Sigma: + q1_ = D1.delta[q1, a] + q2_ = D2.delta[q2, a] + if matching[q1_, q2_]: + if (q1_ in F1) == (q2_ in F2): + matching[q1_, q2_] = True + to_inspect.add((q1_, q2_)) + else: + return False + + for q1 in Q1: + count = 1 + for q2 in Q2: + if matching[q1, q2]: + count = count + 1 + if count != 1: + return False + + for q2 in Q2: + count = 1 + for q1 in Q1: + if matching[q1, q2]: + count = count + 1 + if count != 1: + return False + + return True + + +def dfa_isomorphic1(D1: DFA, D2: DFA) -> bool: + assert D1.Sigma == D2.Sigma + Sigma = D1.Sigma + F1 = D1.F + F2 = D2.F + + matching = {} + todo = {(D1.q0, D2.q0)} + + while len(todo) > 0: + (q1, q2) = next(iter(todo)) + todo.remove((q1, q2)) + if (q1 in F1) != (q2 in F2): + return False + matching[q1] = q2 + for a in Sigma: + q1_ = D1.delta[q1, a] + q2_ = D2.delta[q2, a] + if q1_ not in matching: + todo.add((q1_, q2_)) + elif q2_ != matching[q1_]: + return False + + return True + + +def random_dfa(Sigma: Set[Symbol], n: int) -> DFA: + import random + + Q: Set[State] = set([State('q{}'.format(i)) for i in range(n)]) + delta: MutableMapping[Tuple[State, Symbol], State] = {} + q0: State = next(q for q in Q if q == State('q0')) + F: Set[State] = set([]) + + # generate delta + for q in Q: + for a in Sigma: + q1 = random.choice(list(Q)) + delta[q, a] = q1 + + # generate F + for q in Q: + if random.randint(0, 5) <= 2: + F.add(q) + + return DFA(Q, Sigma, delta, q0, F) + + +def print_dfa(D: DFA) -> str: + Q = D.Q + Sigma = D.Sigma + delta = D.delta + q0 = D.q0 + F = D.F + + out = io.StringIO() + out.write('states {}\n'.format(' '.join(sorted(Q)))) + out.write('final {}\n'.format(' '.join(sorted(F)))) + out.write('initial {}\n'.format(q0)) + out.write('input_symbols {}\n'.format(' '.join(sorted(Sigma)))) + transitions = defaultdict(lambda: []) + for (p, a), q in delta.items(): + transitions['{} {}'.format(p, q)].append(a) + for pq in sorted(transitions.keys()): + out.write('{} {}\n'.format(pq, ' '.join(transitions[pq]))) + result = out.getvalue() + out.close() + return result.strip() + + +def fresh_state(Q: Set[State], hint: str = 'P') -> State: + index = 1 + while True: + q = State('{}{}'.format(hint, index)) + if q not in Q: + return q + index = index + 1 + + +def automaton_to_dfa(A: Automaton, transition_regex=default_transition_label_regex(), state_regex=default_state_label_regex()) -> DFA: + return DFABuilder(A, state_regex=state_regex, transition_regex=transition_regex).build() + + +def parse_dfa(text: str, transition_regex=default_transition_label_regex(), state_regex=default_state_label_regex()) -> DFA: + A = AutomatonParser(state_regex=state_regex, transition_regex=transition_regex).parse(text) + return automaton_to_dfa(A, state_regex=state_regex, transition_regex=transition_regex) + + +class DFABuilder(AutomatonBuilder): + def __init__(self, A: Automaton, state_regex=r'\w+', transition_regex=r'\w+'): + super().__init__(A, state_regex, transition_regex) + + def used_input_symbols(self) -> Set[str]: + A = self.A + return set(a for (_, a, _) in A.transitions) + + def _check_is_deterministic(self): + A = self.A + V = set() + for (p, a, _) in A.transitions: + if (p, a) in V: + raise RuntimeError('the automaton is not deterministic in node {}'.format(p)) + V.add((p, a)) + + def _check_is_total(self, input_symbols: Set[str]): + A = self.A + V = set((p, a) for (p, a, _) in A.transitions) + for p in A.states: + for a in input_symbols: + if (p, a) not in V: + raise RuntimeError('the automaton is not total in node {}'.format(p)) + + def build(self) -> DFA: + A = self.A + A.states = A.states if len(A.states) > 0 else A.used_states() + + self._check_states_are_declared() + self._check_state_labels() + self._check_one_initial_state() + self._check_is_deterministic() + input_symbols = self.get_symbol_set('input_symbols', self.used_input_symbols()) + self._check_symbols(input_symbols) + self._check_is_total(input_symbols) + + Q = set(State(s) for s in A.states) + Sigma = set(Symbol(s) for s in input_symbols) + delta = {} + q0 = State(next(iter(A.initial_states))) + F = set(State(s) for s in A.final_states) + for (p, a, q) in A.transitions: + p = State(p) + q = State(q) + a = Symbol(a) + delta[p, a] = q + return DFA(Q, Sigma, delta, q0, F) + + +# def dfa_product(D1: DFA, D2: DFA) -> DFA: +# Q1 = D1.Q +# Sigma1 = D1.Sigma +# delta1 = D1.delta +# q01 = D1.q0 +# F1 = D1.F +# +# Q2 = D2.Q +# Sigma2 = D2.Sigma +# delta2 = D2.delta +# q02 = D2.q0 +# F2 = D2.F +# +# def make_state(q1: State, q2: State) -> State: +# return State('({},{})'.format(q1,q2)) +# +# def make_symbol(a1: Symbol, a2: Symbol) -> Symbol: +# return Symbol('{}{}'.format(a1,a2)) +# +# states = list(itertools.product(Q1, Q2)) +# symbols = list(itertools.product(Sigma1, Sigma2)) +# final_states = itertools.product(F1, F2) +# +# Q = set(make_state(q1,q2) for q1,q2 in states) +# Sigma = set(make_symbol(a1, a2) for a1,a2 in symbols) +# delta = { (make_state(q1, q2), make_symbol(a1, a2)) : make_state(delta1[q1, a1], delta2[q2, a2]) for (q1, q2), (a1, a2) in itertools.product(states, symbols) } +# q0 = make_state(q01,q02) +# F = set(make_state(q1,q2) for q1,q2 in final_states) +# +# return DFA(Q, Sigma, delta, q0, F) + + +def dfa_complement(D: DFA) -> DFA: + Q = D.Q + Sigma = D.Sigma + delta = D.delta + q0 = D.q0 + F = D.F + return DFA(Q, Sigma, delta, q0, Q - F) + + +def dfa_product(D1: DFA, D2: DFA, product_type: str) -> DFA: + Q1 = D1.Q + Sigma1 = D1.Sigma + delta1 = D1.delta + q01 = D1.q0 + F1 = D1.F + + Q2 = D2.Q + Sigma2 = D2.Sigma + delta2 = D2.delta + q02 = D2.q0 + F2 = D2.F + + assert Sigma1 == Sigma2 + + def make_state(q1: State, q2: State) -> State: + return State('({},{})'.format(q1,q2)) + + states = list(itertools.product(Q1, Q2)) + if product_type == 'union': + final_states = list((q1, q2) for (q1, q2) in states if q1 in F1 or q2 in F2) + elif product_type == 'intersection': + final_states = list((q1, q2) for (q1, q2) in states if q1 in F1 and q2 in F2) + elif product_type == 'symmetric_difference': + final_states = list((q1, q2) for (q1, q2) in states if (q1 in F1 and q2 not in F2) or (q1 not in F1 and q2 in F2)) + else: + raise RuntimeError('unknown product type {}'.format(product_type)) + + Q = set(make_state(q1,q2) for q1,q2 in states) + Sigma = Sigma1 + delta = { (make_state(q1, q2), a) : make_state(delta1[q1, a], delta2[q2, a]) for (q1, q2), a in itertools.product(states, Sigma) } + q0 = make_state(q01,q02) + F = set(make_state(q1,q2) for q1,q2 in final_states) + + return DFA(Q, Sigma, delta, q0, F) + + +# union of two regular languages: product automaton with synchronized +# transitions (p,q) -a-> (p',q') if p -a-> p' and q -a-> q' and final +# states { (p,q) | p in F_1 or q in F_2 +def dfa_union(D1: DFA, D2: DFA) -> DFA: + return dfa_product(D1, D2, 'union') + + +# intersection of two regular languages: product automaton with synchronized +# transitions (p,q) -a-> (p',q') if p -a-> p' and q -a-> q' and final +# states { (p,q) | p in F_1 and q in F_2 +def dfa_intersection(D1: DFA, D2: DFA) -> DFA: + return dfa_product(D1, D2, 'intersection') + + +# symmetric difference of two regular languages: product automaton with synchronized +# transitions (p,q) -a-> (p',q') if p -a-> p' and q -a-> q' and final +# states { (p,q) | (p in F_1 and q not in F_2) or (p not in F_1 and q in F_2) +def dfa_symmetric_difference(D1: DFA, D2: DFA) -> DFA: + return dfa_product(D1, D2, 'symmetric_difference') + + +def dfa_reverse(D: DFA) -> NFA: + epsilon = Symbol('ε') + + q0 = fresh_state(D.Q, 'q') + Q = D.Q.copy() | {q0} + Sigma = D.Sigma.copy() + delta = defaultdict(set) + for (q, a), q1 in D.delta.items(): + delta[q1, a].add(q) + delta[q0, epsilon] = D.F.copy() + F = {D.q0} + + return NFA(Q, Sigma, delta, q0, F, epsilon) + + +def dfa_no_prefix(D: DFA) -> NFA: + epsilon = Symbol('ε') + + Q = D.Q.copy() + Sigma = D.Sigma.copy() + delta = defaultdict(set) + for (q, a), q1 in D.delta.items(): + if q not in D.F: + delta[q, a].add(q1) + q0 = D.q0 + F = D.F.copy() + + return NFA(Q, Sigma, delta, q0, F, epsilon) + + +# Returns the states reachable from q with a path of length >= depth +def dfa_reachable_states(D: DFA, q: State, depth=0) -> Set[State]: + discovered = {q} if depth == 0 else set() + + d = 0 + V = {q} # V contains reachable nodes at depth d + + while True: + Vnext = set() + for u, a in itertools.product(V, D.Sigma): + v = D.delta[u, a] + if v not in discovered: + discovered.add(v) + Vnext.add(v) + if not Vnext: + break + d = d + 1 + V = Vnext + + return discovered + + +def dfa_no_extend(D: DFA) -> DFA: + Q = D.Q.copy() + Sigma = D.Sigma.copy() + delta = dict(D.delta) + q0 = D.q0 + F = set(qf for qf in D.F if len(dfa_reachable_states(D, qf, 1) & D.F) == 0) + + return DFA(Q, Sigma, delta, q0, F) diff --git a/src/gambatools/dfa_io.py b/src/gambatools/dfa_io.py new file mode 100644 index 0000000..e59c29a --- /dev/null +++ b/src/gambatools/dfa_io.py @@ -0,0 +1,35 @@ +# (C) Copyright Wieger Wesselink 2020. Distributed under the GPL-3.0-or-later +# Software License, (See accompanying file LICENSE or copy at +# https://www.gnu.org/licenses/gpl-3.0.txt) + +from gambatools.dfa import DFA, State, Symbol + +DOT_AUTOMATON_TEXT = '''digraph +{ + fake [style=invisible] + fake -> "" [style=bold] + + + + +} +''' + + +def dfa_to_dot(D: DFA) -> str: + def state(q: State) -> str: + attributes = [] + if q == D.q0: + attributes.append('root = true') + if q in D.F: + attributes.append('shape = doublecircle') + return ' "{}" [{}]'.format(q, ', '.join(attributes)) if attributes else ' "{}"'.format(q) + + def transition(q: State, a: Symbol, q1: State) -> str: + return ' "{}" -> "{}" [label="{}"]'.format(q, q1, a) + + text = DOT_AUTOMATON_TEXT + text = text.replace('', D.q0) + text = text.replace('', '\n'.join([state(q) for q in D.Q])) + text = text.replace('', '\n'.join([transition(q, a, q1) for (q, a), q1 in D.delta.items()])) + return text diff --git a/src/gambatools/draw_sigma.py b/src/gambatools/draw_sigma.py new file mode 100644 index 0000000..db638bf --- /dev/null +++ b/src/gambatools/draw_sigma.py @@ -0,0 +1,356 @@ +from collections import defaultdict +from typing import Any, List, Set + +from gambatools.automaton import Automaton +from gambatools.dfa import DFA +from gambatools.nfa import NFA +from gambatools.pda import PDA +from gambatools.tm import TM +from gambatools.text_utility import read_text, write_text + + +SIGMA_HEADER = r''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +''' + +SIGMA_TEMPLATE = r''' +

+ +''' + + +HTML_TEMPLATE = r''' + + + +Automaton Visualization +{} + + + +{} + + +''' + + +def default_html_settings(): + return {'container': 'sigma-container', 'style': 'width:100%; height:100%; background-color:#E1E1E1'} + + +# {id: 0, label: 'q0', x: Math.random(), y: Math.random(), size: 1, type: 'state', initial: true}, +def make_node(id: int, label: str, accept: bool = False, initial: bool = False) -> str: + attributes = { + 'id': id, + 'label': "'{}'".format(label), + 'x': 'Math.random()', + 'y': 'Math.random()', + 'size': 1, + 'type': "'state'", + } + if accept: + attributes['accept'] = 'true' + if initial: + attributes['initial'] = 'true' + items = ["{}: {}".format(key, value) for (key, value) in attributes.items()] + return '{{ {} }}'.format(', '.join(items)) + + +# { id: 0, label: 'a', source: '0', target: '1', color: '#00000', type: 'arrow' }, +# { id: 1, label: 'b', source: '1', target: '0', color: '#00000', type: 'curvedArrow' }, +def make_edge(id: int, label: str, source: int, target: int, color: str, type_: str) -> str: + attributes = { + 'id': id, + 'label': "'{}'".format(label), + 'source': "{}".format(source), + 'target': "{}".format(target), + 'color': "'{}'".format(color), + 'type': "'{}'".format(type_), + } + items = ["{}: {}".format(key, value) for (key, value) in attributes.items()] + return '{{ {} }}'.format(', '.join(items)) + + +def make_html(nodes: List[str], edges: List[str], html_settings=default_html_settings()) -> str: + text = SIGMA_TEMPLATE + text = text.replace('', html_settings['container']) + text = text.replace('