122
4
章 能力を高める
図4-6
これは状態1から状態2へと導く規則を除いて、DPDAのときと同じです。DPDAでは入力から
m
を
読んでいましたが、NPDAでは自由移動を使っています。自由移動を使うことで、マーカーがなくても
入力文字の任意の場所で状態を変えることができます。
4.2.1
シミュレーション
非決定的な機械は決定的な機械よりもシミュレーションが難しくなりますが、難しい作業はすでに
「3.2.1 非決定性」にあるNFA でやりました。同じ考え方が NPDAにも使えます。まず非決定的な
PDARules
の集合を保持する
NPDARulebook
が必要になります。その実装は
NFARulebook
とほと
んど同じです。
require 'set'
class NPDARulebook < Struct.new(:rules)
def next_configurations(configurations, character)
configurations.flat_map { |config| follow_rules_for(config, character) }.to_set
end
def follow_rules_for(configuration, character)
rules_for(configuration, character).map { |rule| rule.follow(configuration) }
end
def rules_for(configuration, ...