[英]Are regular haskell algebraic data types equivalent to context free grammars? What about GADTS?
代數數據類型的語法與Backus-Naur Form的語法非常相似,后者用於描述無上下文語法。 這讓我想到,如果我們將Haskell類型檢查器看作語言的解析器,表示為代數數據類型(例如,表示終端符號的nularry類型構造函數),則接受的所有語言的集合與一組上下文免費語言? 另外,通過這種解釋,GADT可以接受哪些正式語言?
首先,數據類型並不總是描述一組字符串(即語言)。 也就是說,雖然列表類型的確如此,但樹型不會。 有人可能反駁說,我們可以將樹木“壓扁”成列表,並將其視為他們的語言。 然而,像數據類型呢
data F = F Int (Int -> Int)
或者更糟
data R = R (R -> Int)
?
多項式類型(沒有->
內部的類型)粗略地描述了可以展平的樹(按順序訪問),所以讓我們以這些為例。
正如您所觀察到的,將CFG寫為(多項式)類型很容易,因為您可以利用遞歸
data A = A1 Int A | A2 Int B
data B = B1 Int B Char | B2
以上A
表示{ Int^m Char^n | m>n }
{ Int^m Char^n | m>n }
。
GADT遠遠超出了無語境的語言。
data Z
data S n
data ListN a n where
L1 :: ListN a Z
L2 :: a -> ListN a n -> ListN a (S n)
data A
data B
data C
data ABC where
ABC :: ListN A n -> ListN B n -> ListN C n -> ABC
ABC
上面表達了(扁平化的)語言A^n B^n C^n
,它不是無上下文的。
你幾乎不受GADT限制,因為用它們編碼算術很容易。 也就是說,你可以建立一個類型Plus abc
這是一個非空當且僅當c=a+b
與皮亞諾土黃。 如果圖靈機m
在輸入m
上停止,你也可以構建一個非空的類型Halt nm
。 所以,你可以建立一種語言
{ A^n B^m proof | n halts on m , and proof proves it }
這是遞歸的(大概不是在任何更簡單的類中)。
目前,我不知道您是否可以在GADT中描述遞歸可枚舉(可計算可枚舉)的語言。 即使在停止問題的例子中,我也必須在GADT中包含“證明”術語以使其有效。
直觀地說,如果你有一個長度為n
的字符串並且想要針對GADT檢查它,你可以構建深度為n
所有GADT項,展平它們,然后與字符串進行比較。 這應該證明這種語言總是遞歸的。 但是,存在類型使得這種樹構建方法相當棘手,所以我現在還沒有明確的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.