होरे-शैली शुद्धता प्रमाण के दौरान सरणियों से कैसे निपटें


11

इस सवाल के इर्द-गिर्द चर्चा में , गिलेस ने सही उल्लेख किया है कि किसी एल्गोरिथ्म का कोई शुद्धता प्रमाण जो सरणियों का उपयोग करता है, यह साबित करना होगा कि कोई आउट-ऑफ-बाउंड्स एरे एक्सेस नहीं हैं; रनटाइम मॉडल के आधार पर, यह रनटाइम त्रुटि या गैर-सरणी तत्वों तक पहुंच का कारण होगा।

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

मैं फार्म के स्वयंसिद्धों को जोड़ने की कल्पना कर सकता हूं

{0i<A.lengthP[A[i]/E]} A[i]:=E; {P}

हालाँकि, यह मेरे लिए स्पष्ट नहीं है कि आप दाहिने हाथ की तरफ एक ऐरे एक्सेस से कैसे निपटेंगे, अर्थात यदि यह किसी कथन में एक जटिल अभिव्यक्ति का हिस्सा है ।Ex:=E

होरे लॉजिक में एरेसेस एक्सेस को कैसे मॉडल किया जा सकता है ताकि अमान्य एक्सेस की अनुपस्थिति और प्रोग्राम की शुद्धता के लिए सिद्ध हो सके?

उत्तर यह मान सकते हैं कि हम सरणी तत्वों को अलावा बयानों में उपयोग करने के लिए अस्वीकार करते हैं या में कुछ हिस्से के रूप में क्योंकि यह अभिव्यक्ति को प्रतिबंधित नहीं करता है; हम हमेशा एक अस्थायी चर वांछित मान निर्दिष्ट कर सकते हैं, अर्थात बजाय ।A[i]:=EEx:=Et:=A[i]; if(t>0)if(A[i]>0)

जवाबों:


8

आपका स्वयंसिद्ध वास्तव में स्वयंसिद्ध नहीं है, यह परिकल्पना गायब है। होरे तर्क की सरल प्रस्तुतियों ने फॉर्मूले के फॉर्मूले में हेरफेर किया जहां और तार्किक सूत्र हैं और एक कमांड है। आपको यह सुनिश्चित करने की आवश्यकता है कि अच्छी तरह से गठित है । सरल भाषाओं में जैसे कि अक्सर होरे तर्क के पहले परिचय के लिए उपयोग किया जाता है, अच्छी तरह से गठन वाक्यविन्यास है: यह आम तौर पर उस की जांच का विषय{P}C{P}PPCCCएक संदर्भ-मुक्त व्याकरण के अनुरूप है, और संभवत: मुक्त चर एक अनुमत सेट के भीतर हैं। यदि भाषा में वे शब्द शामिल हैं जिनमें अर्थ संबंधी शुद्धता है, जैसे कि सरणी तत्वों तक पहुंच, तो आपको इस शब्दार्थ शुद्धता को व्यक्त करने के लिए परिकल्पना जोड़ने की आवश्यकता है।

औपचारिक रूप से, आप अभिव्यक्तियों और आदेशों के सुधार को व्यक्त करने के लिए निर्णय जोड़ सकते हैं। यदि अभिव्यक्तियों का कोई दुष्प्रभाव नहीं है, तो उन्हें बिना किसी पूर्व शर्त के, केवल पूर्व शर्त की आवश्यकता होती है। उदाहरण के लिए, आप अच्छी तरह से गठित नियम लिख सकते हैं जैसे कि और केवल आदेशों में अच्छी तरह से निर्मित अभिव्यक्तियों की अनुमति देते हैं:

{P}E wf{P0E<length(A)}A[E] wf{P}E1 wf{P}E2 wf{P}E1+E2 wf
{P[xE]}E wf{P[xE]}x:=E{P}

एक अलग दृष्टिकोण सभी अभिव्यक्तियों को अच्छी तरह से निर्मित करने के लिए है, लेकिन किसी भी अभिव्यक्ति को बनाने के लिए एक बीमार-गठन गणना में एक विशेष मूल्य । रन-टाइम सीमा की जाँच करने वाली भाषाओं में, अर्थ है "इस प्रोग्राम ने एक घातक अपवाद उठाया"। फिर आप इस बात पर नज़र रखेंगे कि क्या एक लॉजिकल प्रेडिक्टेट माध्यम से प्रोग्राम को गलत किया गया है ; एक कार्यक्रम केवल तभी मान्य होता है जब आप यह साबित कर सकते हैं कि इसके उत्तरार्ध का अर्थ _ _ _bbf । errorerrorError¬Error

{P[xE]}x:=E{PError}P[xE]Eerror{P[xE]}x:=E{P}

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

