คอมแพเนียน Lean สำหรับ Analysis I
(terrytao.wordpress.com)- Terence Tao เริ่มต้นรีโพซิทอรีคอมแพเนียนที่ย้ายคำนิยาม ทฤษฎีบท และโจทย์แบบฝึกหัดจากหนังสือ Analysis I มาเป็นโค้ด Lean
- ด้วยลักษณะของหนังสือที่จัดการการสร้างจำนวนธรรมชาติ จำนวนเต็ม จำนวนตรรกยะ และจำนวนจริง รวมถึงทฤษฎีเซตและตรรกะอย่างเคร่งครัด จึงมีโครงสร้างที่เหมาะกับการเรียนรู้ผ่าน proof assistant
- ขอบเขตปัจจุบันครอบคลุมบางส่วนของบทที่ 2, ทฤษฎีเซตพื้นฐานใน 3.1 และ จำนวนเต็ม ใน 4.1 พร้อมทั้งมีไอโซมอร์ฟิซึมกับจำนวนธรรมชาติของ Mathlib
- โค้ดสามารถคอมไพล์ใน Lean ได้ แต่ยังมี
sorryอยู่จำนวนมาก และแนะนำให้เติมคำตอบลงในฟอร์กแทนการโฮสต์เฉลยทางการ - เอกสารชุดนี้เป็นทั้งเส้นทางทางเลือกสำหรับการทำโจทย์แบบฝึกหัดใน Lean และยังใช้เป็นสื่อเริ่มต้นเพื่อค่อย ๆ เรียนรู้การใช้ Mathlib ในบทหลัง ๆ ได้
โปรเจกต์ย้าย Analysis I ไปเป็น Lean
- Lean companion to “Analysis I” เป็นโปรเจกต์ที่ “แปล” คำนิยาม ทฤษฎีบท และโจทย์แบบฝึกหัดหลายส่วนของ Analysis I ไปเป็น Lean
- โจทย์แบบฝึกหัดในหนังสือสามารถแก้ได้ด้วยการเติม
sorryที่สอดคล้องกันในโค้ด Lean - มีแผนว่าจะไม่โฮสต์เฉลยแบบฝึกหัดอย่างเป็นทางการไว้ในคอมแพเนียน และสามารถสร้างเวอร์ชันที่เติม
sorryแล้วเป็นฟอร์กของรีโพซิทอรีได้
ทำไมหนังสือกับ Lean จึงเข้ากันได้ดี
- Analysis I เป็นหนังสือที่มุ่งเน้นประเด็นพื้นฐานมากขึ้น เพื่อเสริมตำราการวิเคราะห์จริงแบบเดิม
- การสร้างจำนวนธรรมชาติ จำนวนเต็ม จำนวนตรรกยะ และจำนวนจริง
- ทฤษฎีเซตและตรรกะที่ช่วยให้พัฒนาบทพิสูจน์ที่มีความเคร่งครัดสูงได้
- ตอนเขียนหนังสือมี proof assistant อย่าง Coq และ Agda อยู่แล้ว แต่การพิสูจน์แบบเป็นทางการไม่ใช่ประเด็นที่ผู้เขียนสนใจในเวลานั้น
- หลังจากได้สัมผัสการพิสูจน์แบบเป็นทางการ จึงยืนยันได้ว่าเนื้อหาในหนังสือ เข้ากับ proof assistant ได้ดี
- ทฤษฎีชนิดแบบไร้พิธีการ ที่ใช้โดยนัยในการสร้างระบบจำนวนมาตรฐานในหนังสือ เข้ากันได้ดีกับ dependent type theory ของ Lean
- การรองรับ quotient type ของ Lean ก็สอดคล้องกับวิธีการสร้างในหนังสือเช่นกัน
ขอบเขตที่ย้ายมาเป็น Lean แล้วในปัจจุบัน
- ขณะนี้มีการแปลส่วนต่อไปนี้เป็น Lean
ความสัมพันธ์กับ Mathlib
- การทำให้เป็นทางการนี้ถูกออกแบบให้แยกจากไลบรารีคณิตศาสตร์มาตรฐานของ Lean อย่าง Mathlib ในบางจุด และพึ่งพา Mathlib ในบางจุด
- Mathlib มีแนวคิดเรื่องจำนวนธรรมชาติมาตรฐานอยู่แล้ว
- ในการทำให้เป็นทางการด้วย Lean นี้ จะพัฒนา
Chapter2.Natซึ่งเป็นการสร้างจำนวนธรรมชาติขึ้นใหม่ “ด้วยมือ” ก่อน- หากทำงานในเนมสเปซ
Chapter2ก็สามารถใช้เป็นNatได้ - มีการตั้งผลพื้นฐานที่ขนานกับบทช่วยพิสูจน์เกี่ยวกับจำนวนธรรมชาติใน Mathlib
- หลายบทพิสูจน์ในส่วนนี้ยังถูกทิ้งไว้เป็นแบบฝึกหัดของผู้อ่าน และตอนนี้แทนด้วย
sorry
- หากทำงานในเนมสเปซ
- ในส่วน epilogue จะสร้างไอโซมอร์ฟิซึมระหว่างจำนวนธรรมชาติทางเลือกนี้กับ จำนวนธรรมชาติของ Mathlib
- ให้แม่นยำขึ้นก็คือ ไอโซมอร์ฟิซึมดังกล่าวเองก็ถูกตั้งไว้เป็นแบบฝึกหัด
- หลังจากนั้นจะไม่ใช้การสร้างจำนวนธรรมชาติของบทที่ 2 อีกต่อไป และจะใช้จำนวนธรรมชาติของ Mathlib แทน
- มีแผนจะคงรูปแบบนี้ไว้ในบทท้าย ๆ ของหนังสือ โดยอาศัย คำนิยามและฟังก์ชันของ Mathlib มากขึ้น แทนที่จะพึ่งสิ่งที่สร้างขึ้นเองในบทก่อนหน้า
วิธีใช้งานและสถานะการตรวจสอบ
- โค้ดในรีโพซิทอรีสามารถคอมไพล์ใน Lean ได้
- อย่างไรก็ตาม ยังไม่มีการทดสอบว่าทุก
sorryในโค้ดจะเติมได้จริงทั้งหมดหรือไม่ - ยังต้องตรวจสอบด้วยว่ามีบทช่วยพิสูจน์ที่จำเป็นหรือ API ของไฟล์ Lean เพียงพอหรือไม่
- เป้าหมายคือการยืนยันว่าสามารถเติม
sorryได้อย่างเป็นธรรมชาติตามแนวคิด โดยไม่ต้องพึ่งเทคนิคการเขียนโปรแกรม Lean ที่ซับซ้อนเกินไป
- เป้าหมายคือการยืนยันว่าสามารถเติม
- ผู้เขียนต้องการให้อาสาสมัครช่วย playtest คอมแพเนียน เพื่อดูว่าสามารถแก้แบบฝึกหัดใน Lean ได้จริงหรือไม่
- ยินดีรับข้อเสนอแนะอื่น ๆ เช่นกัน
บทบาทในฐานะสื่อเริ่มต้นสำหรับ Lean และ Mathlib
- คอมแพเนียนนี้สามารถใช้เป็นสื่อเริ่มต้นสำหรับ Lean และ Mathlib ได้ ไม่ใช่แค่สำหรับการวิเคราะห์จริงเท่านั้น
- ในแง่นี้มีลักษณะคล้ายกับ Natural number game อยู่พอสมควร
- Natural number game มีเนื้อหาทับซ้อนเชิงหัวข้อกับบทที่ 2 ของ Analysis I อยู่มาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมคิดว่าสิ่งที่น่าสนใจที่สุดเวลาใช้ Lean สอนคณิตศาสตร์คือ ฟีดแบ็กแบบทันที ถ้าพิสูจน์ของนักศึกษาผิด มันก็จะคอมไพล์ไม่ผ่าน
เมื่อก่อนต้องมีคนอย่างผู้ช่วยสอน อาจารย์ หรือผู้เชี่ยวชาญมาดูให้เท่านั้นถึงจะได้ฟีดแบ็ก แต่ตอนนี้คอมไพเลอร์ของ Lean ให้ฟีดแบ็กได้อย่างรวดเร็ว
ต่อไปถ้าคอมไพเลอร์ของ Lean ให้ฟีดแบ็กที่เป็นเชิงการศึกษามากขึ้นได้ เหมือนที่คอมไพเลอร์ Rust เสนอวิธีแก้โค้ด ก็คงดี และบางทีอาจต้องมี LLM เฉพาะทาง
การเรียนคณิตศาสตร์สมัยก่อนมีเวลาจำนวนมากในการนั่งครุ่นคิดกับโจทย์ ลองนั่นลองนี่บนกระดาษ และกระบวนการนั้นบางครั้งก็นำไปสู่การซึมซับแนวคิดและไอเดียใหม่ๆ
พอใช้ Lean อาจกลายเป็นการลองแบบส่งเดช ตรวจแบบสุ่ม และเททุกอย่างออกมาเสียมากกว่าไหม ตอนที่เคยลองจับ Coq อยู่ไม่กี่ครั้ง ความทรงจำหลักๆ ก็คือการลองปรับโน่นนี่ไปเรื่อยๆ
reduce(r.num, r.denom) = reduce(a, b)cross_equals(a, b, r.num, r.denom)r.denom * a = r.num * bไม่ได้ใช้ LLM แต่มีโมเดลโลคัลขนาดเล็กทำงานอยู่ในส่วนขยาย VS Code หวังว่าสักวันโมเดลโลคัลขนาดเล็กนั้นจะแข็งแกร่งจนเหนือกว่ามนุษย์มากๆ รายละเอียดเพิ่มเติมอยู่ที่ https://acornprover.org/docs/tutorial/proving-a-theorem/
ตั้งตารอจริงๆ ถ้าย้ายไปเป็นรีโพซิทอรีแยกต่างหาก ทำให้ค้นหาและส่งต่อให้คนอื่นง่ายขึ้นก็คงดี
เดิมทีผมสนใจคณิตศาสตร์อยู่แล้ว และ Analysis ของ Tao เป็นตำราเล่มแรกที่แสดงให้เห็นว่าคณิตศาสตร์ถูกสร้างขึ้นอย่างเคร่งครัดในแบบที่หัวแบบโปรแกรมเมอร์คาดหวังได้อย่างไร
หลังจากนั้นก็ลอง Lean นิดหน่อยและรู้สึกพอใจคล้ายกัน แต่ Mathlib ค่อนข้างซับซ้อนสำหรับใช้เรียนแนวคิดทางคณิตศาสตร์ เลยดีใจที่มีสะพานเชื่อมระหว่างหนังสือกับเครื่องมือ
ดีใจที่เห็น การพิสูจน์ทฤษฎีบท เริ่มมีแรงส่งในหัวข้อคณิตศาสตร์กระแสหลักอย่างแคลคูลัสเชิงวิเคราะห์
ในฝั่งทฤษฎีภาษาโปรแกรม เคยมีตำราหลักอย่าง The Formal Semantics of Programming Languages ของ Winskel ถูกตรวจสอบความถูกต้องเชิงรูปนัยด้วย Isabelle แล้ว ตั้งแต่ช่วงกลางทศวรรษ 2010 ตอนที่เครื่องมือเริ่มขัดเกลาได้ดีพอสมควร แม้จะไม่ใช่การถอดแบบ 1:1 อย่างสมบูรณ์ แต่ http://concrete-semantics.org คือตัวอย่างนั้น
ถ้าสนใจการพิสูจน์ทฤษฎีบท ส่วนตัวคิดว่าทางนั้นเป็นจุดเริ่มต้นที่ง่ายกว่ามาก เพราะทฤษฎีบทในแคลคูลัสเชิงวิเคราะห์เองก็ยากพอตัวอยู่แล้ว
ทำอุปนัยเชิงโครงสร้าง ใช้สมมติฐานอุปนัยเพื่อแสดงว่าอินวาเรียนต์ยังคงอยู่ แล้วก็เดินหน้าต่อไปในทำนองนั้น
ผมไม่ได้ทำการพิสูจน์ทฤษฎีบทมามากนัก และก็ยังไม่เคยทำพิสูจน์แบบ “คณิตศาสตร์” อย่างแคลคูลัสเชิงวิเคราะห์ด้วย proof assistant แต่ถ้าการพิสูจน์ทางคณิตศาสตร์ต้องใช้วิธีเข้าหาที่ต่างกันมาก ก็สงสัยว่าทักษะระหว่างสองฝั่งจะถ่ายโอนกันได้แค่ไหน
ขอพูดถึง Software Foundations ของ Rocq ด้วย อาจมีพอร์ตไป Lean แล้วก็ได้ แต่ตอนลองตามช่วงต้นๆ ไป รู้สึกค่อนข้างลื่นไหลดี
การประเมินว่าแนวทางแบบ “ตำราเรียน” กระแสหลักต่างจากแนวทางของ Mathlib อย่างไร น่าจะเป็นเรื่องที่น่าสนใจมาก
โดยทั่วไป ไลบรารีคณิตศาสตร์ที่ถูก formalize จะพยายามกล่าวผลลัพธ์ให้ทั่วไปที่สุดเท่าที่ทำได้ และทำให้รีแฟกเตอร์ลำดับการพิสูจน์ให้เป็นธรรมชาติและสง่างามขึ้นได้ง่าย
เหตุผลที่รีแฟกเตอร์ได้ง่ายคือระบบติดตามอยู่เสมอว่าอะไรตามมาจากอะไรในเชิงตรรกะ เวลาใช้กระดาษกับปากกา เราไม่มีสิ่งนั้น จึงมักพลาดโอกาสในการปรับงานใหม่
คำถามที่ตามมาอย่างเป็นธรรมชาติคือ การสอนการวิเคราะห์จริงในระดับปริญญาตรีด้วยเวอร์ชันแบบ “ทั่วไปสูงสุด” ตามแนว Mathlib นั้นสมเหตุสมผลหรือไม่ แน่นอนว่าสาขาอื่นของคณิตศาสตร์แบบเน้นพิสูจน์ก็เช่นกัน
เท่าที่รู้ ประสบการณ์ของอาจารย์ที่เคยลองทำจริงก็คล้ายกัน สำหรับนักศึกษาระดับสูงอาจโอเค แต่สำหรับนักศึกษาทั่วไป มีโอกาสสูงที่จะกลายเป็นการเสียเวลาเรียน
อคติของผมส่วนหนึ่งมาจากการเรียนแนวคิดคณิตศาสตร์ผ่านบทความวิชาการ
โค้ดเพิ่มภาระอย่างมหาศาล และผมรู้สึกว่าบ่อยครั้งมันก็ไม่ทำตามมาตรฐานสไตล์ใดๆ เลย ในฐานะคนที่เคยต้องอ่านบทความคณิตศาสตร์ที่ถูกมองว่าอ่านไม่รู้เรื่อง ต้องบอกว่าโค้ดแทบไม่มีมาตรฐานด้านความเข้าใจได้อยู่จริงๆ จึงแย่กว่าราว 10 เท่า
ในช่อง YouTube ของ Terence Tao เองก็มีวิดีโอที่ใช้ Lean อยู่หลายรายการ https://www.youtube.com/@TerenceTao27
ผมไม่รู้รายละเอียดมากนัก แต่การได้เห็นเขาทำงานทั้งแบบใช้และไม่ใช้ LLM นั้นเจ๋งดี
สำหรับหัวข้อพื้นฐานอย่างแคลคูลัสเชิงวิเคราะห์ นี่เป็นโปรเจกต์ที่ดีมากและเป็นแนวทางที่ดี
สิ่งที่น่ากังวลทันทีมีสองอย่าง อย่างแรก ผลลัพธ์หลักด้านแคลคูลัสเชิงวิเคราะห์ใน Mathlib ใช้แนวคิด ฟิลเตอร์ เพื่อจัดการลิมิตอย่างทั่วไปและเป็นหนึ่งเดียว ถึงอย่างนั้น ผลลัพธ์บางส่วนก็ถูกทำให้เป็นกรณีเฉพาะในรูปเอปซิลอน-เดลตาไว้แล้ว ผมคิดว่า Analysis ของ Tao น่าจะใช้แนวทางเอปซิลอน-เดลตาแบบดั้งเดิมมากกว่า
อย่างที่สอง Mathlib เคลื่อนไหวเร็วและมักพังบ่อย มีการเปลี่ยนชื่อและรีแฟกเตอร์อยู่เรื่อยๆ ดังนั้นรีโพซิทอรีย่อยจึงต้องมีการบำรุงรักษาอย่างต่อเนื่อง
https://link.springer.com/chapter/10.1007/978-981-19-7261-4_6
เป็นความคิดที่ค่อนข้างสุดโต่ง แต่ผมมองว่าการศึกษาคณิตศาสตร์ควรโฟกัสไปที่การสร้าง ระบบพีชคณิตคอมพิวเตอร์ อย่าง Mathematica และเครื่องพิสูจน์ทฤษฎีบทอย่าง Lean รวมถึงควรใส่การทำ visualization และการประยุกต์ใช้จริงเข้าไปอย่างเข้มข้นด้วย
ถ้าพูดแบบสุดขั้ว ก็อาจเป็นรูปแบบที่ไม่ทำคณิตศาสตร์บนกระดาษเลย แต่สามารถพิสูจน์ทุกอย่างที่เรียนมาได้ภายใน Lean
ระบบตอนนี้ไปเน้นการคำนวณด้วยมือแบบไม่มีที่สิ้นสุด ซึ่งรู้สึกว่าไร้ประโยชน์เกินไปและน่าเบื่อ จนทำให้คนเกลียดคณิตศาสตร์
ดีจังที่มีตำรา Lean แต่ทำไมถึงไม่มี HoTT ล่ะ?
“Should Type Theory (HoTT) Replace (ZFC) Set Theory as the Foundation of Math?”
https://news.ycombinator.com/item?id=43196452
แหล่งข้อมูล Lean เพิ่มเติมที่ขึ้น HN ในสัปดาห์นี้:
“100 theorems in Lean”
https://news.ycombinator.com/item?id=44075061
“Google-DeepMind/formal-conjectures: collection of formalized conjectures in lean” https://news.ycombinator.com/item?id=44119725
แรงจูงใจที่แน่ชัดอยู่นอกสาขาของผมเลยไม่รู้ แต่ดูเหมือน Agda จะเป็นวิธีที่ดีกว่า Lean สำหรับการ formalize แนวคิดเหล่านั้น
ช่วงปลายปีนี้ยังมีกำหนดออกตำราใหม่ที่เป็นการอัปเดตให้ทันสมัยกว่าเดิมของหนังสือ HoTT เล่มเดิมด้วย และก็มีการ formalize ด้วย Agda ด้วย
https://www.cambridge.org/core/books/introduction-to-homotopy-type-theory/0DD31EC06C80797A50ACE807251E80B6
https://github.com/HoTT-Intro/Agda
HoTT ยังไม่ได้ใกล้เคียงเลยที่จะถูกยอมรับเป็นมาตรฐานที่สมเหตุสมผล และสำหรับคนส่วนใหญ่ก็เป็นหัวข้อที่ติดขัดตั้งแต่เริ่ม
คล้ายกับการถามนักพัฒนา JavaScript framework ว่าทำไมไม่ทำ framework สำหรับ Elm หรือ Haskell
งานที่ลงไปเพื่อทำให้เครื่องพิสูจน์ทฤษฎีบท HoTT ใช้งานสะดวกนั้นน้อยกว่ามาก และเอกสารก็ด้อยกว่ามาก
ประโยชน์ของ HoTT ก็ไม่ชัดเจน ดูเหมือนจะช่วยลดงานเฉพาะตอนจัดการกับโครงสร้างที่ลึกลับมาก ๆ ใน category theory เท่านั้น
Terrence Tao มีตำรา analysis อยู่หลายเล่ม และนี่คือเอกสารประกอบใน Lean สำหรับหนังสือเล่มแรกของเขา เขาไม่ได้มีตำรา type theory ดังนั้นจึงไม่มี higher type theory ตั้งแต่แรกสิ่งที่ตั้งใจจะทำก็คนละเรื่องกันโดยสิ้นเชิง
เจ๋งมาก Analysis I เป็นตำรา “คณิตศาสตร์จริง ๆ” เล่มแรกที่ผมซึ่งเป็นวิศวกร ไม่ใช่นักคณิตศาสตร์ รู้สึกว่าสามารถตามและแก้โจทย์ไปได้จนจบ หลังจากลองหนังสือเล่มอื่น ๆ อย่าง Rudin มาหลายครั้ง
หวังว่าเอกสารประกอบ Lean จะทำให้คนที่คุ้นกับคณิตศาสตร์และการเขียนโปรแกรม และอยากเรียนอย่างเข้มงวด เข้าถึงได้ง่ายขึ้น
ในช่วงไม่กี่ปีที่ผ่านมา มีความพยายามอย่างต่อเนื่องที่จะ formalize หนังสือ Analysis I ของ Tao ด้วย Lean และก็มีคนที่พยายามทำสิ่งเดียวกันกับที่ Tao กำลังทำอยู่พอดี น่าเสียดายที่ส่วนใหญ่ไปได้ไม่เกินไม่กี่บทแรก แต่หวังว่า Tao จะไปได้ไกลกว่านั้น
ผมเองก็เคยคิดว่าจะลองทำดูเหมือนกัน เพราะถ้านำ proof ที่ formalize แล้วของแบบฝึกหัดแต่ละข้อไปแนบไว้ในบล็อกคำอธิบาย Analysis I ของผม https://taoanalysis.wordpress.com/ ก็น่าจะเป็นประโยชน์กับคนที่อ่านตามหนังสือ
ผมโพสต์ไว้ใน Discord server แบบปิดของหนังสือแล้ว แต่เห็นว่าน่าจะมีประโยชน์ที่นี่ด้วย จึงขอแชร์แหล่งข้อมูลที่เกี่ยวข้อง
https://github.com/cruhland/lean4-analysis — นำมาจาก https://github.com/cruhland/lean4-axiomatic
https://github.com/Shaunticlair/tao-analysis-lean-practice
https://github.com/vltanh/lean4-analysis-tao
https://github.com/gabriel128/analysis_in_lean
https://github.com/mk12/analysis-i
https://github.com/melembroucarlitos/Tao_Analysis-LEAN
https://github.com/leanprover-community/NNG4/ — แม้จะไม่ได้ตามหนังสือของ Tao แต่เป็นเวอร์ชัน Lean4 ของ Natural Number Game จึงมีเนื้อหาใกล้เคียงกับบทที่ 2 มาก
https://github.com/djvelleman/STG4/ — เป็นเกมทฤษฎีเซตบน Lean4 จึงอาจใกล้เคียงกับบทที่ 3 อย่างไรก็ตาม ใน https://github.com/djvelleman/STG4/blob/main/Game/Metadata.lean เห็นว่ามี
import Mathlib.Data.Set.Basicดังนั้นดูเหมือนจะนำเซตของ Lean มาใช้ แทนที่จะนิยามเซตขึ้นใหม่และตั้งสัจพจน์เอง แนวทางนี้อาจทำให้ Lean “รู้มากเกินไป” เกี่ยวกับทฤษฎีเซต ซึ่งอาจไม่เหมาะกับวัตถุประสงค์นี้https://gist.github.com/kbuzzard/35bf66993e99cbcd8c9edc4914c9e7fc — สำหรับสร้างจำนวนเต็ม
https://github.com/ImperialCollegeLondon/IUM/blob/main/IUM/2023/IntegerGame.lean — อาจเป็นไฟล์เดียวกับข้างต้น
https://github.com/ImperialCollegeLondon/IUM/blob/main/IUM/2023/RationalGameAlgebra.lean — สำหรับสร้างจำนวนตรรกยะ
https://lean-lang.org/theorem_proving_in_lean4/axioms_and_computation.html#function-extensionality — แสดงวิธีหนึ่งในการนิยาม type
Setแบบกำหนดเอง