跳至內容

形式語言

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

數學邏輯計算機科學中,形式語言(英語:Formal language)是用精確的數學或機器可處理的公式定義的語言。

語言學中語言一樣,形式語言一般有兩個方面:語法語義。專門研究語言的語法的數學和計算機科學分支叫做形式語言理論,它只研究語言的語法而不致力於它的語義。在形式語言理論中,形式語言是一個字母表上的某些有限長字符串集合。一個形式語言可以包含無限多個字符串。

語言的形式定義

字母表與字符串

語言定義在某一個特定的字母表上,字母表(經常記作 Σ )可以為任意有限集合。例如集合就表示所有小寫字母構成的字母表。

字符串是字母表中的元素構成的有窮序列,以之前定義的小寫字母表為例,「hello」,「wikipedia」,「abcjkg」都是上面的串,而「AbCd」就不是上面的串了。記號 ε 表示空串——它是一個特殊的長度為0的串。

語言

直覺上,一個語言是字母表所能構成的所有串的集合的一個子集,具體來說:

對於任意一個字母表,記全體長度為 n 的子串為,特別的,規定 為{ε},則還可以定義

包含了字母表所能構成的所有字符串。語言(一般記為 L )定義為的任意子集。

下面給出一些語言的例子,是一個包含兩個字符串的集合,也可以被視為小寫字母構成的字母表上的一個語言。而實際上研究的語言的例子則常常更為複雜,例如所有合法的C語言程序串構成的集合也可以視作ASCII上的一個語言(假定編譯器只支持英文符號)。

需要注意的一點是,空子集 ∅ 與只包含空串的語言 {ε} 是兩個不同的語言。

語言間的運算

語言間的運算就是 Σ*冪集上的運算。

  • 字符串集合的交集併集差集等運算。
  • 連接運算:L1L2 = { xy | x 屬於L1並且 y 屬於L2 }。
  • 冪運算:Ln = L … L (共 n 個 L 連接在一起),L0 = {ε}。
  • 閉包運算:L* = L0∪L1∪…∪Ln∪…。
  • 右商運算:L1/L2 = {x | 存在 y 屬於L2使得 xy 屬於L1}。
  • S ⊆ Σ* 是一個語言,S 的補語言定義為集合 {ω | ω ∈ Σ* 且 ω ∉ S}

語言的表示方法

不像自然語言,一個形式語言作為一個集合,需要有某種明確的標準來定義一個字符串是否是它的元素。這可以通過多種方法來完成,下面將給出一些例子:

枚舉法

如果一個形式語言的元素數目是有限的,那麼可以通過枚舉它的各個字串來嚴格地定義它。

形式文法

通過形式文法來產生(參見喬姆斯基譜系)。

正則表達式

正則表達式是一種很多編程語言和庫都支持的語法,這種語法可以用於匹配符合一定條件的字符串,經常用於文本的搜索和過濾。從名稱上來說,正則表達式應當是對應於正則語言的,在形式語言領域內所稱的正則表達式確實如此。不過,在實際的編程語言中,很多正則表達式已經通過引入複雜的擴展,可以匹配正則表達式所不能描述的內容。形式語言中的正則表達式和一般編程語言中所稱的正則表達式在語法上也有較大差異。

自動機

直覺上來說,自動機消耗輸入符號,並在自身的不同狀態間轉移,可以通過狀態機消耗完整個字符串之後是否達到某些特定狀態來定義一個字符串是否屬於某一個語言。語言可以通過某種自動機來識別,比如圖靈機有限狀態自動機

參考文獻

參見

外部連結