ความสัมพันธ์ระหว่างทฤษฎีประเภทรัสเซลล์และระบบประเภท


12

ฉันเพิ่งรู้ว่ามีความสัมพันธ์บางอย่างระหว่างทฤษฎีประเภทรัสเซลล์และระบบประเภทที่พบเช่นใน Haskell อันที่จริงสัญกรณ์บางประเภทใน Haskell ดูเหมือนว่ามีสารตั้งต้นในทฤษฎีประเภท แต่ IMHO แรงบันดาลใจของรัสเซลในปี 1908 คือการหลีกเลี่ยงความขัดแย้งของรัสเซลและฉันไม่แน่ใจว่ามันเกี่ยวข้องกับระบบการพิมพ์ในวิทยาการคอมพิวเตอร์อย่างไร

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

คำตอบ:


8

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

ดูที่นี่

ประเภทในภาษาโปรแกรมทั่วไปมีแนวโน้มที่จะ จำกัด มากขึ้น แต่ทฤษฎีเมตาเหมือนกัน

สิ่งที่คล้ายกับความขัดแย้งของรัสเซลเป็นประเด็นสำคัญในทฤษฎีประเภทพึ่งพา โดยเฉพาะการมี

Type : Type

มักจะนำไปสู่ความขัดแย้ง Coq และงานที่คล้ายกันโดยทำรังจักรวาล

Type_0 : Type_1

แต่ใน Coq โดยค่าเริ่มต้นตัวเลขเหล่านี้มีความหมายตามปกติซึ่งไม่สำคัญสำหรับโปรแกรมเมอร์

ในบางระบบ (Agda, Idris) กฎประเภทในการเปิดใช้งานผ่านทางธงรวบรวม มันทำให้ logics ไม่สอดคล้องกัน แต่มักจะทำให้การเขียนโปรแกรมเชิงสำรวจ / พิสูจน์ง่ายขึ้น

แม้ในภาษากระแสหลักมากขึ้นความขัดแย้งของรัสเซลล์ก็ปรากฏขึ้นเป็นครั้งคราว ตัวอย่างเช่นใน Haskell การเข้ารหัสของเส้นขนานของรัสเซลเป็นการรวมความไม่ลงรอยกันและกรณีแบบเปิดเป็นไปได้ทำให้ผู้ใช้สามารถสร้างเงื่อนไขที่แตกต่างโดยไม่ต้องเรียกซ้ำแม้แต่ในระดับประเภท Haskell คือ `` ไม่สอดคล้องกัน '(เมื่อตีความว่าเป็นตรรกะในแบบปกติ) เนื่องจากมันรองรับการเรียกซ้ำทั้งในระดับประเภทและมูลค่าไม่ต้องพูดถึงข้อยกเว้นไม่มีน้อยผลลัพธ์นี้ค่อนข้างน่าสนใจ


ขอขอบคุณสำหรับคำตอบโดยละเอียดของคุณ - ตราบใดที่ข้อพิสูจน์ยังคงไม่มีเครื่องมือที่จะพิสูจน์ความถูกต้องของโปรแกรมในภาษาที่จำเป็นเช่น C ++ หรือ Java ใช่ไหม ฉันอยากจะวางมือบนหนึ่งในเหล่านี้ ... ฉันรู้ว่านี่เป็นสัมผัสที่สมบูรณ์ ฉันรู้เกี่ยวกับ Coq และ Agda แต่พวกเขาดูเหมือนจะไม่ใช่เครื่องมือที่ถูกต้องในการพิสูจน์ความถูกต้องของโปรแกรมที่เขียนด้วย C ++ หรือ Java
แฟรงค์

3
มีเครื่องมือบางอย่าง น้อยสำหรับ C, สำหรับ Java และสำหรับ Ada ดูตัวอย่าง: ทำไม (Java, C, Ada), Krakatoa (Java) หรือ SPARK (ชุดย่อย Ada ด้วยเครื่องมือที่ดีมาก) สำหรับ C ++ ไม่มากนัก คุณอาจสนใจ YNot (Coq DSL)
Philip JF

3

คุณพูดถูกเกี่ยวกับแรงจูงใจของรัสเซล ความขัดแย้งเกิดขึ้นในทุกทฤษฎีของเซตที่ยอมรับสัจพจน์ของความเข้าใจที่ไม่ จำกัด กับเอฟเฟกต์ที่: ฟังก์ชันเชิงประพจน์ใด ๆ กำหนดเซตซึ่งก็คือของเอนทิตี้เหล่านั้นทั้งหมดที่สนองต่อการทำงาน ในบรรดาทฤษฎีของหรือตามชุดที่มีข้อบกพร่องที่เป็นทฤษฎีเซตไร้เดียงสาของคันทอร์และระบบของ Frege ของGrundgesetze (เฉพาะ: ความจริง 5)

