2017-09-25 4 views
5

तो, मैं एक पुस्तक "औपचारिक भाषा सिद्धांत का परिचय" पढ़ रहा था और यह एक भाषा L(G) = {a^n ++ b^n | n > 0} का वर्णन करता है।संतुलित भाषा, 2 गैर-टर्मिनल प्रतीकों, सूची समझ

यह निम्न प्रस्तुतियों है:

S -> ab | aSb 

और इसलिए निम्न भाषा का उत्पादन होगा:

a, ab, aabb, aaabbb, ... 

मैं सोच रहा था कि कैसे मैं हास्केल की सूची समझ इस्तेमाल कर सकते हैं इस भाषा बनाने के लिए। मुझे पता है कि मैं तारों के साथ सूची समझ कर सकता हूं, लेकिन मैं बहुत शुरुआत करने वाला हूं और मुझे यकीन नहीं था कि मैं इन तारों की तरह एक अनंत सूची कैसे प्राप्त कर सकता हूं।

मैं की तरह कुछ कल्पना कर रहा हूँ:

[ x ++ y | x <- ["a","aa",..] y <- ["b","bb",..]] 
+1

यह वही नहीं कर रहा है जो आपको लगता है। '[प्रतिकृति एन 'ए' ++ प्रतिकृति एन 'बी' के बारे में कैसे एन <- [1 ..]] '? यह सबसे वफादार अनुवाद की तरह लगता है ... – Alec

+1

"ए" उस भाषा का हिस्सा नहीं है। –

उत्तर

8

उत्पादन शासन से काम करते हुए,

S -> ab | aSb 

हम

s = ["ab"] ++ [ "a" ++ x ++ "b" | x <- s ] 
तो

कि

~> take 5 s 
["ab","aabb","aaabbb","aaaabbbb","aaaaabbbbb"] 
it :: [[Char]] 
लिख सकता है 0

एक छोटे से संपादित के साथ काम कर सकता था आपका प्रयास,

[ x ++ y | x <- ["a","aa",..] | y <- ["b","bb",..]] 
इतना है कि यह Parallel List Comprehensions विस्तार (GHCi में :set -XParallelListComp), enumerations के अलावा का उपयोग करता

। लेकिन यह ठीक करना आसान है,

[ x ++ y | x <- [replicate n 'a' | n <- [1..]] 
     | y <- [replicate n 'b' | n <- [1..]]] 
+0

त्वरित अनुवर्ती, मैंने देखा कि जब मैंने लिखा है [["ab"] ++ ["a" ++ x ++ "b" | एक्स <- एस] 'ghci में, यह एक त्रुटि फेंकता है, लेकिन अगर मैं इसे test.hs में डालता हूं और फिर: एल परीक्षण, यह काम करता है! क्या आप जानते हैं कि अंतर क्या है? – user6189164

+0

त्रुटि क्या थी? क्या आपने 'let' का उपयोग करने का प्रयास किया था, जैसे 'let s = ...' (यदि आपके पास पुराना संस्करण स्थापित है) तो आपको करना होगा। –

+0

आह, यह कहा गया ': 2: 3: इनपुट' = ''पर पार्स त्रुटि; लेकिन, यदि आप सही हैं, तो अगर मैं इसका उपयोग करता हूं तो यह काम करता है! – user6189164

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