2011-11-21 16 views
26

क्या कोई प्रोलॉग में == और = ऑपरेटर के बीच अंतर को समझा सकता है? मुझे पता है कि X = Y का मतलब है कि एक्स वाई के साथ एकीकृत करता है और यह सच है कि एक्स पहले से ही वाई के साथ एकीकृत करता है या इसे बनाया जा सकता है, लेकिन मुझे नहीं पता कि यह == से अलग कैसे है।प्रोलॉग में == और = के बीच क्या अंतर है?

अनुवर्ती: वह (स्वीकृत उत्तर देखें) समझ में आता है। एक और सवाल हालांकि, क्या ऐसी स्थिति है जहां X \= Y सत्य है और X \== Y गलत है (या इसके विपरीत)? यही है, X \= Y परीक्षण करता है अगर वे एकीकृत नहीं हो सकते हैं या यदि वे वर्तमान में एकीकृत नहीं हैं?

+1

"यह समझ में आता है।": क्या आप कृपया यह समझ सकते हैं कि क्या समझ में आता है या सवाल से इसे हटा देता है और अंततः इसे उत्तर में टिप्पणी के रूप में जोड़ता है? –

+0

@moose: "फॉलो-अप" ('=' और '==') के साथ नकारात्मक संयोजन को मेरे उत्तर में टिप्पणियों के रूप में शुरू किया गया। मुझे संदेह है कि "यह समझ में आता है" मेरे पहले दो पैराग्राफ के संदर्भ में है, जिसके बाद मैंने आगे जवाब दिया। देखें कि मेरा संपादन इस भावना को दूर करने के लिए पर्याप्त लगता है या नहीं। – hardmath

उत्तर

29

प्रोलॉग में = "ऑपरेटर" वास्तव में एक अनुमान है (इन्फिक्स नोटेशन के साथ) =/2 जो दो शर्तों को एकीकृत करते समय सफल होता है। इस प्रकार X = 2 या एक ही बात करने के लिए 2 = X राशि, एक लक्ष्य के साथ 2.

== "ऑपरेटर" यह सफल होता है कि केवल यदि दो शब्दों को पहले से ही आगे एकीकरण के बिना समान हैं में अलग है X एकजुट करने के लिए। इस प्रकार X == 2 सच है ही अगर चर X पहले मूल्य 2.

जोड़ा गया आवंटित किया गया था: यह जब "नहीं" इन लक्ष्यों में जॉन्स द्वारा नीचे मिलाया जाता है टिप्पणी प्रति, क्या होता है के माध्यम से काम करने के लिए दिलचस्प है। Amzi में अच्छा set of examples देखें! प्रोलॉग प्रलेखन।

\= का अर्थ है कि दो शर्तों को एकीकृत नहीं किया जा सकता है, यानी कि एकीकरण विफल हो जाता है। विफलता के रूप में अस्वीकृति के सभी अनुप्रयोगों के साथ, "एकीकृत नहीं" शब्दों के बीच किसी भी एकीकरण में परिणाम (और नहीं कर सकता) होता है।

\== का अर्थ है कि दो शर्तें समान नहीं हैं। यह सफल होने पर भी कोई एकीकरण नहीं होता है।

अंत में सोचें कि not(not(X = Y)) क्या करेगा। आंतरिक लक्ष्य सफल होता है यदि एक्स और वाई (जो मनमाने ढंग से शब्द हो सकते हैं) को एकीकृत किया जा सकता है, और इसी तरह की डबल अस्वीकृति भी होगी।हालांकि डबल नकारात्मकता के अंदर आंतरिक लक्ष्य को लपेटने से एक लक्ष्य उत्पन्न होता है जो सफल होता है यदि दो शर्तों को एकीकृत किया जा सकता है लेकिन उन शर्तों को एकजुट किए बिना

पाठक के लिए यह अभ्यास करने के लिए एक अभ्यास के रूप में छोड़ा गया है कि not(not(X == Y)) में कोई समान उपयोगिता है या नहीं।

+0

यह समझ में आता है। एक और सवाल हालांकि, क्या ऐसी कोई स्थिति है जहां 'एक्स \ = वाई' सच है और 'एक्स \ == वाई' गलत है (या इसके विपरीत)? यही है, 'एक्स \ = वाई' परीक्षण करता है अगर वे एकीकृत नहीं हो सकते हैं या यदि वे वर्तमान में एकीकृत नहीं हैं? – JohnS

+0

@ जॉन्स: ध्यान दें कि 'एक्स \ = वाई' 'नहीं (एक्स = वाई)' जैसा है, या कुछ प्रोलॉग कार्यान्वयन के रूप में, \ \ (X = Y)'। आगे की टिप्पणियों के लिए मेरे उत्तर के अतिरिक्त भाग को देखें। – hardmath

+0

"इस प्रकार एक्स == 2 केवल तभी सत्य है जब चर एक्स को पहले मूल्य 2 असाइन किया गया था।" नोटिस करना बहुत महत्वपूर्ण है, क्योंकि आपके पास समान आउटपुट के साथ दो गणनाएं हो सकती हैं जो '==' पास नहीं होती हैं। उदाहरण के लिए '2/2 * 2 == * (2, (/ (2,2)))। क्योंकि बायीं तरफ शब्द वास्तव में अंकगणितीय शब्दों में टूट नहीं जाता है जब तक इसका मूल्यांकन नहीं किया जाता है। –

5

= एकीकरण के लिए खड़ा है, इसका मतलब है कि यह अन्य सदस्यों से मेल खाने के लिए मुक्त चर को बांधने का प्रयास करेगा। उदाहरण के लिए उदाहरण के लिए: ए = एच (एक्स) ए को एच (एक्स) शब्द में बदल देगा यदि ए मुक्त है, और अगर ए कहने के लिए बाध्य है तो असफल हो जाएगा। एकीकरण बहुत अच्छा है क्योंकि आप इसके साथ मिलान पैटर्न कर सकते हैं, उदाहरण के लिए:

X-Y:Z = 5-[a, b, c]:y 

आप

X = 5, Y = [a, b, c] and Z = y 

दे देंगे क्योंकि prolog XY बनाने की कोशिश करता: y: जेड अभिव्यक्ति 5- [क, ख, ग] फिट। यह बहुत उपयोगी है।

ध्यान दें कि एकीकरण प्रयोग किया जाता है जब आप एक विधेय फोन और कुछ तकनीकों पीछा: कहते हैं कि तुम एक पुनरावर्ती विधेय में एक संचायक का मान देने के लिए चाहते हैं, आप ऐसा कर सकते हैं:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

पहले खंड तीसरे और दूसरे तर्क को एकजुट करने का प्रयास करेंगे, इसलिए यदि तीसरा मुफ़्त है, तो अब यह दूसरे के समान मूल्य है।

== चर को बांधने की कोशिश किए बिना समानता है।

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