ฉันกำลังทดลองกับระบบที่บริสุทธิ์ในก้อนแลมบ์ดาของ 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) -> xFalse = λ(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?