您可以使用定義語句語法(DCG)來實現有限狀態轉換器。雖然DCG在生產方面沒有提供太多的組合操作,但它們在實現識別方面非常出色。
所以你想要認識到的是兩種不同類型的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' 是Prolog的符號的字符代碼。在ascii中,我們有0'x = 120,0'1 = 49,0'2 = 50,這說明了結果。以上應該在大多數Prolog系統上運行,因爲它們支持DCG。
再見
定條款語法
http://en.wikipedia.org/wiki/Definite_clause_grammar
有限狀態傳感器
http://en.wikipedia.org/wiki/Finite_state_transducer
目前尚不清楚這些表格是如何表示的;你能舉個例子嗎?此外,你如何確定哪個「點」是第一個,哪個是第二個?你如何定義一個「點」? – 2012-01-05 14:47:29
這些表是它們的元素是列表的列表。點是相鄰的元素,值爲1。我想通過將一個點的元素僅從1變爲2來分開這兩個點 – user1118501 2012-01-05 14:54:48
沒有,沒有找到,對不起。 – 2012-01-08 16:57:25