कोड जैसा आपने पोस्ट किया है (लगभग) ठीक है। खंड के आदेश सिर्फ बदली जा करने के लिए (यह विधेय परिभाषा उत्पादक, जब एक उत्पादक तरीके से उपयोग में बनाने के लिए क्रम में) की जरूरत है:
append([],X,X). % your 2nd line
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line
यह तीन तर्कों के बीच एक संबंध को परिभाषित करता है, मान लें कि A
, B
और C
जाने ।
में आप सबसे पहले कहते हैं, "C
A
और B
अगर A
और C
हैं गैर खाली सूचियों जोड़कर का परिणाम है, वे दोनों एक ही सिर (यानी पहला तत्व), और पूंछ की राशि C
एक ही दूसरे तर्क, B
"" के साथ A
की पूंछ को जोड़ने का नतीजा है।
a a
----------
b b
c c
. d d
e e
. .
इसके बारे में सोचें, यह सही समझ में आता है। यह क्या है, हम append/3
रिश्ते को परिभाषित करना चाहते हैं, और हम जानते हैं कि हम क्या चाहते हैं, इसलिए हम इसके बारे में कुछ स्पष्ट तथ्यों को लिखते हैं कि हम इसे पूरा करना चाहते हैं, यदि आप करेंगे तो कानूनों का पालन करना चाहिए।
तो मान लीजिए कि हमारे पास यह कोड पहले से ही हमारे लिए परिभाषित है, इसका क्या पालन करना चाहिए?जाहिर है, किसी अन्य सूची के साथ कुछ सूची की पूंछ जोड़ना हमें उस दूसरी सूची के साथ पूरी सूची को जोड़ने के परिणाम की पूंछ देता है।
यह परिभाषित करता है कि हम पहली सूची के साथ "स्लाइड" कैसे करते हैं। लेकिन अगर स्लाइड करने के लिए कहीं और नहीं है तो क्या होगा? क्या होगा यदि हम उस सूची के अंत तक पहुंच गए हैं? फिर हम खाली सूची में पहुंचे हैं, और एक और सूची के साथ एक खाली सूची जोड़ना परिणाम के रूप में हमें सूची देता है। जाहिर है। और यह है कि आपके कोड में दूसरी पंक्ति हमें बता रही है, यह कहती है, "खाली सूची को एक और सूची के साथ जोड़ने से परिणाम" "के रूप में सूचीबद्ध होता है।
आश्चर्यजनक रूप से, इन दो कानूनों को लिखा है जो append/3
का पालन करना चाहिए, परिभाषा को स्वयं लिखने जैसा ही है।
अतिरिक्त: यह इसे एक घोषणात्मक दृष्टिकोण से समझाता है; an answer by m09 देखें जो इसे परिचालन बिंदु से अधिक दिखाता है।
ओह मेरा मतलब यह है कि, मैं इसे कैसे कोड करूं जो प्रोलॉग – Zik
के एपेंड() की तरह काम करेगा, आप इसे उसी तरह कोड करते हैं जिसे 'एपेंड' कोड किया गया है ?? आप पहले से ही कार्यान्वयन की खोज कर चुके हैं (यह आपके प्रश्न में कोड की पहली दो पंक्तियां है)। – aioobe