形式語言與自動機|DFA識別句子

實驗二 DFA識別句子

1、實驗目的

加深對DFA工做原理的理解。

java

2、實驗內容

  • 1.設計固定DFA。也就是說用if-then-else(通常用來實現字母表中只有兩個字母的狀況)、switch(大於兩個字母的狀況)、for(用於控制輸入字符串,長度爲n的字符串,for循環n次)等語句表示DFA。一個函數定義一個DFA;
  • 2.設計文件形式存儲DFA。設計文件格式,DFA動態生成,使用字符串來驗證DFA的有效性和正確性;(使用面向對象的方法。對於k個狀態的DFA,生成相應的k個狀態對象;狀態轉換應經過對象間的消息傳遞來實現)
  • 3.圖形化表示。用java或者VC中圖形功能實現圖形化的dfa。(選做)

前置知識1:DFA

什麼是FA,也叫有窮狀態自動機;書上是這麼說的👇,是一個五元組(狀態集合,字母表,狀態轉移表,開始狀態,終止狀態集合)





什麼是DFA,也是一個五元組,在FA的基礎上加了一個約束條件:每個狀態結點只能發出一條具備相同符號的邊;也就是同一狀態不能發出(輸入字符相同的)兩條邊上。能夠發出輸入字符不一樣的多條邊


下圖就是一個DFA栗子👇編程




下圖就是NFA的栗子👇(容許從一個狀態發出多條具備相同符號的邊,甚至容許發出標有ε(表示空)符號的邊)
數據結構

完成這個實驗,只須要知道DFA就能夠了。

函數

前置知識2:有向圖

什麼是有向圖:由頂點和有方向的邊構成的圖



如何在程序中存儲有向圖?
可使用數據結構中學的「鄰接矩陣」
「鄰接矩陣」就是一個「二維表」
設計

DFA實質就是一個有向圖,各個頂點和其它頂點以前,使用有向邊相鏈接;而DFA的狀態轉移表,就是它的鄰接矩陣。


開始寫代碼1.設計固定DFA

採用面向對象的方式編程,沒有對象就new一個。3d

1-1:先寫一個狀態結點類

狀態結點類的總體構造是這樣的👇
對象

1-2:DFA類

DFA的總體構造是這樣的👇blog

5元組對應5個屬性,其它還應該有狀態表結點個數、字母表字符個數、最大存儲的結點個數等屬性。👇


遞歸

經過書上的一個DFA例子,理解一下狀態集合、終結點集合、字母表集合是這樣存儲的👇
字符串

1-3:幾個必要的函數


1-4:選一個栗子

選用例3-1 有窮自動機M: ({q0,q1,q2},{0},轉換函數,q0,{q2}),做爲樣例
這個自動機功能是:識別偶數個0,好比00是合法的句子;而000就是非法的句子。

狀態轉換表以下


下圖是例題3-1的DFA圖👇



init()函數初始化例3-1的自動機👇,把例3-1的五元組分別存儲到實例對象的5個屬性中




graphInit()函數初始化狀態轉換表



主要理解狀態轉換表(有向圖的鄰接矩陣)👇

狀態集合、終結點集合、字母表集合是這樣存儲的👇



而後試着理解狀態轉換表的存儲👇

1-5:核心,遞歸程序識別句子



run()啓動函數👇



dfs()核心遞歸程序👇

1-6:運行,效果



例3-1的DFA,功能:只識別偶數個0的句子。


主函數:




運行效果:


開始寫代碼2.文件形式存儲DFA

下次再寫吧。 有疑問能夠在評論區提出

相關文章
相關標籤/搜索