System Fà la Church에서 전체 제거를위한 유형 추론을 자동화 할 수 있습니까?


9

문제는 다음과 같습니다. 일반적으로 다음과 같은 용어가있을 때Λ엑스.인스턴스 와 같이이 용어를 유형 에 적용하여 전체를 제거 할 수 있습니다 .(Λ엑스.)[][엑스: =]

이제 이것이 화살표라고 가정하고 인수를 주려고합니다. 그런 다음이 인수를받을 수 있도록이 용어를 적절한 유형에 적용해야합니다. 그게 내가 automatize 수 있는지 물어하고 무엇 :이 기능을 구성 할 수있다 두 용어를 복용하고되도록 유형 돌아 주고 우리에게 필요한 유형으로 대체 할을 에서 하도록 인수 받아 들일 수 ?에프에프<Λ엑스.> <아르 자형>엑스아르 자형

몇 가지 예 :

  • 에프<Λ엑스.λ엑스엑스엑스.> <λ엑스.엑스> = .

  • 에프<Λ엑스.λ엑스엑스.아르 자형> <(λ엑스아르 자형.) 에스> =


2
f에 대한 인수를 하위 / 첨자 (각각 다른 하위 / 첨자)로 포함하지 않으면 질문이 좀 더 읽기 쉽습니다.
Dave Clarke

참조 :이 종류의 문제는 "로컬 형식 유추"( dl.acm.org/citation.cfm?id=345100 )로 해결 된 두 가지 문제 중 하나입니다 . dl.acm.org/citation.cfm?id=1086383 도 관련성이 있어야합니다 .
Blaisorblade

답변:


8

질문을 이해했는지 잘 모르겠습니다. 먼저 문제를 다음과 같은 통일 문제로 줄이기 위해 노력합니다.

자유 (유형) 변수 X와 유형 σ를 가진 시스템 F 유형 τ (X)가 주어집니다.
τ (γ) = σ와 같은 유형 γ를 찾을 수 있습니까?

이 문제를 해결하기위한 의사 코드 (확인할 수없는 경우 예외 발생)가 있습니다.

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.