[英]Odd DFA for Language
有人可以幫我畫一個接受這種語言的NFA嗎?
{ w | the length of w is 6k + 1 for some k ≥ 0 }
我已經在這個問題上停留了幾個小時。 我不知道k
在哪里起作用以及在圖中如何使用...
{ w | the length of w is 6k + 1 for some k ≥ 0 }
我們可以使用Myhill-Nerode定理為該語言構造性地產生最小的DFA。 這是一個有用的練習。 首先,定義:
兩個字符串
w
和x
相對於語言L
iff是無法區分的 :(1)對於每個字符串y
,使得wy
在L
,xy
在L
; (2)對於每個字符串z
,使xz
在L
,wz
在L
。
Myhill-Nerode的見解是,如果兩個字符串與常規語言是無法區分的,則該語言的最小DFA將使該機器對於這兩個字符串最終處於相同狀態。 不可區分性是自反的,對稱的和可傳遞的,因此我們可以在其上定義等價類。 這些等效類直接對應於最小DFA中的狀態集。 現在,找到我們語言的等效類。 我們考慮長度增加的字符串,並針對每個字符串是否與之前的任何字符串都沒有區別:
e
(空字符串)之前沒有字符串。 我們需要一個狀態q0
來對應於該字符串所屬的對等類。 在e
之后到達L
的字符串的字符串集合是L
本身; 也寫成c(c^6)*
c
,任何長度為1的字符串,其前都只有e
。 但是,這些並不是無法區分的。 我們可以將e
添加到c
以得到ce = c
,這是L
的字符串,但是我們不能將e
添加到e
以獲取L
的字符串,因為e
不在L
。 因此,對於c
所屬的等價類,我們需要一個新的狀態q1
。 在c
之后到達L
的字符串的字符串集合為(c^6)*
。 q2
; 將cc
傳遞到L
的字符串的字符串集是ccccc(c^6)*
。 顯示這個。 q3
; 將ccc
轉換為L
的字符串的字符串集是cccc(c^6)*
。 顯示這個。 q4
; 將cccc
轉換為L
的字符串的字符串集合是ccc(c^6)*
。 顯示這個。 q5
; 將ccccc
轉換為L
的字符串的字符串集是cc(c^6)*
。 顯示這個。 cccccc
。 什么弦將我們帶到L
弦? 好吧, c
。 c
后面跟着任何長度為6的字符串也是如此。有趣的是,這與L
本身相同。 我們已經有了,一個等價類: e
還可以隨后以任何字符串L
得到一個字符串L
。 cccccc
和e
是無法區分的。 此外,由於所有長度為6的字符串都無法與較短的字符串區分開,因此我們不再需要繼續檢查較長的字符串。 我們的DFA保證具有已經確定的狀態q0
- q5
之一。 而且,我們上面所做的工作定義了我們在DFA中所需的過渡,初始狀態和接受狀態:
c
從狀態q
為狀態q'
如果x
是在對應於等價類的字符串q
和xc
是在對應於等價類的字符串q'
; e
所屬的等價類對應的狀態; q
接受是否有屬於該語言的等價類的任何字符串(因此所有字符串)都在該語言中; 或者,如果將等價類中的字符串作為L
的字符串的一組字符串包括e
,則為空字符串。 我們可以使用上面的注釋以表格形式編寫DFA:
q x q'
-- -- --
q0 c q1 // e + c = c
q1 c q2 // c + c = cc
q2 c q3 // cc + c = ccc
q3 c q4 // ccc + c = cccc
q4 c q5 // cccc + c = ccccc
q5 c q0 // ccccc + c = cccccc ~ e
我們以q0
作為初始狀態,唯一接受的狀態是q1
。
這是一個NFA,它將向前6個狀態前進,然后如果再有一個字符,它將在最終狀態下停止。 否則,它將不確定地循環回到開始狀態並經過最終狀態。
(Start) S1 -> S2 -> S3 -> S5 -> S6 -> S7 (Final State) -> S8 - (loop forever)
^ |
^ v |_|
|________________________| (non deterministically)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.