2011-06-29 10 views
9

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

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

क्या डीसीजी व्याकरण में इस तरह की अतिरिक्त बाधाएं जोड़ना संभव है? या क्या मुझे मूल रूप से डीसीजी को सामान्य प्रोलॉग क्लॉज में अनुवाद करना है और उन्हें संशोधित करना शुरू करना है?

?- length(Xs, N), phrase(mynonterminal, Xs). 

पाठ्यक्रम कि सभी वाक्य उत्पन्न की:

उत्तर

8

आप केवल सभी वाक्य है कि उत्पन्न कर रहे हैं देखने के लिए चाहते हैं, यह निम्न का उपयोग करने के लिए बहुत सुविधाजनक है। लेकिन यह बहुत उपयोगी है और यह आपको ठोस सीमा के बारे में सोचने का समय बचाता है। यदि आप इसे और प्रतिबंधित करना चाहते हैं, तो आगे between(0,10,N) लक्ष्य जोड़ें।

आप एक व्याकरण भीतर कहने के लिए, कि एक निश्चित गैर टर्मिनल एक निश्चित लंबाई लेना चाहिए चाहते हैं, यह स्पष्ट रूप से यह कहना सबसे अच्छा है:

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

a --> {length(Es,10)}, seq(Es), {phrase(mynonterminal,Es)}. 

आप अभी भी खुश नहीं हैं, तो आप चाहते हैं दो गैर-टर्मिनलों के चौराहे को व्यक्त करने के लिए। यह दो संदर्भ मुक्त भाषाओं के चौराहे पूछने की ताकत है जो सामान्य मामले में अनिश्चित है। लेकिन बहुत पहले, आपको समाप्ति के साथ समस्याएं होगी। तो क्या इस प्रकार में इस बात का ध्यान रखें:

:- op(950, xfx, &). 

(NT1 & NT2) --> 
    call(Xs0^Xs^(phrase(NT1,Xs0,Xs),phrase(NT2,Xs0,Xs))). 

निम्नलिखित केवल जरूरत है अगर आप library(lambda) का उपयोग नहीं करते:

^(V0, Goal, V0, V) :- 
     call(Goal,V). 

^(V, Goal, V) :- 
    call(Goal). 

तो यह है कि तुम अब परमिट दो गैर टर्मिनलों के चौराहे व्यक्त करते हैं। लेकिन कृपया, ध्यान रखें कि समाप्ति यहां बहुत भंगुर है। विशेष रूप से, पहले गैर-टर्मिनल को समाप्त करना आवश्यक रूप से दूसरे को सीमित नहीं करता है।

+0

मुझे लगता है कि इसका पहला हिस्सा "seq" से निपटने के लिए है, जो मुझे चाहिए (यानी एक nonterminal एक सीमित सूची है)। लेकिन मुझे शायद यह काम करने में काफी कुछ नहीं मिल रहा है क्योंकि मुझे समझ में नहीं आता है। उस पहले उदाहरण में "वाक्यांश" क्या है? – interstar

+0

'(&) // 2' की परिभाषा को समझने से पहले, यह समझने की कोशिश करें कि डीएलजी को प्रोलॉग में कैसे एन्कोड किया गया है। पेरेरा और शिबर द्वारा प्रोलॉग एंड नेचुरल लैंग्वेज एनालिसिस पर एक अच्छी किताब है। http://www.mtome.com/Publications/PNLA/pnla.html (यह मुफ़्त है) – false

+0

हाय झूठी, पुस्तक संदर्भ के लिए धन्यवाद। उपयोगी हो जाएगा। मेरी विशेष समस्या पर, मुझे लगता है कि आपका समाधान "ए -> {लंबाई (एसएस, 10)}, सीईसी (एस), {वाक्यांश (mynonterminal, Es)}।" लगभग वही दिखता है जो मैं चाहता हूं। मैं समझ में नहीं आता कि, मेरे कार्यक्रम में, मुझे लिखना चाहिए जहां आपने "वाक्यांश" लिखा है।मैं देख सकता हूं कि उस हिस्से का उद्देश्य यह कहना है कि अनुक्रम mynonterminals से बना है। लेकिन वह "वाक्यांश" क्या कहता है? – interstar

5

अच्छी तरह से, आप हमेशा उपयोग कर सकते हैं {} और prolog विधेय के बीच, उदाहरण के लिए किसी भी तरह का लिखना:

foo(X)--> 
    { valid(X) }, 
    [a]. 
foo(X)--> 
    [b]. 

ताकि आप शब्द काउंटर किसी प्रकार का जोड़ सकते हैं। बेशक, यदि प्रत्येक टोकन एक शब्द है तो आप बस कुछ लिख सकते हैं: लंबाई (एल, एन), एन < 11, शुरू करें (एल, [])।

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

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