ภาษาการเขียนโปรแกรมและรากฐานของคณิตศาสตร์มีความสัมพันธ์กันอย่างไร


30

โดยพื้นฐานฉันรู้พื้นฐานสามประการเกี่ยวกับคณิตศาสตร์

  1. ทฤษฎีเซต
  2. ทฤษฎีประเภท
  3. ทฤษฎีหมวดหมู่

ดังนั้นการเขียนโปรแกรมภาษาและรากฐานของคณิตศาสตร์ในทางใดบ้าง?

แก้ไข

คำถามเดิมคือ "ภาษาการเขียนโปรแกรมตามรากฐานของคณิตศาสตร์"

กับ paragarph เพิ่มของ

และการประยุกต์ใช้ทฤษฎี
1. ทฤษฎีประเภทในCoq
2. ตั้งทฤษฎีในSETL
3. ทฤษฎีหมวดหมู่ในHaskell

ตามคำแนะนำนี้ถูกเปลี่ยนเป็น "ภาษาการเขียนโปรแกรมและพื้นฐานทางคณิตศาสตร์เกี่ยวข้องอย่างไร"

เนื่องจากนี่เป็นหนึ่งในคำถามเหล่านั้นที่ฉันไม่รู้เกี่ยวกับสิ่งที่ฉันถาม แต่ต้องการเรียนรู้บางอย่างฉันจึงแก้ไขคำถามเพื่อให้มีค่ามากขึ้นสำหรับการเรียนรู้และอื่น ๆ แต่ยังทิ้งรายละเอียดไว้เพื่อไม่ให้คำตอบปัจจุบันโดย Andrej Bauer ดูเหมือนปิดหัวข้อ

ขอบคุณสำหรับความคิดเห็นทั้งหมดและคำตอบจนถึงตอนนี้ฉันกำลังเรียนรู้จากพวกเขา


1
ฉันไม่แน่ใจว่าฉันเข้าใจคำถามหรือสมมติฐานที่ระบุไว้ในนั้นหรือไม่ Coq ไม่ใช่ภาษาโปรแกรมเท่าที่ฉันเข้าใจ โปรแกรมสามารถแยกได้จากการพิสูจน์ Coq แต่ไม่ได้ทำให้เป็นภาษาการเขียนโปรแกรม ทฤษฎีหมวดหมู่และทฤษฎีประเภทมีความสัมพันธ์กันอย่างใกล้ชิดดังนั้นฉันไม่แน่ใจว่าเราสามารถจัดหมวดหมู่เหล่านี้ตามที่คุณมี ไม่รู้เรื่อง SETL ดูรายชื่อผู้ช่วยพิสูจน์บน Wikipedia
Kaveh

3
Haskell ไม่ใช่ "การดำเนินการตามหมวดหมู่ทฤษฎี" และไม่ว่าในกรณีใดรากฐานของคณิตศาสตร์มีจุดประสงค์ที่แตกต่างจากภาษาโปรแกรม ในขณะที่การเปรียบเทียบบางประเภทสามารถทำได้ แต่ก็ไม่ดีนักที่จะพยายามบังคับให้การเปรียบเทียบเป็นความสัมพันธ์ที่เป็นทางการ
Andrej Bauer

1
ลิงก์ที่เกี่ยวข้องกับทรินิตี้ศักดิ์สิทธิ์
Gardenhead

คำตอบ:


29

[หมายเหตุ: ย่อหน้านี้ล้าสมัยแล้ว] ชื่อคำถามของคุณมีข้อสันนิษฐานที่ไม่ได้รับการรับรองนั่นคือภาษาการเขียนโปรแกรมเป็น "ตามรากฐานของคณิตศาสตร์" โดยทั่วไปจะไม่เป็นเช่นนั้นแม้ว่าทั้งสองพื้นที่จะมีความสัมพันธ์ที่สำคัญ ข้อความที่แม่นยำมากขึ้นคือภาษาการเขียนโปรแกรม (บางภาษา) ได้รับการออกแบบโดยใช้เทคนิคพื้นฐาน คำถามที่ดีกว่าที่จะถามคือ"ภาษาการเขียนโปรแกรมและพื้นฐานของคณิตศาสตร์เกี่ยวข้องกันอย่างไร"

