2011-12-15 12 views
27

समस्या जो मुझे सामना करती है, थोड़ा सा मामूली है। मैं तार्किक Prolog में नहीं उपयोग करना चाहते हैं, लेकिन ऐसा लगता है कि not/1 बात यह है कि मैं चाहता हूँ नहीं है:प्रोलॉग में तार्किक 'नहीं' क्या है?

course(ai). 
course(pl). 
course(os). 

have(X,Y) :- course(X),course(Y),not(X = Y). 

मैं क्वेरी:

have(X,Y), write(X-Y), nl , fail. 

और मैं परिणाम मैं चाहता हूँ नहीं मिलता है: (

+6

नतीजा यह है कि आप चाहते हैं क्या है? –

+2

आपको जो परिणाम मिला है वह आपको प्रश्न पठनीयता के लिए भी अच्छा होगा बीटीडब्ल्यू – m09

+0

मैं चाहता हूं कि यह मेरे लिए पाठ्यक्रम नामों के संयोजनों को प्रिंट करे, जहां दोनों बराबर नहीं हैं, मेरा मतलब है: ai-pl ai-os pl-ai pl -ओएस ओएस-एआई ओएस-पीएल –

उत्तर

12

दोनों SWI-Prolog और GNU Prolog साथ ही, नीचे काम करना चाहिए:

have(X, Y) :- course(X), course(Y), X \= Y. 

में SWI-Prolog, आप भी dif/2 उपयोग कर सकते हैं, जो जब से तुम यह पहले विधेय में उपयोग कर सकते हैं और अधिक सुविधाजनक हो सकता है:

have(X, Y) :- dif(X, Y), course(X), course(Y). 
+7

वैसे भी, ओपी SWI मुझे लगता है कि उसके संस्करण SWI पर काम करता है के बाद से की जाँच कर के बिना टैग किया SWI-pl, भले ही नहीं/1 वहाँ मान्य नहीं है। – m09

33

जगह not(X = Y) की आप \+ X = Y या X \= Y लिखने की ज़रूरत है। लेकिन इसके बजाय dif(X,Y) का उपयोग करने पर विचार करें। dif/2 बी, एसडब्ल्यूआई, वाईएपी, एसआईसीस्टस में मौजूद है।

?- X = b, dif(a, X). 
X = b. 

?- X = b, \+ a = X. 
X = b. 

तो अब सब कुछ ठीक हो रहा है करने के लिए: अंतर देखने के लिए। लेकिन क्या, अगर हम केवल दो लक्ष्यों के क्रम का आदान-प्रदान करते हैं?

?- \+ a = X, X = b. 
false. 

?- dif(a, X), X = b. 
X = b. 

(\+)/1 अब हमें एक अलग परिणाम देता है, a = X के लिए एक जवाब न होने के कारण, लक्ष्य \+ a = X असफल हो जायेगी।

(\+)/1 इस प्रकार निषेध नहीं है, लेकिन समय में इस बिंदु में साध्य नहीं मतलब है।

A safe approximationdif/2 आईएसओ प्रोलॉग में भी संभव है।

+3

बस पूर्णता के लिए, यह "ध्वनि अस्वीकृति" ईसीएलपीएस में '~/2' या' ~ =/2' का उपयोग करके भी उपलब्ध है, और समकक्ष प्रश्न '- ~ (ए = एक्स), एक्स = b.' या '- एक ~ = एक्स, एक्स = b.' – twinterer

+0

क्या कोई अन्य Prolog ग्रहण के अलावा अन्य जो का उपयोग करता है' (~ =)/2' के लिए 'dif/2' है? स्मृति से, मु- और नु-प्रोलॉग का इस्तेमाल होता था। – false

1

जैसा आपने कहा था, ओपी, यह मामूली है।

course(ai). 
course(pl). 
course(os). 

have(X,Y) :- course(X), course(Y), X \== Y). 

कि आपके विधेय ठीक करना चाहिए की कोशिश करो।

खोज रहे हैं एक कदम आगे हालांकि, गणितीय शब्दों, तो आप शायद करने के लिए (एन सी 2) के रूप में करने के लिए (एन पी 2) जो अपने विधेय वर्तमान में परिवर्तन के बजाय प्रदान करता है-संयोजन, चुनाव का विरोध किया समाधान के लिए देख रहे हैं चयन के विकल्पों की व्यवस्था के विरोध में चयन का। मैं ऐसा सोचता हूं।

यदि यह तुम क्या चाहते है, मैं तुम्हें

course(ai). 
course(pl). 
course(os). 

have(X,Y) :- course(X), course(Y), X @< Y). 

कौन नकली रोका जा सके उलट परिणाम कोशिश सुझाव है।

@< का मतलब परमाणु रूप से कम है। < पूर्णांक के लिए है, @< परमाणुओं के लिए है।

3

उपयोगकर्ता द्वारा "गलत" ऊपर, यानी

जवाब देने के लिए एक सहायक के रूप में "जगह में की नहीं (एक्स = वाई) आप लिखने के लिए \ + X = Y की जरूरत है,"

यह दे सकता है धारणा है कि:

एक। "नहीं" और "\ +" अलग बातें

ख कर रहे हैं। \ + काम करेगा जबकि नहीं, गलती, नहीं।

मेरे समझ है कि "नहीं" और "\ + 'के बराबर हैं, लेकिन वह \ + आधुनिक Prolog कार्यक्रमों में पसंद किया जाता है, क्योंकि यह भावना अधिक सहज ज्ञान युक्त है कि बता देते हैं। विशेष रूप से, जबकि "नहीं" अनचाहे कोडर को "सत्य नहीं है" का सुझाव दे सकता है, "\ +" सुझाव देता है "साबित नहीं होता है" जो वास्तव में यह कह रहा है कि वह ऑपरेशन वास्तव में क्या कह रहा है। प्रोलॉग में, "नहीं" "विफलता के रूप में अस्वीकार" का एक उदाहरण है, लेकिन यह महसूस किया जाता है कि \ + प्रोग्रामर को यह स्पष्ट कर देगा कि किसी दिए गए नियम में वास्तव में क्या कहा जा रहा है। तो आप "नहीं" का उपयोग कर सकते हैं (अधिकांश पीएल कार्यान्वयन इसे पीछे की ओर संगतता के लिए रखते हैं) लेकिन एक बेवकूफ आधुनिक पीएल प्रोग्रामर होने के लिए, आपको शायद \ + का उपयोग करना पसंद करना चाहिए।