0

有沒有什麼竅門可以通過查看語言來猜測語言是否正規?如何確定給定的語言是否正規(僅通過查看語言)?

爲了選擇證明方法,我首先必須有一些假設。您是否知道在解決長期問題時需要減少時間消耗的任何提示/模式?

例如,爲了不花費時間抽水引理,當語言是規則的,我不想構建DFA /語法。

例如:

1. L={w ε {a,b}*/no of a in (w) < no of b in (w)} 
2. L={a^nb^m/n,m>=0} 

如何分辨它是通過看上面的例子正規?

回答

0

一般來說,在查看一種語言時,語言是否規則的一個好的經驗法則是想一個能夠讀取字符串並回答問題的程序「這是該語言中的字符串嗎?」要編寫這樣一個程序,你需要在變量中存儲一些任意值還是程序的狀態(也就是所有可能變量值的組合)限於一些有限的固定數量的可能性?如果語言可以被程序識別,程序只需要固定數量的只能有固定數量值的變量,那麼你就有一種常規語言。如果不是,那麼不是。

使用這個,我可以看到第一種語言不規則,但第二種語言是。在第一種語言中,我需要記住我見過多少個a,以及多少個b。 (或者至少,我需要跟蹤(#a s) - (#b s),並接受字符串結束而該計數爲負數的情況。與此同時,a s的數量沒有限制,所以這個數字可以任意大。

在第二語言中,我不在乎nm究竟是什麼。所以用第二種語言,我的程序只會記錄「我是否看到過至少一個b」?以確保我們在第一個b之後沒有任何a字符。 (所以,一個變量只有兩個值 - 真或假)

所以一個方法,使語言1到正規語言是改變它是:

1. L={w ∈ {a,b}*/no of a in (w) < no of b in (w), and no of a in (w) < 100} 

現在我不需要跟蹤我曾經看到的a的數量,一旦我達到100(因爲那時我自動知道該字符串不在該語言中),並且與b的數量相同 - 一旦我達到100,我就可以停止計數,因爲我知道這是足夠的,除非a s的數量本身太大。

,你應該注意這一個常見的情況是,當有人問你關於語言其中「a的號碼是13的倍數」或「瓦特∈{0,1} *和瓦特是13的倍數的二進制表示。有了這些,看起來好像需要跟蹤整個數字才能做出決定,但事實上並非如此 - 在這兩種情況下,只需保留一個可以從0到12計數的變量。因此,觀察用於「多種」類型的語言。(以及相關的「是奇數的」或「甚至是」或「不是13的倍數更是1」)雖然

其它數學屬性 - 例如,瓦特∈{0,1} *和瓦特是完美平方的二進制表示 - 將導致非正規語言。