การเชื่อมต่อทั่วไปส่วนใหญ่เป็นตัวเป็นตนในสโลแกนหลักฐานเป็นโปรแกรมซึ่งสามารถทำงานได้หลายวิธี การติดต่อกับCurry-Howardเป็นสิ่งที่ชัดเจนที่สุด ด้วยเหตุนี้เราจึงเชื่อมโยงทฤษฎีชนิดตรรกะและการเขียนโปรแกรมในครั้งเดียว แต่ควรเน้นว่าการติดต่อกับ Curry-Howard นั้นทำงานได้ไม่ดีเมื่อมีการเรียกซ้ำโดยทั่วไป (เพราะทุกประเภทกลายเป็นที่อยู่อาศัย) ซึ่งภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสนับสนุน

วิธีที่ง่ายกว่าในการทำให้งานสโลแกนเป็นโปรแกรมที่ใช้งานได้จริง ที่นี่เราก็เกี่ยวข้องกับการพิสูจน์และโปรแกรม แต่ตอนนี้ทิศทางไปจากการพิสูจน์ไปยังโปรแกรม: ทุกบทพิสูจน์ให้โปรแกรม แต่ไม่ใช่ทุกโปรแกรมที่จำเป็นต้องพิสูจน์

ตัวอย่างหลักของภาษาการเขียนโปรแกรมบนพื้นฐานเป็นAGDAซึ่งก็คือการดำเนินการของทฤษฎีประเภทขึ้นอยู่กับ อย่างไรก็ตาม Agda ไม่ใช่ภาษาการเขียนโปรแกรมทั่วไปเนื่องจากไม่รองรับการเรียกซ้ำทั่วไป ทุกฟังก์ชั่นใน Agda เป็นผลรวมและมีฟังก์ชันที่คำนวณได้ซึ่งไม่สามารถนำมาใช้ใน Agda ได้ ในทางปฏิบัติโปรแกรมเมอร์จะไม่สังเกตเห็นสิ่งนี้ แต่พวกเขาจะสังเกตเห็นว่า Agda ไม่อนุญาตค่าที่ไม่ได้กำหนดตัวอย่างเช่นลูปไม่สิ้นสุด

Coqคือไม่เป็นภาษาโปรแกรม แต่ผู้ช่วยพิสูจน์ อย่างไรก็ตามมันก็มีความสามารถในการแตกไฟล์ซึ่งให้โปรแกรมจากการพิสูจน์ ผู้ช่วยที่พิสูจน์อักษรและภาษาการเขียนโปรแกรมไม่ควรสับสนระหว่างกัน

เราไม่ควรลืมว่าภาษาอารัมภบทและภาษาการเขียนโปรแกรมเชิงตรรกะอื่น ๆใช้แรงบันดาลใจจากแนวคิดที่ว่าการคำนวณเป็นการค้นหาที่พิสูจน์ได้ หลักสูตรนี้เกี่ยวข้องกับพวกเขาอย่างใกล้ชิดกับตรรกะ

Haskell เป็นภาษาโปรแกรมวัตถุประสงค์ทั่วไปซึ่งอยู่บนพื้นฐานทฤษฎีโดเมน กล่าวคือความหมายของมันคือทฤษฎีโดเมนเพราะมันจะต้องมีฟังก์ชั่นบางส่วนและการเรียกซ้ำ ชุมชน Haskell ได้มีการพัฒนาเทคนิคจำนวนหนึ่งแรงบันดาลใจจากทฤษฎีประเภทที่monadsเป็นที่รู้จักกันดีที่สุด แต่ไม่ควรจะสับสนกับmonads โดยทั่วไปคุณสมบัติการเขียนโปรแกรมขั้นสูงมักจะได้รับการปฏิบัติด้วยการผสมผสานระหว่างทฤษฎีโดเมนและทฤษฎีหมวดหมู่ แต่นี่ไม่ใช่สิ่งที่โปรแกรมเมอร์ Haskell ในท้องถนนเชี่ยวชาญ ที่เรียกว่า "หมวดหมู่วากยสัมพันธ์" ของประเภท Haskell เป็นมุมมองของคนทั่วไปเกี่ยวกับวิธีที่ Haskell และทฤษฎีหมวดหมู่สอดคล้องกัน

ทฤษฎีเซต (แบบดั้งเดิมหรือเชิงสร้างสรรค์) ดูเหมือนว่าจะสร้างแรงบันดาลใจความคิดในการเขียนโปรแกรมภาษาในระดับที่น้อยกว่า แน่นอนว่าทฤษฎีเซตเชิงสร้างสรรค์นั้นมีความเชื่อมโยงกับการเขียนโปรแกรมผ่านตรรกะเชิงสร้างสรรค์ แอปพลิเคชั่นที่สำคัญอย่างหนึ่งของทฤษฎีเซต intuitionistic กับภาษาการเขียนโปรแกรมนั้นได้รับจาก Alex Simpson ที่ใช้เพื่อทำให้ทฤษฎีโดเมนสังเคราะห์ทำงาน แต่นี้เป็นสิ่งที่ค่อนข้างสูงอาจจะดูภาพนิ่งเหล่านี้ Jean-Louis Krivine ได้พัฒนาแบรนด์ที่น่าสนใจมากสำหรับ realizability ของทฤษฎีเซตแบบดั้งเดิม นี่เป็นวิธีที่ดีในการเชื่อมโยงทฤษฎีเซตดั้งเดิมและการเขียนโปรแกรม

โดยสรุปทฤษฎีภาษาการเขียนโปรแกรมใช้เทคนิคพื้นฐาน นี่ไม่น่าแปลกใจเพราะเราคิดว่าการคำนวณเป็นแนวคิดพื้นฐาน แต่มันก็ไร้เดียงสาเกินไปที่จะกล่าวว่าภาษาการเขียนโปรแกรมนั้น "อิง" อยู่บนรากฐานที่แน่นอน ในความเป็นจริง trichotomy ของรากฐาน "ทฤษฎีเซต - ทฤษฎีประเภท - ทฤษฎีหมวดหมู่" เป็นเพียงการสังเกตระดับสูงที่มีประโยชน์ที่สามารถทำให้แม่นยำทางคณิตศาสตร์ในรูปแบบต่าง ๆ แต่ไม่มีอะไรจำเป็นเกี่ยวกับมัน มันเป็นอุบัติเหตุประวัติศาสตร์


"แนวคิดที่การคำนวณเป็นการค้นหาที่พิสูจน์แล้ว" ฉันสับสนกับคำสั่งนี้ แน่นอนการค้นหาหลักฐานเป็นรูปแบบของการคำนวณ แต่ไม่ใช่การคำนวณทั้งหมดคือการค้นหาเพื่อพิสูจน์ ในบริบทของคำถามนี้ยังมีการพิสูจน์ยืนยันการตรวจสอบประเภท โดยทั่วไปเพิ่มเพียง 5 + 3 คุณหมายถึงอะไรโดยข้อความนี้?
user56834

6

นี้เป็นเรื่องที่ซับซ้อนมากและมีหนังสือที่ดีมากในเรื่องที่เมื่อเร็ว ๆ นี้อย่างใดอย่างหนึ่งที่เรียกว่าวิหาร Turings ต้นกำเนิดของจักรวาลดิจิตอลและเครื่องยนต์ของตรรกะคณิตศาสตร์และต้นกำเนิดของคอมพิวเตอร์

