2011-12-01 12 views
5

पैटर्न मिलान (जैसा कि प्रोलॉग, एमएल परिवार भाषाएं और विभिन्न विशेषज्ञ सिस्टम शैल में पाया जाता है) सामान्य रूप से सख्त क्रम में तत्व द्वारा डेटा तत्व के विरुद्ध एक क्वेरी से मेल खाता है।सहयोगी और कम्यूटेटिव ऑपरेटरों के साथ पैटर्न मिलान

स्वचालित प्रमेय साबित करने वाले डोमेन में, हालांकि, यह ध्यान रखना आवश्यक है कि कुछ ऑपरेटर सहयोगी और कम्यूटिव हैं। मान लीजिए कि हमारे डेटा

A or B or C 

और क्वेरी

C or $X 

सतह वाक्य रचना इस मेल नहीं खाता से जा रहे हैं, लेकिन तार्किक यह $XA or B करने के लिए बाध्य के साथ मेल खाना चाहिए क्योंकि or साहचर्य और विनिमेय है।

क्या कोई मौजूदा सिस्टम है, किसी भी भाषा में, यह इस तरह की चीज करता है?

+0

मुझे यकीन है कि मैं Prolog पैटर्न मिलान बनाम एमएल पैटर्न मिलान अपने सम्मिश्रण के साथ सहमत नहीं हूँ। एमएल पैटर्न मिलान पूरी तरह से वाक्य रचनात्मक है, और प्रोलॉग में मुझे विश्वास नहीं है कि यह मामला है। – Gian

+0

मैं यह नहीं कह रहा हूं कि वे एक ही बात हैं, केवल वे सख्त क्रम में तत्वों की तुलना में आम हैं। – rwallace

+0

मैं समर्पित प्रमेय साबित सॉफ़्टवेयर मानता हूं जैसे ओटर पहले से ही लॉजिकल फॉर्मूला को सामान्य रूप में रखकर और खंडों को डेटा संरचनाओं के रूप में पेश करके करता है, जो निर्माण और सत्यापन दोनों के लिए ओ (एन लॉग एन) समय खर्च करता है। असल में, मुझे लगता है कि उन्होंने एसोसिएटिविटी और कम्यूटिटीविटी जैसे गुणों के लिए संचालन के लिए प्रीप्रोग्राम किए गए ऑप्टिमाइज़ेशन हैं। –

उत्तर

6

एसोसिएटिव-कम्यूटेटिव पैटर्न मिलान 1981 and earlier के बाद से रहा है, और अभी भी एक गर्म विषय today है।

ऐसे कई सिस्टम हैं जो इस विचार को लागू करते हैं और इसे उपयोगी बनाते हैं; इसका मतलब है कि आप जटिल पैटर्न मिलान लिखने से बच सकते हैं जब पैटर्न मिलान करने के लिए associtivity या कम्यूटिटी का उपयोग किया जा सकता है। हाँ, यह महंगा हो सकता है; पैटर्न मैचर बेहतर ढंग से ऐसा करते हैं, आप इसे हाथ से बुरी तरह से करते हैं।

आप हमारे प्रोग्राम ट्रांसफ़ॉर्मेशन सिस्टम का उपयोग करके लागू rewrite system for algebra and simple calculus में एक उदाहरण देख सकते हैं। इस उदाहरण में, संसाधित होने वाली प्रतीकात्मक भाषा को व्याकरण नियमों द्वारा परिभाषित किया गया है, और उन नियमों जिनमें ए-सी गुण हैं चिह्नित हैं। प्रतीकात्मक भाषा को पार्स करके उत्पादित पेड़ों पर पुनर्लेखन स्वचालित रूप से मिलान के लिए बढ़ाए जाते हैं।

1

मुझे ऐसी कोई चीज़ कभी नहीं मिली है, और मेरे पास अभी और अधिक विस्तृत रूप है।

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

मुझे संदेह है कि इसे लागू करने का सामान्य तरीका केवल दोनों पैटर्न (बाइनरी मामले में) लिखना होगा, यानी C or $X और $X or C दोनों के लिए पैटर्न हैं।

डेटा के अंतर्निहित संगठन (आमतौर पर यह टुपल्स) के आधार पर, इस पैटर्न मिलान में ट्यूपल तत्वों के क्रम को पुनर्व्यवस्थित करना शामिल होगा, जो अजीब होगा (विशेष रूप से दृढ़ता से टाइप किए गए पर्यावरण में!)। यदि इसकी बजाय सूचियां हैं, तो आप भी कमजोर जमीन पर हैं।

संयोग से, मुझे लगता है कि आपरेशन आप मौलिक चाहते सेट पर संबंध तोड़ना संघ पैटर्न है जैसे:

