[英]Finding the complement of a DFA?
我被要求顯示DFA圖和RegEx作為RegEx (00 + 1)*
的補充。 在之前的問題中,我必須證明DFA的補充是封閉的並且也是正則表達式,所以我知道要將DFA,M轉換為補碼,M`,我只需要交換初始接受狀態和最終接受國家。
但是,似乎RegEx的初始接受狀態是{00, 1, ^}
00,1 {00, 1, ^}
,最終接受狀態也是{00, 1, ^}
。 因此,交換它們只會產生完全相同的RegEx和DFA,這似乎是相互矛盾的。
我做錯了什么,或者這個RegEx應該沒有真正的補充?
謝謝
正如你所說的那樣:
我知道要將DFA,M轉換為補碼,M`,我只需要交換初始接受狀態和最終接受狀態。
它不是補充 ,但你正在做一些像 語言的逆轉和常規語言的逆轉 。
什么是逆轉語言?
語言L(表示為L R )的逆轉是由L中所有字符串的反轉組成的語言。
鑒於某些FA A的L是L(A),我們可以為L R構造一個自動機:
反轉轉換圖中的所有邊(弧)
L R自動機的接受狀態是A的開始狀態
為新自動機創建一個新的開始狀態,epsilon轉換為A的每個接受狀態
注意 :通過反轉其所有箭頭並交換DFA的初始和接受狀態的角色,您可能會獲得NFA。
這就是我寫FA(不是DFA)的原因
找到DFA的補充?
Defination:
語言的補語是根據與Σ*(sigma star)的集合差異來定義的。 那是L ' =Σ * - L.
並且L的補語(L ' )具有來自Σ*(sigma star)的所有字符串,除了L.Σ*中的字符串是字母表Σ上的所有可能的字符串。
Σ=語言符號集
要構造接受L的補碼的DFA D,只需將A中的每個接受狀態轉換為D中的非接受狀態,並將A中的每個非接受狀態轉換為D中的接受狀態。
( 警告!對於NFA來說不是這樣 )
A是L的DFA,D是補體
注意 :要構建補充DFA,舊的DFA必須是一個完整的手段,應該從每個狀態都可能出現邊緣(或者換句話說, δ
應該是一個完整的函數 )。
正則表達式的補充DFA
(00+1)*
以下是名為A的 DFA:
但是這個DFA不是完整的DFA。 過渡函數δ
是部分定義的,但不適用於全域Q×Σ
( 從標簽1
q1中錯過了邊緣 )。
其完整的DFA可以如下( A ):
在上面的DFA中,定義了所有可能的事務(*對於每對Q,Σ
*),在這種情況下δ
是一個完整的函數。
可以通過將所有最終狀態q0
改變為非最終狀態來構造新補碼DFA D,反之亦然。
因此在補充q0
變為非最終和q1, q2
是最終狀態。
現在,您可以使用ARDEN'S THEOREM和我給出的DFA為補充語言編寫正則表達式。
在這里,我直接寫補充正則表達式:
(00 + 1)*
0
(^ + 1(1 + 0)*)
其中^
是空符號。
一些有用的鏈接 :
從這里開始 ,通過我的個人資料,您可以在FA上找到更多有用的答案。 另外,關於常規語言屬性的兩個很好的鏈接: 一 , 二
我沒有花時間閱讀Grijesh的所有答案,但這是讓DFA接受語言補充的簡單方法,因為DFA接受語言:使用相同的DFA,但將接受狀態更改為不接受,反之亦然。
之前接受的字符串將被拒絕,之前拒絕的字符串將被接受。 由於必須在任何有效的DFA中定義所有轉換,並且由於所有輸入字符串都只導致一個狀態,因此這始終有效。
要獲得反轉的DFA,您可以首先通過添加一個新的初始狀態來構造NFA,該狀態非確定性地分支到原始DFA的所有接受狀態。 反轉原始DFA的所有轉換,並使唯一的接受狀態為原始DFA的初始狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.