((A -> খ) -> খ) -> হয় তবে টাইপের কোনও ফাংশন উপলব্ধি করার কোনও উপায় আছে কি?


18

প্রস্তাব (P -> Q) -> Qএবং P \/ Qসমতুল্য।

হাস্কেলের মধ্যে এই সমতা দেখার কোন উপায় আছে:

from :: Either a b -> ((a -> b) -> b)
from x = case x of
         Left a -> \f -> f a
         Right b -> \f -> b

to :: ((a -> b) -> b) -> Either a b
to = ???

যেমন যে

from . to = idএবং to . from = id?


এটি আমার কাছে স্পষ্ট মনে হয় এটি অসম্ভব তবে সম্ভবত আমি ভুল হয়েছি। যদি তা হয় তবে একটি কার্যকর প্রারম্ভিক বিন্দু হ'ল theকতিকভাবে পলিমারফিক ধরণের একটি ফাংশন ((a -> b) -> b)isomorphic aযা কেবলমাত্র সম্ভাব্য বাস্তবায়ন g f = f someHardcodedA
amalloy

1
@ মলয় আরেকটি সম্ভাব্য বাস্তবায়ন রয়েছে:g = const someHardcodedB
ফায়োডর সোইকিন

আহ, অবশ্যই হয় হয় aবা হয় b। বোধ হয়।
অমলয়

1
হাস্কেলের যদি কল / সিসি থাকে, তবে to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))কাজ করবে। (এটি জড়িত থাকার একটি বৈধ শাস্ত্রীয় প্রমাণ))
বেনার্গ 19

উত্তর:


14

প্রস্তাব (P -> Q) -> Qএবং P \/ Qসমতুল্য।

এটি শাস্ত্রীয় যুক্তিতে সত্য, তবে গঠনমূলক যুক্তিতে নয়।

গঠনমূলক যুক্তিতে আমাদের বর্জিত মাঝের আইন নেই , অর্থাৎ আমরা "হয় পি সত্য হয় বা পি সত্য নয়" দিয়ে আমাদের চিন্তাভাবনা শুরু করতে পারি না।

ধ্রুপদীভাবে আমরা যুক্তিযুক্ত:

  • পি যদি সত্য হয় (যেমন আমাদের কাছে ( x :: P) থাকে তবে ফিরে আসুন Left x
  • যদি পি মিথ্যা হয়, তবে হাস্কেল ভাষায় আমরা nx :: P -> Voidফাংশন করব। তারপরে absurd . nx :: P -> Q(আমরা যে কোনও ধরণের শীর্ষে পৌঁছাতে পারি, আমরা গ্রহণ করি Q) এবং প্রকারের মান পেতে কল দেওয়া f :: (P -> Q) -> Q)হয় ।absurd . nxQ

সমস্যা, যে কোনও ধরণের সাধারণ ফাংশন নেই:

lem :: forall p. Either p (p -> Void)

কিছু কংক্রিটের জন্য রয়েছে, যেমন Boolআবাসিত তাই আমরা লিখতে পারি

lemBool :: Either Bool (Bool -> Void)
lemBool = Left True -- arbitrary choice

কিন্তু আবার, সাধারণভাবে আমরা পারি না।


9

না, এটা অসম্ভব। বিশেষ ক্ষেত্রে বিবেচনা করুন যেখানে Q = Void

Either P Qতা হলে Either P Void, যা isomorphic হয় P

iso :: P -> Either P Void
iso = Left

iso_inv :: Either P Void -> P
iso_inv (Left p)  = p
iso_inv (Right q) = absurd q

সুতরাং, আমরা যদি একটি ফাংশন শব্দ ছিল

impossible :: ((P -> Void) -> Void) -> Either P Void

আমরা একটি শব্দও থাকতে পারে

impossible2 :: ((P -> Void) -> Void) -> P
impossible2 = iso_inv . impossible

কারি-হাওয়ার্ড চিঠিপত্রের অনুযায়ী, এই একটি অনুলাপ হবে intuitionistic যুক্তিবিজ্ঞান:

((P -> False) -> False) -> P

তবে উপরেরটি হ'ল ডাবল নেগ্রেশন বিলোপ, যা স্বজ্ঞাত যুক্তিতে প্রমাণ করা অসম্ভব হিসাবে পরিচিত - সুতরাং এটি একটি বৈপরীত্য। (যে বিষয়টি আমরা শাস্ত্রীয় যুক্তিতে প্রমাণ করতে পেরেছি তা প্রাসঙ্গিক নয়।)

(চূড়ান্ত দ্রষ্টব্য: এটি ধরে নিয়েছে যে হাস্কেল প্রোগ্রামটি সমাপ্ত হবে course অবশ্যই, অসীম পুনরাবৃত্তি undefined, এবং অনুরূপ উপায়গুলি ব্যবহার করে বাস্তবে কোনও ফলাফল ফিরে না আসা, আমরা হাসকেলে যে কোনও ধরণের বাস করতে পারি))


