คำปฏิเสธ
นี่เป็นเรื่องที่ไม่เป็นทางการตามที่คุณร้องขอ
ไวยากรณ์
ในภาษาที่พิมพ์ขึ้นอยู่กับว่าเรามีเครื่องผูกที่ระดับประเภทเช่นเดียวกับที่ระดับค่า:
Term = * | (∀ (Var : Term). Term) | (Term Term) | (λ Var. Term) | Var
คำที่พิมพ์ได้ดีเป็นคำที่มีประเภทที่แนบมาเราจะเขียนt ∈ σหรือ
σ
t
เพื่อแสดงให้เห็นว่าคำว่ามีประเภทtσ
กฎการพิมพ์
เพื่อความเรียบง่ายเราจำเป็นต้องใช้λ v. t ∈ ∀ (v : σ). τทั้งในλและ∀ผูกตัวแปรเดียวกัน (vในกรณีนี้)
กฎ:
t ∈ σ is well-formed if σ ∈ * and t is in normal form (0)
* ∈ * (1)
∀ (v : σ). τ ∈ * -: σ ∈ *, τ ∈ * (2)
λ v. t ∈ ∀ (v : σ). τ -: t ∈ τ (3)
f x ∈ SUBS(τ, v, x) -: f ∈ ∀ (v : σ). τ, x ∈ σ (4)
v ∈ σ -: v was introduced by ∀ (v : σ). τ (5)
ดังนั้น*คือ "ประเภททุกประเภท" (1), ∀รูปแบบประเภทจากประเภท (2), นามธรรม Lambda มีปี่ชนิด (3) และถ้าvเป็นที่รู้จักโดย∀ (v : σ). τแล้วvมีประเภทσ (5)
"ในรูปแบบปกติ" หมายความว่าเราดำเนินการลดจำนวนมากที่สุดโดยใช้กฎการลด:
กฎการลด "The"
(λ v. b ∈ ∀ (v : σ). τ) (t ∈ σ) ~> SUBS(b, v, t) ∈ SUBS(τ, v, t)
where `SUBS` replaces all occurrences of `v`
by `t` in `τ` and `b`, avoiding name capture.
หรือในรูปแบบสองมิติที่
σ
t
หมายถึงt ∈ σ:
(∀ (v : σ). τ) σ SUBS(τ, v, t)
~>
(λ v . b) t SUBS(b, v, t)
เป็นไปได้ที่จะใช้การลบแลมบ์ดากับคำศัพท์เมื่อคำนั้นมีชนิดเดียวกับตัวแปรในปริมาณทั้งหมดที่เกี่ยวข้อง จากนั้นเราจะลดทั้ง lambda abstraction และ forall quantifier ในลักษณะเดียวกับใน lambda แคลคูลัสบริสุทธิ์ก่อน หลังจากลบส่วนระดับค่าเราจะได้รับ (4) กฎการพิมพ์
ตัวอย่าง
นี่คือตัวดำเนินการแอปพลิเคชันฟังก์ชัน:
∀ (A : *) (B : A -> *) (f : ∀ (y : A). B y) (x : A). B x
λ A B f x . f x
(เราย่อ∀ (x : σ). τไปσ -> τถ้าτไม่ได้พูดถึงx)
fผลตอบแทนB yสำหรับการใด ๆ ที่ให้บริการประเภทy Aเราใช้fไปxซึ่งเป็นประเภทที่เหมาะสมAและใช้แทนyสำหรับxใน∀หลัง.จึง~>f x ∈ SUBS(B y, y, x)f x ∈ B x
ตอนนี้ขอย่อตัวดำเนินการประยุกต์ใช้ฟังก์ชั่นเป็นappและนำไปใช้กับตัวเอง:
∀ (A : *) (B : A -> *). ?
λ A B . app ? ? (app A B)
ฉันวาง?เงื่อนไขที่เราต้องการให้ ก่อนอื่นเราขอแนะนำและยกตัวอย่างอย่างชัดเจนAและB:
∀ (f : ∀ (y : A). B y) (x : A). B x
app A B
ตอนนี้เราต้องรวมสิ่งที่เรามี
∀ (f : ∀ (y : A). B y) (x : A). B x
ซึ่งเหมือนกับ
(∀ (y : A). B y) -> ∀ (x : A). B x
และสิ่งที่app ? ?ได้รับ
∀ (x : A'). B' x
ผลลัพธ์นี้ใน
A' ~ ∀ (y : A). B y
B' ~ λ _. ∀ (x : A). B x -- B' ignores its argument
(ดูที่ predicativity คืออะไร )
การแสดงออกของเรา (หลังจากเปลี่ยนชื่อ) จะกลายเป็น
∀ (A : *) (B : A -> *). ?
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
ตั้งแต่ใด ๆA, Bและf(ที่f ∈ ∀ (y : A). B y)
∀ (y : A). B y
app A B f
เราสามารถยกตัวอย่างAและBรับ (สำหรับfประเภทที่เหมาะสม)
∀ (y : ∀ (x : A). B x). ∀ (x : A). B x
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) f
(∀ (x : A). B x) -> ∀ (x : A). B xและลายเซ็นชนิดเทียบเท่ากับ
การแสดงออกทั้งหมดคือ
∀ (A : *) (B : A -> *). (∀ (x : A). B x) -> ∀ (x : A). B x
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
กล่าวคือ
∀ (A : *) (B : A -> *) (f : ∀ (x : A). B x) (x : A). B x
λ A B f x .
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B) f x
ซึ่งหลังจากการลดลงทั้งหมดที่ระดับมูลค่าจะให้ผลappตอบแทนเท่าเดิม
ดังนั้นในขณะที่ต้องใช้เพียงไม่กี่ก้าวในแคลคูลัสแลมบ์ดาบริสุทธิ์appจากapp appการตั้งค่า (และโดยเฉพาะอย่างยิ่งการพิมพ์พึ่งพา) เรายังต้องดูแลเกี่ยวกับการรวมกันและสิ่งที่ซับซ้อนมากขึ้นแม้จะมีความสะดวกสบายไม่สอดคล้องกัน ( * ∈ *)
การตรวจสอบประเภท
- ถ้า
tเป็นเช่น*นั้นt ∈ *โดย (1)
- ถ้า
tเป็น∀ (x : σ) τ, σ ∈? *, τ ∈? *(ดูหมายเหตุเกี่ยวกับ∈?ด้านล่าง) แล้วt ∈ *โดย (2)
- ถ้า
tเป็นf x, f ∈ ∀ (v : σ) τสำหรับบางคนσและτ, x ∈? σแล้วt ∈ SUBS(τ, v, x)โดย (4)
- ถ้า
tเป็นตัวแปรv, vได้รับการแนะนำให้รู้จัก∀ (v : σ). τแล้วt ∈ σโดย (5)
สิ่งเหล่านี้ล้วนเป็นกฎการอนุมาน แต่เราไม่สามารถทำแบบเดียวกันกับ lambdas ได้ (การอนุมานประเภทนั้นไม่สามารถอธิบายได้สำหรับประเภทที่ขึ้นต่อกัน) ดังนั้นสำหรับ lambdas เราตรวจสอบ ( t ∈? σ) แทนที่จะอนุมาน:
- หาก
tมีการλ v. bและตรวจสอบกับ∀ (v : σ) τ, b ∈? τแล้วt ∈ ∀ (v : σ) τ
- หาก
tเป็นอย่างอื่นและตรวจสอบกับσจากนั้นอนุมานประเภทของการtใช้ฟังก์ชั่นด้านบนและตรวจสอบว่ามันเป็นσ
การตรวจสอบความเท่าเทียมกันสำหรับประเภทพวกเขาต้องการที่จะอยู่ในรูปแบบปกติเพื่อที่จะตัดสินใจว่าจะtมีการพิมพ์σครั้งแรกที่เราตรวจสอบว่ามีประเภทσ *ถ้าเป็นเช่นนั้นก็σจะเป็นมาตรฐาน (โมดูโลของกิราร์ด) และมันจะถูกทำให้เป็นมาตรฐาน (ดังนั้นจึงσกลายเป็นรูปแบบที่ดีโดย (0) SUBSยังทำให้นิพจน์ทั่วไปรักษา (0)
สิ่งนี้เรียกว่าการตรวจสอบประเภทสองทิศทาง ด้วยเหตุนี้เราจึงไม่จำเป็นต้องใส่คำอธิบายประกอบแลมบ์ดาทุกประเภท: หากเป็นที่รู้จักกันในf xประเภทของแลมบ์ดาจะถูกตรวจสอบกับประเภทของการโต้แย้งที่ได้รับแทนที่จะเป็นการอนุมานและเปรียบเทียบกับความเสมอภาค แต่ถ้าเป็นแลมบ์ดาคุณจะต้องมีคำอธิบายประกอบแบบชัดแจ้ง (มีคำอธิบายประกอบอยู่ในไวยากรณ์และทุก ๆ ที่คุณสามารถเพิ่มหรือสร้าง)fxffAnn Term Termλ' (σ : Term) (v : Var)
นอกจากนี้ให้ดูที่ง่ายขึ้นง่ายขึ้น! โพสต์บล็อก.