हास्केल के seq ऑपरेशन के साथ काम करने के लिए एटा-तुल्यता है?


14

लेम्मा: एटा-समतुल्यता मानकर हमने ऐसा किया है (\x -> ⊥) = ⊥ :: A -> B

प्रमाण: ⊥ = (\x -> ⊥ x)एटा-समतुल्यता (\x -> ⊥ x) = (\x -> ⊥)द्वारा , और लंबोदर के तहत कमी द्वारा।

हास्केल 2010 की रिपोर्ट, खंड 6.2 seqफ़ंक्शन को दो समीकरणों द्वारा निर्दिष्ट करता है:

seq :: a -> b -> b
seq ⊥ b = =
seq ab = b, यदि ≠,

यह तब दावा करता है "परिणामस्वरूप, ⊥ \ x ->> के समान नहीं है, क्योंकि seq का उपयोग उन्हें अलग करने के लिए किया जा सकता है।"

मेरा प्रश्न यह है कि क्या वास्तव में इसकी परिभाषा का परिणाम है seq?

निहित तर्क से ऐसा लगता है कि seqअगर यह अविश्वसनीय होगा seq (\x -> ⊥) b = ⊥। हालाँकि मैं यह साबित करने में सक्षम नहीं हूं कि इस तरह से seqयह अविश्वसनीय होगा। मुझे ऐसा लगता है कि seqयह दोनों एकरस है, और निरंतर है, जो इसे संगणक होने के दायरे में रखता है।

एक एल्गोरिथ्म जो कि seq के रूप में लागू होता है, कुछ के लिए खोज करने का प्रयास करके काम कर सकता है, xजहां ⊥ के साथ शुरू करने f x ≠ ⊥के डोमेन की गणना करता है f। हालांकि इस तरह के एक कार्यान्वयन, भले ही संभव हो, हम एक बार seqपॉलीमोर्फिक बनाना चाहते हैं ।

क्या इस बात का कोई प्रमाण है कि कोई ऐसा संगणक नहीं है seqजिसकी पहचान (\x -> ⊥)हो ⊥ :: A -> B? वैकल्पिक रूप से, वहाँ के निर्माण के साथ की seqपहचान करता है ?(\x -> ⊥)⊥ :: A -> B

जवाबों:


6

पहले, आइए हम स्पष्ट करें कि λ x से explicit कैसे seqअलग है :λx.

bottom :: a
bottom = bottom

eta :: a -> b
eta x = bottom

-- This terminates
fortytwo = seq eta 42

-- This does not terminate
infinity = seq bottom 42

λx.seqseqseqλseqλx. सहमत हैं, जबकि दूसरे में वे नहीं करते हैं।

λ[DE]=λx.seq

λseqλx.η[DE][DE]λx.seq


1
यह एक प्रायोगिक तथ्य है कि GHC और / या Hugs ⊥ और λx. that में। सौभाग्य से, हास्केल को एक कार्यान्वयन द्वारा परिभाषित नहीं किया गया है। मेरा प्रश्न यह सुझाव दे रहा है कि हास्केल सीक के संबंध में अंडरसेक्स्ड है।
रसेल ओ'कॉनर

क्या आप "प्रभावी स्कॉट डोमेन" से जो मतलब है उसका संदर्भ दे सकते हैं, संभवतः इसका मतलब यह नहीं है कि आंशिक आदेश निर्णायक है। इसके अलावा, STLC बहुरूपी नहीं है, लेकिन हास्केल है। आमतौर पर हास्केल की व्याख्या सिस्टम एफ या उसके एक डेरिवेटिव में की जाती है। यह आपके तर्क को कैसे प्रभावित करता है?
रसेल ओ'कॉनर

मेरी पीएचडी की धारा 1.1.4। शोध प्रबंध andrej.com/thesis/thesis.pdf में प्रभावी स्कॉट डोमेन की एक छोटी परिभाषा है, और यह वास्तव में पहला Google हिट है जो स्वतंत्र रूप से उपलब्ध है।
बाउर

2
यदि आप मेरे लिए एक प्रमाण लिखते हैं, तो आपको हास्केल 98 का ​​कार्यान्वयन मिलेगा, जहां एटा-नियम अनुमति देता है (फोल्डर (\ ab -> फैब) z xs) को (तह fz xs) के लिए अनुकूलित किया जा सकता है, जिससे ओ से एक असममित प्रदर्शन बढ़ जाता है। (n ^ 2) से O (n) ( ghc.haskell.org/trac/ghc/ticket/7436 देखें )। अधिक सम्मोहक यह एक NewTypeWrapper को (NewTypeWrapper। F) को et-विस्तारित होने के लिए मजबूर किए बिना अनुकूलित किए जाने और वर्तमान में GHC (उदाहरण के लिए तह के उपयोग में) में newTypes द्वारा लगाए गए कुछ स्पर्शोन्मुख प्रदर्शन दंड को रोकने की अनुमति देगा।
रसेल ओ'कॉनर