เนื่องจากประเภทถือว่าเป็นชุดพิเศษหากไม่ได้รับการดูแลความขัดแย้งที่คล้ายกันสามารถคลานเข้าสู่ระบบประเภทได้กล่าวว่าฉันไม่ทราบว่าระบบประเภทใดที่ประสบชะตากรรมเช่นนี้ ฉันจำได้เพียงความพยายามครั้งแรกของคริสตจักรในการกำหนดแลมบ์ดาแคลคูลัสในยุค 30 ซึ่งกลายเป็นว่าไม่สอดคล้องกัน (Kleene-Rosser Paradox) แต่สิ่งนั้นไม่ได้เกิดจากประเภทและไม่เกี่ยวข้องกับความขัดแย้งของรัสเซล

อัปเดต : ดูคำตอบของฟิลิปสำหรับคำตอบที่แท้จริงสำหรับคำถามของคุณ


1
ขอบคุณสำหรับคำตอบ. อาจมีทางเลือกให้กับประเภท - ลา - รัสเซลเพื่อหลีกเลี่ยงความขัดแย้งรัสเซล โซลูชันทางเลือกใด ๆ เหล่านี้จะมีสิ่งใดที่น่าสนใจที่จะมีส่วนร่วมในภาษาคอมพิวเตอร์หรือไม่ ประเภทของโลกีย์มีประโยชน์อย่างมากในการระบุสัญญาระหว่างส่วนต่าง ๆ ของรหัสอย่างชัดเจนและแม้กระทั่งก่อนหน้านั้นเพื่อให้ความหมายกับโปรแกรมเลย จะมีความหมายอื่น ๆ ที่สามารถได้รับอย่างอื่นนอกเหนือจากประเภท? (ฉันไม่รู้ว่าจะเป็นอย่างไร :-)
Frank

1
ใช่มีทางเลือกมากมาย (NF ของ Quine, ZFC ฯลฯ ) แต่ฉันไม่เห็นการเชื่อมต่อโดยตรงระหว่างวิกฤตพื้นฐานและภาษาโปรแกรม หากคุณคิดว่าทฤษฎีประเภทของมาร์ตินลอฟเป็นภาษาการเขียนโปรแกรมอาจมีการเชื่อมต่อบางอย่างที่กลับไปสู่สัญชาตญาณ สำหรับความหมายของภาษาการเขียนโปรแกรมมีภาษาพื้นฐานบางอย่างเช่น PDL (Propositional Dynamic Logic) ซึ่งมี Kripke (หรือโลกที่เป็นไปได้) ความหมาย แต่ประเภทดูเหมือนจะให้ฉันเพื่อให้พื้นฐานที่พวกเขาก็อาจจะอยู่เบื้องหลัง :)
หูหนาน Rostomyan

1
แต่ประเภทเป็นคนเกียจคร้าน: คุณต้องการและต้องการพวกเขา แต่คุณชอบที่จะไม่ต้องระบุพวกเขา (ดังนั้น IMHO, ทำไมเราถึงมีระบบอนุมานประเภทในภาษาเช่น Haskell หรือ Ocaml (ฉันรักภาษาเหล่านั้น) ที่ปลายอีกด้านของสเปกตรัม Python รู้สึกว่าใช้งานง่ายมากและเป็นที่น่าพอใจ (และมีประสิทธิภาพในแง่ของเวลาการเข้ารหัส) โดยไม่ต้องกังวลเกี่ยวกับประเภทของภาษานั้นมากเกินไป บางทีการอนุมานแบบนั้นดีที่สุดของทั้งโลก - แต่นั่นคือวิศวกรที่พูด ฉันแค่ฝันกลางวันว่าวิชาคณิตศาสตร์สามารถมีส่วนร่วมในแนวคิดที่สำคัญอื่น ๆ (เช่นประเภท) กับวิทยาการคอมพิวเตอร์ :-)
Frank

1
@ Frank ทุกครั้งที่ฉันใช้ภาษาที่ไม่มีประเภทคงที่ (ส่วนใหญ่เป็น Ruby) ฉันเกลียดประสบการณ์เพราะฉันเกลียดข้อผิดพลาด runtime ที่หลีกเลี่ยงได้ ดังนั้นดูเหมือนว่าจะเป็นเรื่องของรสนิยมเป็นส่วนใหญ่ ฉันยอมรับว่าการอนุมานแบบทรงพลังสามารถมอบสิ่งที่ดีที่สุดให้กับคุณทั้งสองโลก ซึ่งอาจเป็นเพราะเหตุใดฉันจึงชอบสกาล่ามาก
Raphael

