ฉันกำลังทดลองกับระบบที่บริสุทธิ์ในก้อนแลมบ์ดาของ Barendregt โดยเฉพาะกับแคลคูลัสออฟคอนสตรัคชั่นที่ทรงพลังที่สุด ระบบนี้มีทุกประเภทและ*
BOX
สำหรับบันทึกด้านล่างฉันใช้ไวยากรณ์ที่เป็นรูปธรรมของMorte
เครื่องมือhttps://github.com/Gabriel439/Haskell-Morte-Libraryซึ่งอยู่ใกล้กับแคลคูลัสแลมบ์ดาคลาสสิก
ฉันเห็นว่าเราสามารถเลียนแบบประเภทอุปนัยโดยการเข้ารหัสเหมือนคริสตจักรบางอย่าง (aka Boehm-Berarducci isomorphism สำหรับประเภทข้อมูลพีชคณิต) สำหรับชนิดเช่นฉันใช้งานง่ายBool = ∀(t : *) -> t -> t -> t
ด้วยการก่อสร้างงานและTrue = λ(t : *) -> λ(x : t) -> λ(y : t) -> x
False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y
ฉันเห็นว่าประเภทของฟังก์ชั่นระดับคำBool -> T
เป็น isomorphic เพื่อคู่ของประเภทที่Product T T
มีProduct = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> t
พารามิเตอร์แบบโมดูโลคลาสสิกโดยวิธีการของฟังก์ชั่นif : Bool -> λ(t : *) -> t -> t -> t
ซึ่งในความเป็นจริงตัวตน
Bool -> *
คำถามทุกข้อดังต่อไปนี้จะเกี่ยวกับการแสดงประเภทขึ้นอยู่กับ
ฉันสามารถแยก
D : Bool -> *
เป็นคู่D True
และD False
. มีวิธีบัญญัติมาตรฐานในการสร้างD
อีกครั้งหรือไม่? ฉันต้องการสร้าง isomosphism ซ้ำBool -> T = Product T T
โดยฟังก์ชันอนาล็อกif
ที่ระดับประเภท แต่ฉันไม่สามารถเขียนฟังก์ชันนี้ได้ง่ายเหมือนต้นฉบับif
เพราะเราไม่สามารถผ่านชนิดในอาร์กิวเมนต์เช่นประเภทฉันใช้อุปนัยประเภทที่มีสอง constuctors เพื่อแก้ปัญหาคำถาม (1) คำอธิบายระดับสูง (สไตล์ Agda) เป็นประเภทต่อไปนี้ (ใช้แทนประเภทระดับ
if
)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F False
ด้วยการเข้ารหัสต่อไปนี้ใน PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P bool
การเข้ารหัสของฉันถูกต้องหรือไม่
ฉันสามารถเขียน constructors สำหรับ
BoolDep
เช่นรหัสนี้สำหรับDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True
:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
แต่ฉันไม่สามารถเขียนฟังก์ชันผกผันได้ (หรือฟังก์ชันใด ๆ ในทิศทางตรงกันข้าม) เป็นไปได้ไหม? หรือฉันควรใช้เป็นตัวแทนอีกBoolDep
ในการผลิตมอร์ฟBoolDep T F True = T
?