मैं "सात सप्ताह में सात भाषाओं" एटीएम पढ़ रहा हूं, और मैं कुछ प्रोलॉग क्वेरी पर फंस गया हूं कि मुझे 'नहीं' प्रतिक्रिया नहीं है।चर के साथ प्रोलॉग प्रश्नों में ` +` के साथ समस्या
friends.pl
फ़ाइल इस तरह दिखता है:
| ?- ['friends'].
compiling /home/marc/btlang-code/code/prolog/friends.pl for byte code...
/home/marc/btlang-code/code/prolog/friends.pl compiled, 12 lines read - 994 bytes written, 8 ms
yes
| ?- friend(wallace,grommit).
yes
| ?- friend(wallace,wendolene).
no
यह सभी के रूप में की उम्मीद है:
likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).
friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).
मैं जैसे उस पर कुछ तुच्छ प्रश्नों कर सकते हैं। अब, मैं क्वेरी में एक चर प्रस्तुत करना चाहता हूँ। मेरा इरादा यह है कि प्रोलॉग मुझे वैलेस के सभी दोस्तों की एक सूची देगा। मैं X = grommit
उम्मीद कर रहा हूँ, लेकिन मैं no
हो रही है:
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- friend(wallace,X).
1 1 Call: friend(wallace,_16) ?
2 2 Call: \+wallace=_16 ?
3 3 Call: wallace=_16 ?
3 3 Exit: wallace=wallace ?
2 2 Fail: \+wallace=_16 ?
1 1 Fail: friend(wallace,_16) ?
no
{trace}
यह भी X
(_16
) grommit
साथ एकजुट करने के लिए कोशिश नहीं करता। क्यूं कर?
ठीक है, समझा। आप 'दोस्त/2' को कैसे सुधारेंगे ताकि यह चर के साथ एक क्वेरी के साथ काम करे? –
पहली नज़र में, मैंने समानता ऑपरेटर '==/2' का उपयोग किया होगा और इसे' मित्र (एक्स, वाई) के रूप में लिखा होगा: - \ + (एक्स == वाई), पसंद (एक्स, जेड), पसंद (वाई , जेड)। 'लेकिन इस संस्करण में आपके दोस्तों के भीतर स्वयं को शामिल करने का दोष है, उदाहरण के लिए 'मित्र (दीवार, एक्स)' समाधान के रूप में 'दीवारों' की सूची देगा। तो फिलिप जेएफ सुझाव देता है कि फिलिप जेएफ सुझाव देता है कि भले ही वह एकीकरण ऑपरेटर का उपयोग कर रहा है, अंत में चेक डालने के लिए: 'दोस्त (एक्स, वाई): - पसंद (एक्स, जेड), पसंद (वाई, जेड), एक्स \ == वाई'। (ध्यान दें कि '\ ==/2'' ==/2' को अस्वीकार करने के बराबर है, लेकिन स्पष्ट, बस अधिक प्रत्यक्ष।) –