柯里 - 霍華德同構

以函數語言程式設計寫作的：在 Coq 軟體中自然數加法交換性的證明。natind 代表數學歸納，eqind 代替等於，f_equal 代表在等式兩邊取同樣的函式。 前面的定理參照顯示 m = m + 0 和 S（m + y）= m + S y。

柯里 - 霍華德對應（Curry-Howard correspondence）是在計算機程式和數學證明之間的緊密聯絡；這種對應也叫做柯里 - 霍華德同構、公式為型別對應或命題為型別對應。這是對形式邏輯系統和數學運算之間符號的相似性的推廣。它被認為是由美國數學家哈斯凱爾・柯里和邏輯學家威廉・阿爾文・霍瓦德（William Alvin Howard）獨立發現的。

對應的起源、範圍和結論

對應可以在兩個層面上看到，首先是類比層次，它聲稱對一個函式計算出的值的型別的斷言可類比於一個邏輯定理，計算這個值的程式可類比於這個定理的證明。在理論計算機科學中，這是連線 λ 演算和型別論的毗鄰領域的一個重要的底層原理。它被經常以下列形式陳述為 “證明是程式”。一個可選擇的形式化為 “命題為型別”。其次，更加正式的，它指定了在兩個數學領域之間的同構，就是以一種特定方式形式化的自然演繹和簡單型別 λ 演算之間是雙射，首先是證明和項，其次是證明歸約步驟和 beta 歸約。

有多種方式考慮柯里 - 霍華德對應。在一個方向上，它工作於 “把證明編譯為程式” 級別上。這裡的 “證明” 最初被限定為在構造性邏輯中 — 典型的是直覺邏輯系統中的證明。而 “程式” 是在常規的函數語言程式設計的意義上的；從語法的觀點上看，這種程式是用某種 λ 演算表達的。所以柯里 - 霍華德同構的具體實現是詳細研究如何把來自直覺邏輯的證明寫成 λ 項。（這是霍華德的貢獻；柯里貢獻了組合子，它是相對於是高階語言的 λ 演算是能寫所有東西的機器語言）。最近，同樣處理經典邏輯的柯里 - 霍華德對應的擴充套件可被公式化了，透過對經典有效規則比如雙重否定除去和皮爾士定律關聯上明確的用續體比如處理的一類項。

還有一個相反的方向，對一個程式的正確性關聯上 “證明提取” 的可能性。這在非常豐富的型別論環境中是可行的。實際上理論家對推進非常豐富型別的函數語言程式設計語言的開發的動機，已經部分地混合了希望帶給柯里 - 霍華德對應更加顯著的地位的因素。

型別

依據 λ 演算，我們將使用 λx.E 來指示帶有形式引數 x 和函式體 E 的函式。在應用於引數比如 a 的時候，這個函式生成 E，並帶有 x 的所有自由出現都被替換為 a。有效的 λ 演算表示式有如下形式之一：

v（這裡的 v 是個變數）
λv.E（這裡的 v 是個變數，而 E 是個 λ 演算表示式）
(E F)（這裡的 E 和 F 是 λ 演算表示式）

通常我們將縮寫 (（A B）C) 為 (A B C)，縮寫 λa.λb.E 為 λab.E。一個表示式被稱為是 “閉合的”，如果它不包含自由變數。

2.1 型別確定規則

型別可以依賴於型別變數，它被指示為小寫的希臘字母 α, β 等等。在我們概念中型別變數是被隱含的全稱量化的，就是說，如果一個值有包括型別變數的一個型別，則它必須由這個型別變數的所有可能例項組成。我們可以定義任意表達式的型別為如下：

一個變數比如 x 可以有任意型別。
如果變數 x 有型別 α，而表示式 E 有型別 β，則 λx.E 有指示為 α→β 的型別；就是說，它是取型別 α 的值，並對映到型別 β 的值。
在表示式 (E F) 中，如果 F 有型別 α，則 E 必須有型別 α→β（就是說它必須是期望型別 α 的引數的函式）並且這個表示式有型別 β。

