在這篇文章裡面我想要探討 Elaboration Zoo 裡面的 pattern unification 演算法怎麼算出來的,以及在什麼時候成立。主要是了解我們怎麼導出等式:
?α=?rhs′[spm−1]
超越 Elaboration zoo 中的合一演算法與隱式參數 僅是直覺的推理。在 Display map category 我們已經了解到,contexts 跟 substitutions 構成了一個範疇,而我們想要知道的是 epimorphism 的定義,所以 Kovacs 的第一步是把 epimorphism 定義改寫成更適合這個案例的定義
我們說 Sub Γ Δ 是 epimorphism iff
δ∘σ=δ′∘σ⇒δ=δ′A[σ]=A′[σ]⇒A=A′
這也導出了 term 的事實:u[σ]=u′[σ]⇒u=u′
我們關心一個 substitutions 中的子集:renamings
一個 substitution σ:Sub Γ Δ 如果純粹由變數構成,那麼它是 renaming,記成 σ:Ren Γ Δ
而且 Renaming 有以下特性
- 如果只用到 Γ 中的變數至多一次,那麼 σ 是 epimorphism
- 如果只用到 Γ 中的變數至少一次,那麼 σ 是 monomorphism
- 如果只用到 Γ 中的變數剛好一次,那麼 σ 是 isomorphism(context 的 permutation)
Renamings 還有一個子集叫 Embeddings,是 Δ 為 Γ 捨棄 0 到多個變數後組成的 context。
- 每個 embedding 都是 epimorphism
- embedding Γ→Γ 一定是 identity
Renaming σ 總是能被分解為(這個動作叫 strengthening,可以延伸到 type/term 的 substitution 上)
σm∘σe=σ
其中 σm 是一個 monomorphism,而 σe 是一個 embedding
Pattern unification 問題是,在某個 context Γ 下有等式
Γ⊢?α[sp]=?rhs
其中
- Δ⊢?α:A
- sp:Sub Γ Δ
- Γ⊢rhs:A[sp]
所謂的 pattern conditions 是以下 3 個條件
- sp 是一個 epimorphism 跟 renaming,可以分解成 spm∘spe
- rhs=rhs′[spe]
- α 這個 meta variable 在 rhs 中不是自由變數
sp 是 epimorphism 意味著 spm 也是 epimorphism,因此 spm 是 isomorphism,具有 inverse spm−1。從初始問題出發
?α[sp]=?rhs
分解 sp 得到
?α[spm∘spe]=?rhs
替換 rhs 得到
?α[spm][spe]=?α[spm∘spe]=?rhs′[spe]
embedding 是 epimorphism
?α[spm]=?rhs′
套上 spm−1
?α[spm∘spm−1]=?α[spm][spm−1]=?rhs′[spm−1]
inverse 對消
?α=?rhs′[spm−1]
這促使我們定義 ?α:=rhs′[spm−1],然後就只需要檢查 ?α 不是解的自由變量就可以了,原因參考 Elaboration with first-class implicit function types 的細節。直覺一點來說,本來的假定條件會導出 α 不是自由的,如果檢查卻發現它是自由的,就表示假定條件不成立。
最後
- 判斷 Renaming 是不是 epimorphism
- 分解 Renaming
- type/term 的 strengthening(如果 type theory 是 normalizing)
這三個演算法都是可判定的,因此 pattern unification 這個演算法是可判定的。而且由於分解唯一,解也是唯一的。