DCG(Definite Clause Grammars)を使用して、有限状態トランスデューサを実装することができます。 DCGはプロダクション側で多くの構成操作を提供しませんが、認識側の実装にはかなり優れています。
あなたが認識したいのは、2つの異なるタイプの1のランです。だから、基本的に、私は次のように拡張バッカスナウア記法(EBNF)に見える入力行を推測:認識問題については
line :== exs run1 exs run2 exs | exs.
exs :== { "x" } "x".
run1 :== { "1" } "1".
run2 :== { "1" } "1".
あなたは属性なしDCGを書くことができます(次にくるものがPrologのテキストである、あなたはで置くことができます経由して、それを相談するファイルを直接または - [ユーザー]):?
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' 文字コードのプロローグ表記法です。アスキーでは、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
これらの表がどのように表現されているかは不明です。あなたは例を挙げることができますか?さらに、どの「スポット」が最初で、どのスポットが第2であるかはどのようにして決めるのですか?そして、あなたはどのように「スポット」を定義しますか? –
これらのテーブルは、それらの要素がリストであるリストです。スポットは、近傍であり値1を持つ要素です。私は1つのスポットの要素を1から2に変えることで2つのスポットを分離したい。 – user1118501
いいえ、見つからない、申し訳ありません。 –