タイトルは私が考えられる最善の方法で表現しましたが、明確にさせてください。Prolog で DFA をプログラミングする場合、一般的な方法は次のとおりです。
start(q0).
final(q2).
transition(q0, a, q1).
transition(q1, b, q1).
transition(q1, c, q2).
accept(Symbols) :- start(StartState), accept(Symbols, StartState).
accept([], State) :- final(State).
accept([Symbol|Symbols], State) :- transition(State, Symbol, NextState),
accept(Symbols, NextState).
このコードが何をするのか、その目的は何なのか、その他すべてを理解しています。私の頭を悩ませているのは、「受け入れる」ルールです。繰り返しますが、実行されていることの背後にあるロジックは理解していますが、理解していないのは、StartState と NextState の突然の使用です。これらはどこからともなく出てきて、そもそも start(StartState) がどのように true を返すのか、ましてや値がどこから来るのか理解できません。NextState を使用する場合も同様です。プロローグはこれらの中でどのような価値を「考えている」のか、そしてそれらは移行の事実によってどのように受け入れられているのでしょうか?
start(q0) という事実から始めると、start(StartState) はどうですか。真実?