क्या प्रोलोग वास्तव में बंद-दुनिया की धारणा पर आधारित है?
बंद दुनिया की धारणा के तहत ,
वर्तमान में जो सत्य नहीं है, वह असत्य है
प्रोलॉग के शब्दार्थ को अक्सर बंद दुनिया धारणा का पालन करने के लिए कहा जाता है, उदाहरण के लिए, यहां :
प्रोलॉग बंद विश्व धारणा (CWA) पर आधारित है - अर्थात, यदि प्रस्ताव तथ्य डेटाबेस में नहीं है और तथ्य डेटाबेस से व्युत्पन्न नहीं है, तो यह सच नहीं है।
हालाँकि, यह इस तरह से व्यवहार नहीं करता है। CWA के तहत, मुझे उम्मीद है
?- a.
false.
लेकिन इसके बजाय, SWI- प्रोलॉग में, मुझे मिलता है:
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
ऐसा क्यों है? क्या यह कहना गलत है कि प्रोलॉग CWA पर आधारित है?
जवाब
जब प्रोलॉग के संदर्भ में क्लोज्ड-वर्ल्ड असेंशन (CWA) के बारे में बात की जाती है, तो अज्ञात भविष्यवाणी (बनाम रनटाइम) प्रणाली के बारे में जानने के बीच अंतर किया जाना चाहिए । दोनों ही मामलों में, क्लॉस के साथ या उसके बिना भविष्यवाणी की जाती है।
एक अज्ञात विधेय को डिफ़ॉल्ट रूप से कॉल करके, एक विधेय अस्तित्व त्रुटि को बढ़ाएँ। एक मानक ध्वज है, unknown
जिसका डिफ़ॉल्ट मान है error
, जिसे सेट किया जा सकता है fail
। इससे आपको वह व्यवहार मिलेगा जिसकी आपको स्पष्ट रूप से तलाश है। शील, मैं आपको दृढ़ता से सलाह देता हूं कि आप ध्वज को उसके डिफ़ॉल्ट मान पर रखें error
, क्योंकि यह प्रोग्रामिंग विधेय (उदाहरण के लिए विधेय नाम या समरूपता) में आसान पहचान की अनुमति देता है।
एक विधेय को रनटाइम के लिए क्या जाना जाता है? निर्देश या विधेय उपदेश समर्पित करें। सबसे परिचित उदाहरण dynamic/1
निर्देश है। यदि आपके कोड में निम्नलिखित पाठ शामिल हैं:
:- dynamic(foo/1).
फिर, संकलन और लोड करने के बाद, आप उम्मीद कर सकते हैं:
?- foo(_).
no.
लेकिन दूसरी निर्देशों ही प्रभाव है (उदाहरण के लिए multifile/1
और discontiguous/1
, यह सोचते हैं कि एक मानक Prolog कार्यान्वयन अनुरूप है!)।
इस प्रकार, ज्ञात विधेय के लिए, प्रोलॉग में CWA की व्याख्या सरल है: जो हम सच साबित नहीं कर सकते, वह गलत है। यानी असफलता से नकारात्मकता , जो तार्किक नकार के समान नहीं है । प्रोलोग नाम तर्क में प्रोग्रामिंग से आता है, लेकिन प्रोलॉग भी एक व्यावहारिक और व्यावहारिक प्रोग्रामिंग भाषा होने का लक्ष्य रखता है।
Prolog में क्या कमी है (और इसे Logtalk द्वारा प्रदान किया गया है ) को एक गतिशील घोषित करने के लिए मजबूर किए बिना इसे घोषित करने में सक्षम किया जा रहा है, या इसके लिए ... या इसके लिए खंड प्रदान करने की आवश्यकता है (उदाहरण के लिए यह उदाहरण देखें )। यह सरल और स्पष्ट CWA शब्दार्थ प्रदान करता है: बिना किसी खंड के घोषित विधेय को विफल करना (समस्याग्रस्त ध्वज के साथ खिलवाड़ की आवश्यकता के बिना ); एक गैर-घोषित विधेय को कॉल करना एक विधेय अस्तित्व त्रुटि को जन्म देता है।unknown
उम्मीद है की यह मदद करेगा। विफलता के रूप में नकार की खोज करना आगे स्पष्टीकरण प्रदान करना चाहिए।
आपकी क्वेरी भाषा में ही होनी चाहिए, क्योंकि a
प्रस्ताव के a/0
लिए भाषा में होना चाहिए, यानी, एक विधेय के रूप में परिभाषित किया गया है। भाषा में सभी अशक्त विधेय प्रस्ताव हैं। आप किसी नए शब्द को पहले भाषा में जोड़े बिना विधेय के रूप में क्वेरी नहीं कर सकते।
के लिए a/1
जब आप बस के रूप में इसे परिभाषित a(b).
यह भाषा में है, तो क्वेरी a(X), dif(X,b)
असफल के बाद से prolog प्रणाली और कोई अन्य शब्द है कि यह संतुष्ट और करीब दुनिया संभालने कोई अन्य कर रहे हैं पता नहीं है जाएगा।