簡體   English   中英

常規的haskell代數數據類型是否等同於上下文無關語法? GADTS怎么樣?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM