खोज…


परिचय

प्रोलॉग में अंतर सूची एक बिंदु तक एक सूची की संरचना को जानने के लिए अवधारणा को दर्शाती है। सूची के शेष को तब तक अनबाउंड छोड़ा जा सकता है जब तक कि किसी विधेय का पूरा मूल्यांकन नहीं हो जाता। एक सूची जहां इसका अंत अज्ञात है, एक खुली सूची के रूप में संदर्भित किया जाता है, एक छेद द्वारा समाप्त होता है। यह तकनीक विशेष रूप से जटिल वाक्यविन्यास या व्याकरण को मान्य करने के लिए उपयोगी है।

प्रसिद्ध निश्चित क्लॉज ग्रामर (DCG) हुड के तहत संचालित करने के लिए अंतर सूचियों का उपयोग कर रहा है।

मूल उपयोग

यदि एक सूची की संरचना कई बाधाओं से मेल खाती है, तो सत्यापित करें कि हम sumDif/2 पर विचार करें। पहला शब्द विश्लेषण करने के लिए सूची का प्रतिनिधित्व करता है और दूसरा शब्द दूसरी सूची में पहली सूची का हिस्सा है जो हमारे अवरोधों के लिए अज्ञात है।

प्रदर्शन के लिए, sumDif/2 n पूर्णांकों को योग करने के लिए एक अंकगणितीय अभिव्यक्ति को पहचानता है।

sumDif([X, +|OpenList], Hole) :-
    integer(X),
    sumDif(OpenList, Hole).

हम जानते हैं कि सूची को सत्यापित करने का पहला तत्व एक पूर्णांक है, यहां X द्वारा चित्रित किया गया है, इसके बाद जोड़ ( + ) का प्रतीक है। शेष सूची जिसे अभी भी ( OpenList ) पर बाद में संसाधित करने की आवश्यकता है, उस स्तर पर OpenList छोड़ दी गई है। Hole उस सूची के उस हिस्से का प्रतिनिधित्व करता है जिसे हमें सत्यापित करने की आवश्यकता नहीं है

आइए अंकगणितीय sumDif/2 की एक और परिभाषा दें। अंकगणितीय अभिव्यक्ति की मान्यता को पूरा करने के लिए:

sumDif([X|Hole], Hole) :-
    integer(X).

हम खुली सूची के शुरू में सीधे X नामक एक पूर्णांक की अपेक्षा करते हैं। दिलचस्प बात यह है कि Hole की शेष सूची अज्ञात है और यह अंतर सूचियों का पूरा उद्देश्य है: सूची की संरचना को एक बिंदु तक जाना जाता है।

अंत में, जब कोई सूची का मूल्यांकन किया जाता है तो अनुपलब्ध टुकड़ा आता है:

?- sumDif([1,+,2,+,3], []).
true

यह तब होता है जब विधेय का उपयोग किया जाता है कि सूची के अंत का उल्लेख किया गया है, यहां [] , इंगित करता है कि सूची में अतिरिक्त तत्व नहीं हैं।

एक अंकगणितीय अभिव्यक्ति का मूल्यांकन करें

आइए एक व्याकरण को परिभाषित करें जो हमें कोष्ठक के उपयोग के साथ परिवर्धन, गुणा करने में सक्षम बनाता है। इस उदाहरण में अधिक मूल्य जोड़ने के लिए, हम अंकगणितीय अभिव्यक्ति के परिणाम की गणना करने जा रहे हैं। व्याकरण का सारांश:

अभिव्यक्ति → बार
अभिव्यक्ति → बार '+' अभिव्यक्ति
समय → तत्व
समय → तत्व '*' बार
तत्व → "पूर्णांक"
तत्व → '(' अभिव्यक्ति ')'

सभी विधेयकों में 3 की एक समानता है, क्योंकि उन्हें सूची, छेद और अंकगणितीय अभिव्यक्ति के मूल्य की आवश्यकता है।

expression(Value, OpenList, FinalHole) :-
    times(Value, OpenList, FinalHole).

expression(SumValue, OpenList, FinalHole) :-
    times(Value1, OpenList, ['+'|Hole1]),
    expression(Value2, Hole1, FinalHole),
    plus(Value1, Value2, SumValue).

times(Value, OpenList, FinalHole) :-
    element(Value, OpenList, FinalHole).

times(TimesValue, OpenList, FinalHole) :-
    element(Value1, OpenList, ['*'|Hole1]),
    times(Value2, Hole1, FinalHole),
    TimesValue is Value1 * Value2.

element(Value, [Value|FinalHole], FinalHole) :-
    integer(Value).

element(Value, ['('|OpenList], FinalHole) :-
    expression(Value, OpenList, [')'|FinalHole]).

छेद के सिद्धांत को सही तरीके से समझाने के लिए और मान की गणना कैसे की जाती है, आइए दूसरा खंड expression :

expression(SumValue, OpenList, FinalHole) :-
    times(Value1, OpenList, ['+'|Hole1]),
    expression(Value2, Hole1, FinalHole),
    plus(Value1, Value2, SumValue).

खुली सूची को विधेय OpenList द्वारा निरूपित किया जाता है। मान्य करने के लिए पहला तत्व वह है जो अतिरिक्त प्रतीक ( + ) से पहले आता है । जब पहले तत्व को मान्य किया जाता है, तो यह सीधे इसके अतिरिक्त प्रतीक के साथ और सूची की निरंतरता के साथ, Hole1 । हम जानते हैं कि Hole1 मान्य करने के लिए अगला तत्व है और एक और expression हो सकती है, इसलिए Hole1 को तब विधेय expression लिए दिया गया शब्द है।

मूल्य हमेशा पहले कार्यकाल में दर्शाया जाता है। इस खंड में, यह Value1 (सब सिंबल से पहले) और Value2 (अतिरिक्त सिंबल के बाद सब कुछ) के योग से परिभाषित होता है।

अंत में, एक अभिव्यक्ति का मूल्यांकन किया जा सकता है।

?- expression(V, [1,+,3,*,'(',5,+,5,')'], []).
V = 31


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow