जैसा कि आपके पास तर्क में कुछ पृष्ठभूमि है, आपको तर्क सूत्रों के रूप में नियमों को पढ़ने में मदद मिल सकती है। के/2 dif द्वारा की जगह (\ ==)/2 तब हटाने के रूप में निम्नानुसार/3 पढ़ता है:
remove([], _, [])
← true
remove([X | Xs], X, Ys)
← remove(Xs, X, Ys)
remove([Y | Xs], X, [Y | Ys])
← dif(X,Y)
∧ remove(Xs, X, Ys)
नोट कैसे निहितार्थ तीर नियम के सिर को इंगित करता है। इसका मतलब है कि नियम का शरीर पूर्ववर्ती है और नियम का मुखिया परिणामस्वरूप है। तो आप इस नियम को पढ़ते हैं: यदि नियम का शरीर सत्य है तो नियम का मुखिया सत्य है। नियमों में लक्ष्य संयोजन के साथ जुड़े हुए हैं। ध्यान दें कि तथ्य true
पूर्ववर्ती के रूप में है, जिसका अर्थ है कि remove([], _, [])
हमेशा सत्य है। दूसरी तरफ, यदि नियम का शरीर गलत है कि नियम विफल रहता है लेकिन भविष्यवाणी अभी भी सफल हो सकती है यदि किसी अन्य नियम का शरीर सत्य है। यदि अन्य सभी नियमों के निकाय भी झूठे हैं तो भविष्यवाणी विफल हो जाती है। इसलिए भविष्यवाणी के लिए कई नियम तार्किक होते हैं या: नियम 1 या नियम 2 या नियम 3 सफल होने पर पूर्वानुमान निकालें/3 सफल होता है।
जैसा कि आपने विशेष रूप से वाक्यविन्यास के लिए कहा था, यह सूचियों के लिए सिर और पूंछ नोटेशन से परिचित होने का भी उपयुक्त है। यही कारण है, आप एक सूची के पहले तत्व (रों) स्पष्ट रूप से तो एक सूची निर्माता |
और सूची के बाकी लिख सकते हैं:
[1|Xs]
... सूची 1
साथ शुरू होता है और फिर वहाँ एक आराम
है [1,2|Xs]
... सूची 1
और 2
द्वारा एक आराम
[X|Xs]
... सूची का पालन किया कम से कम एक तत्व से एक आराम
नोट का पालन कैसे सूची तत्वों 012,360 से अलग होते हैं के साथ शुरू होता हैजबकि शेष सूची |
से अलग है। |
के बाद शब्द वास्तव में एक सूची है और यह एक खाली सूची भी हो सकती है।यहाँ बराबर सूचियों के लिए कुछ उदाहरण हैं:
:
[1]
रूप [1|[]]
[1,2]
= [1|[2]]
= [1|[2|[]]]
= [1,2|[]]
निम्न सूची के लिए वहाँ पहले से ही कर रहे हैं यह लिखने के लिए 8 तरीके एक ही है [1,2,3]
= [1,2|[3]]
= [1|[2,3]]
= [1|[2|[3|[]]]]
= ...
उपर्युक्त अवलोकनों के साथ आप एक समय में नियमों की जांच करेंगे। जैसा कि @ लर्कर ने पहले से ही अपने जवाब में किया था, मैं विस्तार से नहीं जाऊंगा। हालांकि, मैं जोड़ना होगा कि यदि कोई नियम कई लक्ष्यों, अपने उदाहरण में 3 नियम की तरह है, मैं इसे उपयोगी एक समय में लक्ष्यों को एक के माध्यम से चलने के लिए लगता है:
remove([Y | Xs], X, [Y | Ys]) :-
तत्व मूल सूची के Y
है भी
remove([Y | Xs], X, [Y | Ys]) :-
dif(X,Y),
X
यदि बिना सूची ... में ... X
Y
और से अलग है ...
remove([Y | Xs], X, [Y | Ys]) :-
dif(X,Y),
remove(Xs, X, Ys).
... संबंध Xs
, X
और Ys
के लिए भी है।
तो प्रतिस्थापन क्यों? अंतर्निहित भविष्यवाणी (\ ==)/2 एकीकरण या दुष्प्रभाव के बिना बस सफल या विफल हो जाती है। किसी दिए गए समय पर टर्म असमानता परीक्षण करने के लिए यह अच्छा है लेकिन बाद में इसका कोई प्रभाव नहीं पड़ता है। निम्नलिखित प्रश्नों पर विचार करें:
?- X=Y, X\==Y.
no
प्रथम चर X
और Y
एकीकृत कर रहे हैं और बाद में असमानता के लिए परीक्षण विफल रहता है। लेकिन:
?- X\==Y, X=Y.
X = Y
पहले असमानता के लिए परीक्षण सफल होता है, अन्यथा Prolog दूसरे लक्ष्य पर भी विचार नहीं करेगा। फिर X
और Y
सफलतापूर्वक एकीकृत हैं। द्वारा इसका मतलब यह है कि बाद में पर कोई प्रभाव नहीं पड़ा। तो भविष्यवाणी पढ़ने पर मैंने जो कुछ भी लिखा है वह वास्तव में अर्थपूर्ण नहीं है (\ ==)/2।
मैं टोपी में निम्नलिखित, if_/3 और =/3 का उपयोग कर फेंक एक छोटा संस्करण के रूप में:
list_without_element([],[],_E).
list_without_element([X|Xs],L,E) :-
if_(X=E,L=Ys,L=[X|Ys]),
list_without_element(Xs,Ys,E).
सही धन्यवाद, वाक्य रचना वास्तव में मुझे भ्रमित किया गया है और कैसे मैं सामान्य रूप से पढ़ता था से इतना अलग प्रतीत हो रहा है विधेय। – user6248190
@ user6248190 मैं एक अनुमानित खंड के बारे में सोचकर शुरू करता हूं, * ऐसा और सच है ** यदि ** .... * शर्तों के अनुक्रम के बाद। – lurker
क्षमा करें एक और बात, क्या निकालने की भविष्यवाणी करने के लिए एक छोटा रास्ता है? हटाने की 3 लाइनें क्यों हैं? – user6248190