আমি বারেন্ড্রেগের ল্যাম্বদা কিউবে খাঁটি ধরণের সিস্টেমগুলির সাথে বিশেষত সবচেয়ে শক্তিশালী কন্সট্রাকশনসের ক্যালকুলাস নিয়ে পরীক্ষা করছি। এই সিস্টেমে বিভিন্ন ধরণের *
এবং রয়েছে BOX
। কেবল রেকর্ডের জন্য, নীচে আমি Morte
সরঞ্জামটির কংক্রিট সিনট্যাক্সটি ব্যবহার করছি https://github.com/Gabriel439/Haskell-Morte- লাইব্রেরি যা ক্লাসিকাল ল্যাম্বদা ক্যালকুলাসের নিকটবর্তী।
আমি দেখতে পাচ্ছি যে আমরা কিছু প্রকারের চার্চের মতো এনকোডিং (যেমন বীজম-বেরারডাস্কি আইসোমর্ফিিজম বীজগণিত সম্পর্কিত ডেটাগুলির জন্য) দ্বারা প্রেরণামূলক প্রকারগুলি অনুকরণ করতে পারি। একটি সাধারণ উদাহরণের জন্য আমি Bool = ∀(t : *) -> t -> t -> t
নির্মাণকারীর সাথে টাইপ ব্যবহার করি True = λ(t : *) -> λ(x : t) -> λ(y : t) -> x
এবং False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y
।
আমি দেখতে পেলাম যে পদ-স্তরের ফাংশনগুলির Bool -> T
ধরণটি Product T T
ক্লাসিকাল Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> t
মডুলো প্যারামিট্রিকটির সাথে জোড় ধরণের জোড় সংখ্যার সাথে ফাংশনটির মাধ্যমে if : Bool -> λ(t : *) -> t -> t -> t
প্রকৃতপক্ষে পরিচয় is
নীচের সমস্ত প্রশ্ন নির্ভরশীল প্রকারের উপস্থাপনা সম্পর্কে হবে 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
পিটিএস / কোসিতে নিম্নলিখিত এনকোডিং সহ:
λ(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
?