Synchronizing characteristic spines #
Two independent operational run summaries do not determine an active characteristic spine: in particular, successive drain pops can have the same visible cut and the same transition output. The synchronization theorem must therefore retain the syntactic spine ancestry. This file first records the common-child completion facts used by that ancestry-sensitive argument.
A list-introducing edge together with its normalized concrete ancestry and
the chosen terminal completion of the child's visible prefix. Unlike
ListTransitionRun, this relation retains the actual final grammar edge, so
successive drain pops cannot be confused with one another.
- read {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : DPDA Q T S} {p : List (symbol T (Nonterminal M))} {suffix preWord : List T} {context : List (StackSymbol M)} {q target next : State M} {a : T} {Z : StackSymbol M} {gamma : List (StackSymbol M)} (parent : ConcreteOperationalSpine M p (PDA_to_CFG.N.single q Z target) suffix preWord context) (htransition : (next, gamma) ∈ (emptyStackPDA M).transition_fun q a Z) (hrule : (PDA_to_CFG.N.single q Z target, [symbol.terminal a, symbol.nonterminal (PDA_to_CFG.N.list next gamma target)]) ∈ (characteristicGrammar M).rules) : ConcreteListIntroduction M (p ++ [symbol.terminal a]) next gamma target suffix (preWord ++ [a]) context (PDA_to_CFG.N.single q Z target) (PDA_to_CFG.N.single q Z target, [symbol.terminal a, symbol.nonterminal (PDA_to_CFG.N.list next gamma target)])
- epsilon {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : DPDA Q T S} {p : List (symbol T (Nonterminal M))} {suffix preWord : List T} {context : List (StackSymbol M)} {q target next : State M} {Z : StackSymbol M} {gamma : List (StackSymbol M)} (parent : ConcreteOperationalSpine M p (PDA_to_CFG.N.single q Z target) suffix preWord context) (htransition : (next, gamma) ∈ (emptyStackPDA M).transition_fun' q Z) (hrule : (PDA_to_CFG.N.single q Z target, [symbol.nonterminal (PDA_to_CFG.N.list next gamma target)]) ∈ (characteristicGrammar M).rules) : ConcreteListIntroduction M p next gamma target suffix preWord context (PDA_to_CFG.N.single q Z target) (PDA_to_CFG.N.single q Z target, [symbol.nonterminal (PDA_to_CFG.N.list next gamma target)])
- splitRight {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : DPDA Q T S} {p : List (symbol T (Nonterminal M))} {suffix preWord leftWord : List T} {context : List (StackSymbol M)} {q middle target : State M} {Z : StackSymbol M} {gamma : List (StackSymbol M)} (parent : ConcreteOperationalSpine M p (PDA_to_CFG.N.list q (Z :: gamma) target) suffix preWord context) (hlength : ↑(Z :: gamma).length ≤ PDA_to_CFG.max_push (emptyStackPDA M)) (hrule : (PDA_to_CFG.N.list q (Z :: gamma) target, [symbol.nonterminal (PDA_to_CFG.N.single q Z middle), symbol.nonterminal (PDA_to_CFG.N.list middle gamma target)]) ∈ (characteristicGrammar M).rules) (hleft : (characteristicGrammar M).DerivesRightmost [symbol.nonterminal (PDA_to_CFG.N.single q Z middle)] (List.map symbol.terminal leftWord)) : ConcreteListIntroduction M (p ++ [symbol.nonterminal (PDA_to_CFG.N.single q Z middle)]) middle gamma target suffix (preWord ++ leftWord) context (PDA_to_CFG.N.list q (Z :: gamma) target) (PDA_to_CFG.N.list q (Z :: gamma) target, [symbol.nonterminal (PDA_to_CFG.N.single q Z middle), symbol.nonterminal (PDA_to_CFG.N.list middle gamma target)])
- start {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : DPDA Q T S} {target : State M} (hrule : (PDA_to_CFG.N.start, [symbol.nonterminal (PDA_to_CFG.N.list (emptyStackPDA M).initial_state [(emptyStackPDA M).start_symbol] target)]) ∈ (characteristicGrammar M).rules) : ConcreteListIntroduction M [] (emptyStackPDA M).initial_state [(emptyStackPDA M).start_symbol] target [] [] [] PDA_to_CFG.N.start (PDA_to_CFG.N.start, [symbol.nonterminal (PDA_to_CFG.N.list (emptyStackPDA M).initial_state [(emptyStackPDA M).start_symbol] target)])
Instances For
The concrete introduction contains the normalized concrete spine of its child.
Every replacement stack carried by a concrete list introduction satisfies the characteristic grammar's uniform push bound.
Every visible prefix of a list-introducing edge has a terminal
completion. For a split edge, productivity of the exposed left single
supplies the additional completed segment.
Normalize a list-introducing active edge after choosing a terminal completion of its child prefix. The returned witness retains both the exact last edge and the concrete ancestry leading to its parent.
A nonterminal occurring in a retained characteristic rule has a terminal rightmost completion.
The list child selected by a concrete introduction has a terminal completion, independently of the surrounding active suffix.
The focused continuation of a concrete introduction starts at its list target with exactly the saved suffix and outer context.
A terminal completion of a characteristic list child realizes its encoded net-pop computation under every saved outer stack context.
Completing a list child and then following its focused continuation gives an accepting continuation from the child's concrete stack cut.
Concrete anchor comparison #
Recover the left visible anchor retained by a paired-anchor witness.
Recover the right visible anchor retained by a paired-anchor witness.
Paired visible anchors whose endpoint states both remain in the simulation component lie on one ordered normalized computation. This is the comparison needed for split-right/split-right anchors; read anchors admit the stronger literal equality proved below.
Read transitions of the normalized empty-stack machine have a unique output. The FS→ES wrapper introduces nondeterminism only through an epsilon edge into the drain, never between two reading edges.
Aligned concrete read anchors agree componentwise on their output cut, including the hidden outer context.
No transition of the FS→ES machine enters its distinguished boot state.
A globally reachable boot-state configuration is literally the initial configuration; no nonempty computation can return to boot.
All paired visible-anchor cuts are comparable. Read anchors are equal, split anchors use the deterministic simulation or drain phase, and the boot case reduces to the literal initial configuration.
Removing the untouched outer context of a zero-visible tail #
A zero-visible tail has a context-free operational realization. The
returned added block is exactly what the tail inserted immediately above
the anchor's untouched outer context.
A zero-visible tail cannot return nontrivially to the same list nonterminal on a productive spine. With no inserted context it is a useful cycle; with a nonempty inserted block it is useful stack growth.
Paired read/epsilon synchronization #
Any visible anchor aligned with a concrete read anchor is another read anchor with the same physical output data.
A concrete read edge and a concrete epsilon edge cannot introduce the same active list child. Aligning their last visible read anchors makes the epsilon side a productive nonempty return to the same physical list cut.
Active-spine form of concreteRead_epsilon_false, obtaining the common
visible-prefix completion and exact hidden contexts internally.