Prolog Language
दिष्टता
खोज…
मोनोटोनिक के बारे में तर्क की भविष्यवाणी करता है
घोषणात्मक तर्क को लागू करके मोनोटोनिक विधेयकों को डीबग किया जा सकता है।
शुद्ध प्रोलॉग में, एक प्रोग्रामिंग गलती निम्नलिखित घटनाओं में से एक या सभी को जन्म दे सकती है:
- विधेय गलत तरीके से उस मामले में सफल होता है जहाँ उसे विफल होना चाहिए
- विधेय गलत तरीके से उस मामले में विफल हो जाता है जहां उसे सफल होना चाहिए
- अप्रत्याशित रूप से छोरों को समर्पित करें जहां यह केवल उत्तरों के एक सीमित सेट का उत्पादन करे।
एक उदाहरण के रूप में, विचार करें कि हम घोषणात्मक तर्क द्वारा मामले (2) को कैसे डीबग कर सकते हैं: हम व्यवस्थित रूप से विधेय के खंडों के लक्ष्यों को हटा सकते हैं और देख सकते हैं कि क्या क्वेरी अभी भी विफल रहती है। मोनोटोनिक कोड में, लक्ष्यों को हटाने से अधिकांश परिणामी कार्यक्रम अधिक सामान्य हो सकते हैं । इसलिए, हम त्रुटियों को इंगित कर सकते हैं कि कौन सा लक्ष्य अप्रत्याशित विफलता की ओर जाता है।
मोनोटोनिक के उदाहरण भविष्यवाणी करते हैं
मोनोटोनिक विधेय के उदाहरण हैं:
- साथ एकीकरण
(=)/2याunify_with_occurs_check/2 - अंतर
dif/2, शर्तों की असमानता व्यक्त करना - CLP (FD) एक मोनोटोनिक निष्पादन मोड का उपयोग करके
(#=)/2और(#>)/2की तरह अड़चन डालती है।
प्रोलॉग भविष्यवाणी करता है कि केवल मोनोटोनिक लक्ष्यों का उपयोग स्वयं मोनोटोनिक है।
घोषणात्मक तर्क के लिए मोनोटोनिक की अनुमति देता है:
- एक क्वेरी में एक बाधा (यानी, एक लक्ष्य) को जोड़कर, कम कर सकते हैं, कभी नहीं, समाधान का सेट।
- इस तरह के विधेयकों के एक लक्ष्य को हटाकर सबसे अधिक विस्तार किया जा सकता है, कभी भी समाधान का सेट कम नहीं करना चाहिए।
गैर-मोनोटोनिक भविष्यवाणी करता है
यहाँ उन विधेय के उदाहरण दिए गए हैं जो एकरस नहीं हैं:
- मेटा-लॉजिकल, जैसे कि
var/1,integer/1आदि की भविष्यवाणी करता है - शब्द तुलना
(@<)/2और(@>=)/2तरह भविष्यवाणी करती है - उस उपयोग की भविष्यवाणी करता है
!/0,(\+)/1और अन्य निर्माण जो एकरसता को तोड़ते हैं - सभी समाधान
findall/3औरsetof/3तरह भविष्यवाणी करते हैं।
यदि इन विधेयकों का उपयोग किया जाता है, तो लक्ष्यों को जोड़ने से अधिक समाधान हो सकते हैं, जो तर्क से ज्ञात महत्वपूर्ण घोषणात्मक संपत्ति के लिए काउंटर चलाता है कि बाधाओं को कम करने के लिए , कभी भी विस्तार नहीं हो सकता है , समाधान का सेट।
परिणामस्वरूप, अन्य गुण जिन्हें हम घोषित डिबगिंग के लिए भरोसा करते हैं और अन्य तर्क भी टूट जाते हैं। उदाहरण के लिए, गैर-मोनोटोनिक विधेय पहले-क्रम के तर्क से ज्ञात संयुग्मन की मूलभूत धारणा को तोड़ता है। निम्न उदाहरण यह दिखाता है:
?- var(X), X = a.
X = a.
?- X = a, var(X).
false.
ऑल-सॉल्यूशंस में पाया गया है कि findall/3 भी findall/3 तोड़ती है: क्लॉज़ जोड़ने से उन लक्ष्यों की विफलता हो सकती है जो पहले आयोजित किए गए थे । यह भी पहले क्रम तर्क है, जहां जोड़ने तथ्यों सबसे वृद्धि पर, परिणामों के सेट को कम नहीं कर सकते हैं से भी जाना जाता है के रूप में montonicity के लिए काउंटर चलाता है।
गैर-मोनोटोनिक निर्माण के लिए मोनोटोनिक विकल्प
अपने कार्यक्रमों में अशुद्ध, गैर-मोनोटोनिक निर्माणों के बजाय मोनोटोनिक का उपयोग कैसे करें, इसके उदाहरण यहां दिए गए हैं:
-
dif/2का अर्थ गैर-मोनोटोनिक निर्माणों के बजाय(\=)/2 - अंकगणित बाधाओं की भविष्यवाणी करने के बजाय अंकगणित बाधाओं (सीएलपी (एफडी), सीएलपी (क्यू) और अन्य) का उपयोग किया जाना है
-
!/0लगभग हमेशा गैर-मोनोटोनिक कार्यक्रमों की ओर जाता है और इसे पूरी तरह से बचा जाना चाहिए। - तात्कालिकता त्रुटियों को उन स्थितियों में उठाया जा सकता है जहां आप इस समय एक ध्वनि निर्णय नहीं कर सकते हैं।
दक्षता के साथ एकरसता का मेल
यह कभी-कभी तर्क दिया जाता है कि, दक्षता के लिए, हमें वास्तविक दुनिया के प्रोलॉग कार्यक्रमों में गैर-मोनोटोनिक निर्माणों के उपयोग को स्वीकार करना चाहिए।
इसका कोई प्रमाण नहीं है। हाल के शोध से संकेत मिलता है कि प्रोलॉग का शुद्ध मोनोटोनिक उपसमूह न केवल अधिकांश वास्तविक दुनिया के कार्यक्रमों को व्यक्त करने के लिए पर्याप्त हो सकता है, बल्कि व्यवहार में भी काफी कुशल है। एक ऐसा निर्माण जो हाल ही में खोजा गया है और इस दृष्टिकोण को प्रोत्साहित करता है if_/3 : यह पसंद अंक की कमी के साथ एकरसता को जोड़ता है। अनुक्रमणिका स्थिति / 2 देखें।
उदाहरण के लिए, फॉर्म का कोड:
pred(L, Ls) :-
condition(L),
then(Ls).
pred(L, Ls) :-
\+ condition(L),
else(Ls).
if_/3 साथ लिखा जा सकता है:
pred(L, Ls) :-
if_(condition(L),
then(Ls),
else(Ls)).
और नियतत्ववाद के साथ एकरसता को जोड़ती है ।