वैसे, ध्यान दें कि जब एक यौगिक चर जैसे कि संशोधित किया जाता है, तो व्यक्त करना अधिक शामिल होता है कि आपने क्या लिखा है। मान लीजिए था कहते हैं, : प्रतिस्थापन नहीं बदलेगा , फिर भी काम अमान्य हो । यहां तक कि अगर आप परमाणुओं के बारे में केवल बात करने के लिए विधेय की वाक्य रचना को प्रतिबंधित, असाइनमेंट पर विचार पूर्व शर्त के तहत : आप सही पोस्टकांड प्राप्त करने के लिए एक साधारण प्रतिस्थापन नहीं कर सकते , आपको का मूल्यांकन करने की आवश्यकता हैPIsSorted(A)A[i]EPA[i]PPA[A[0]1]:=A[0]A[0]=2A[1]=3A[0]=1A[1]=1A[0](जो सामान्य रूप से मुश्किल हो सकता है, क्योंकि पूर्व शर्त लिए एक भी संभव मान निर्दिष्ट नहीं कर सकती है )। आपको सरणी पर ही प्रतिस्थापन करने की आवश्यकता है: । माइक गॉर्डन के व्याख्यान नोट्स में सरणियों के साथ एक अच्छी प्रस्तुति होरे तर्क है (लेकिन त्रुटि जाँच के बिना)।A[0]AA[iE]


0

गिल्स द्वारा उल्लेख किया गया है, एक सरणी असाइनमेंट स्वयंसिद्ध है ( गॉर्डन के नोट्स, सेक। 2.1.10 देखें ): शब्दों में, यदि आपके पास एक सरणी असाइनमेंट है, तो मूल सरणी को सरणी द्वारा प्रतिस्थापित करें, जिसमें मूल्य की स्थिति है । ध्यान दें कि यदि आपके पास पहले से ही पोस्ट है, और असाइन करें , तो आपको पूर्व के रूप में प्राप्त करना चाहिए (हाँ, इस क्रम में - हाल ही में अपडेट को पहले निष्पादित किया गया है!)।

{Q[AA.store(i,expr)]}A[i]=expr{Q}
A.store(i,expr)iexprA.store(i,vi)A[j]=vjA.store(j,vj).store(i,vi)

इसके अतिरिक्त, हम सरणी पहुँच स्वयंसिद्ध की जरूरत है: A.store(i,v)[i]द्वारा बदला जा सकता है v( "यदि आप का उपयोग वें तत्व है कि आप बस अद्यतन, तो सौंपा मान")।i

मुझे लगता है कि सरणियों के साथ एक कार्यक्रम साबित करने के लिए सही है ("कोई आउट-ऑफ-बाउंड एक्सेस" नहीं है), उपरोक्त स्वयंसिद्ध पर्याप्त हैं। आइए कार्यक्रम पर विचार करें:

...
A[i] = 12
...

हम इस कार्यक्रम की व्याख्या करेंगे:

...
@ {0<i<A_length}
A[i] = 12
...

जहां A_lengthएक चर है जो सरणी लंबाई निर्दिष्ट करता है। अब एनोटेशन को साबित करने की कोशिश करें - अर्थात्, इसे पीछे की ओर से काम करें (नीचे से ऊपर तक, "आमतौर पर" होरे प्रमाण में)। यदि आप शीर्ष पर हैं {false}, तो आउट ऑफ बाउंड एक्सेस हो सकता है, अन्यथा, जो अभिव्यक्ति आपको मिली है वह पूर्व शर्त है जिसके तहत कोई आउट-ऑफ-बाउंड एक्सेस संभव नहीं है। (यह भी, हमें यह सुनिश्चित करने की आवश्यकता है कि जब सरणी हमारे int A=int[10];जैसी स्थिति के बाद बनाई जाती है {A_length==10})।


आपके स्वयंसिद्ध आउट-ऑफ-बाउंड एक्सेस को मॉडल नहीं करते हैं: वे लंबाई का भी उल्लेख नहीं करते हैं! अपने उदाहरण कार्यक्रम में, आप कैसे संबंधित lengthहैं A?
गिल्स एसओ- बुराई को रोकना '

ठीक है, स्वयंसिद्ध बाध्य पहुंच से बाहर मॉडल नहीं है। सबसे पहले, एक कार्यक्रम को सही साबित करने के लिए मैं उन एनोटेशन को जोड़ता हूं जिनके लिए यह आवश्यक है कि एक पहुंच सीमा के भीतर हो। ( lengthनाम बदल दिया गया था A_length।) दूसरा, हमें सरणी "निर्माण" जैसे स्वयंसिद्ध शब्दों की आवश्यकता है int[] a = int[length] {a_length==length}। मुझे लगता है कि यह पर्याप्त होना चाहिए।
अय्यट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.