上下文無關文法與推導

推導步驟(derivation step)

推導步驟是文法的單一原子動作:一次重寫、一條規則、一個變數被替換。如果完整的推導是從起始符號到成品字串的整段旅程,那麼推導步驟就是途中的一步。文法所做的一切,不過是把許多這樣的小動作串連起來。

形式上,當 v 是由 u 取其中某個變數 A 的單一出現處、用某條產生式規則 A → α 的右側替換而得時,我們寫 u => v(一步)。所以若 u = xAy(x 與 y 是任意符號字串)而文法有規則 A → α,則 xAy => xαy 為一步。帶星號的雙箭頭 =>* 是自反遞移閉包:u =>* w 表示 u 經零步或多步這樣的動作到達 w(零步表示 u 等於 w)。推導於是不過是個別步驟的鏈 u0 => u1 => ... => un。

單步關係是「生成」之意的形式核心,也是讓我們得以用歸納法推理文法的依據:許多關於 CFG 的證明(例如某文法生成某語言)都是對推導步驟的「數量」作歸納。請注意,單一步驟總是「恰好」重寫一個變數的「一個」出現處——你不能在一步中重寫兩個變數,而選哪個出現處則是自由的選擇,除非你固定如最左或最右這樣的紀律。

以規則 A → 0 A 1,字串「0 A 1」一步變成「0 0 A 1 1」:0A1 => 00A11。我們把那單一個 A 替換成它的右側 0 A 1,周圍的符號保持不動。

u => v:用一條規則替換恰好一個變數的一個出現處;=>* 串接零步或多步這樣的步驟。

一步只重寫一個變數的一個出現處——絕不同時重寫兩個。帶星號的 =>* 允許零步,所以 w =>* w 恆成立。

又称
one-step derivationdirect derivation單步推導直接推導