2012-11-15 26 views
6

मैं एक कठिन Prolog में निषेध पर स्पष्ट जवाब के लिए खोज समय मिला है, तो मैं माफी माँगता हूँ अगर यह एक स्पष्ट सवाल यह है:SWI-prolog निषेध

मैं एक सरल कोड है कि तार्किक कहेंगे लिखने के लिए कोशिश कर रहा हूँ "एक्स और वाई एक दूसरे से प्यार करता है, तो एक्स वाई पसंद करती है और केवल वाई" है कि

likes(mary,john). 
likes(mary,chad). 
likes(john,mary). 

loves(X,Y):- likes(X,Y), \+likes(X,Z). 

मैं तो मेरे कार्यक्रम चलाने के लिए और बस से पूछते हैं:: मेरी .pl कोड कुछ इस तरह दिखता

?- loves(X,Y). 

लेकिन यह हमेशा बाहर झूठी आता है। मेरे तर्क के आधार पर यह कह रही है 'एक्स = जॉन, वाई = मेरी' वापस आ जाना चाहिए।

मैंने कटौती के साथ नकारात्मकता को अलग करने के कुछ संयोजनों की कोशिश की है, "प्यार" को परिभाषित करने के लिए कई लाइनों की कोशिश कर रहा है ... शायद मुझे अस्वीकृति का एक प्रमुख सिद्धांत याद आ रहा है, या शायद इसे लागू करने का एक आसान तरीका भी है मैं यहाँ करने के लिए कोशिश कर रहा हूँ। कृपया मुझे बताएं यदि आप मदद कर सकते हैं!

मैं, SWI-Prolog (swipl) का उपयोग कर रहा डेबियन सॉफ्टवेयर प्रबंधक से है कि अगर सब पर मदद करता है, हालांकि मुझे शक है इतना फर्क होगा।

उत्तर

5

आपका समस्या यह है कि Z यह बाध्य नहीं कर रहा है कि अपना नियम \+likes(X,Z) के लिए कहता है, तो कम से कम वहाँ हमेशा जेड हो जाएगा = Y कि अमान्य कर देता है/2 प्यार करता है। मेरा मतलब है, के बाद से पसंद (एक्स, वाई) सच है, निश्चित रूप से सच पसंद (एक्स, जेड) हो जाएगा।

बदलें यह इस तरह से:

loves(X,Y):- likes(X,Y), \+ ((likes(X,Z), Z \= Y)). 

और आप

?- loves(X,Y). 
X = john, 
Y = mary. 
मिलेगा