1
λx.λx.seqseq

2

ध्यान दें कि जिस विनिर्देश के लिए seqआप उद्धरण देते हैं, वह इसकी परिभाषा नहीं है । हास्केल रिपोर्ट को उद्धृत करने के लिए "फ़ंक्शन seq को समीकरणों द्वारा परिभाषित किया गया है : [और फिर आपके द्वारा दिए गए समीकरण ]"।

सुझाए गए तर्क से लगता है कि अगर seq (\ x -> ⊥) b = ⊥ है तो seq अविश्वसनीय होगा।

इस तरह के व्यवहार के विनिर्देश का उल्लंघन होगा seq

महत्वपूर्ण रूप से, चूंकि seqपॉलिमॉर्फिक है, seqइसलिए दोनों मापदंडों में से किसी पर भी डीकोस्ट्रिक्टर्स (अनुमान / पैटर्न मिलान, आदि) के संदर्भ में परिभाषित नहीं किया जा सकता है।

क्या कोई प्रमाण है कि कोई कंप्युटेबल seq नहीं है जो B :: A -> B से पहचानता हो (\ x -> ()?

यदि seq' (\x -> ⊥) b, कोई सोच सकता है कि हम पहले पैरामीटर (जो एक फ़ंक्शन है) को कुछ मूल्य पर लागू कर सकते हैं और फिर ⊥ बाहर निकाल सकते हैं। लेकिन, अपने पैरामीट्रिक पॉलीमॉर्फिक प्रकार की वजह से seqकभी भी फंक्शन वैल्यू के साथ पहले पैरामीटर की पहचान नहीं की जा सकती है (भले ही यह किसी एक के उपयोग के लिए एक हो seq)। पैरामीट्रिकिटी का मतलब है कि हम मापदंडों के बारे में कुछ नहीं जानते हैं। इसके अलावा, seqकभी भी एक अभिव्यक्ति नहीं ले सकता है और निर्णय ले सकता है "क्या यह an है?" (cf. हाल्टिंग समस्या), seqकेवल इसका मूल्यांकन करने का प्रयास कर सकता है, और स्वयं ही Hal को मोड़ सकता है।

seqपहले पैरामीटर का मूल्यांकन करने के लिए क्या है (पूरी तरह से नहीं, लेकिन "कमजोर सिर सामान्य रूप" [1], यानी शीर्ष-सबसे अधिक निर्माता के लिए), फिर दूसरा पैरामीटर वापस करें। यदि पहला पैरामीटर घटित होता है (यानी, एक गैर-समाप्ति संगणना) तो इसका मूल्यांकन seqकरना गैर-समाप्ति का कारण बनता है, और इस प्रकार seq ⊥ a = ⊥

[१] सीक की उपस्थिति में नि: शुल्क प्रमेय - जोहान, वोइग्लैंडर http://www.iai.uni-bonn.de/~jv/p76-voigtlaender.pdf


मैं seq के लिए जो विनिर्देश देता हूं, वह seq की परिभाषा है क्योंकि ठीक यही है कि हास्केल 2010 की रिपोर्ट धारा 6.2 में कहती है। Seq की आपकी ऑपरेशन परिभाषा हास्केल 2010 रिपोर्ट द्वारा समर्थित नहीं है: शब्द "सामान्य रूप" केवल एक बार पूरी तरह से अलग संदर्भ में रिपोर्ट में होते हैं। यह मेरी समझ से भी असंगत है कि जीएचसी अक्सर पहले तर्क से पहले seq करने के लिए दूसरे तर्क को कम कर देगा, या पहले तर्क को बिल्कुल भी कम नहीं किया जाएगा क्योंकि कठोरता विश्लेषक ने साबित कर दिया है कि यह सांख्यिकीय रूप से गैर-निचला है।
रसेल ओ'कॉनर

पैरामीट्रिकिटी सीधे तौर पर यह नहीं कहती है कि हम किसी भी डिकंस्ट्रक्टर्स को लागू नहीं कर सकते हैं, और न ही यह कहते हैं कि हम पहले पैरामीटर को फ़ंक्शन मान के साथ कभी भी पहचान नहीं सकते हैं। फिक्स्चरपॉइंट के साथ बहुरूपता वाले लैम्ब्डा कैलकुलस के लिए सभी पैरामेरिटी कहती है कि seq सख्त कार्यों को अवशोषित कर सकता है, या अधिक सामान्यतः कुछ सख्त संबंधों के लिए पकड़ में seq होते हैं। मैं मानता हूं कि यह प्रशंसनीय है कि पैरामीट्रिकिटी का इस्तेमाल साबित करने के लिए किया जा सकता है (\ x -> ⊥) & ne; Would, लेकिन मैं एक कठोर प्रमाण देखना चाहूंगा।
रसेल ओ'कॉनर

एक फ़ंक्शन के मामले में f : forall a . a -> T(जहां Tकुछ अन्य प्रकार है), फिर fकिसी भी डिकंस्ट्रक्टर्स को इसके पहले तर्क पर लागू नहीं कर सकता क्योंकि यह नहीं जानता कि कौन से डिकंस्ट्रक्टर्स को लागू करना है। हम प्रकारों पर "केस" नहीं कर सकते। मैंने उपरोक्त उत्तर को बेहतर बनाने का प्रयास किया है ( seqसामान्य रूप से मूल्यांकन करने की जानकारी का हवाला देते हुए )।
dorchard

मैं बाद में कठोर प्रमाण करने की कोशिश कर सकता हूं अगर मुझे समय मिलता है (रेनॉल्ड्स की शैली में संबंधों का उपयोग करना एक अच्छा तरीका हो सकता है)।
dorchard

@ रसेल ओ'कॉनर: सीक का वर्णन उन व्यवहारों के साथ "असंगत" नहीं है, यह सिर्फ एक परिचालन विनिर्देश है (और व्यवहार अनुकूलन हैं जो अंतिम परिणाम नहीं बदलते हैं)।
Blaisorblade

2

λx.λx.

सैमसन अब्रामस्की ने इस मुद्दे पर बहुत समय पहले विचार किया था और " द लेजी लैंबडा कैलकुलस " नामक एक पेपर लिखा था । इसलिए, यदि आप औपचारिक परिभाषा चाहते हैं, तो यह वह जगह है जहाँ आप देख सकते हैं।


1
जाहिरा तौर पर, ये विवरण केवल "हास्केल कर्नेल" में उतर कर परिभाषित किया गया है। यह कहां परिभाषित किया गया है? रिपोर्ट कहती है, सेक में। 1.2 : "हालांकि कर्नेल औपचारिक रूप से निर्दिष्ट नहीं किया गया है, यह अनिवार्य रूप से लैम्बडा कैलकुलस का एक छोटा सा सुव्यवस्थित रूप है, जिसमें एक सीधा-साकार अर्थविज्ञान है। कर्नेल में प्रत्येक सिंटैक्टिक संरचना का अनुवाद वाक्यविन्यास के रूप में प्रस्तुत किया गया है।"
ब्लिसोरब्लेड

हास्केल 2010 की रिपोर्ट वही कहती है , आश्चर्यजनक रूप से।
१०:५२ पर ब्लेज़ोरब्लेड

अब्रामस्की के संदर्भ के लिए धन्यवाद! मैंने इसे देखने के लिए स्किम किया कि यह प्रश्न का उत्तर कैसे देता है, और मैं निम्नलिखित उत्तर के साथ आया: cstheory.stackexchange.com/a/21732/989
Blaisorblade

2

साबित हो रहा है कि λ x। L the Ω is लक्ष्यों में से एक है, अब्रामस्की ने अपने आलसी लंबोदा पथरी सिद्धांत ( अपने कागज के पृष्ठ 2 , पहले से ही उदय रेड्डी द्वारा उद्धृत) के लिए निर्धारित किया है, क्योंकि वे दोनों कमजोर सिर सामान्य रूप में हैं। 2.7 की परिभाषा के अनुसार, वह स्पष्ट रूप से चर्चा करता है कि एटा-कमी λ x। एम एक्स → एम आमतौर पर मान्य नहीं है, लेकिन यह संभव है अगर एम हर वातावरण में समाप्त हो जाए। इसका मतलब यह नहीं है कि एम को कुल फ़ंक्शन होना चाहिए - केवल इसका मूल्यांकन करना होगा कि एम को समाप्त करना चाहिए (उदाहरण के लिए, मेमने को कम करके)।

आपका प्रश्न व्यावहारिक चिंताओं (प्रदर्शन) से प्रेरित लगता है। हालांकि, भले ही हास्केल रिपोर्ट पूरी तरह से स्पष्ट से कम हो सकती है, मुझे संदेह है कि λ x के बराबर। Implementation implementationwith; हास्केल के एक उपयोगी कार्यान्वयन का उत्पादन करेगा; यह हास्केल '98 को लागू करता है या नहीं, यह बहस का मुद्दा नहीं है, लेकिन टिप्पणी को देखते हुए, यह स्पष्ट है कि लेखकों ने इसे करने का इरादा किया है।

अंत में, कैसे मनमाने ढंग से इनपुट प्रकार के लिए तत्वों को उत्पन्न करने के लिए seq है? (मुझे पता है कि क्विकचेक उस के लिए आर्बिटवर्ल्ड टाइपकास्ट को परिभाषित करता है, लेकिन आपको इस तरह की बाधाओं को जोड़ने की अनुमति नहीं है)। यह पैरामीट्रिकिटी का उल्लंघन करता है।

अपडेट किया गया : मैंने इस अधिकार को कोड करने का प्रबंधन नहीं किया (क्योंकि मैं हास्केल में इतना धाराप्रवाह नहीं हूं), और इसे ठीक करने के लिए नेस्टेड runSTक्षेत्रों की आवश्यकता होती है। मैंने इस तरह के मनमाने तत्वों को बचाने के लिए एक एकल संदर्भ सेल (एसटी मोनद में) का उपयोग करने की कोशिश की, उन्हें बाद में पढ़ा, और उन्हें सार्वभौमिक रूप से उपलब्ध कराया। पैरामीट्रिकिटी यह साबित करती है कि break_parametricityनीचे परिभाषित नहीं किया जा सकता है (नीचे लौटने के अलावा, उदाहरण के लिए एक त्रुटि), जबकि यह उन तत्वों को पुनर्प्राप्त कर सकता है जो आपके प्रस्तावित seq उत्पन्न करेगा।

import Control.Monad.ST
import Data.STRef
import Data.Maybe

produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }

