?- 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)
एक सूची है।
ध्यान दें कि हाल के एसडब्ल्यूआई संस्करणों में, []
भी एक परमाणु नहीं है, इसलिए यह फिर से इस धारणा को तोड़ देता है। जब एक साधारण विफलता अधिक उपयुक्त हो सकता है
लेकिन 'must_be (सूची, non_list)' एक प्रकार की त्रुटि पैदा करता है। शायद ['itype'] (http://stackoverflow.com/a/30600104/772868) एक समाधान है। – false
हाँ, या तो इस, या हो सकता है एक ध्वज है कि चुप विफलताओं में त्रुटियों टाइप बदल जाता है? – mat
वास्तविक समस्या लक्ष्यों है कि कुछ मूक विफलता का एक परिणाम के रूप में सफल होने के साथ आता है। यही कारण है कि यहां तक कि "मूक विफलता" के विचार मुझे अस्वस्थ-यह सिर्फ मुसीबतों के लिए भीख माँग रहा है देता है ... यह यकीन है कि चुप विफलता बनाने का किसी तरह की जरूरत होगी गया था ** नहीं ** इस्तेमाल किया जब कुछ लक्ष्य साबित। – repeat