依賴類型

在計算機科學和邏輯中 ， 依賴類型 （ 或依存類型 ， dependent type ） 是指依賴於值的類型 ， 其理論同時包含了數學基礎中的類型論和計算機編程中用以減少程序錯誤的類型系統兩方面 。 在 Per Martin - Löf 的直覺類型論中 ， 依賴類型可對應於謂詞邏輯中的全稱量詞和存在量詞 ； 在依賴類型函數式編程語言如 ATS 、 Agda 、 Dependent ML 、 Epigram 、 F * 和 Idris 中 ， 依賴類型系統通過極其豐富的類型表達能力使得程序規範得以藉助類型的形式被檢查 ， 從而有效減少程序錯誤 。 依賴類型的兩個常見實例是依賴函數類型 （ 又稱依賴乘積類型 、 Π - 類型 ） 和依賴值對類型 （ 又稱依賴總和類型 、 Σ - 類型 ） 。 一個依賴類型函數的返回值類型可以依賴於某個參數的具體值 ， 而非僅僅參數的類型 ， 例如 ， 一個輸入參數爲整型值n的函數可能返回一個長度爲n的數組 ； 一個依賴類型值對中的第二個值可以依賴於第一個值 ， 例如 ， 依賴類型可表示這樣的類型 ： 它由一對整數組成 ， 其中的第二個數總是大於第一個數 。 依賴類型增加了類型系統的複雜度 。 由於確定兩個依賴於值的類型的等價性需要涉及具體的計算 ， 若允許在依賴類型中使用任意值的話 ， 其類型檢查將會成爲不可判定問題 ； 換言之 ， 無法確保程序的類型檢查一定會停機 。 由於Curry - Howard同構揭示了程序語言的類型論與證明論的直覺邏輯之間的緊密關聯性 ， 以依賴類型系統爲基礎的編程語言大多同時也作爲構造證明與可驗證程序的輔助工具而存在 ， 如 Coq 和 Agda （ 但並非所有證明輔助工具都以類型論爲基礎 ） ； 近年來 ， 一些以通用和系統編程爲目的的編程語言被設計出來 ， 如 Idris 。 一些以證明輔助爲主要目的的編程語言採用強函數式編程 （ total functional programming ） ， 這消除了停機問題 ， 同時也意味着通過它們自身的核心語言無法實現任意無限遞歸 ， 不是圖靈完全的 ， 如 Coq 和 Agda ； 另外一些依賴類型編程語言則是圖靈完全的 ， 如 Idris 、 由 ML 衍生而來的 ATS 和 由 F# 衍生而來的 F * 。