मैं निम्नलिखित स्थिति में हूं: मेरे पास एक सूची है और मैं इसे केवल अंतिम तत्व से हटाना चाहता हूं।प्रोलॉग में एक सूची से अंतिम तत्व को कैसे हटाएं?
मैं निम्नलिखित नियम (कि अच्छी तरह से काम नहीं करते) को लागू किया है:
deleteLastElement([Only],WithoutLast) :-
!,
delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
!,
deleteLastElement(Tail,WithoutLast).
समस्या यह है कि जब मैं इसे कहते हैं, सूची में सभी तत्व नष्ट हो जाती हैं, वास्तव में अगर मैं निष्पादित है निम्नलिखित बयान मैं प्राप्त:
[debug] ?- deleteLastElement([a,b,c], List).
List = [].
निशान को देखते हुए मुझे लगता है कि स्पष्ट है इस समस्या के कारण:
[trace] ?- deleteLastElement([a,b], List).
Call: (7) deleteLastElement([a, b], _G396) ? creep
Call: (8) deleteLastElement([b], _G396) ? creep
Call: (9) lists:delete([b], b, _G396) ? creep
Exit: (9) lists:delete([b], b, []) ? creep
Exit: (8) deleteLastElement([b], []) ? creep
Exit: (7) deleteLastElement([a, b], []) ? creep
List = [].
जब आधार मामले तक पहुँच जाता है, WithoutLast सूची खाली सूची [] के साथ एकीकृत है और जब उलटे पांव लौटने से किया जाता है WithoutLast अभी भी खाली सूची रहते हैं।
यह अच्छा नहीं है।
मैं इसे निम्नलिखित कार्रवाई करते समय लागू करने के लिए सोच रहा था:
- सूची में तत्व की संख्या की गणना से पहले विधेय कि पिछले तत्व हटाना कहते हैं।
- प्रत्यावर्तन द्वारा दोहराएं और तत्व की संख्या का मूल्य हर बार
- इसका मतलब है कि यह पिछले तत्व है तो मैं मूल सूची
लेकिन ऐसा लगता है कि मुझे स्पष्ट नहीं है और इतना अच्छा नहीं है, मुझे पता होगा कि इस समस्या के लिए एक घोषणात्मक अच्छा समाधान है या नहीं।
+1 'एपेंड (बिना लैंड, [_], सूची)' चाल के लिए +1। –