In automata theory, a nested stack automaton is a finite automaton that can make use of a stack containing data which can be additional stacks.[1] Like a stack automaton, a nested stack automaton may step up or down in the stack, and read the current symbol; in addition, it may at any place create a new stack, operate on that one, eventually destroy it, and continue operating on the old stack. This way, stacks can be nested recursively to an arbitrary depth; however, the automaton always operates on the innermost stack only.
A nested stack automaton is capable of recognizing an indexed language,[2] and in fact the class of indexed languages is exactly the class of languages accepted by one-way nondeterministic nested stack automata.[3]
Nested stack automata should not be confused with embedded pushdown automata, which have less computational power.
A (nondeterministic two-way) nested stack automaton is a tuple (Q,Σ,Γ,δ,q0,Z0,F,[,],]) where
Informally, the top symbol of a (sub)stack together with its preceding left endmarker "[" is viewed as a single symbol;<ref>Aho (1969), p.385 top</ref> then δ reads :* the current state, :* the current input symbol, and :* the current stack symbol, : and outputs :* the next state, :* the direction in which to move on the input, and :* the direction in which to move on the stack, or the string of symbols to replace the topmost stack symbol. * ''q''<sub>0</sub> ∈ ''Q'' is the initial state, * ''Z''<sub>0</sub> ∈ Γ is the initial stack symbol, * ''F'' ⊆ ''Q'' is the set of final states. ===Configuration=== A '''configuration''', or '''instantaneous description''' of such an automaton consists in a triple {{angbr| ''q'', [''a''<sub>1</sub>''a''<sub>2</sub>...<u>''a''<sub>''i''</sub></u>...''a''<sub>''n''-1</sub>], [''Z''<sub>1</sub>''X''<sub>2</sub>...<u>''X''<sub>''j''</sub></u>...''X''<sub>''m''-1</sub>''']}},where
An example run (input string not shown):
Action | Step | Stack | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1: | [''a'' || style="font-family:monospace"| ''b'' || style="font-family:monospace"| [''k'' || style="font-family:monospace"| ] || style="font-family:monospace"| [''p''</u> || style="font-family:monospace"| ] || style="font-family:monospace"| c || style="font-family:monospace"| ] | ||||||||||||
create substack | 2: | [''p'' || style="font-family:monospace"| <u>[''r''</u> || style="font-family:monospace"| ''s'' || style="font-family:monospace"| ] || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| |-| pop| 3: | style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| [''s''</u> || style="font-family:monospace"| {{color|#808080|]}} || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| | |-| pop| 4:| style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| [] || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| | colspan=2 | |-| destroy substack| 5:| style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| ] || style="font-family:monospace"| || style="font-family:monospace"| | colspan=4 | |-| move down| 6:| style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| || style="font-family:monospace"| ] | c | ||||||||||
move up | 7: | ] | c | ||||||||||
move up | 8: | [''p''</u> || style="font-family:monospace"| ] | |||||||||||
push | 9: | [''n''</u> || style="font-family:monospace"| ''o'' || style="font-family:monospace"| ''p'' || style="font-family:monospace"| {{color|#808080|]}} || style="font-family:monospace"| || style="font-family:monospace"| | colspan=2 | |}PropertiesWhen automata are allowed to re-read their input ("two-way automata"), nested stacks do not result in additional language recognition capabilities, compared to plain stacks.[6] Gilman and Shapiro used nested stack automata to solve the word problem in certain groups.[7] References |