1.3.4. Automata in fsm-tools¶
fsm-tools implements the Chomsky hierarchy as a strict Python inheritance chain. Each class is a formal restriction of the one above it — it inherits the full structure of its parent and constrains it further, removing degrees of freedom rather than adding them.
Automaton (abstract base)
└── TuringMachine (Type 0 — recursively enumerable)
└── LinearBoundedAutomaton (Type 1 — context-sensitive)
└── PushdownAutomaton (Type 2 — context-free)
└── FiniteStateAutomaton (Type 3 — regular, planned v0.2.0)
This structure means that isinstance(pda, TuringMachine) is True — every
pushdown automaton is also a (constrained) Turing machine in the type system.
1.3.4.1. TuringMachine — Type 0¶
A Turing Machine operates on an infinite one-dimensional tape. Its transition function
maps a (state, symbol) pair to a (next_state, write_symbol, direction) triple.
It is the most general computational model — equivalent to any algorithm.
Key properties:
Infinite bidirectional tape, extended dynamically with blank symbols.
Read/write head moves left or right.
Accepts when reaching the accepting state.
See also
TuringMachine
1.3.4.2. LinearBoundedAutomaton — Type 1¶
A Linear Bounded Automaton is a Turing Machine whose tape is bounded to a length proportional to the input. It recognises exactly the context-sensitive languages.
Restriction over TuringMachine:
Tape size bounded:
limitsenforced per dimension.Head raises
IndexErrorif it reaches a tape boundary.
See also
LinearBoundedAutomaton
1.3.4.3. PushdownAutomaton — Type 2¶
A Pushdown Automaton replaces the tape with a LIFO stack. Its transition function
maps a (state, input_symbol, stack_top) triple to a (next_state, stack_ops)
pair, where stack_ops is the list of symbols pushed after popping the stack top.
Restriction over LinearBoundedAutomaton:
No tape: memory is a stack (last-in, first-out).
Input is read sequentially — no random access, no backtracking.
Acceptance by empty stack (bottom marker convention).
Transition 5-tuple:
(state_from, input_symbol, stack_top, state_to, stack_ops)
Where stack_ops is a list of symbols pushed after popping stack_top:
[]— pure pop (no push).["A"]— replace top withA.["A", "B"]— pop, then pushB, thenA(Aends on top).
Note
Epsilon-transitions (input_symbol=None) are reserved and will be implemented
in v0.3.0. Passing None raises NotImplementedError in v0.1.0.
See also
PushdownAutomaton
1.3.4.4. FiniteStateAutomaton — Type 3¶
Note
FiniteStateAutomaton is planned for v0.2.0 and is not yet implemented.
A Finite State Automaton is a Pushdown Automaton with no stack: transitions depend only on the current state and the current input symbol. It recognises exactly the regular languages.
Restriction over PushdownAutomaton:
No stack: transition function is
(state, symbol) → state.Accepts when reaching a designated accepting state after consuming all input.