Nested stack automaton
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.[1][3]
Nested stack automata should not be confused with embedded pushdown automata, which have less computational power.Script error: No such module "Unsubst".
Formal definition
Automaton
A (nondeterministic two-way) nested stack automaton is a tuple Template:Angbr where
- Q, Σ, and Γ is a nonempty finite set of states, input symbols, and stack symbols, respectively,
- [, ], and ] are distinct special symbols not contained in Σ ∪ Γ,
- [ is used as left endmarker for both the input string and a (sub)stack string,
- ] is used as right endmarker for these strings,
- ] is used as the final endmarker of the string denoting the whole stack.[note 1]
- An extended input alphabet is defined by Σ' = Σ ∪ {[,]}, an extended stack alphabet by Γ' = Γ ∪ {]}, and the set of input move directions by D = {-1,0,+1}.
- δ, the finite control, is a mapping from Q × Σ' × (Γ' ∪ [Γ' ∪ {], []}) into finite subsets of Q × D × ([Γ* ∪ D), such that δ maps[note 2]
| Q × Σ' × [Γ | into subsets of Q × D × [Γ* | (pushdown mode), | |
| Q × Σ' × Γ' | into subsets of Q × D × D | (reading mode), | |
| Q × Σ' × [Γ' | into subsets of Q × D × {+1} | (reading mode), | |
| Q × Σ' × {]} | into subsets of Q × D × {-1} | (reading mode), | |
| Q × Σ' × (Γ' ∪ [Γ') | into subsets of Q × D × [Γ*] | (stack creation mode), and | |
| Q × Σ' × {[]} | into subsets of Q × D × {ε}, | (stack destruction mode), |
- Informally, the top symbol of a (sub)stack together with its preceding left endmarker "[" is viewed as a single symbol;[4] 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.
- q0 ∈ Q is the initial state,
- Z0 ∈ Γ 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 Template:Angbr, where
- q ∈ Q is the current state,
- [a1a2...ai...an-1] is the input string; for convenience, a0 = [ and an = ] is defined[note 3] The current position in the input, viz. i with 0 ≤ i ≤ n, is marked by underlining the respective symbol.
- [Z1X2...Xj...Xm-1] is the stack, including substacks; for convenience, X1 = [Z1 [note 4] and Xm = ] is defined. The current position in the stack, viz. j with 1 ≤ j ≤ m, is marked by underlining the respective symbol.
Example
An example run (input string not shown):
| Action | Step | Stack | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1: | [a | b | [k | ] | [p | ] | c | ] | |||||
| create substack | 2: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | [p | [r | s | ] | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | |
| pop | 3: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />[p | [s | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | ||
| pop | 4: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />[p | [] | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | |||
| destroy substack | 5: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />[p | ] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | ||||
| move down | 6: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />[p | ] | c | <templatestyles src="Template:Color/styles.css" />] | ||||
| move up | 7: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />[p | ] | c | <templatestyles src="Template:Color/styles.css" />] | ||||
| move up | 8: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | [p | ] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | ||||
| push | 9: | <templatestyles src="Template:Color/styles.css" />[a | <templatestyles src="Template:Color/styles.css" />b | <templatestyles src="Template:Color/styles.css" />[k | <templatestyles src="Template:Color/styles.css" />] | [n | o | p | <templatestyles src="Template:Color/styles.css" />] | <templatestyles src="Template:Color/styles.css" />c | <templatestyles src="Template:Color/styles.css" />] | ||
Properties
When 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.[5]
Gilman and Shapiro used nested stack automata to solve the word problem in virtually free groups, similarly to the Muller–Schupp theorem.[6]
Notes
<templatestyles src="Reflist/styles.css" />
- ↑ Aho originally used "$", "¢", and "#" instead of "[", "]", and "]", respectively. See Aho (1969), p.385 top.
- ↑ Juxataposition denotes string (set) concatenation, and has a higher binding priority than set union ∪. For example, [Γ' denotes the set of all length-2 strings starting with "[" and ending with a symbol from Γ'.
- ↑ Aho originally used the left and right stack marker, viz. $ and ¢, as right and left input marker, respectively.
- ↑ The top symbol of a (sub)stack together with its preceding left endmarker "[" is viewed as a single symbol.
Script error: No such module "Check for unknown parameters".
References
<templatestyles src="Reflist/styles.css" />
Script error: No such module "Check for unknown parameters".
Script error: No such module "Navbox".