例如，考慮函式 K = λa.λb.a。假定 a 有型別 α 而 b 有型別 β。則 λb.a 有型別

β→α，而 λa.λb.a 有型別 α→(β→α)。我們接受→是右結合的約定，所以這個型別也可以寫為 α→β→α。這意味著 K 函式接受型別 α 的引數並返回一個函式，它接受型別 β 的引數並返回型別 α 的值。

類似的，考慮函式 B = λa.λb.λc.(a (b c))。假定 c 有型別 γ，則 b 必須有形如 γ→β 的某種型別，表示式 (b c) 有型別 β。a 必須有形如 β→α 的某種型別，表示式 (a (b c)) 有型別 α。那麼 λc.(a (b c)) 有型別 γ→α；λb.λc.(a (b c)) 有型別 (γ→β)→γ→α，而 λa.λb.λc.(a (b c)) 有型別 (β→α)→(γ→β)→γ→α。你可以把這解釋為意味著 B 函式接受型別 (β→α) 的引數和型別 (γ→β) 的引數並返回一個函式，它接受型別 γ 的引數並返回型別 α 的結果。

2.2 型別居留問題

很明顯 λ- 表示式可以有非常複雜的型別。你可能要問是否有帶有給定型別的 λ- 表示式。找到帶有特定型別的 λ- 表示式的問題叫做型別居留問題。

答案是非常引人注目的：有帶有特定型別的閉合 λ- 表示式，當且僅當這個型別對應於一個邏輯定理，在這裡的→符號再次解釋為意味著邏輯蘊涵的時候。

例如，考慮恆等函式 λx.x，它接受型別 ξ 的引數並返回型別 ξ 的結果，所以有型別 ξ→ξ。ξ→ξ 當然是邏輯定理：給定一個公式 ξ，你可以結論出 ξ。

K 函式的型別 α→β→α 也是一個定理。如果已知 α 為真，則你可以結論出如果 β 為真就能推出 α。這有時也叫做重複規則。B 的型別是 (β→α)→(γ→β)→γ→α。你可類似的把它解釋為邏輯重言式；如果已知 (β→α) 為真，則如果已知 (γ→β) 為真，你就能推出 γ 蘊涵 α。

在另一方面，考慮 α→β，它不是定理。明顯的沒有這種型別的 λ- 項；它必定是接受型別 α 的引數並返回某個完全無關的和未約束型別的結果的函式。這是不可能的，因為你不能從這種函數里得到什麼東西，除非把它放到其他什麼地方之中。

儘管有型別 β→(α→α) 的函式（比如，λb.λa.a，它接受一個引數 b，忽略引數，並返回恆等函式），卻沒有型別 (α→α)→β 的函式，如果存在的話，它會是轉換恆等函式到任意值的函式。

2.3 直覺邏輯

儘管所有居留型別對應於邏輯定理為真，逆命題卻不為真。即使我們限制我們的嘗試到只包含→運算的邏輯公式，所謂的邏輯的蘊涵片段，不是所有經典有效的邏輯公式是居留型別。例如，型別 ((α→β)→α)→α 是非居留的，儘管叫做皮爾士定律的對應邏輯公式是重言式。

直覺邏輯是比經典邏輯弱的系統。經典邏輯把自身關注於在抽象的、柏拉圖主義意義上為真的公式，而直覺邏輯只在可以為它構造一個證明的時候認為公式為真。公式 α ∨ ¬α 示例了這種區別；它是經典邏輯的一個定理而不是直覺邏輯的定理。儘管它是經典的真的，在直覺邏輯中這個公式斷言了我們要麼證明 α 要麼證明 ¬α。因為我們不是總能做到這些事情之一，它不是直覺邏輯的一個定理。

