2011-01-03 17 views
5

में औपचारिक भाषा मैं एक डीसीजी बनाने की कोशिश कर रहा हूं जो इस फॉर्म से मेल खाने वाली सभी सूचियों को पहचानता है: a^n b^2m c^2m d^n
s --> [].
s --> ad.
ad --> a, ad, d.
ad --> bc.
bc --> b, b, bc, c, c.
bc --> [].
a --> [a].
b --> [b].
c --> [c].
:
मैं निम्नलिखित नियम लिखा है
प्रश्न - प्रोलॉग

जब मैं उन विनिर्देशों के साथ एक स्ट्रिंग का मूल्यांकन करने का प्रयास करता हूं, जैसे [a,b,b,c,c,d], यह काम करता है। लेकिन जब मैं phrase(s, X) क्वेरी का मूल्यांकन करने का प्रयास करता हूं ताकि मैं इस व्याकरण द्वारा लौटाए गए सभी संभावित तारों को देख सकूं, यह अनंतता के लिए loops।

क्या डीसीजी बनाने के तरीके में कुछ गड़बड़ है?

+0

मुझे लगता है, अगर मैं आपका प्रश्न समझ गया, तो ऐसा इसलिए है क्योंकि कई पेड़ बनाए जा सकते हैं, क्योंकि आपके व्याकरण – Muggen

+0

में लूप हैं और मुझे इस समस्या को कैसे ठीक करना चाहिए? : -? – Simon

उत्तर

6

आप पुनरावृत्ति मजबूत बनाने के साथ काफी तार की गणना कर सकते हैं:

?- length(Ls, _), phrase(s, Ls). 
Ls = [] ; 
Ls = [] ; 
Ls = [a, d] ; 
Ls = [a, a, d, d] ; 
Ls = [b, b, c, c] ; 
etc. 
0

मुझे इस प्रश्न का प्रस्ताव भाग नहीं दिख रहा है। इसका उत्तर इस व्याकरण को कैसे लागू करता है इस पर निर्भर करता है।

मेरा सबसे अच्छा अनुमान नियमों के क्रम को उलटाना होगा, अंतिम नियम लागू करने के लिए पहले।

+4

डीसीजी नोटेशन का उपयोग करते हुए व्याकरण पहले ही प्रोलॉग कोड के रूप में निर्दिष्ट है। यदि आप विज्ञापन // 0 और बीसी // 0 नियमों को पुन: व्यवस्थित करते हैं, तो यह वास्तव में अस्तित्व में समाप्त होता है (यानी, सबसे सामान्य क्वेरी तब समाधान उत्पन्न करती है) लेकिन तारों को गलत तरीके से बताती है: व्याकरण के तत्व हैं जो व्याकरण के तत्व हैं, लेकिन कभी नहीं उत्पन्न होते हैं । इसे हल करने के लिए उपरोक्त पुनरावृत्त गहन क्वेरी देखें। – mat

0

मैं एक तरह से सीमा समाधान भले ही अनंत समाधान देखते हैं मदद करने के लिए के रूप में यह लिखा। लेकिन मुझे एहसास हुआ कि पहले छोटे परिणाम प्राप्त करने के लिए नियमों को पुनर्व्यवस्थित करने का एक तरीका होगा।

क्योंकि ad --> a, ad, d.ad --> bc. से पहले मूल्यांकन किया जाता है यह ad --> bc. से पहले ad --> a, ad, a. को पूरा करने के प्रयास करता है। मैं ad --> a, ad, a. से पहले ad --> bc. डाल दूंगा। bc --> b, b, bc, c, c. और bc --> []. नियम

जैसा कि अरियन ने इंगित किया है कि टर्मिनिंग नियम पहले लागू होते हैं, यह सुनिश्चित करेगा कि छोटे समाधान पहले पाए जाते हैं।

मैं यह भी इंगित करना चाहता हूं कि [] एस और एस -> विज्ञापन -> बीसी -> [] के लिए दो समाधान हैं, मैं s --> []. को अनावश्यक रूप से समाप्त कर दूंगा।

कुल मिलाकर मैं इस समाधान की कोशिश करेंगे:

s --> ad. 
a --> [a]. 
b --> [b]. 
c --> [c]. 
d --> [d]. 
ad --> bc. 
bc --> []. 
ad --> a, ad, d. 
bc --> b, b, bc, c, c. 

मूल पोस्ट:

मैं देखने के लिए कैसे गिनती करना था (यह बाद से मैं prolog किया समय हो गया है) लेकिन देखते हैं एक अनंत संख्या और चूंकि प्रोलॉग सभी समाधानों को खोजने का प्रयास करता है, यह कभी भी दिखना बंद नहीं करता है, हालांकि मुझे यकीन है कि आप प्रवाह से पहले एक स्टैक या कुछ त्रुटि को हिट करेंगे :)।परिणामों की संख्या सीमित करने के लिए

एक तरह से समाधान

phrase(s, X), length(X, 4). 

वास्तव में 4 मूल्यों के साथ सब समाधान हो जाता है, जो होगा के आकार को सीमित करने के लिए है

X = [a, a, d, d] 
X = [b, b, c, c] 

6 करने के लिए बढ़ रही है प्राप्त होते हैं :

X = [a, a, a, d, d, d] 
X = [a, b, b, c, c, d] 

या उपयोग पर्वतमाला:

phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6. 
+2

आपके प्रश्न आपके द्वारा उद्धृत नतीजे नहीं देते हैं, यह देखने के लिए कि यह केवल एक ही समाधान पाता है, अपना खुद का उदाहरण "वाक्यांश (एस, एक्स), लंबाई (एक्स, 4)" आज़माएं। इसे 6 उपज में कोई समाधान नहीं मिला है, और अंतिम क्वेरी सिंटेक्टिक रूप से अमान्य है। – mat

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