← नवीनतम पेपर
💻 computer science

{log}: From a Constraint Logic Programming Language to a Formal Verification Tool

यह शोध पत्र {log} का एक व्यापक अवलोकन प्रस्तुत करता है, जो एक कंस्ट्रेंट लॉजिक प्रोग्रामिंग भाषा है जो एक एकीकृत औपचारिक सत्यापन वातावरण के रूप में विकसित हुई है, जो ऑटोमेटेड थ्योरम प्रूविंग, वेरिफिकेशन कंडीशन जनरेशन और टेस्ट केस जनरेशन जैसी विशेषताओं के माध्यम से स्टेट मशीनों को निष्पादन योग्य प्रोग्राम और स्पेसिफिकेशन दोनों के रूप में उपचार करने में सक्षम है।

मूल लेखक: Maximiliano Cristiá, Alfredo Capozucca, Gianfranco Rossi

प्रकाशित 2026-03-13
📖 6 मिनट में पढ़ें🧠 गहराई से पढ़ें

मूल लेखक: Maximiliano Cristiá, Alfredo Capozucca, Gianfranco Rossi

मूल पेपर CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें

कल्पना कीजिए कि आप एक जटिल मशीन बना रहे हैं, जैसे कि एक रोबोट जो एक लाइब्रेरी को व्यवस्थित करता है। आमतौर पर, आपको दो बहुत अलग काम करने होते हैं:

  1. निर्देश लिखना (कोड) जो रोबोट को उसके हाथ चलाने का तरीका बताते हैं।
  2. एक अलग मैनुअल लिखना (स्पेसिफिकेशन) जो यह वर्णन करता है कि रोबोट को क्या करना चाहिए, ताकि आप यह जाँच सकें कि निर्देश सही हैं या नहीं।

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

यह पेपर {log} (उच्चारण: सेट-लॉग) नामक एक टूल पेश करता है जो इस समस्या को हल करने के लिए इन दोनों कामों को एक में मिला देता है। यह प्रोग्रामिंग भाषा को ही एक "प्रूफ मशीन" (प्रमाण मशीन) में बदल देता है।

यहाँ बताया गया है कि यह कैसे काम करता है, कुछ रोजमर्रा के उदाहरणों का उपयोग करते हुए:

1. "गिरगिट वाला" कोड (प्रोग्राम-फॉर्मूला द्वैतता)

अधिकांश प्रोग्रामिंग भाषाओं में, कोड एक रेसिपी की तरह होता है: "आटा मिलाएं, अंडे डालें, बेक करें।" यह केवल चरणों की एक सूची है।
{log} में, कोड एक गिरगिट की तरह है। यह अपनी शक्ल बदल सकता है कि आप इसे कैसे देखते हैं।

  • एक प्रोग्राम के रूप में: आप इसे रोबोट को चलाने के लिए रन कर सकते हैं।
  • एक स्पेसिफिकेशन के रूप में: आप उसी कोड की लाइनों को देख सकते हैं और पूछ सकते हैं, "क्या यह रेसिपी गारंटी देती है कि मैं केक जलाऊंगा नहीं?"

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

2. "सेट" की महाशक्ति (The "Set" Superpower)

{log} का असली रहस्य यह है कि यह सेट्स (समूहों) और रिलेशनशिप्स (चीजों के बीच संबंध) को अपनी मूल भाषा मानता है।

  • कल्पना कीजिए कि आपके पास लेगो ब्रिक्स (Lego bricks) का एक डिब्बा है। सामान्य प्रोग्रामिंग में, आपको एक विशिष्ट लाल ब्रिक खोजने के लिए जटिल लूप लिखने होंगे।
  • {log} में, आप बस कहते हैं, "मुझे लाल ब्रिक दो," या "मुझे वे सभी ब्रिक्स दिखाओ जो नीले वाले से जुड़े हैं।"
    इस टूल के पास एक अंतर्निहित "गणितीय मस्तिष्क" (सॉल्वर) है जो तुरंत पता लगा लेता है कि आपकी रिक्वेस्ट संभव है या यह किसी विरोधाभास की ओर ले जाती है। यह केवल अनुमान नहीं लगाता; यह उत्तर देने के लिए गणितीय तर्क का उपयोग करता है।

3. "स्टेट मशीन" (बर्थडे बुक की कहानी)

