This ever-expanding document started as a set of study notes and exercises and gradually outgrew itself to become more encyclopedic. Having all these notes in one place is quite helpful for both expressing my own thoughts clearly and for later reference. It is also helpful for tracking connections between seemingly unrelated concepts --- the entire monograph is hyperlinked. Even though I aim at understanding every concept in the way it is meant to be used, most concepts are presented insomuch as they are relevant to my previous experience.
Since these are study notes, they will naturally have a lot of errors, so read them with caution. The document claims no referential nor pedagogical value. Everything is written at the level of abstraction I am comfortable with. Furthermore, some sections in the monograph are much more polished than others. Feel free to contact me if something in this monograph happens to distress you.
I tried putting citations on as many things as possible. The citations themselves are usually put in the left margin. If there is no citation on a definition or theorem, that means that I have either recalled it from memory or discovered it on my own. I try to mark my own definitions to distinguish them from one taken from other sources. Many of the unoriginal definitions and theorems are restated. The simple proofs are mostly original, and the difficult ones are, often loosely, based on proofs from the places cited.
Last but not least, some auxiliary programs are provided in the code/ subdirectory within the monograph's source. Staying close to the monograph exposition is a priority over performance or code quality considerations.
This is a public domain project: it uses CC0 for the text itself and the Unlicense for the Python code.
While I have put in a lot of effort into the project structure itself, I believe that, because of the nature of the project, it makes little sense to document it extensively. There is a GNU Make file specifying how to build the document. There are also several custom tools that can be found in the code/commands
subdirectory - they are most easily activated via poe (poe --root code <command>
).
If you happen to be interested in any aspect of the setup, feel free to contact me.
There are two build systems --- the makefile
and the code.commands.watcher
(Usage: poe --root code watcher [--no-aux]
) command. The first one is aimed at full builds, i.e. for continuous integration, while the second one is aimed at incremental builds, i.e. for development.
There are externalized figures in the figures
directory of the following kinds:
- Asymptote (
.asy
) files for 2D and 3D sketches and plots, as well as (graph-theoretic) graphs.xvfb
is used by default for 3D rendering (freeglut doesn't work on headless environments nor on Wayland). - tikz-cd (
.tex
with document classclasses/tikzcd
) files for commutative and Hasse diagrams and automata. - forest (
.tex
with document classclasses/forest
) files for trees.
A lot of the monograph-related code, as well as some of the tools are based on a recursive descent parser framework created specifically for various (micro)languages in the monograph:
- Natural deduction rules
- Formal grammar schemas
- First-order logic terms and formulas
- Untyped lambda calculus terms
- Plain text
Two additional parsers are included:
There is a tool, code.commands.format_matrices
(Usage: poe --root code format-matrices figures/*.tex
), made specifically for formatting LaTeX arrays and similar environments.
There is a set of tools, code.commands.bibtools
(Usage: poe --root code bibtools
), consisting of:
-
A "formatter" (
... format bibliography bibliography/*.bib
) that handles name and ISBN/ISSN normalization, reference translation (e.g. DOI, mathnet, zbMATH and other URLs to fields) and other mundane tasks. It also emits warnings when it detects mistakes, e.g. an@article
entry without ajournal
or an@inbook
entry without abooktitle
. -
Several BibLaTeX entry fetch tools:
... fetch doi <id>
... fetch isbn <id>
... fetch arxiv <id>
.... fetch mathnet <id>
.
Some comments should be made about the parser. It was created specifically for maintaining my personal (digital) library and this monograph's sources in particular.
- The rules for entry fields are based on those of BibLaTeX with some additions (e.g. mathnet, zbMATH, jstor).
- The parser only allows the fields from the
BibEntry
class. Because this tool was built upon years of maintaining references with other improvised tools, however, a lot of (standard and nonstandard) entry properties accumulated. - The parser auxiliary logic for handling author names via the
BibAuthor
class. This involves parsing and handling each author separately (withand
acting as a separator). For Cyrillic languages, Latin transliteration is enforced via theBibAuthor.short
field that gets read and written to theshortauthor
BibTeX field. - The parser tries to unescape certain characters like
&
and@
, whileBibEntry
tries to escape them when serializing. Exceptions for this are the fields marked as "verbatim" such asurl
. - The parser also supports verbatim fields, i.e. fields with values enclosed in an additional pair of curly braces like
{{value}}
or"{value}"
. The value inside does not get processed by the author processing mechanism, thus we can treat "corporate names" like{{Springer Science and Business Media}}
as one.