ฉันไม่มั่นใจว่าไม่มีประเภท "อัตโนมัติ" นำไปสู่ข้อผิดพลาดรันไทม์ตามที่คุณดูเหมือนจะบอกเป็นนัย :-) ฉันไม่เคยมีปัญหาใน Python
แฟรงค์

3

เมื่อคุณพูดถึง Python คำถามนั้นไม่ใช่ทฤษฎีเชิงทฤษฎี ดังนั้นฉันจึงพยายามให้มุมมองที่กว้างขึ้นเกี่ยวกับประเภท ประเภทเป็นสิ่งที่แตกต่างกันสำหรับคนอื่น ฉันได้รวบรวมแนวคิดอย่างน้อย 5 ประเภท (แต่เกี่ยวข้องกัน):

  1. ระบบประเภทเป็นระบบโลจิคัลและตั้งทฤษฎี

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

  3. Type คือการจำแนกประเภทที่ระบุข้อมูลประเภทใดประเภทหนึ่งเช่นมูลค่าจริงจำนวนเต็มหรือบูลีนที่กำหนดค่าที่เป็นไปได้สำหรับประเภทนั้น การดำเนินการที่สามารถทำได้กับค่าของประเภทนั้น ความหมายของข้อมูล และวิธีการเก็บค่าประเภทนั้น

  4. ชนิดข้อมูลนามธรรมอนุญาตให้มีการลบข้อมูลในภาษาระดับสูง ADT นั้นมักจะถูกนำไปใช้เป็นโมดูล: อินเทอร์เฟซของโมดูลประกาศขั้นตอนที่สอดคล้องกับการดำเนินการ ADT กลยุทธ์การซ่อนข้อมูลนี้ช่วยให้การใช้งานโมดูลมีการเปลี่ยนแปลงโดยไม่รบกวนโปรแกรมไคลเอนต์

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

คำพูดมาจาก Wikipedia แต่ฉันสามารถให้การอ้างอิงที่ดีกว่าหากมีความต้องการเกิดขึ้น

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

ประเภทที่ 2-5 เกิดขึ้นในการเขียนโปรแกรมจากความต้องการที่แตกต่างกัน: เพื่อหลีกเลี่ยงข้อบกพร่องเพื่อจัดประเภทซอฟต์แวร์ข้อมูลนักออกแบบและโปรแกรมเมอร์ทำงานร่วมกับการออกแบบระบบขนาดใหญ่และการใช้ภาษาโปรแกรมได้อย่างมีประสิทธิภาพตามลำดับ

ระบบประเภทใน C / C ++, Ada, Java, Python ไม่ได้เกิดจากการทำงานของ Russel หรือต้องการหลีกเลี่ยงข้อบกพร่อง พวกเขาเกิดขึ้นจากความต้องการที่จะอธิบายข้อมูลประเภทต่าง ๆ ที่นั่น (เช่น "นามสกุลคือสตริงอักขระและไม่ใช่ตัวเลข"), ออกแบบซอฟต์แวร์แบบแยกส่วนและเลือกการแสดงระดับต่ำสำหรับข้อมูลอย่างเหมาะสม ภาษาเหล่านี้ไม่มีประเภท -1 หรือประเภท 2 Java ช่วยให้มั่นใจในความปลอดภัยจากข้อผิดพลาดไม่ใช่โดยการพิสูจน์ความถูกต้องของโปรแกรมโดยใช้ระบบพิมพ์ แต่ด้วยการออกแบบอย่างระมัดระวังของภาษา (ไม่มีตัวชี้คณิตศาสตร์) และระบบรันไทม์ (เครื่องเสมือนการตรวจสอบไบต์) ระบบพิมพ์ใน Java ไม่ใช่ทั้งระบบตรรกะและทฤษฎีเซต

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

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

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

ประเภทของระบบ Scala ยิ่งกว่าเดิมจากงานของ Russel และภาษาพิสูจน์สมบูรณ์แบบของ Agda แต่ยังคงมีรากฐานในงานของ Russel

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

สำหรับแนวทางที่น่าสนใจ แต่แตกต่างกันดูโครงการวิจัย Coq และ Microsoft Boogie Coq อาศัยทฤษฎีประเภทเพื่อสร้างโปรแกรมที่จำเป็นจากโปรแกรม Coq Boogie อาศัยคำอธิบายประกอบของโปรแกรมที่จำเป็นพร้อมคุณสมบัติและการพิสูจน์คุณสมบัติเหล่านั้นด้วยโปรแกรมพิสูจน์ทฤษฎีบท Z3 โดยใช้วิธีการที่แตกต่างอย่างสิ้นเชิงกว่า Coq

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