Definite Clause Grammars (DCG) を使用して、有限状態変換器を実装できます。DCG は、プロダクション側で構成操作をあまり提供しませんが、認識側の実装には非常に優れています。
したがって、認識したいのは、2 つの異なるタイプの 1 の連続です。したがって、基本的に、入力行は Extended Backus Naur Form (EBNF) で次のようになると思います。
line :== exs run1 exs run2 exs | exs.
exs :== { "x" } "x".
run1 :== { "1" } "1".
run2 :== { "1" } "1".
認識の問題については、属性なしで DCG を書くことができます (以下は Prolog テキストです。ファイルに入れるか、?- [user] 経由で直接調べることができます)。
line --> exs, run1, exs, run2, exs | exs.
run1 --> "1", run1.
run1 --> "1".
run2 --> "1", run2.
run2 --> "1".
exs --> "x", exs.
exs --> "x".
いくつかの実行例を次に示します。
?- phrase(line,"xxx").
Yes
?- phrase(line,"xxx111xxx111xxx").
Yes
?- phrase(line,"xxx111xxx").
No
生産上の問題については、属性を DCG に追加するだけです。差分リストを使用すると、最も簡単に機能します。
line(I,O) --> exs(I,H), run1(H,J), exs(J,K), run2(K,L), exs(L,O) | exs(I,O).
run1([0'1|I],O) --> "1", run1(I,O).
run1([0'1|H],H) --> "1".
run2([0'2|I],O) --> "1", run2(I,O).
run2([0'2|H],H) --> "1".
exs([0'x|I],O) --> "x", exs(I,O).
exs([0'x|H],H) --> "x".
いくつかの実行例を次に示します。
?- phrase(line(R,[]),"xxx").
R = [120, 120, 120]
?- phrase(line(R,[]),"xxx111xxx111xxx").
R = [120, 120, 120, 49, 49, 49, 120, 120, 120, 50, 50, 50, 120, 120, 120]
?- phrase(line(R,[]),"xxx111xxx").
No
注: 0' は、文字コードの Prolog 表記です。アスキーでは、0'x = 120、0'1 = 49、0'2 = 50 となり、結果が説明されます。上記は DCG をサポートしているため、ほとんどの Prolog システムで動作するはずです。
さよなら
定句文法
http://en.wikipedia.org/wiki/Definite_clause_grammar
有限状態変換器
http://en.wikipedia.org/wiki/Finite_state_transducer