ภาษาคอมพิวเตอร์มีวิวัฒนาการมาหลายสิบปี แต่เชื่อหรือไม่ว่ามีสองภาษาโปรแกรมต้นฉบับซึ่งแสดงว่าคณิตศาสตร์และวิทยาการคอมพิวเตอร์มีการประสานอย่างใกล้ชิด:

มีตัวเลขสองหลักที่ข้ามเขตแดนทางคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์ wrt "ภาษาโปรแกรม":

  • ทฤษฎีสารสนเทศที่บุกเบิกโดยแชนนอนแสดงให้เห็นถึงความเชื่อมโยงอย่างลึกซึ้งระหว่างคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์

  • คนสำคัญอีกคนหนึ่งที่ข้ามระหว่างคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์Von Neumann เขาคิดค้นสถาปัตยกรรม von neumann ของการจัดเก็บโปรแกรมในหน่วยความจำ

แม้กระทั่งก่อนหน้านี้ "ภาษาการเขียนโปรแกรม":

  • คำว่า "คอมพิวเตอร์" ภาษาอังกฤษหมายถึงอะไรบางอย่างที่เหมือน "เครื่องคิดเลข" ที่ใช้การคำนวณทางคณิตศาสตร์กับตัวเลขมากขึ้น ดังนั้นจึงมีการเชื่อมต่อระหว่างภาษาการเขียนโปรแกรมและเครื่องคิดเลขล่วงหน้า
  • บัตรตอกที่ใช้ในการทอผ้าทอผ้าจากปลายศตวรรษที่ 19 และต้นศตวรรษที่ 20 เป็น "ภาษาโปรแกรม" สำหรับรูปแบบการทอผ้า โปรดทราบว่าใช้การ์ด punch สำหรับการเขียนโปรแกรม mainframes มากในปี 1960 สิ่งเหล่านี้ถูกมองว่าเป็น "เครื่องคำนวณ" (โดยใช้คณิตศาสตร์!) แต่ไม่ทันสมัยคอมพิวเตอร์วัตถุประสงค์ทั่วไป
  • BabbageและAda Lovelaceพัฒนาแนวคิดเริ่มแรกของ "ภาษาโปรแกรม" ในช่วงกลางปี ​​1800 บน "เครื่องมือคำนวณ"
  • พีชคณิตแบบบูลเดิมเป็นแนวคิดทางคณิตศาสตร์ที่คิดค้นโดย Boole
  • ลูกคิดโบราณ (พันปี) สำหรับการคำนวณทางคณิตศาสตร์ถูกมองว่าเป็นเครื่องนำทางของคอมพิวเตอร์สมัยใหม่ แต่อาจกล่าวได้ว่าการดำเนินการเพื่อจัดการมันเป็น "ภาษาโปรแกรม" (ตามด้วยมนุษย์)

อย่างไรก็ตามในการเขียนโปรแกรมภาษาสมัยใหม่ในขณะที่นามธรรมได้เพิ่มขึ้นและปรับขนาดการเชื่อมต่อโดยตรงที่ชัดเจนกับคณิตศาสตร์ได้ลดลงบ้างในช่วงหลายสิบปีที่ผ่านมา แต่มันก็จะมีความเป็นจริงมากและในบางวิธีมันมีความเข้มแข็ง สำหรับภาษาตัวอย่างเช่น Java ที่มีประเภทที่เข้มงวดมีการเชื่อมต่อกับคณิตศาสตร์และในการเริ่มต้นในภาษาคอมพิวเตอร์กระแสหลัก ~ ปลายปี 1990 (เช่น c ++, Java, Ruby ฯลฯ ) เริ่มต้นการใช้วัตถุระดับสูงทางคณิตศาสตร์จำนวนมากอย่างชัดเจน ภาษาเช่นชุดต้นไม้ (เช่น Btrees หรือ hashmaps) เป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.