2012-09-03 10 views
15

आप समान बाध्य नाम का संदर्भ देने वाले अभिव्यक्तियों को कैसे ढूंढते और फिर से लिखते हैं? उदाहरण के लिए, अभिव्यक्तिदो अभिव्यक्तियों को समान बाध्य नाम से संदर्भित करने के आधार पर आप एक पुनर्लेखन पास कैसे बनाते हैं?

let xs = ... 
in ...map f xs...map g xs... 

दोनों अभिव्यक्ति map f xs और अभिव्यक्ति map g xs में एक ही बाध्य नाम, अर्थात् xs को देखें। क्या कोई मानक कंपाइलर विश्लेषण है जो हमें इस स्थिति की पहचान करने देगा और दो map अभिव्यक्तियों को फिर से लिखने देगा।

let xs = ... 
    e = unzip (map (f *** g) xs) 
in ...fst e...snd e... 

मैं पेड़ के ट्रैवर्सल के मामले में समस्या के बारे में सोच रहा हूं। उदाहरण के लिए एएसटी दिया:

data Ast = Map (a -> b) -> Ast -> Ast 
     | Var String 
     | ... 

हम इस मामले का पता लगाने के एक पेड़ ट्रेवर्सल लिखने के लिए कोशिश कर सकते हैं, लेकिन यह मुश्किल लगता है के बाद से दो Map नोड्स है कि एक ही Var का उल्लेख पेड़ में व्यापक रूप से विभिन्न स्थानों पर दिखाई दे सकता है। यह विश्लेषण करना आसान लगता है यदि आप एएसटी में सभी संदर्भों को उलटा करते हैं, इसे ग्राफ बनाते हैं, लेकिन मैं देखना चाहता हूं कि उस दृष्टिकोण के कोई विकल्प हैं या नहीं।

उत्तर

2

मुझे लगता है कि आप जो खोज रहे हैं वह प्रोग्राम ट्रांसफॉर्मेशन का एक सेट है जिसे आमतौर पर टुपलिंग, फ़्यूज़न और सुपरकंपिलेशन कहा जाता है, जो अनफॉल्ड/फोल्ड ट्रांसफ़ॉर्मेशन के अधिक सामान्य सिद्धांत के अंतर्गत आता है। आप जो भी चाहते हैं उसे प्राप्त कर सकते हैं।

सबसे पहले तर्कों पर मानचित्र की परिभाषा "ड्राइविंग" द्वारा सट्टा मूल्यांकन (अनफोल्डिंग) करें, जो दो नए छद्म कार्यक्रमों को जन्म देता है, इस पर निर्भर करता है कि xs फॉर्म y: ys या [] है। छद्म कोड में:

let y:ys = ... 
in ...(f y):(map f ys)...(g y):(map g ys)... 

let [] = ... 
in ...[]...[]... 

तो खुलासा नहीं तो सदा को रोकने के लिए मूल कार्यक्रम के संबंध में साझा संरचना (Tupling) और सामान्यीकरण (फोल्डिंग) के लिए कपोल-कल्पना करते हैं:

let xs = ... 
in ...(fst tuple)...(snd tuple)... 
where tuple = generalisation xs 
     generalisation [] = ([],[]) 
     generalisation (y:ys) = let tuple = generalisation ys 
           in ((f y):(fst tuple),(g y):(snd tuple)) 

मुझे आशा है कि यह आप एक देता है विचार, लेकिन कार्यक्रम tranformation अपने स्वयं के अधिकार में एक शोध क्षेत्र है, और अचलिक निर्देशित ग्राफ ड्राइंग के बिना अच्छी तरह से व्याख्या करना मुश्किल है।

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