有限オートマトンがPrologで2行で書けてワロタ
記号処理の授業でProlog勉強中。いろいろわかってきて面白くなってきたが、特に、Prolog処理系の探索機能の便利さに感動。これを使えば、有限オートマトンの文字列受理機構の部分がたった2行で書けるのにはワロタ。簡単な記号処理とかなら、Prologを使うというのもいいのかもしれないなあ。
今頃Prologを勉強して感動って遅れすぎだろとか言うなよ! 絶対言うなよ!
via Prologプログラミング: 言語処理 適宜改訂。
入力文字列の受理・非受理を判定する部分(acceptor.pl)。
fa(Q, [], Q). fa(Q_S, [A | S], Q_F) :- delta(Q_S, A, Q), fa(Q, S, Q_F).
扱う有限オートマトンのデータ(fa_data1.pl)。初期状態はq0で、受理状態はq3のみとする。
delta(q0, a, q1). delta(q1, a, q1). delta(q1, b, q1). delta(q1, a, q2). delta(q2, b, q3).
fa_data1.plが表す有限オートマトン(by Graphviz)。
実行例(on gprolog 1.3.0)。
| ?- fa(q0, [a, a, b], q3). true ? ; no | ?- fa(q0, [a, b, a], q3). no | ?- fa(q0, [a, b], q3). no | ?- fa(q0, [b, a, b], q3). no | ?- fa(q0, [a, b, b, b, a, b], q3). true ? ; no | ?-