break_parametricity :: a
break_parametricity = fromJust produce_maybe_a

मुझे यह स्वीकार करना होगा कि मुझे यहां आवश्यक पैरामीट्रिकिटी प्रमाण को औपचारिक रूप से समझने में थोड़ी फजी है, लेकिन हास्केल में पैरामीट्रिकिटी का यह अनौपचारिक उपयोग मानक है; लेकिन मुझे डेरेक ड्रेयर के लेखन से पता चला कि इन अंतिम वर्षों में आवश्यक सिद्धांत पर तेजी से काम किया जा रहा है।

संपादन:

  • मुझे यह भी निश्चित नहीं है कि क्या आपको उन एक्सटेंशनों की आवश्यकता है, जिनका अध्ययन एमएल-जैसी, अनिवार्य और अप्रयुक्त भाषाओं के लिए किया जाता है, या क्या पैरामीट्रिकिटी के शास्त्रीय सिद्धांत हास्केल को कवर करते हैं।
  • इसके अलावा, मैंने डेरेक ड्रेयर का उल्लेख केवल इसलिए किया क्योंकि मैं केवल बाद में उदय रेड्डी के काम में आया था - मैंने इसके बारे में हाल ही में "रेनॉल्ड्स का सार" से सीखा। (मैंने केवल पिछले महीने या इतने पर पैरामीट्रिकिटी पर साहित्य पढ़ना शुरू किया है)।

