गणित में एक भूत है
(overreacted.io)- Lean गणित को औपचारिक रूप में लिखने के लिए डिज़ाइन की गई प्रोग्रामिंग भाषा है, जो गणितज्ञों को गणितीय प्रमेयों को कोड की तरह संभालने की सुविधा देती है
- उपयोगकर्ता प्रमेय, प्रमाण, स्वयंसिद्ध आदि को कोड के रूप में लिखते हैं, और प्रमाण निर्माण
tacticनामक निर्देशों के सेट के माध्यम से आगे बढ़ता है - प्रमाण सच में पूरा न होने पर भी इसे
sorryसे अस्थायी रूप से बंद किया जा सकता है, लेकिन यह TypeScript केanyजैसा एक झूठा प्रमाण है - यदि गलत स्वयंसिद्ध जोड़ दिए जाएँ (जैसे
2 = 3), तो तार्किक विरोधाभास और सभी दावों के सिद्ध हो जाने की संभावना जैसी जोखिमपूर्ण स्थिति उत्पन्न होती है - Lean केवल चुने हुए स्वयंसिद्धों और प्रमाण प्रणाली पर ही निष्कर्ष निकालता है, इसलिए गणितीय वैधता को बनाए रखना इसका बड़ा महत्व रखता है
Lean: गणित को कोड में संभालने वाली भाषा
- Lean औपचारिक गणित लिखने के लिए बना हुआ एक विशिष्ट प्रोग्रामिंग भाषा है
- गणितज्ञ Lean की सहायता से गणित को कोड में व्यक्त करते हैं और एक-दूसरे के प्रमेय व प्रमाणों को संगठित कर सहयोग एवं साझा करना आसान बनाते हैं
- आगे चलकर मानवता का विशाल गणितीय ज्ञान कोड के रूप में मशीन-सत्यापन और संयोजन के लिए उपलब्ध हो सकता है—यह भविष्य की दिशा दिखाता है
Lean प्रमाण की पहली सीढ़ी
theorem two_eq_two : 2 = 2 := by sorryके रूप में Lean में सरल प्रमेय घोषणा की जा सकती है- यदि प्रमाण अधूरा हो तो
sorryडालते हैं, पर यह केवल एक अस्थायी उपाय है, वास्तविक प्रमाण नहींsorryLean का प्रमाण सत्यापन पार करा देता है, लेकिन तार्किक दृष्टि से भरोसेमंद नहीं होता
- पूर्ण प्रमाण के लिए
rfl(reflexivity) जैसी tactic का उपयोग कर2 = 2जैसे सहज समता का प्रमाण दिया जाता है - पहले से सिद्ध सामग्री को
exactजैसे शब्दों के साथ अन्य प्रमेयों में पुनः उपयोग किया जा सकता है, जिससे मॉड्यूलरिटी पर जोर मिलता है
स्वयंसिद्ध और विरोधाभास: जब गणित भुतहा हो
- यदि
axiom math_is_haunted : 2 = 3जैसे कोई स्वयंसिद्ध जोड़ा जाए, तो Lean उसे सत्य के रूप में मान लेता है - यही स्वयंसिद्ध आगे के प्रमाण चरणों में प्रयोग हो सकता है और गणितीय रूप से गलत निष्कर्ष जैसे (
2 + 2 = 6) भी सिद्ध किए जा सकते हैं rewritetactic से2को3में बदलकर औरrflसे समानता सिद्ध करके प्रक्रिया पूरी की जा सकती है- गलत स्वयंसिद्ध से विरोधाभास पैदा होने पर Lean में भी सभी प्रस्तावों के प्रमाण संभव होने की स्थिति (तार्किक पतन) आ जाती है
- वास्तव में, 20वीं सदी के शुरुआती दौर में रसेल का विरोधाभास आदि स्वयंसिद्ध-प्रणाली में विरोधाभासों ने गणित की मूलभूत पड़ताल को जन्म दिया था
- इस तरह Lean स्पष्ट दिखाता है कि स्वयंसिद्ध का चयन तार्किक प्रणाली की वैधता बनाए रखने में निर्णायक भूमिका निभाता है
Lean के रूप में प्रमाण-जांचकर्ता (proof checker)
- यदि स्वयंसिद्ध सही चुने गए हों और Lean तार्किक रूप से सही ढंग से काम करे, तो यह सैद्धांतिक रूप से भरोसेमंद निष्कर्ष दे सकता है
- सरल समानताओं से लेकर बहुत जटिल प्रमेयों (उदाहरण: Fermat’s Last Theorem) तक सभी का सत्यापन समान सिद्धांत पर होता है
- बड़े प्रमेय का ढाँचा नीचे की उप-संरचनाओं और अन्य प्रमेयों के बार-बार प्रमाणित होते जाने से चरणबद्ध तरीके से बनता है
- उदाहरण के लिए, Fermat's Last Theorem को Lean में औपचारिक करने का एक बड़े पैमाने का प्रोजेक्ट जारी है, और अंतिम चरण में बिना किसी
sorryके पूर्ण औपचारिक प्रमाण संरचना बनाने की अपेक्षा है
Lean सीखने का आनंद
- Lean में प्रमाण निर्माण कोडिंग और गणित का एक रचनात्मक मिश्रण है
- शुरुआत में सरल कथनों के प्रमाण से शुरुआत कर, धीरे-धीरे जटिल और गहरी गणित को कठोरता से क्रमबद्ध करने की प्रक्रिया ही सबसे बड़ा आनंद बन जाती है
- आधिकारिक ट्यूटोरियल और समुदाय संसाधन (जैसे Natural Numbers Game, Mathematics in Lean आदि) शुरुआत के लिए उपयुक्त हैं
- Lean का उपयोग करके आप सीधे तर्क को औपचारिक करते हैं और चतुर विचार व तर्क की सुंदरता को फिर से खोजते हैं
- किसी अतिरिक्त कारण के बिना भी, कुछ लोगों के लिए यह निष्कर्ष निकलता है कि Lean में खास मज़ा है
1 टिप्पणियां
Hacker News की राय
two_eq_twotheorem एक function जैसा दिखता है, थोड़ा अजीब है। उसमें कोई arguments नहीं हैं, इसलिए वह constant के ज़्यादा क़रीब है (हालाँकि मैं मानता हूँ कि constants भी बिना arguments वाले functions ही होते हैं)। नीचे की तरहx_eq_xका इस्तेमाल करके2_eq_2में function की तरह apply करना ज़्यादा विश्वसनीय लगेगा। यहाँx_eq_xfunction जैसा दिखता है, और2_eq_2में वास्तव में उसी तरह इस्तेमाल भी हुआ है।xदेने परx = xका proof लौटता है) मेरे लिए थोड़ा अपरिचित है, और वह अपने-आप में अलग विषय है। अगले लेख में उसी पर बात करूँगा।rflजैसी) बहुत ज़्यादा व्यापक हैं, और tutorial से भी उनका सटीक मतलब समझना कठिन है। उदाहरण के लिए, C भाषा में आप bit-level तक state changes को ट्रैक कर सकते हैं, लेकिन Lean में चीज़ें कुछ धुंधली लगती हैं। औरrewrite(rw) tactic की syntax भी स्वाभाविक नहीं लगती।rewriteकिसी समझ में न आने वाले कारण से काम नहीं करता था (शायद बीच की structure definitions की वजह से)। दूसरी ओर, Metamath और उसकाset.mmdatabase बिना किसी tactic के सिर्फ़ concrete reasoning से proofs करवाते हैं (जैसेax-mpजैसी inference rules), लेकिन वहाँ समस्या यह है कि आपको काम के utility lemmas काफ़ी याद रखने पड़ते हैं, इसलिए वह भी आसान नहीं है।rflयाrewriteहर बार खुद लिखना पड़ता है। शायद Lean में कोई prelude जैसी चीज़ हो, जो इसे अपने-आप कर दे।rw [x]कमांडों की सूची जैसे लगते थे, इसलिए उन्हें पढ़ना बहुत मुश्किल था। editor में हर लाइन की state देखी जा सकती है, लेकिन लगातार क्लिक करना पड़ता है, जिससे flow टूट जाता है। Python में भी अगर indentation न हो और flow समझने के लिए block structure पर क्लिक करना पड़े, तो वही समस्या होगी। हो सकता है यह मेरी नज़र में game की शुरुआती सीमित commands की वजह से हो, लेकिन मैं जानना चाहता हूँ कि full Lean environment में यह flow बेहतर लगता है या नहीं।by ...से tactics को छोटा किया जाता है जहाँ बारीक details महत्वपूर्ण हों। Lean में इसका कोई समकक्ष है या नहीं, यह नहीं जानता, लेकिन कम-से-कम इसे search keywords या Lean forum में पूछने के विषय के रूप में इस्तेमाल किया जा सकता है।introदेखकर पता चल जाता है कि quantifier के भीतर जा रहे हैं,constructorgoal split कर रहा है, वगैरह। आखिरकार tactics proofs का tree (term tree) बनाने वाला macro/DSL हैं। मैं proof code को tree manipulation की तरह देखता हूँ — टुकड़ों में बाँटना, क्रम भरना, आदि। फिर भी proof code के बीच की assertions को ठीक-ठीक जानने के लिए क्लिक करना पड़ता है, यह बात बनी रहती है। जिन proofs में अच्छा idea होता है, वे paper की logical exposition की तरह साफ़ पढ़े जा सकते हैं। इसलिए जो लोग इरादा स्पष्ट करना चाहते हैं, वे readable names, साफ़ progression, छोटे lemmas निकालना, और hypotheses पहले लिखकर छोटे proof code से बात ख़त्म करना — इस तरह लिखते हैं। दूसरी ओर, मशीन के लिए तो मेहनत भरा लेकिन गणितज्ञ की नज़र में बिल्कुल स्पष्ट हिस्सा अक्सर “golfing” (सबसे छोटा code) से निपटाया जाता है। Golf style में code छोटा तो हो जाता है, लेकिन वह अक्सर वही हिस्से समेटता है जो इंसान सहज रूप से समझता है। संक्षेप में, Lean में पढ़ी जाने वाली structure कुछ हद तक implicit है, लेकिन उसे अधिक स्पष्ट करने के तरीके भी हैं; और tactics में निपुणता बढ़ने पर बिना क्लिक किए भी structure ज़्यादा समझ आने लगती है। सिर्फ़ lemma names को सरसरी नज़र से देखकर भी बड़ी तस्वीर का पता चल जाता है, और क्रम आसानी से फिर से बनाया जा सकता है।Lean community का बड़ा हिस्सा Zulip पर इकट्ठा होता है, और Machine-Learning-for-Theorem-Proving चैनल में कई उपयोगी threads मिलेंगे।
sorryवाले हिस्सों को खुद भरकर सीख रहा हूँ (मेरे solutions यहाँ हैं)।sorry) इस्तेमाल हों या बार-बार नए axioms जोड़ दिए जाएँ? जैसे यह जाँचना कि “proof किसी भी तरहsorryका उपयोग नहीं करता” या “यह एक निश्चित axiom set की proof power पर निर्भर है” — क्या ऐसा verify किया जा सकता है?#print axioms some_theoremशायद यही उदाहरण है। इससे आप देख सकते हैं कि वह proof प्रत्यक्ष या अप्रत्यक्ष रूप सेsorryया किसी unreviewed axiom पर निर्भर करता है या नहीं।print axiomsसे यह जाँचा जा सकता है कि कोई अतिरिक्त axioms तो नहीं जोड़े गए, और यह भी देखा जा सकता है कि चीज़ें बिना warning या error के compile होती हैं या नहीं। SafeVerify utility उन कुछ tricks को भी पकड़ लेती है जो RL systems ने खोज निकाली थीं।