คำปฏิเสธ
นี่เป็นเรื่องที่ไม่เป็นทางการตามที่คุณร้องขอ
ไวยากรณ์
ในภาษาที่พิมพ์ขึ้นอยู่กับว่าเรามีเครื่องผูกที่ระดับประเภทเช่นเดียวกับที่ระดับค่า:
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
ประเภทของแลมบ์ดาจะถูกตรวจสอบกับประเภทของการโต้แย้งที่ได้รับแทนที่จะเป็นการอนุมานและเปรียบเทียบกับความเสมอภาค แต่ถ้าเป็นแลมบ์ดาคุณจะต้องมีคำอธิบายประกอบแบบชัดแจ้ง (มีคำอธิบายประกอบอยู่ในไวยากรณ์และทุก ๆ ที่คุณสามารถเพิ่มหรือสร้าง)f
x
f
f
Ann Term Term
λ' (σ : Term) (v : Var)
นอกจากนี้ให้ดูที่ง่ายขึ้นง่ายขึ้น! โพสต์บล็อก.