(\x -> writeSTRef cell (Just x) >> return x)यादृच्छिक आदानों पर मूल्यांकन सेल में एक लिखने को निष्पादित नहीं करता है। केवल एसटी कमांड जो इसे अनुक्रम में पारित करते runSTहैं, उन्हें कभी भी निष्पादित किया जाता है। इसी तरह, रनिंग main = (putStrLn "Hello") `seq` (return ())डिस्प्ले पर कुछ भी प्रिंट नहीं करता है।
रसेल ओ'कॉनर

@ RussellO'Connor, बेशक आप सही हैं - परीक्षण कठिन है क्योंकि seq में वह व्यवहार नहीं है जिसकी हम चर्चा करते हैं। लेकिन मैं अभी भी लगता है कि प्रति उत्पन्न करने वाले तत्व प्रति पैरामीट्रिकिटी को तोड़ते हैं। मैं इस बात का जवाब देने की कोशिश करूंगा कि उदाहरण के लिए उत्तर दें।
ब्लिसोरब्लेड

हम्म, जवाब के लिए स्पष्ट तय करने के लिए रनिंग क्षेत्रों में नेस्टिंग और आंतरिक क्षेत्र में बाहरी क्षेत्र से सेल का उपयोग करने की आवश्यकता होती है, लेकिन इसकी अनुमति नहीं है।
ब्लिसोरब्लेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.