---
type: theoretical
ty:
---

## The foundations of computation
Looking for answers for basic questions like:
- Computability?
- Power $\leftrightarrow$ Programming constructs?

Which leads us to fundamental concepts like:
- State
- Transitions
- Non-determinism
- Undecideability


## Models
### Finite memory
Finite automata, regexp
![](Pasted%20image%2020250414190100.png)
### Finite memory with stack
Push down automata
![](Pasted%20image%2020250414190119.png)
### Unrestricted
Turing machines

![](Pasted%20image%2020250414190144.png)



## Grammars

![](Pasted%20image%2020250414190229.png)


On a higher level, it seems like grammars and machines are very different, but parsing a language (a set of strings) is quite similar to computation.

## State-based systems and glossary
An FSM can be a specification for OOP.

- States ($q_0,\ldots, q_n$)
- Transitions ($a,b,c,\ldots,z$)
- We can interpret the transitions as class methods and specify the sequences of allowed invocations - **typestate**



## Notation
- $x \in X, X\subseteq Y$
- $\forall x \in X: P(x), \exists x \in X: P(x)$
- $R \subseteq X \times Y$ is a relation between $X$ and $Y$
- $xRy \equiv (x,y) \in R$ 
- $G = (V, E)$, where $E \subseteq V\times V$ is a directed graph

Part of [Relations and Digraphs](Relations%20and%20Digraphs.md)