foo (Or ({C} disjointUnion {X})) = ... 

केवल प्रोग्रामिंग वातावरण मैंने देखा है कि किसी भी विस्तार से सेट के साथ संबंधित होगा इसाबेल/HOL , और मुझे अभी भी यकीन नहीं है कि आप उनके ऊपर पैटर्न मैचों का निर्माण कर सकते हैं।

संपादित करें: यह इसाबेल के function कार्यक्षमता (बल्कि fun की तुलना में) की तरह दिखता है आप जटिल गैर निर्माता पैटर्न को परिभाषित करने देगा, तो सिवाय आप को साबित करना है कि वे लगातार उपयोग किया जाता है है, और आप अब और कोड जनरेटर का उपयोग नहीं कर सकते हैं।

संपादित करें 2:

मेरे शब्द, रूप A | B | C | D के थे, जबकि प्रश्नों रूप B | C | $X, जहां $X मिलान करने के लिए अनुमति दी गई थी के थे: जिस तरह से मैं n विनिमेय, साहचर्य और सकर्मक ऑपरेटरों से अधिक समान कार्यक्षमता लागू इस था शून्य या अधिक चीजें। मैंने लेक्सोग्राफिक ऑर्डरिंग का उपयोग करके इन्हें पूर्व-क्रमबद्ध किया, ताकि चर हमेशा अंतिम स्थिति में हुई।

सबसे पहले, आप सभी जोड़ों के मैचों का निर्माण करते हैं, अब के लिए चर को अनदेखा करते हैं, और आपके नियमों के अनुसार मेल खाने वाले रिकॉर्डिंग करते हैं।

{ (B,B), (C,C) } 

आप एक द्विपक्षीय ग्राफ के रूप में इस का इलाज है, तो आप अनिवार्य रूप से एक perfect marriage समस्या कर रहे हैं। इन्हें खोजने के लिए तेज़ एल्गोरिदम मौजूद हैं।

आप एक पाते हैं मान लिया जाये, तो आप सब कुछ है कि अपने संबंध की बाएं हाथ की ओर पर प्रकट नहीं होता इकट्ठा (इस उदाहरण, A और D में), और आप उन चर $X में सामान, और अपने मैच है पूर्ण। जाहिर है आप यहां किसी भी स्तर पर असफल हो सकते हैं, लेकिन अगर ऐसा होता है तो आरएचएस पर कोई परिवर्तनीय मुक्त नहीं होता है, या यदि एलएचएस पर एक कन्स्ट्रक्टर मौजूद है जो किसी भी चीज़ से मेल नहीं खाता है (आपको एक परिपूर्ण मैच खोजने से रोकता है)।

क्षमा करें अगर यह थोड़ा सा गड़बड़ है। यह थोड़ी देर हो गया है क्योंकि मैंने यह कोड लिखा था, लेकिन मुझे उम्मीद है कि यह आपकी मदद करता है, यहां तक ​​कि थोड़ा सा!

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

+0

मैं मानता हूं कि इस पर विचार करने के तरीके पर मेरी सोच अब टुपल-आधारित प्रतिनिधित्व को एक सेट प्रतिनिधित्व में परिवर्तित करना है ताकि इस प्रकार की क्वेरी को उचित रूप से कुशलता से निष्पादित करने में सक्षम हो सके। मुझे लगा कि यह देखने के लायक था कि किसी ने पहले ही इस विशेष पहिया का आविष्कार किया था या नहीं। – rwallace

+0

मैंने बड़े-बड़े के लिए मॉडल-चेकर में कुछ ऐसा ही लागू किया है। बड़े अनुच्छेदों के लिए समांतर संरचना कम्यूटिव है, इसलिए मुझे बिल्कुल इस कार्यक्षमता को लागू करना पड़ा। इसे लागू करने के लिए ज्यादातर भयानक था, मुझे कहना होगा।कोड उपलब्ध है, लेकिन मुझे संदेह है कि यह सहायक नहीं होगा क्योंकि यह अन्य बड़े मिलान मिलान कोड से बहुत जुड़ा हुआ है, और उपयोगी रूप से पुन: प्रयोज्य होने की संभावना नहीं है। मैं अपना जवाब संपादित करने के तरीके को स्केच करने के लिए संपादित करूंगा। – Gian

+1

धन्यवाद! upvoted; मुझे नहीं पता कि डाउनवोट किससे आया था। – rwallace

5

माउड टर्म रीराइटर सहयोगी और कम्यूटेटिव पैटर्न मिलान लागू करता है।

http://maude.cs.uiuc.edu/

+0

क्या आप एक और विशिष्ट लिंक दे सकते हैं? शायद एक कोड उदाहरण के साथ? –

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