2011-12-25 15 views
6

मैं primtive recursive फ़ंक्शंस का उपयोग करके हैकेल के भीतर एक मॉड्यूलस फ़ंक्शन बनाने की कोशिश कर रहा हूं। मुझे पता है कि यह संभव है (क्योंकि यह विकिपीडिया पर उदाहरण कार्यों की सूची पर है)हैकेल मॉड्यूलस आदिम रिकर्सन

और मुझे पता है कि मैं इसे तर्कसंगत तरीके से कैसे करूंगा .. लेकिन मैं इसे लागू नहीं कर सकता!

आईई, तर्क (नहीं primtive प्रत्यावर्तन या Haskell)

function mod(a, b){ 
    while(a > b) 
    a -= b 
    return a; 
} 

कौन सा मैं प्रत्यावर्तन (फिर haskel नहीं)

function mod(a, b){ 
    if(a < b) return a; 
    return mod(a - b, b); 
} 

लेकिन मैं लागू करने के लिए नहीं कर पा रहे का उपयोग कर परिभाषित कर सकते हैं है यह आदिम रिकर्सिव कार्यों का उपयोग कर रहा है। मैं जो मैं नहीं कर सकता एक < ख

मैं वास्तव में मेरे समस्या को हल करने मैं इस तरह के (फिर से नहीं haskel)

reduce(a, b) 
    = a >= b -> a-b 
    otherwise x 

किसी को भी कर सकते थे, तो के रूप में परिभाषित तर्क के कुछ प्रकार की जरूरत है लगता है के तर्क है थोड़ा इस के किसी भी हिस्से के साथ मेरी मदद करें, मैं वास्तव में इसकी सराहना करता हूं, धन्यवाद

संपादित करें :: मैंने संभावित रूप से एक मॉड्यूलस फ़ंक्शन को विभाजित करने के उपयोग को परिभाषित करने का विचार किया, यानी मॉड (ए, बी) = ए - (ए/बी) * बी, लेकिन चूंकि विभाजन के लिए मेरे आदिम रिकर्सिव फ़ंक्शन मॉड्यूल पर निर्भर करता है, मैं इसे नहीं कर सकता हूं

+0

'mod ab | एक <बी = ए | अन्यथा = mod (ए - बी) बी' - यह आपके सादे रिकर्सन का सरल हास्केल अनुवाद है। –

+0

@DanBurton एक उपयोगकर्ता पहले से ही इसे पहले पोस्ट कर चुका है, लेकिन फिर उसने अपना संदेश हटा दिया क्योंकि यह आदिम पुनरावर्ती कार्यों के संदर्भ में वास्तव में प्रासंगिक नहीं है – AlanFoster

उत्तर

0

इस का हल

mod(0, y) 
     = zero(y) 
mod(x, 0) 
     = zero(x) 
mod(x + 1, y) 
     = mult3(succ(mod(x, y)), sign(y), notsign(eq(mod(x, y), diff(y, 1)))) 
है: http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Totality#Primitiverecursion

निम्नलिखित पृष्ठ भी मैं क्या सोचता आदिम प्रत्यावर्तन की कुछ हद तक एक स्पष्ट प्रदर्शनी है

1

कुछ पॉइंटर्स के लिए इसे देखें: http://www.proofwiki.org/wiki/Quotient_and_Remainder_are_Primitive_Recursive

यह भी ध्यान दें कि विकिपीडिया परिभाषा कुछ हद तक संकीर्ण है। एक सीमित डेटा संरचना पर प्रेरण द्वारा निर्मित कोई भी कार्य आदिम रिकर्सिव है, हालांकि यह दिखाने के लिए थोड़ा सा लगता है कि यह विकिपीडिया में दिए गए टूल में अनुवाद करता है। और ध्यान दें कि हम क्लासिक पेनो शैली में प्राकृतिकों का प्रतिनिधित्व कर सकते हैं। आपको यह निश्चित रूप से करने की ज़रूरत नहीं है, लेकिन यह प्रेरण के बारे में तर्क अधिक प्राकृतिक है। आदिम प्रत्यावर्तन की इस धारणा का एक प्रशस्ति पत्र के लिए AGDA विकि देखें: http://plato.stanford.edu/entries/recursive-functions/#1.3

+0

धन्यवाद, मैंने इसे लागू करने के लिए अपनी पूरी कोशिश की है, लेकिन मुझे 'इनबेटवीन' 'बिट्स। लिंक कहता है "तो हम देखते हैं कि: rem (n + 1, m) = (rem (n, m) +1) sgn (m) notsgn (χeq (rem (n, m), m-˙1))" लेकिन क्या जोड़ता है (रेम (एन, एम) + 1) और एसएनजी (एम) और notsgn()? उन सभी को एक साथ जोड़ने के लिए कोई फंक्शन नहीं है? या मैं इस हेहे को गलत समझ रहा हूं – AlanFoster