2010-07-24 18 views
25

मेरा एसडब्ल्यूआई-प्रोलॉग ज्ञान बेस में निम्नलिखित दो तथ्य हैं:यह प्रोलॉग क्वेरी सच और झूठी क्यों है?

f(a,b). 
f(a,c). 

अब अगर मैं क्वेरी

?- f(a,c). 
true. 

उत्पन्न करता हूं लेकिन

?- f(a,b). 
true ; 
false. 

क्यों f (a, b) दोनों है सही और गलत? यह तब होता है जब केबी में तीन तथ्य होते हैं। अगर मैं एफ (ए, डी) संलग्न करता हूं। केबी के लिए, फिर एफ (ए, डी) सच है (केवल), लेकिन एफ (ए, बी) और एफ (ए, सी) दोनों सत्य और झूठे हैं। क्या हो रहा है, और मैं क्या कर सकता हूं ताकि प्रोलॉग इन प्रश्नों के उत्तर (केवल) सच हो?

+3

अरे, अच्छा सवाल: आप Prolog बताने के लिए पहली सफल हिट के बाद उत्तर की तलाश में बंद करना चाहते हैं, तो कटौती (!) का उपयोग करें। –

उत्तर

24

:

विचार करें कि Prolog निर्धारित करता है कि f(a,c) सच है या नहीं (नोट इस जवाब एक अनुमान के कुछ है)। यह पहला नियम, f(a,b) जांचता है, और एक मैच नहीं मिलता है, लेकिन दूसरा नियम, f(a,c) मैचों। इसलिए, f(a,c) सच है। इसके अलावा, चूंकि f के लिए कोई और नियम नहीं हैं, इसलिए बैकट्रैक होने की अनुमति देने में कोई बात नहीं है - कोई अन्य संभावित समाधान नहीं हैं।

अब f(a,b) पर विचार करें। Prolog पहले नियम की जांच करेगा, और एक मैच मिल जाएगा। इसलिए, f(a,b) सच है। हालांकि, सभी नियम समाप्त नहीं हुए हैं। इसलिए, Prolog खोज जारी रखने की अनुमति देगा (यदि आप ; हिट करते हैं)। जब आप खोज और बैकट्रैक जारी रखते हैं, तो यह पता चलेगा कि शेष नियम, विशेष रूप से f(a,c), f(a,b) से मेल नहीं खाते हैं। इसलिए, परिणाम झूठा है।

+11

यह उत्तर सही है। प्रोलॉग में, जिस क्रम में आपके तथ्यों के नियम हैं, वे एक प्रश्न से प्राप्त आदेश को निर्धारित करते हैं। अधिक विशेष रूप से, 'बैकट्रैक' विकल्प ";" अनिवार्य रूप से क्वेरी इंजन को लौटे हुए परिणाम को त्यागने के लिए मजबूर करता है और सवाल का जवाब देता है "क्या कोई * अन्य * उत्तर हैं?"। तो, यह नहीं है कि एफ (ए, बी) दोनों सत्य और झूठे हैं; बल्कि यह सच है और यदि आप उस नतीजे को अनदेखा करना चुनते हैं तो इंजन आपको बताएगा कि कोई अन्य एफ (ए, बी) तथ्य प्रविष्टियां नहीं हैं। यह साबित करने के लिए, अगर आप दूसरा एफ (ए, बी) तथ्य जोड़ते हैं तो क्या होता है देखें। – Assaf

+4

यह भी दिखाता है कि यदि आप प्रदर्शन के बारे में चिंतित हैं तो आपको अपने तर्कों के आदेश पर ध्यान क्यों देना चाहिए। यदि भविष्यवाणी 'एफ' में तर्कों का क्रम फ़्लिप किया गया था, तो ऐसा नहीं होता क्योंकि प्रारंभिक तर्क अब समान नहीं होते हैं, और इसलिए कोई विकल्प बिंदु न छोड़ें। ऐसा इसलिए होता है क्योंकि अधिकांश prologs तर्क अनुक्रमणिंग करते हैं, जो अग्रिम में खोज-स्थान से छेड़छाड़ करने के लिए असंगत तर्कों के साथ भविष्यवाणी करता है। एसडब्ल्यूआई प्रोलॉग केवल डिफ़ॉल्ट रूप से पहले तर्क को अनुक्रमित करता है, लेकिन इसे बदला जा सकता है। – nedned

11

बस माइकल विलियमसन के जवाब के अतिरिक्त।

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true.