System Fàla Churchでは、for-all除去のために型推論を自動化できますか?


9

質問は次のとおりです。一般に、ような用語がある場合、インスタンスように、この用語を型に適用することで forallを削除できます。Λ X T [ T ] T [ X = T ]ΛX.t(ΛX.t)[T]t[X:=T]

ここで、これが矢印であり、引数を与えたいとすると、この項を適切な型に適用して、そのような引数を受け取ることができるようにする必要があります。それが私が自動化できるかどうかを尋ねています:2つの項を取り、型を返す関数を 構築して、が、でのというように、tは引数受け入れることができrはF < Λ X t > < r > X tff<ΛX.t><r>Xttr

いくつかの例:

  • f<ΛX.λxXX.t><λxT.x>=T

  • f<ΛX.λxX.r><(λxR.tT) s>=T


2
引数をfに下付き/上付き文字として指定しない場合、質問はもう少し読みやすくなります。それぞれ下付き/上付き文字が含まれます。
デイブクラーク

参考までに:この種の問題は、「ローカル型推論」(dl.acm.org/citation.cfm?id=345100)によって解決される2つの問題の1つです。dl.acm.org/citation.cfm?id=1086383も関連する必要があります。
Blaisorblade、2016年

回答:


8

質問が理解できたかどうかはわかりません。最初に、私はあなたの問題を次の統一問題に縮小しようとします:

自由(タイプ)変数Xを持つシステムFタイプτ(X)とタイプσが与えられます。
τ(γ)=σであるようなタイプγを見つけることは可能ですか?

これは、この問題を解決するための疑似コードです(unifiableでない場合は例外が発生します)。

unify (X, σ) = σ
unify (Y, Y) = Y
unify (τ₁ → τ₂, σ₁ → σ₂) = unify(τ₁,σ₁) → unify(τ₂,σ₂)
unify (∀Y.τ(Y), ∀Y.σ(Y)) = ∀Y.unify(τ(Y),σ(Y)) (with Y a fresh variable)
unify (_,_) = raise Not_unifiable

例外が発生しない場合にのみ、γ=τ(unify(τ(X)、σ)が機能することを(帰納法によって)証明できます。

今あなたの問題のために取ることができます

f (ΛX.t) (r) = match type of t with "τ₁ → τ₂" => unify (τ₁, type of r) | _ => fail end

(もちろん、関数fは、引数が開いている場合、引数としてコンテキストを取る必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.