পিটিএস / কোসিতে চার্চ-এনকোডযুক্ত ধরণের উপর নির্ভরশীল প্রকারগুলি


11

আমি বারেন্ড্রেগের ল্যাম্বদা কিউবে খাঁটি ধরণের সিস্টেমগুলির সাথে বিশেষত সবচেয়ে শক্তিশালী কন্সট্রাকশনসের ক্যালকুলাস নিয়ে পরীক্ষা করছি। এই সিস্টেমে বিভিন্ন ধরণের *এবং রয়েছে 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 -> *

  1. আমি বিভক্ত করতে পারেন D : Bool -> *জোড়া মধ্যে D Trueএবং D FalseDআবার তৈরি করার জন্য কি প্রথাগত উপায় আছে ? আমি টাইপ স্তরে Bool -> T = Product T Tফাংশনটির অ্যানালগ দ্বারা আইসোমসফিজমকে পুনরুত্পাদন করতে চাই ifতবে আমি এই ফাংশনটিকে মূল হিসাবে সহজ লিখতে পারি না ifকারণ আমরা প্রকারের মতো আর্গুমেন্টগুলিতে পাস করতে পারি না।

  2. আমি প্রশ্ন (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
    

    আমার এনকোডিং কি উপরে?

  3. আমি 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?


পণ্য টিটিboolটিboolটি((টি:*)(টিটিটি))টিপ্রোডাক্টটিটি(টি:*)((টিটিটি)টি)

@ জর্জিও মোসা দেখুন cstheory.stackexchange.com/questions/30923/… - আপনার যদি প্যারামিট্রিকিটি (সমস্ত মডেল নয় তবে প্রাথমিক (সিনট্যাকটিক) এক) থাকে তবে আপনার কাছে আইসোমরফিজম রয়েছে।
ZeitRaffer

উত্তর:


9

প্রথাগত চার্চ এনকোডিং ব্যবহার করে আপনি এটি করতে পারবেন না Bool:

#Bool = ∀(Bool : *) → ∀(True : Bool) → ∀(False : Bool) → Bool

... কারণ আপনি টাইপের কোনও (দরকারী) ফাংশন লিখতে পারবেন না:

#Bool → *

কারণ হিসাবে আপনি উল্লেখ করেছেন যে, আপনি *প্রথম যুক্তি হিসাবে পাস করতে পারবেন না #Bool, যার পরিবর্তে এর অর্থTrue এবং Falseযুক্তিগুলি প্রকারভেদ নাও হতে পারে।

এটি সমাধান করার জন্য কমপক্ষে তিনটি উপায় রয়েছে:

  1. ইনডাকটিভ কনস্ট্রাকশনের ক্যালকুলাস ব্যবহার করুন। তারপরে আপনি এর প্রকারটি সাধারণ করতে #Boolপারেন:

    #Bool = ∀(n : Nat) → ∀(Bool : *ₙ) → ∀(True : Bool) → ∀(False : Bool) → Bool
    

    ... এবং তারপরে আপনি তা ইনস্ট্যান্ট nকরবেন 1, যার অর্থ আপনি *₀দ্বিতীয় তর্ক হিসাবে পাস করতে পারেন , যা টাইপ-চেক করবে কারণ:

    *₀ : *₁
    

    ... সুতরাং আপনি ব্যবহার করতে পারে #Bool দুটি ধরণের মধ্যে নির্বাচন ।

  2. আরও একটি বাছাই করুন:

    * : □ : △
    

    তারপরে আপনি এই জাতীয় একটি পৃথক #Bool₂ধরণের সংজ্ঞা দেবেন :

    #Bool₂ = ∀(Bool : □) → ∀(True : Bool) → ∀(False : Bool) → Bool
    

    এটি মূলত ইন্ডাকটিভ নির্মাণের ক্যালকুলাসের একটি বিশেষ ক্ষেত্রে, তবে এখন থেকে কম পুনঃব্যবহারযোগ্য কোড তৈরি করে আমাদের অবশ্যই দুটি পৃথক সংজ্ঞা বজায় রাখতে হবে #Bool , আমরা প্রতিটি ধরণের যেটিকে সমর্থন করতে চাই তার একটি।

  3. #Bool₂কনস্ট্রাকশনের ক্যালকুলাসের মধ্যে সরাসরি এনকোড করুন :

    #Bool₂ = ∀(True : *) → ∀(False : *) → *
    

যদি লক্ষ্যটি অশোধিতগুলির মধ্যে সরাসরি এটি ব্যবহার করা হয় morteতবে কেবল # 3 পদ্ধতির কাজ হবে।


আমি দেখতে পাচ্ছি, আমরা # বুলি -> # বুলিকে রূপান্তর করতে পারি না, তাই না?
জিতরফার

@ ZititRaffer ঠিক আছে আপনি এর থেকে রূপান্তর করতে পারবেন না #Bool₁করার#Bool₂
গ্যাব্রিয়েল গঞ্জালেস

1
হুম ... আইআইইউসি আপনি "ইনডুকটিভ কনস্ট্রাকশনস এর ক্যালকুলাস" টাইপগুলির একটি অসীম শ্রেণিবিন্যাসের সাথে একটি ক্যালকুলাস বলেছেন, তবে আফ্রিকের মূল সিআইসির তেমন কিছু ছিল না (এটি কেবল ইনসেক্টিভ টাইপসকে কোসিতে যুক্ত করেছে)। আপনি Luo এর ইসিসি (নির্মাণের বর্ধিত ক্যালকুলাস) সম্পর্কে ভাবতে পারেন?
স্টেফান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.