在居留型別和有效邏輯公式之間的對應完全是雙向的，如果我們限制我們的注意力到直覺邏輯的蘊涵片段（這也叫做希爾伯特代數）。

希爾伯特演繹系統和組合子邏輯的對應

形式上刻畫直覺邏輯的一個簡單方式是希爾伯特演繹系統。它有兩個公理模式。所有形式為

 α→β→α

的公式都是公理，所有形式為

 (α→β→γ)→(α→β)→α→γ

的公式都是公理。

唯一的演繹規則是肯定前件，它聲稱如果我們已經證明了兩個定理，一個有形式 α→β 而另一個有形式 α，我們可以結論出 β 也是定理。以這種方式推匯出來的公式的集合正好是直覺邏輯的集合。特別的是，皮爾士定律不能以這種方式演繹。（對皮爾士定律不能以這種方式演繹的證明請參見海廷代數條目）。

如果我們增加皮爾士定律為第三個公理模式，這個系統就有能力證明在經典邏輯的蘊涵片段中的所有定理。

考慮 λ- 表示式的下列兩個函式：

 K: λxy.x

 S: λxyz.(x z (y z))

可以證明任何函式都可以透過適當的 K 和 S 相互應用來建立。（有關證明請參見組合子邏輯）。例如，上面定義的函式 B 等價於 (S (K S) K)。如果一個函式比如 B，可以表達為 S 和 K 的複合，則這個表示式可以直接轉換成型別 B 的一個證明，它被解釋為邏輯公式，是直覺邏輯的一個定理。本質上，K 的外觀對應於第一個公理模式的使用，S 的外觀對應於第二個公理模式的使用，而函式應用對應於肯定前件演繹規則的使用。

第一個公理模式是 α→β→α，並且它精確的是 K 函式的型別；類似的第二個公理模式 (α→β→γ)→(α→β)→α→γ，是 S 函式的型別。肯定前件聲稱如果我們有兩個表示式，一個型別是 α→β（就是說，接受型別 α 的值並返回型別 β 的值）而另一個型別是 α（就是說，型別 α 的值），則我們應當能夠找到型別 β 的值；明顯的，我們可以透過應用這個函式到這個值之上來得到；結果會有型別 β。

3.1 證明 α→α

作為一個簡單的例子，我們將構造定理 α→α 的證明。這是恆等函式 I = λx.x 的型別。函式 ((S K) K) 等價於恆等函式。作為對證明的描述，它聲稱了我們需要首先應用 S 到 K。我們做如下：

 α→β→α

 (α→β→γ)→(α→β)→α→γ

如果我們在 S 中設 γ = α，我們得到：

 (α→β→α)→(α→β)→α→α

因為這個公式的前件 (α→β→α) 是一個已知定理，並且實際上正好是 K，我們可以應用肯定前件並推匯出後件：

 (α→β)→α→α

這是函式 (S K) 的型別。現在我們需要應用這個函式到 K。我們再次操縱公式使得前件看起來像 K，這次我們替代 β 為 (β→α):

 (α→β→α)→α→α

我們再次應用肯定前件來推出後件：

 α→α

我們完成了。

一般的說，這個過程是隻要程式包含形如 (P Q) 的應用，我們應當首先證明對應於 P 和 Q 的型別的定理。因為 P 要被應用於 Q，對於某種 α 和 β，P 的型別必定有形式 α→β 而 Q 的型別必定有形式 α。我們可以透過肯定前件規則推出 β。

3.2 證明 (β→α)→(γ→β)→γ→α

作為一個更加複雜的例子，我們看對應於函式 B 的定理的證明。B 的型別是 (β→α)→(γ→β)→γ→α。B 等價於 (S (K S) K)。這是對證明定理 (β→α)→(γ→β)→γ→α 的指引。

