2010-12-14 24 views
21

मैंने सोचा कि मैं समझता हूं कि स्कैला और हास्केल में पाई जाने वाली पैटर्न कैसे प्रोलॉग में मिली एकीकरण से अलग है लेकिन प्रोलॉग के मेरे गलतफहमी महान हैं। किसी साधारण द्वारा हल की जाने वाली कुछ सरल समस्याएं क्या हैं जिन्हें दूसरे द्वारा हल नहीं किया जा सकता है? धन्यवादपैटर्न मिलान और एकीकरण के बीच मतभेद?

उत्तर

25

सरल कथन: पैटर्न मिलान एक तरफा है, एकीकरण दो-तरफा है। यही है, प्रोलॉग में दायीं तरफ (जिस पर मिलान किया जा रहा है) में अनबाउंड वैरिएबल शामिल हो सकते हैं। Erlang में

X = Y, 
X = 5, 
%% Y = 5 now as well 

(जो Prolog के करीब वाक्य रचना के साथ पैटर्न मिलान का उपयोग करता है), लाइन X = Y कोई त्रुटि उत्पन्न करेगा: जैसे, अगर आप दो अनबाउंड चर X और Y है, यह ठीक काम करेंगे variable 'Y' is unbound। ध्यान दें कि X अनबाउंड होने पर ठीक है: यह पैटर्न-मिलान होना चाहिए।

यह उपयोगी हो सकता है जब आप आंशिक रूप से परिभाषित मानों से निपटना चाहते हैं। एक बहुत अच्छा उदाहरण difference lists है।

यह भी है जो प्रोलॉग के कई तरीकों से भविष्यवाणी करने की अनुमति देता है। जैसे स्कैला/हास्केल/एरलांग में, यदि आप चाहते हैं 1) A ++ B खोजें, 2) समीकरण A ++ X == B, या 3 समीकरण को हल करें) दिए गए सूचियों A और B के लिए समीकरण को हल करें, आपको 3 अलग-अलग फ़ंक्शन लिखने की आवश्यकता है; Prolog में, इन सभी नौकरियों (और अधिक!) एक predicate द्वारा किया जाता है।

+0

एसडब्ल्यूआई प्रोलॉग इंटरैक्टिव संपादक [SWISH] पर अपने प्रोलॉग पैटर्न-मिलान कौशल का अभ्यास करें (http: //swish.swi- prolog.org/), निचले दाएं आरईपीएल विंडो का उपयोग करें। ध्यान दें कि एकीकरण वास्तव में अभिव्यक्ति पेड़ों में बाधाओं की एक श्रृंखला को लागू करने के बारे में है ('एफ (जी (एक्स, वाई), एच) = एफ (जेड, जी (ए, [एल, एक्स, वाई]) चलाने के लिए प्रयास करें), एक्स = 12.'), यह अनंत पेड़ों को भी संभाल सकता है। [एकीकरण] (http://en.wikipedia.org/wiki/Unification_%28computer_science%29) एक अद्भुत शक्तिशाली विचार है, इस पुस्तक को इस कम एल्गोरिदम के बारे में लिखा गया है, विशेष रूप से इसे अनुकूलित करने के तरीके के बारे में और अभी भी काम है करने के लिए। –

+0

बकवास। इसे प्रमाणित करने का प्रयास करें: '? - बी = एक्स + ए, बी 3 है, ए 2 है। – Feofilakt

+0

@ फेफिलकट," है "एक तरह से बाध्यकारी है। आपको peano संख्याओं के लिए शब्द लिखने की आवश्यकता है: 0, एस (0), एस (एस (0)), ... या समस्या के आधार पर आप राज्य succ (शून्य, एक), succ (एक, दो) expicityle हो सकता है, ... किसी भी मामले में अंकगणित अप्रभावी हो जाता है। –

1

स्कैला में निम्नलिखित संकलन करने में विफल रहेगा, क्योंकि यह पहली मामला शाखा है 0xपरिवर्तनीय घोषित करने का प्रयास करती है।

(1, 1) match{ 
    case (x, x) => println("equals") 
    case _  => println("not equals") 
} 

तो स्काला के बजाय एकीकरण मिलान इस सफल और प्रिंट होगा पैटर्न का इस्तेमाल "बराबर है" जबकि

(1, 2) match{ 
    case (x, x) => println("equals") 
    case _  => println("not equals") 
} 

मुद्रित होगा "बराबर नहीं"। ऐसा इसलिए है क्योंकि परिवर्तनीय x को 1 और 2 दोनों को बाध्य करने का प्रयास करते समय एकीकरण विफल हो जाएगा।

+9

में बहुत मंदी दिखाई दे रही थी दरअसल, यह रैखिक (स्कैला और हास्केल में) और गैर-रैखिक (जैसे एरलांग और मैथमैटिका) पैटर्न मिलान के बीच का अंतर है। –

0

Prolog में, आप [3] [1,2] के लिए इस तरह संलग्न कर सकते हैं:

?- append([1,2], [3], Z). 
Z = [1, 2, 3]. 

एकीकरण के बारे में साफ बात यह है कि आप एक ही कोड ('संलग्न' के आंतरिक परिभाषा का उपयोग कर सकते है आप कह तुम क्या जानते द्वारा Prolog में कोड

?- append([1,2], Y, [1,2,3]). 
Y = [3]. 

बल्कि लिख कर कोडिंग की तुलना में "ऐसा करते हैं, तो ऐसा कर",:), लेकिन इसके बजाय पहले तर्क से परिणाम प्राप्त करने के लिए आवश्यक दूसरा तर्क पाते हैं। Prolog उन तथ्यों का इलाज करता है जिन्हें आप इसे समीकरण के रूप में देते हैं। एकीकरण यह उन समीकरणों को लेने देता है और जो भी वेरिएबल्स आपको अभी तक मूल्यों के बारे में नहीं जानता है, चाहे वे दाएं या बाएं तरफ हों।

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

2

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

  • एक शब्द रों मैचों टी, iff है एक प्रतिस्थापन फ़ाई ऐसी है कि फ़ाई (रों) = टी
  • एक शब्द टी के साथ एक अवधि रों जोड़ता, iff है एक प्रतिस्थापन ऐसी है कि फ़ाई (एस) = फ़ाई (टी)

उदाहरण देने के लिए हम एस = एफ (वाई, ए) और टी = एफ (ए, एक्स) शब्द का निरीक्षण करते हैं। जहां एक्स, वाई चर हैं और एक स्थिर है। एस टी से मेल नहीं खाता है, क्योंकि हम सार्वभौमिक रूप से निरंतर एक को माप नहीं सकते हैं। हालांकि, एस और टी के लिए एक यूनिफायर है: phi = {x \ a, y \ a}

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