2016-07-01 6 views
5

यहाँ एक पहले अवलोकन हैis_list/1 और चर

?- [] = _, [_,_,_] = _. 
true. 

इसलिए, क्यों is_list/1 लागू किया जाएगा इस तरह के

?- is_list(_). 
false. 

कि या

?- is_list([_|_]). 
false. 

जब _ स्पष्ट रूप से एक सूची के साथ एकीकृत किया जा सकता है? क्या यह तर्कसंगत रूप से अच्छा नहीं होगा कि यह true होगा?

SWI-Prolog's documentation for is_list/1 में, एक नोट का कहना है:

संस्करणों में 5.0.1 से पहले, is_list/1 सिर्फ [] या [_|_] और proper_list/1 के लिए वर्तमान is_list/1 की भूमिका की थी जाँच की। वर्तमान परिभाषा डी वास्तविक तथ्य के अनुरूप है।

यह वास्तविक तथ्य क्यों है?

उत्तर

6

आप सही तरीके से पालन के रूप में, is_list/1, अस्वस्थ, या बल्कि अधूरा है, क्योंकि यह गलत तरीके से कहते कोई समाधान देखते हैं कि जब सबसे सामान्य प्रश्न उत्पन्न कर रहा है।

 
?- is_list(Ls). 
false. 

कोई सूची मौजूद नहीं है? चलो!

यह दुर्भाग्यपूर्ण विशेषता सभी वंशानुगत प्रकार atom/1 तरह विधेय की जाँच करके साझा किया जाता है, integer/1   आदि, जिनकी अशुद्धता स्पष्ट था पहले से ही है जब इन विधेय कल्पना अभी तक लेबलिंग के बाद जो लोग सही ढंग से "शुद्धतावादियों" के रूप में उनके द्वारा सुझाए गए अर्थ विज्ञान का विरोध के माध्यम से धकेल दिया गया (जो उस समय, उस शब्द के प्रशंसनीय चरित्र की कमी थी जब से अधिग्रहण किया गया था)।

मामले की तरह:

 
?- is_list(Ls), Ls = []. 
false. 

?- Ls = [], is_list(Ls). 
Ls = []. 

स्पष्ट रूप से वर्णन है कि कुछ मौलिक इस तरह के गैर monotonic   परीक्षणों के साथ देखने के एक तार्किक बिंदु से टूट गया है। "Prolog's (,)/2 तार्किक संयोजन नहीं है", हां, यदि आप अपने कोड में पहली जगह में अजीब भविष्यवाणियों का उपयोग करते हैं। अन्यथा, (,)/2 हमेशा लक्ष्यों का तार्किक संयोजन है।

तत्काल त्रुटियों को फेंकने के लिए एक साफ और तार्किक रूप से सही तरीका है जो अभी तक निर्धारित नहीं किया जा सकता है।के बाद विरासत में मिला विसंगत विधेय की अशुद्धता भी   Prolog के आकस्मिक उपयोगकर्ताओं के लिए असहनीय हो गया है

library(error) और विशेष रूप से must_be/2 में एक ध्वनि दिशा में जाने:

 
?- must_be(list, X). 
Arguments are not sufficiently instantiated 

?- must_be(list, [_|_]). 
Arguments are not sufficiently instantiated 

?- must_be(list, [a,b,c]). 
true. 

must_be/2 उपयोग करने के लिए आसान है और एक अच्छा पहला है अधिक सही तर्क कार्यक्रमों की ओर कदम। अन्य संरचनाएं क्षितिज पर भी दिखाई देती हैं, और मुझे आशा है कि अन्य लोग वर्तमान स्थिति पर टिप्पणी करेंगे।

और अब वास्तविक शब्दों के लिए: एक तरफ बुनियादी समस्या ऊपर उल्लिखित लाना, विवाद में SWI   प्रलेखन है उल्लेख सबसे बाहरी functor पर्याप्त एक सूची के रूप में एक अवधि के संबंध में, या सूची चाहिए कि क्या करने के लिए जाँच करें कि क्या वास्तव में एक सूची का आगमनात्मक परिभाषा है, जो के अनुरूप:

  • परमाणु [] एक सूची है।
  • अगर Ls एक सूची है, तो '.'(_, Ls) एक सूची है।

ध्यान दें कि हाल के एसडब्ल्यूआई संस्करणों में, [] भी एक परमाणु नहीं है, इसलिए यह फिर से इस धारणा को तोड़ देता है। जब एक साधारण विफलता अधिक उपयुक्त हो सकता है

+3

लेकिन 'must_be (सूची, non_list)' एक प्रकार की त्रुटि पैदा करता है। शायद ['itype'] (http://stackoverflow.com/a/30600104/772868) एक समाधान है। – false

+1

हाँ, या तो इस, या हो सकता है एक ध्वज है कि चुप विफलताओं में त्रुटियों टाइप बदल जाता है? – mat

+1

वास्तविक समस्या लक्ष्यों है कि कुछ मूक विफलता का एक परिणाम के रूप में सफल होने के साथ आता है। यही कारण है कि यहां तक ​​कि "मूक विफलता" के विचार मुझे अस्वस्थ-यह सिर्फ मुसीबतों के लिए भीख माँग रहा है देता है ... यह यकीन है कि चुप विफलता बनाने का किसी तरह की जरूरत होगी गया था ** नहीं ** इस्तेमाल किया जब कुछ लक्ष्य साबित। – repeat

संबंधित मुद्दे