Prolog क्वेरी: पुनरावर्ती प्रश्नों के लिए कैसे मायने रखता है

Nov 22 2020

मैं एक सूची के nth तत्व को खोजने के लिए एक विधेय लिखने की कोशिश कर रहा हूं।

शुरू में मैंने कुछ इस तरह लिखा:

nth([X|_], 0, X).
nth([_|T],N,Z):- N > 0, nth(T, M, Z), N is M + 1.

यह जैसे प्रश्नों के लिए काम करता है, nth([1, 2, 3, 4, 5], 0, X).लेकिन जैसे प्रश्नों के लिए nth([1, 2, 3, 4, 5], N, 1)., मुझे "I के बाद" "अपर्याप्त तर्कपूर्ण त्रुटि" प्राप्त होती है; जवाब मिलने के बाद। मुझे पता है कि इस मामले में केवल 1 एएनएस होगा, लेकिन पूर्णता के लिए, मैं जानना चाहता हूं कि क्यों।

मैंने यहां स्टैक ओवरफ्लो पर पढ़ा कि निम्नलिखित एक बेहतर समाधान है:

nth([X|_], 0, X) :- !.
nth([_|Y], N, Z) :- N > 0, M is N-1, nth(Y, M, Z).

मैं यह समझना चाहता हूं कि मेरे उत्तर के M is N-1, nth(Y, M, Z).मुकाबले क्यों फर्क पड़ता है nth(T, M, Z), N is M + 1

पुनश्च: मुझे लगता है कि प्रश्न शीर्षक में सुधार किया जा सकता है, लेकिन मुझे यकीन नहीं है कि कैसे। यदि आपके पास सुझाव हैं, तो कृपया मुझे बताएं!

जवाब

3 rajashekar Nov 22 2020 at 14:56

is/2एक संपूर्ण बाधा नहीं है। इसलिए N is M + 1और M is N - 1बराबर दिखते हैं लेकिन वे नहीं हैं। पहला केवल तभी सफल होता है जब M को तत्काल किया जाता है और दूसरा जब N को त्वरित किया जाता है। क्या आपने अन्य शून्य सूचकांकों के साथ अपने समाधान की कोशिश की है? वे काम नहीं करेंगे। आप plus(1, M, N)इसे काम करने के लिए दोनों में से किसी के बजाय उपयोग कर सकते हैं । इसके अलावा plus(1, M, N)पुनरावर्ती कॉल करने से पहले क्लॉज ऑर्डर करने के मामले होने चाहिए nth

nth([X|_], 0, X).
nth([_|T],N,Z):- N > 0, plus(1, M, N), nth(T, M, Z).

यदि N > 0, nth(T, M, Z), plus(1, M, N)आपका क्लॉज ऑर्डर कर रहा है, तो आपका कार्यक्रम nth(T, M, Z)पहले संतुष्ट करने का प्रयास करेगा और N > 0एम से पहले से ही तत्काल नहीं होने के कारण एक अज्ञात त्रुटि का कारण बन सकता है।

साथ ही जेनेरिक केस में भी कोई प्रोग्राम काम नहीं करेगा।