ใน System F à la Church เราสามารถทำให้การอนุมานแบบอัตโนมัติสำหรับการกำจัดทั้งหมดได้หรือไม่?


9

คำถามมีดังต่อไปนี้ โดยทั่วไปเมื่อมีคำเช่นΛX.tเราสามารถกำจัด forall โดยใช้คำนี้กับประเภทเช่น(ΛX.t)[T]t[X:=T].

ทีนี้สมมติว่านี่คือลูกศรและเราต้องการโต้แย้งมันแล้วเราจะต้องใช้เทอมนี้กับประเภทที่เหมาะสมเพื่อให้สามารถรับอาร์กิวเมนต์ได้ นั่นคือสิ่งที่ฉันถามถ้าฉันสามารถทำให้เป็นอัตโนมัติ: มันเป็นไปได้ที่จะสร้างฟังก์ชั่นf รับสองเทอมและคืนค่าประเภทนั้น f<ΛX.t><r> โปรดระบุประเภทที่จำเป็นสำหรับการแทนที่ด้วย X ใน t ดังนั้น t สามารถยอมรับข้อโต้แย้ง r?

ตัวอย่างบางส่วน:

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

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


2
คำถามของคุณน่าอ่านมากขึ้นถ้าคุณไม่ใส่อาร์กิวเมนต์ให้ f เป็น sub / superscripts แต่ละอันมี sub / superscript อื่น ๆ
Dave Clarke

สำหรับการอ้างอิง: ปัญหาประเภทนี้เป็นหนึ่งในสองปัญหาที่แก้ไขโดย "การอนุมานประเภท Local" ( dl.acm.org/citation.cfm?id=345100 ) นอกจากนี้ยังเกี่ยวข้องควรจะdl.acm.org/citation.cfm?id=1086383
Blaisorblade

คำตอบ:


8

ฉันไม่แน่ใจจริงๆว่าฉันเข้าใจคำถามนี้หรือไม่ ก่อนอื่นฉันพยายามลดปัญหาของคุณเป็นปัญหาการรวมต่อไปนี้:

รับระบบ F type τ (X) พร้อมตัวแปรฟรี (ชนิด) 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

คุณสามารถพิสูจน์ (โดยอุปนัย) ว่าγ = τ (รวม (τ (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.