首先我們需要構造 (K S)。我要使 K 公理的前件看起來像 S 公理，透過設定 α 等於 (α→β→γ)→(α→β)→α→γ，和 β 等於 δ:

 α→β→α

 ((α→β→γ)→(α→β)→α→γ)→δ→(α→β→γ)→(α→β)→α→γ

因為前件正好是 S，我們可以推出後件：

 δ→(α→β→γ)→(α→β)→α→γ

這是對應於 (K S) 的定理。現在我們要應用 S 到這個表示式。取得 S

 (α→β→γ)→(α→β)→α→γ

我們設定 α = δ，β = (α→β→γ) 和 γ = ((α→β)→α→γ)，生成

(δ→(α→β→γ)→(α→β)→α→γ)→(δ→(α→β→γ))→δ→(α→β)→α→γ

我們可以接著推出後件：

 (δ→α→β→γ)→δ→(α→β)→α→γ

這是型別 (S (K S)) 的公式。這個定理的一個特殊情況有 δ = (β→γ):

 ((β→γ)→α→β→γ)→(β→γ)→(α→β)→α→γ

我們需要應用最後這個公式到 K。我們再次特殊化 K，這次是替代 α 為 (β→γ)，替代 β 為 α:

 α→β→α

 (β→γ)→α→(β→γ)

這同於前者公式的前件，所以我們推出後件：

 (β→γ)→(α→β)→α→γ

交換變數 α 和 γ 的名字得到

 (β→α)→(γ→β)→γ→α

這就是我們要證明的。

自然演繹和 lambda 演算的對應

在下表第一列中的推導規則定義了直覺蘊涵自然演繹（為蘊涵連結詞準備一個介入和一個除去規則）的標準系統。在第二列中給出 - 演算的標準型別指派（賦值）系統。

相繼式演算

希爾伯特式證明是很難構造的。證明邏輯定理的更加直覺的方式是根岑的相繼式演算。相繼式演算以同希爾伯特式證明對應於組合子表示式一樣的方式對應於 λ- 表示式程式。

直覺邏輯的蘊涵片段的相繼式演算規則是：

 (公理)

 (Right →)

 (Left →)

Γ 表示上下文，它是假設的集合。指示假定上下文 Γ 我們可以證明 a。邏輯定理完全由其證明不需要假設的那些公式 t 組成的；就是說，t 是一個定理，當且僅當我們可以證明。詳情請參見相繼式演算。

在相繼式演算中的證明是樹，它的根是我們要證明的定理，而它的葉子是公理模式例項；每個內部節點必須標記為要麼 Right →要麼 Left →，並且必須包含依據指定規則從子節點推出的一個公式。

相繼式演算證明緊密的對應於 λ- 演算表示式。斷言可以被解釋為意味著，給定帶有在 Γ 中列出型別的值，我們可以製造帶有型別 a 的一個值。公理對應於帶有新的無約束的型別的新變數介入。

Right →規則對應於函式抽象：

 (Right →)

什麼時候我們能結論出某個程式 Γ 包含型別 α→β 的函式？在 Γ 加上型別 α 的一個值的時候，包含了足夠的機械來允許我們製造型別 β 的一個值。

Left →規則對應於函式應用：

 (Left →)

如果我們可以製造型別 α 的一個值，並且如果給出型別 β 的一個值，我們還可以製造型別 γ 的一個值，則型別 α→β 的一個函式將允許我們製造型別 γ 的一個值：首先我們可以製造 α，接著應用 α→β 函式於它，並接著使用結果的 β 值來製造型別 γ 的一個值。

5.1 例子

例如，(β→α)→(γ→β)→γ→α 的相繼式演算如下：

(β→α)→(γ→β)→γ→α 的證明告訴我們如何製造帶有這個型別的一個 λ- 表示式。首先，介入分別帶有型別 α 和 β 的變數 a 和 b。Left →規則聲稱制造程式 (λb.a b)，它構造型別 α 的一個值。我們再次使用 Left →來構造 (λb.a (λg.b g))，它仍有型別 α。