4

না, এটি সম্ভব নয়, তবে এটি কিছুটা সূক্ষ্ম। সমস্যাটি হ'ল ধরণের ভেরিয়েবল aএবং bসর্বজনীনভাবে পরিমাণযুক্ত।

to :: ((a -> b) -> b) -> Either a b
to f = ...

aএবং bসর্বজনীন পরিমাণযুক্ত। কলকারী তাদের ধরণের পছন্দ করে, তাই আপনি কেবল উভয় প্রকারের মান তৈরি করতে পারবেন না। এটি বোঝায় যে আপনি Either a bযুক্তি উপেক্ষা করার সময় কেবলমাত্র কোনও ধরণের মান তৈরি করতে পারবেন না f। তবে ব্যবহার fকরাও অসম্ভব। কি ধরণের aএবং কী তা না জেনে আপনি পাস করার bজন্য কোনও ধরণের মান তৈরি করতে পারবেন না । প্রকারগুলি সর্বজনীন পরিমাণে মীমাংসা করার সময় কেবল পর্যাপ্ত তথ্য পাওয়া যায় না।a -> bf

যতদূর আইসোমর্ফিিজম হাস্কেলে কাজ করে না - আপনি কি নিশ্চিত যে এই প্রস্তাবগুলি গঠনমূলক স্বজ্ঞাত যুক্তির সাথে সমান? হাস্কেল কোনও শাস্ত্রীয় অনুদানমূলক যুক্তি প্রয়োগ করে না।


2

অন্যরা যেমন উল্লেখ করেছে, এটি অসম্ভব কারণ আমাদের বাদ দেওয়া মাঝের আইন নেই। আমাকে আরও কিছুটা স্পষ্টভাবে যেতে দিন। ধরুন আমাদের আছে

bogus :: ((a -> b) -> b) -> Either a b

এবং আমরা সেট b ~ Void। তাহলে আমরা পাই

-- chi calls this `impossible2`.
double_neg_elim :: ((a -> Void) -> Void) -> a
bouble_neg_elim f = case bogus f of
             Left a -> a
             Right v -> absurd v

এখন, আসুন বাদ দেওয়া মাঝের আইনের দ্বিগুণ প্রত্যাখ্যানকে একটি নির্দিষ্ট প্রস্তাবের প্রয়োগ হিসাবে প্রমাণ করি ।

nnlem :: forall a. (Either a (a -> Void) -> Void) -> Void
nnlem f = not_not_a not_a
  where
    not_a :: a -> Void
    not_a = f . Left

    not_not_a :: (a -> Void) -> Void
    not_not_a = f . Right

তাই এখন

lem :: Either a (a -> Void)
lem = double_neg_elim nnlem

lemস্পষ্টভাবে উপস্থিত থাকতে পারে না কারণ aপ্রস্তাবটি এনকোড করতে পারে যে আমি যে কোনও টুরিং মেশিন কনফিগারেশন বাছাই করব তা বন্ধ হয়ে যাবে।


lemযথেষ্ট যাচাই করা যাক :

bogus :: forall a b. ((a -> b) -> b) -> Either a b
bogus f = case lem @a of
  Left a -> Left a
  Right na -> Right $ f (absurd . na)

0

এটি যুক্তির দিক থেকে বৈধ কিনা, বা এটি আপনার সমতার জন্য কী বোঝায় তা আমার কোনও ধারণা নেই তবে হ্যাঁ হ্যাসকেলে এই জাতীয় ফাংশনটি লেখা সম্ভব।

একটি নির্মাণ করতে Either a b, আমাদের হয় একটি aবা একটি bমান প্রয়োজন। আমাদের কাছে aমান নির্মানের কোনও উপায় নেই তবে আমাদের একটি ফাংশন রয়েছে bযা আমাদের কল করতে পারে returns যে কাজের জন্য, আমরা একটি ফাংশন যা ধর্মান্তরিত একটি সরবরাহ করতে হবে aএকটি মধ্যে bশ্রেষ্ঠ সময়ে একটি ফাংশন যে আয় একটি ধ্রুবক করতে, কিন্তু ধরনের দেওয়া অজানা আমরা পারে b। এই bমানটি পেতে , আমরা এটি আগের চেয়ে অন্য কোনও উপায়ে নির্মাণ করতে পারি না, সুতরাং এটি বিজ্ঞপ্তিযুক্ত যুক্তিতে পরিণত হয় - এবং আমরা কেবল একটি ফিক্সপয়েন্ট তৈরি করে এটি সমাধান করতে পারি :

to :: ((a -> b) -> b) -> Either a b
to f = let x = f (\_ -> x) in Right x
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.