इसे सिद्ध करने के लिए, लेखक एक क्लासिक उदाहरण का उपयोग करते हैं: एक बर्थडे बुक

  • लक्ष्य: एक ऐसा सिस्टम जो लोगों के जन्मदिन याद रखता है और उनके बड़े दिन पर आपको याद दिलाता है।
  • स्टेट मशीन: स्टेट मशीन को एक नाटक के पात्र के रूप में सोचें। इसके पास एक "वर्तमान स्थिति" (बुक में कौन है) और "ऑपरेशन्स" (नाम जोड़ना, नाम हटाना, तारीख चेक करना) होते हैं।
  • जादू: {log} के साथ, आप नाम जोड़ने के नियम लिख सकते हैं। फिर, आप तुरंत कंप्यूटर से पूछ सकते हैं: "यदि मैं एक नाम जोड़ता हूँ, तो क्या सिस्टम टूट जाएगा?" या "यदि मैं एक ही नाम के दो लोग जोड़ता हूँ, तो क्या सिस्टम इसे ठीक से संभाल पाएगा?"

4. "सेफ्टी इंस्पेक्टर" (वेरिफिकेशन कंडीशन जनरेटर)

आमतौर पर, कोड सुरक्षित है या नहीं, इसकी जाँच करने के लिए एक इंसान को इसे पढ़ना पड़ता है और कहना पड़ता है, "हम्म, मुझे लगता है कि यह सुरक्षित है।"
{log} में एक अंतर्निहित सेफ्टी इंस्पेक्टर (जिसे VCG कहा जाता है) है।

  • जब आप एक नियम लिखते हैं (जैसे "आप एक नाम तभी जोड़ सकते हैं जब वे पहले से बुक में न हों"), तो इंस्पेक्टर स्वचालित रूप से "क्या होगा अगर" (What If) वाले सवालों की एक सूची तैयार करता है।
  • सवाल: "क्या होगा अगर बुक खाली हो?"
  • सवाल: "क्या होगा अगर नाम एक नंबर हो?"
  • टूल फिर "हाँ" या "नहीं" का उत्तर देने के लिए एक गणितीय प्रमाण चलाता है। यदि यह "नहीं, यह नियमों को तोड़ता है" कहता है, तो यह केवल रुकता नहीं है; यह आपको एक काउंटर-एग्जांपल (प्रति-उदाहरण) देता है। यह कहता है, "यहाँ एक विशिष्ट परिदृश्य है जहाँ आपका कोड विफल हो जाता है: 'एलिस' जोड़ने का प्रयास करें जब 'एलिस' पहले से ही वहां मौजूद है।" यह आपको तुरंत बग ठीक करने में मदद करता है।

5. "टेस्ट केस जनरेटर" (द स्ट्रेस टेस्टर)

एक बार जब कोड सत्यापित हो जाता है, तो आपको यह सुनिश्चित करने के लिए परीक्षण करने की आवश्यकता होती है कि यह वास्तविक दुनिया में काम करता है।
आमतौर पर, एक इंसान को यह सोचना पड़ता है कि अजीब चीजें क्या हो सकती हैं (जैसे, "क्या होगा अगर मैं उस व्यक्ति के लिए जन्मदिन जोड़ने की कोशिश करूं जो अस्तित्व में ही नहीं है?")।
{log} के पास एक स्ट्रेस टेस्टर है जो यह आपके लिए करता है।

  • यह आपके नियमों को देखता है और स्वचालित रूप से "टेस्ट परिदृश्यों" की एक सूची बनाता है।
  • यह संभावनाओं का एक "ट्री" (Tree) बनाता है: "एक नाम जोड़ने का प्रयास करें," "एक डुप्लिकेट जोड़ने का प्रयास करें," "एक अजीब प्रतीक वाला नाम जोड़ने का प्रयास करें।"
  • फिर यह सुनिश्चित करने के लिए इन परीक्षणों को स्वचालित रूप से चलाता है कि आपका सिस्टम बिल्कुल वैसा ही व्यवहार करे जैसा गणित ने भविष्यवाणी की थी।

यह एक बड़ी बात क्यों है?

Agda या Dafny जैसे अन्य टूल्स के बारे में सोचें। वे उच्च-स्तरीय, कस्टम-निर्मित प्रयोगशालाओं की तरह हैं। वे शक्तिशाली हैं, लेकिन वे आपसे सोचने का एक नया, बहुत सख्त तरीका सीखने की मांग करते हैं।

{log} एक स्विस आर्मी नाइफ (Swiss Army Knife) की तरह है।

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

निष्कर्ष

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

अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?

आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।

Digest आज़माएँ →