क्या किसी प्रकार के फ़ंक्शन ((a -> b) -> b) -> या तो ab का एहसास करने का कोई तरीका है?


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?


मुझे यह स्पष्ट लगता है कि यह असंभव है, लेकिन शायद मैं गलत हूं। यदि ऐसा है, तो एक उपयोगी प्रारंभिक बिंदु यह है कि थ्योरी पॉलीमॉर्फिक प्रकार के साथ एक फ़ंक्शन ((a -> b) -> b)आइसोमोर्फिक टू a: एकमात्र एकमात्र कार्यान्वयन है g f = f someHardcodedA
अमलियो

1
@amalloy एक और संभावित कार्यान्वयन है:g = const someHardcodedB
फ्योडोर सोइकिन

आह, बिल्कुल। यह aया तो है b। समझ में आता है।
अमलॉय

1
यदि हास्केल के पास कॉल / सीसी था, तो to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))काम करेगा। (यह निहितार्थ का एक मान्य शास्त्रीय प्रमाण है।)
बेन्ग

जवाबों:


14

प्रस्ताव (P -> Q) -> Qऔर P \/ Qसमतुल्य हैं।

शास्त्रीय तर्क में यह सच है, लेकिन रचनात्मक तर्क में नहीं।

रचनात्मक तर्क में हमारे पास बहिष्कृत मध्य का कानून नहीं है , अर्थात हम "या तो पी सत्य है या पी सत्य नहीं है" के साथ अपनी सोच शुरू नहीं कर सकते।

शास्त्रीय रूप से हम कारण जैसे:

  • यदि P सत्य है (अर्थात हमारे पास ( x :: P) है) तो वापस लौटें Left x
  • यदि P गलत है, तो Haskell में बोलें कि हमारे पास nx :: P -> Voidकार्य होगा। तो absurd . nx :: P -> Q(हम किसी भी प्रकार के चोटी सकते हैं, हम ले Q) और दिए गए फोन f :: (P -> Q) -> Q)के साथ absurd . nxप्रकार के मूल्य प्राप्त करने के Q

समस्या, कि सामान्य प्रकार के कार्य नहीं हैं:

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

करी-हावर्ड पत्राचार के अनुसार, यह अंतर्ज्ञानवादी तर्क में एक तनातनी होगी :

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

लेकिन उपरोक्त दोहरापन उन्मूलन है, जिसे अंतर्ज्ञानवादी तर्क में साबित करना असंभव है - इसलिए एक विरोधाभास है। (तथ्य यह है कि हम इसे शास्त्रीय तर्क में साबित कर सकते हैं प्रासंगिक नहीं है।)

(अंतिम नोट: यह मानता है कि हास्केल कार्यक्रम समाप्त हो गया है। निश्चित रूप से, अनंत पुनरावर्तन का उपयोग करके undefined, और इसी तरह से वास्तव में परिणाम वापस करने से बचने के लिए, हम हास्केल में किसी भी प्रकार का निवास कर सकते हैं।)


4

नहीं, यह संभव नहीं है, लेकिन यह थोड़ा सूक्ष्म है। समस्या यह है कि प्रकार चर aऔर bसार्वभौमिक रूप से परिमाणित हैं।

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

aऔर bसार्वभौमिक रूप से परिमाणित हैं। कॉलर चुनता है कि वे किस प्रकार के हैं, इसलिए आप किसी भी प्रकार का मान नहीं बना सकते। इसका मतलब है कि आप Either a bतर्क की अनदेखी करते हुए केवल प्रकार का मान नहीं बना सकते f। लेकिन उपयोग fकरना भी असंभव है। यह जानने के बिना कि आप किस प्रकार के हैं aऔर पास होने के लिए आप bप्रकार a -> bका मूल्य नहीं बना सकते f। जब पर्याप्त रूप से मात्रा निर्धारित की जाती है तो बस पर्याप्त जानकारी उपलब्ध नहीं होती है।

जहाँ तक इसोस्कोफ़िज़्म हास्केल में काम नहीं करता है - क्या आप सुनिश्चित हैं कि वे प्रस्ताव एक रचनात्मक अंतर्ज्ञानवादी तर्क में समतुल्य हैं? हास्केल क्लासिकल डिडक्टिव लॉजिक को लागू नहीं करता है।


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जिसे हम कॉल कर सकते हैं। ऐसा करने के लिए, हमें एक फंक्शन की आपूर्ति करने की ज़रूरत है जो कि aए को एक में परिवर्तित करता है b, लेकिन दिए गए प्रकार अज्ञात हैं जिन्हें हम सबसे अच्छा फ़ंक्शन बना सकते हैं जो एक स्थिर रिटर्न देता है b। उस bमूल्य को प्राप्त करने के लिए , हम इसे पहले की तुलना में किसी अन्य तरीके से नहीं बना सकते हैं, इसलिए यह परिपत्र तर्क बन जाता है - और हम इसे केवल एक बिंदु बनाकर हल कर सकते हैं :

to :: ((a -> b) -> b) -> Either a b
to f = let x = f (\_ -> x) in Right x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.