2015-03-06 22 views
5

प्रोलॉग में --> का क्या अर्थ है?क्या है -> प्रोलॉग में मतलब है?

क्या आप एक ठोस उदाहरण प्रदान कर सकते हैं और समझा सकते हैं कि यह कैसे काम करता है?

+9

इस ट्यूटोरियल पर एक नज़र डालें: http://www.logic.at/prolog/dcg.html –

उत्तर

0

प्रतीक --> घोषणात्मक खण्ड व्याकरण बनाने के लिए कई Prolog कार्यान्वयन में प्रयोग किया जाता है (DCG) नियम, जो रूप ले:

head --> body. 

के रूप में सामान्य Prolog नियमों के अनुरूप:

head :- body. 

में तथ्य यह है कि प्रत्येक डीसीजी नियम को सामान्य प्रोलॉग नियम (और आंतरिक रूप से) में अनुवादित किया जा सकता है, लेकिन डीसीजी सिंटैक्स नियमों को बनाने के लिए एक सुविधाजनक और बहुत शक्तिशाली शॉर्टेंड के रूप में कार्य करता है जो विभिन्न प्रोलॉग संरचनाओं में सूचियों से संबंधित है। अक्सर डीसीजी नियमों का उपयोग पार्सिंग सूचियों के काफी सीमित उद्देश्य के लिए किया जाता है।

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

यहाँ एक DCG उदाहरण SWI-Prolog DCG tutorial मार्कस Triska given in Boris's Comment द्वारा ट्यूटोरियल से ऐन Ogborn द्वारा रूपांतरित से लिया है:

as --> [ ].   % empty list is okay 
as --> [a], as.  % list [a|T] is okay iff T is okay 

एक सामान्य Prolog विधेय हम इस as//0 निरूपित से अलग करने के लिए, लेकिन यह एक के बराबर है सामान्य प्रोलॉग दो अतिरिक्त तर्कों के साथ भविष्यवाणी करता है। हम दो अतिरिक्त तर्क की आपूर्ति करके सीधे अंतर्निहित Prolog विधेय क्वेरी कर सकते हैं:

?- as([ ],[ ]). 
true 

यह सफल होता है क्योंकि दो सूचियों के बीच अंतर (जो फिर से एक खाली सूची है) as//0 के अनुसार ठीक है। इसके अलावा:

?- as([a],[ ]). 
true 

सफल होता है क्योंकि दो सूचियों के बीच अंतर [a], जो as//0 साथ प्रत्यावर्तन द्वारा ठीक है।

as//0 का उपयोग करने का एक और तरीका अंतर्निहित प्रोलॉग phrase/2 है, जो डीसीजी सिर के पहले तर्क के रूप में और दूसरे तर्क के रूप में एक तर्क के रूप में होता है। , इतने पर

?- phrase(as, Ls). 
Ls = '[]' ; 
Ls = [a] ; 
Ls = [a, a] ; 
Ls = [a, a, a] ; 

और जब तक आप वापसी को हिट करके सफलतापूर्वक क्वेरी समाप्त: इस मामले में phrase/2 सूचियों कि as//0 संतुष्ट उत्पन्न होगा।

यह उदाहरण भी अज़ी के साथ काम करता है! आउटपुट में केवल मामूली अंतर के साथ प्रोलॉग।

+1

आप कुछ हद तक सुझाव दे रहे हैं कि 'वाक्यांश/2' "सूचियां उत्पन्न करेगा"। लेकिन यह नहीं करता; और नहीं, प्रत्यक्ष विस्तार को कॉल करने से कम नहीं। इसके बजाय, 'वाक्यांश/2' ने इंटरफ़ेस को परिभाषित किया, जबकि' as (ls, []) जैसे लक्ष्य ने इसे circumvents। – false

+0

@false: संभावित गलत व्याख्या को इंगित करने के लिए धन्यवाद। मेरा मतलब केवल यह था कि लक्ष्य को कॉल करने का एक और तरीका था, इस मामले में परिवर्तनीय 'एलएस' को बाध्यकारी देना जो कि किसी अन्य भविष्यवाणी में गुजरने में उपयोगी हो सकता है, न कि यह सामान्य बैकट्रैकिंग से अलग "सूचियां उत्पन्न करता है"। – hardmath

+1

मैं कहूंगा: आंतरिक कॉलिंग को पूरी तरह से छोड़ दें। – false

4

hardmath पहले से ही बहुत कुछ समझाया गया है। लेकिन डीसीजी के बारे में और अधिक आकर्षक बात यह है कि यद्यपि ->/2 वाक्यविन्यास संदर्भ मुक्त व्याकरण का सुझाव देता है, यह वास्तव में और अधिक है। कोई भी जटिलताओं को मॉडल के लिए धन्यवाद दे सकता है, जो कि गैर-टर्मिनल के लिए पैरामीटर हैं।

यहां एक डीसीजी है जो भाषा एल = {ए^एन बी^एन सी^एन} उत्पन्न करता है और स्वीकार करता है।DCG के रूप में पढ़ता:

:- use_module(library(clpfd)). 

start(N) --> as(N), bs(N), cs(N). 

as(N) --> {N #> 0, M #= N-1}, [a], as(M). 
as(0) --> []. 

bs(N) --> {N #> 0, M #= N-1}, [b], bs(M). 
bs(0) --> []. 

cs(N) --> {N #> 0, M #= N-1}, [c], cs(M). 
cs(0) --> []. 

ऊपर कोड एक तथाकथित सहायक की स्थिति (*), {द्वारा अपनाया का उपयोग करता है}, इस DCG में बीच-बीच में सामान्य कोड है। और डीसीजी के द्विपक्षीय उपयोग की अनुमति देने के लिए हम सामान्य अंकगणित के बजाय सीएलपी (एफडी) का उपयोग कर रहे थे। यहाँ कुछ उदाहरण SWI-Prolog में चलता है:

?- phrase(start(X),[a,a,a,b,b,b,c,c,c]). 
X = 3 
?- phrase(start(3),Y). 
Y = [a,a,a,b,b,b,c,c,c] 

लेकिन व्यवहार DCGs में भी अक्सर क्योंकि राज्य भर से पारित करने की क्षमता के पाए जाते हैं। वे प्रोलॉग में मोनैड के एक रूप की अनुमति देते हैं। इनपुट स्थिति और आउटपुट स्थिति के साथ बस इनपुट सूची और आउटपुट सूची को प्रतिस्थापित करें।

अलविदा

(*) एक प्रारंभिक कागज DCG प्रचार कर रही है:

परेरा, F.C.N. और वॉरेन, डीएच.डी. (1980):
भाषा विश्लेषण के लिए निश्चित खण्ड व्याकरण -
एक रीतिवाद का सर्वेक्षण और साथ
संवर्धित संक्रमण नेटवर्क, उत्तर-हॉलैंड
प्रकाशन कंपनी, आर्टिफिशियल इंटेलिजेंस, 13, 231 एक तुलना - 278

http://cgi.di.uoa.gr/~takis/pereira-warren.pdf

संबंधित मुद्दे