मैं विशेष रूप से सबसे शक्तिशाली एक, कंस्ट्रक्शंस के पथरी के साथ, बेंड्रिग्रेट के लैम्ब्डा क्यूब में शुद्ध प्रकार की प्रणालियों के साथ प्रयोग कर रहा हूं। इस प्रणाली के प्रकार *
और हैं BOX
। केवल रिकॉर्ड के लिए, नीचे मैं Morte
उपकरण के कंक्रीट सिंटैक्स का उपयोग कर रहा हूं https://github.com/Gabriel439/Haskell-Morte-Library जो कि क्लासिकल लैम्ब्डा कैलकुलस के करीब है।
मैं देख रहा हूं कि हम कुछ प्रकार के चर्च-जैसे एन्कोडिंग (उर्फ बोहेम-बरार्डुसी आइसोमॉर्फिज्म बीजीय डेटा प्रकारों के लिए) का अनुकरण कर सकते हैं। एक साधारण उदाहरण के लिए, मैं 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
Bool -> T = Product T T
if
if
मैं प्रश्न (1) को हल करने के लिए दो अवरोधकों के साथ एक प्रकार के एक प्रेरक प्रकार का उपयोग करता हूं। उच्च स्तरीय विवरण (अगड़ा-शैली) निम्न प्रकार है (टाइप-स्तर के बजाय प्रयोग किया जाता है
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
क्या मेरा एन्कोडिंग सही है?
मैं
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
?