2012-12-01 13 views
5

मैं वर्तमान में vellvm के साथ काम कर रहा हूं, इस पर एक परिवर्तन विकसित कर रहा हूं। मैं एक coq नौसिखिया हूँ।मैं कोक नट्स में स्टैक ओवरफ़्लो या सेगमेंटेशन गलती से कैसे बच सकता हूं?

Warning: Stack overflow or segmentation fault happens when working with large numbers in nat (observed threshold may vary from 5000 to 70000 depending on your system limits and on the command executed).

मेरे समारोह है कि उत्पन्न करता है कि यह चेतावनी हस्ताक्षर गणना करता है:

जबकि प्रोग्रामिंग, मैं निम्न चेतावनी का सामना करना पड़ा। हस्ताक्षर बेहतर और निम्न बिट्स में बांटा गया है। दो बिट्स एन 1 और एन 2 को बेहतर बिट्स और अवरक्त बिट्स का प्रतिनिधित्व करते हुए, यह गणना करता है (एन 1 * 65536) + एन 2 - यह 16 बिट्स के साथ-साथ दो बाइनरी संख्याओं को रखने के लिए एक अमूर्त है।

मैं आश्चर्यचकित था क्योंकि एस कन्स्ट्रक्टर के लिए धन्यवाद, कॉक नेट परिभाषा बाहरी से बड़ी चींटियों को संभालने के लिए प्रतीत होती है।

मुझे इस चेतावनी से बचने/कोक में बड़ी संख्याओं का उपयोग कैसे करना चाहिए? मैं नाट से किसी प्रकार के बाइनरी निर्माण में कार्यान्वयन को बदलने के लिए खुला हूं।

धन्यवाद!

+0

नाट्स के साथ काम करना क्रूर है, क्योंकि वे 'एस' के साथ बने हैं, जिसका अर्थ है कि प्रत्येक नंबर * सचमुच * एस 'अनुप्रयोगों का अनुक्रम होगा: आप इसके बजाय पूर्णांक के साथ काम कर सकते हैं, जिसमें समान सबूत सिद्धांत हैं लेकिन उनमें एक है साइन/परिमाण (बिट) आधारित प्रतिनिधित्व: http://coq.inria.fr/library/Coq.ZArith.BinInt.html –

+0

तब मैं ऑपरेशन का उपयोग कैसे कर सकता हूं? (Zpos 1) + (Zpos 2) काम नहीं करता है ... - त्रुटि: "1% Z" शब्द का प्रकार "|" है जबकि यह "नेट" टाइप होने की उम्मीद है। – fotanus

+0

ऐसा इसलिए है क्योंकि "+" का मतलब है कि आप कहां हैं इसके आधार पर कई चीजें हैं। हकीकत में "+" नट्स जोड़ने के लिए सिंटैक्टिक चीनी है, जहां 'प्लस' को दो नटों पर स्ट्रक्चरल रूप से परिभाषित किया जाता है। आप 'प्लस' को पूर्णांक के लिए उपयोग करना चाहते हैं, जो 'nat' (अर्थात्, 'Int_scope') के मुकाबले एक अलग _ व्याख्या व्याख्या क्षेत्र में रहता है। व्याख्या स्कॉप्स और उन्हें कैसे खोलें और उनका उपयोग कैसे करें के बारे में पढ़ें। –

उत्तर

4

nat कोक में टाइप करने के बजाय, कभी-कभी (जब आपको बड़ी संख्या में हेरफेर करना होता है) Z प्रकार का उपयोग करने के लिए बेहतर होता है, जो एक संकेत परिमाण जोड़ी प्रतिनिधित्व का उपयोग करके पूर्णांक का औपचारिकरण है। ट्रेडऑफ यह है कि आपके सबूत थोड़ा अधिक जटिल हो सकते हैं; nat बहुत आसान है, और इसलिए सरल प्रमाण सिद्धांतों को स्वीकार करता है।

हालांकि, कोक में परिभाषाओं, प्रमेय और सबूत लिखना आसान बनाने के लिए नोटेशन का व्यापक उपयोग है। कोक का एक बहुत छोटा कर्नेल है (हम इसे चाहते हैं क्योंकि हम विश्वास करने में सक्षम होना चाहते हैं कि सबूत चेकर सही है, और हम इसे पढ़ सकते हैं) इसके शीर्ष पर बहुत सी नोटेशन के साथ। हालांकि, जैसा कि चीजों के विभिन्न प्रतिनिधित्व हैं, और केवल कुछ अच्छे प्रतीक हैं, हमारे प्रतीकों आमतौर पर संघर्ष करते हैं। इसे पाने के लिए, कॉक प्रतीकों को असंबद्ध करने के लिए interpretation scopes का उपयोग करता है, और उन्हें नामों में हल करता है (क्योंकि "+" का अर्थ add, plus, आदि ...) है।

आप सही हैं, Z_scope उपयोग कर रहा है जहां, plusZ भीतर के लिए +

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