一般的 OCaml 函數可以寫成
let f x y z = ...
一個直覺的想法是:每個型別都解釋成一個可數集合,該型別的 term 解釋成這個集合的元素。但有些函數會用到自己本身,例如整數階乘函數
let rec fac n = if n = 0 then 1 else n * fac(n-1)
它的值是什麼呢?答案是
中的 就是 fac 自己,把原始 OCaml 程式中的 fac 換成 即可。問題是集合論沒有辦法充分解釋這個運算,具體來說,集合解釋不滿足 PCF 的 Adequacy theorem。
Theorem Adequacy (充分性定理) [math-CFN7]
If is closed term of ground type and for a value , then .
對一個形式系統來說,需要證明一個假定的 model 確實能表現系統的特徵,所以才需要證明這個定理。參考 computational adequacy
一般來說,只考慮構造與操作規則的話,可以記成下面這樣
Definition Rules of [math-TMY9]
Typing [local-0]
Operational (Big step) [local-1]
但我們想要知道在數學上可以用什麼物件表示運算子 ,也就是指稱語意 (denotational semantic),我先定義一個這個目標需要達成的等式。
基本的約束 [math-2C9J]
解釋 (interpretation)
必須是一個能滿足下面等式的 元素
註: 在後面講到語意解釋時會定義
問題是我們怎麼知道存在這麼一個元素呢?由於不動點定理,使得我們有動機把 解釋成 cpo,把計算解釋成 monotone function 再套用不動點定理。從而得到一個合理的定義:least fixed point 即是 的表示物件。
Definition 的解釋 [math-SSSU]
Notation [local-0]
這裡採用 表示數學中的函數, 是輸入 是輸出;但 則是指 中的 被替換成
在開始之前我們需要大概了解 這個解釋的定義。
- 當 是型別,則 是一個 cpo
- 當 是型別,則 是一個連續函數,domain 是 而 codomain 是
- 是一個 -環境,幫每個 中的變數 定義一個 , 是一個型別
- ,要解釋成三種情形
-
需要 函數的部分,當我們在程式語言中寫下
let f : T = M時,就在 這個部分函數中加入了 的定義,注意到 是部分函數,因為也可能被問到未綁定的變數 ,這時候 -
為程式函數找一個數學函數作為解釋
-
直接調用作為解釋的數學函數
-
Definition 的解釋結果 [math-IG9K]
本身的公式倒沒有很複雜
其中數學函數 是
但我們怎麼確認 的存在?我們已經知道 是 cpo。根據不動點定理我們知道只要再證明 是連續函數即可;接著根據下面的定理我們可以知道這能夠套用到任意來自 ground type 的 functional 上
Proposition (cpo)-continuous function space is a cpo [math-LVSY]
If and are cpo, then the continuous function space
is a cpo under the pointwise order.
再來就可以選擇 least fixed point 作為 的解釋
其中
不過這條鏈 不需要是唯一的,只要對任何一條都能這樣推理即可。
要證明函數 對所有 -環境 都成立有點麻煩,需要歸納所有的語法構造,所以這裡就跳過。或許哪天我會寫這部分,不過有興趣的讀者可以先參考 Gunter 的書的第四章,或是自己根據 PCF 這個 metalanguage 進行證明。Sterling 的演講 Synthetic Domains in the 21st Century 也是很好的資源。