การใช้พีชคณิตประเภทข้อมูลเชิงพีชคณิตในทางที่ผิด - ทำไมจึงใช้งานได้?


289

นิพจน์ 'พีชคณิต' สำหรับชนิดข้อมูลเชิงพีชคณิตนั้นมีความหมายมากสำหรับคนที่มีพื้นฐานด้านคณิตศาสตร์ ให้ฉันพยายามอธิบายสิ่งที่ฉันหมายถึง

มีการกำหนดประเภทพื้นฐาน

  • สินค้า
  • สหภาพ +
  • ซิงเกิล X
  • หน่วย 1

และการใช้ชวเลขสำหรับX•Xและ2XสำหรับX+Xฯลฯ เราก็สามารถกำหนดนิพจน์พีชคณิตสำหรับเช่นรายการเชื่อมโยง

data List a = Nil | Cons a (List a)L = 1 + X • L

และต้นไม้ไบนารี:

data Tree a = Nil | Branch a (Tree a) (Tree a)T = 1 + X • T²

ตอนนี้สัญชาตญาณแรกของฉันเป็นนักคณิตศาสตร์คือการไปถั่วที่มีการแสดงออกเหล่านี้และพยายามที่จะแก้ปัญหาสำหรับและL Tฉันสามารถทำสิ่งนี้ผ่านการทดแทนซ้ำ แต่ดูเหมือนว่าง่ายกว่ามากในการใช้สัญลักษณ์ที่น่ากลัว ตัวอย่างเช่นสำหรับรายการที่เชื่อมโยง:

L = 1 + X • L

(1 - X) • L = 1

L = 1 / (1 - X) = 1 + X + X² + X³ + ...

ที่ฉันใช้การขยายตัวของชุดพลังงาน1 / (1 - X)ในวิธีที่ไม่ยุติธรรมโดยสิ้นเชิงเพื่อให้ได้ผลลัพธ์ที่น่าสนใจกล่าวคือLประเภทนั้นมีNilหรือมี 1 องค์ประกอบหรือมี 2 องค์ประกอบหรือ 3 เป็นต้น

มันน่าสนใจมากขึ้นถ้าเราทำกับต้นไม้ไบนารี:

T = 1 + X • T²

X • T² - T + 1 = 0

T = (1 - √(1 - 4 • X)) / (2 • X)

T = 1 + X + 2 • X² + 5 • X³ + 14 • X⁴ + ...

อีกครั้งโดยใช้การขยายตัวของซีรีส์พาวเวอร์ (ทำกับWolfram Alpha ) นี่เป็นการแสดงออกถึงความไม่ชัดเจน (กับฉัน) ความจริงที่ว่ามีเพียงหนึ่งต้นไม้ไบนารีที่มี 1 องค์ประกอบ 2 ต้นไม้ไบนารีที่มีสององค์ประกอบ (องค์ประกอบที่สองสามารถอยู่ทางซ้ายหรือสาขาขวา) 5 ต้นไม้ไบนารีที่มีสามองค์ประกอบ ฯลฯ .

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

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


19
คุณอาจพบว่าน่าสนใจ / เกี่ยวข้อง: blog.lab49.com/archives/3011
shang

4
ไม่ใช่ถ้ามันเก็บข้อมูลไว้ในทุก ๆ โหนด มันทั้งรูปลักษณ์ที่เหมือนหรือดูเหมือนว่าBranch x (Branch y Nil Nil) Nil Branch x Nil (Branch y Nil Nil)
Chris Taylor

4
@nlucaroni: ด้านล่างเป็นค่าไม่ใช่ประเภท ประเภทศูนย์ที่แท้จริงจะไม่มีค่าของประเภทนั้นใด ๆ ซึ่งเป็นไปไม่ได้ใน Haskell เว้นแต่คุณจะไม่สนใจก้น หากคุณคำนึงถึงค่าที่ต่ำที่สุดแล้วประเภทที่มีพื้นเพียงประเภทเดียวจะกลายเป็นประเภทหน่วยซึ่ง ... ไม่เป็นประโยชน์เวลาส่วนใหญ่
CA McCann

3
ฉันเห็นด้วยว่ามันเป็นเรื่องธรรมดาของแฮสเค็ลล์มันก็ยังโง่อยู่ กล่าวคือเราใช้ "ก้น" แตกต่างจากนั้นพวกเขาทำในเชิงตรรกะและทฤษฎีประเภทซึ่งตะเข็บไม่ดีสำหรับฉัน การมองเหมือนกันจากรหัสบริสุทธิ์ไม่ได้ทำให้พวกมันเหมือนกัน: "การแก้ปัญหากลุ่มที่น่าอึดอัดใจ" ทำให้ชัดเจนว่าความหมายของ Haskell มีทั้ง "ค่าที่ไม่ดี" ซึ่งวนรอบตลอดไปและโยนข้อยกเว้นไม่เหมือนกันอย่างชัดเจน . การทดแทนอันที่หนึ่งสำหรับอีกอันนั้นไม่ใช่การใช้เหตุผลเชิงเหตุผลที่ถูกต้อง Haskell มีคำศัพท์สำหรับการอธิบายค่าที่ไม่ดีเหล่านี้undefined, throwฯลฯ เราควรจะใช้มัน
Philip JF

17
ใจของฉันปลิวไปตามคำถามนี้
TheIronKnuckle

คำตอบ:


138

ข้อจำกัดความรับผิดชอบ: สิ่งนี้ไม่ได้ผลจริง ๆ เมื่อคุณคิดค่าใช้จ่ายสำหรับ I'm ดังนั้นฉันจะมองข้ามอย่างโจ๋งครึ่มเพื่อความเรียบง่าย

จุดเริ่มต้นไม่กี่:

  • โปรดทราบว่า "ยูเนี่ยน" อาจไม่ใช่คำที่ดีที่สุดสำหรับ A + B ที่นี่ - นั่นคือการรวมกลุ่มที่แยกจากกันของทั้งสองประเภทเนื่องจากทั้งสองฝ่ายมีความแตกต่างแม้ว่าประเภทของพวกเขาจะเหมือนกัน สำหรับสิ่งที่คุ้มค่าคำศัพท์ทั่วไปก็คือ "ประเภทผลรวม"

  • ชนิด Singleton นั้นได้อย่างมีประสิทธิภาพทุกประเภทหน่วย พวกเขาทำงานเหมือนกันภายใต้พีชคณิตผสมและที่สำคัญกว่านั้นปริมาณของข้อมูลที่มีอยู่ยังคงอยู่

  • คุณอาจต้องการประเภทศูนย์เช่นกัน Haskell Voidแสดงให้เห็นว่าเป็น ไม่มีค่าที่มีประเภทเป็นศูนย์เช่นเดียวกับที่มีหนึ่งค่าที่มีประเภทเป็นหนึ่ง

ยังคงมีการดำเนินการที่สำคัญหายไปหนึ่งที่นี่ แต่ฉันจะกลับไปที่ในอีกสักครู่

ดังที่คุณอาจสังเกตเห็นว่า Haskell มีแนวโน้มที่จะยืมแนวคิดจากทฤษฎีประเภทและสิ่งที่กล่าวมาทั้งหมดมีการตีความที่ตรงไปตรงมามากเช่น:

  • ให้วัตถุ A และ B ในHaskผลิตภัณฑ์ของพวกเขา A × B เป็นชนิดที่ไม่ซ้ำกัน (สูงถึง isomorphism) ที่ช่วยให้การคาดการณ์สองครั้งfst : A × B → A และsnd : A × B → B โดยที่ประเภท C และฟังก์ชั่นf : C → A, G : C → B คุณสามารถกำหนดจับคู่ฉ &&& กรัม : C →× B ดังกล่าวว่าFST ∘ (ฉ &&& กรัม) = Fและเช่นเดียวกันสำหรับกรัม Parametricity รับประกันคุณสมบัติที่เป็นสากลโดยอัตโนมัติและตัวเลือกที่น้อยกว่ารายละเอียดของฉันควรให้แนวคิดแก่คุณ ตัว(&&&)ดำเนินการถูกกำหนดในControl.Arrowโดยวิธี

  • คู่ข้างต้นคือ coproduct A + B ที่มีการฉีดinl : A → A + B และinr : B → A + B, เมื่อใดก็ตามที่มีประเภท C และฟังก์ชั่นf : A → C, g : B → C, คุณสามารถ กำหนด copairing f ||| g : A + B → C จนมีค่าเทียบเท่าที่เห็นได้ชัด อีกครั้งพารามิเตอร์ที่รับประกันส่วนที่ยากที่สุดโดยอัตโนมัติ ในกรณีนี้ฉีดมาตรฐานเป็นเพียงLeftและRightและ copairing eitherคือฟังก์ชั่น

คุณสมบัติหลายอย่างของผลิตภัณฑ์และประเภทผลรวมสามารถได้มาจากด้านบน โปรดทราบว่าประเภทซิงเกิลใด ๆ เป็นวัตถุเทอร์มินัลของHaskและประเภทที่ว่างเปล่าใด ๆ เป็นวัตถุเริ่มต้น

กลับไปที่การดำเนินการที่หายไปดังกล่าวข้างต้นในหมวดหมู่คาร์ทีเซียนปิดคุณมีวัตถุอธิบายที่สอดคล้องกับลูกศรของหมวดหมู่ ลูกศรของเราเป็นฟังก์ชั่นวัตถุของเราเป็นประเภทที่มีชนิด*และประเภทที่A -> Bแน่นอนทำงานเป็น B Aในบริบทของการจัดการพีชคณิตประเภท หากยังไม่ชัดเจนว่าทำไมจึงควรเก็บประเภทBool -> Aนี้ มีเพียงสองปัจจัยการผลิตที่เป็นไปได้, ฟังก์ชั่นชนิดที่เป็น isomorphic สองค่าประเภทคือA (A, A)สำหรับMaybe Bool -> Aเรามีสามอินพุตที่เป็นไปได้และอื่น ๆ นอกจากนี้ให้สังเกตว่าถ้าเราใช้คำนิยามใหม่เกี่ยวกับการถ่ายเอกสารด้านบนเพื่อใช้สัญกรณ์พีชคณิตเราจะได้ตัวตน C A × C B = CA + B

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

  • ประเภทผลิตภัณฑ์(A, B)แสดงถึงค่าแต่ละค่าจากAและBดำเนินการอย่างอิสระ ดังนั้นสำหรับค่าคงที่ใด ๆ ที่a :: Aมีค่าชนิดเดียวสำหรับการอยู่อาศัยของแต่ละ(A, B) Bซึ่งแน่นอนว่าเป็นผลิตภัณฑ์คาร์ทีเซียนและจำนวนผู้อยู่อาศัยของประเภทผลิตภัณฑ์คือผลผลิตของจำนวนผู้อยู่อาศัยของปัจจัย

  • ประเภทผลรวมEither A Bหมายถึงค่าจากอย่างใดอย่างหนึ่งAหรือBมีความแตกต่างสาขาทางซ้ายและขวา ดังที่ได้กล่าวไว้ก่อนหน้านี้นี่คือการรวมกลุ่มกันและจำนวนผู้อยู่อาศัยประเภทผลรวมคือผลรวมของจำนวนผู้อยู่อาศัยของการสรุป

  • ประเภทชี้แจงB -> Aแสดงให้เห็นถึงการทำแผนที่จากค่านิยมของประเภทไปเป็นค่าประเภทB Aสำหรับอาร์กิวเมนต์คงที่b :: Bค่าใด ๆ ของAสามารถกำหนดให้มัน ค่าของประเภทB -> Aเลือกการแมปหนึ่งรายการสำหรับแต่ละอินพุตซึ่งเทียบเท่ากับผลิตภัณฑ์ที่มีสำเนามากAเท่าที่Bมีผู้อยู่อาศัยดังนั้นการยกกำลัง

ในขณะที่การดึงดูดประเภทแรกเป็นประเภทที่ไม่ได้ผลดีมากในบริบทนี้ - เรามีการรวมกลุ่มมากกว่าสหภาพชุดมาตรฐานไม่มีการตีความที่ชัดเจนของการแยกหรือการดำเนินการชุดอื่น ๆ และเรา มักจะไม่สนใจเกี่ยวกับการเป็นสมาชิกชุด (ปล่อยให้เป็นตัวตรวจสอบประเภท)

ในทางตรงกันข้ามสิ่งก่อสร้างข้างต้นใช้เวลาพูดคุยเกี่ยวกับการนับจำนวนชาวและการแจกแจงค่าที่เป็นไปได้ของประเภทเป็นแนวคิดที่มีประโยชน์ที่นี่ สิ่งนี้นำเราไปสู่combinatorics ที่มีการแจกแจงอย่างรวดเร็วและหากคุณศึกษาบทความ Wikipedia ที่เชื่อมโยงคุณจะพบว่าหนึ่งในสิ่งแรกที่มันทำคือนิยาม "คู่" และ "สหภาพ" ในลักษณะเดียวกับประเภทผลิตภัณฑ์และผลรวมการสร้างฟังก์ชั่นจากนั้นทำเช่นเดียวกันสำหรับ "ลำดับ" ที่เหมือนกับรายการของ Haskell โดยใช้เทคนิคเดียวกับที่คุณทำ


แก้ไข:โอ้และนี่คือโบนัสด่วนที่ฉันคิดว่าแสดงให้เห็นถึงจุดที่โดดเด่น คุณพูดถึงในความคิดเห็นว่าสำหรับประเภทต้นไม้T = 1 + T^2คุณสามารถได้รับตัวตนT^6 = 1ซึ่งผิดอย่างชัดเจน แต่T^7 = T ไม่ถือและ bijection ระหว่างต้นไม้และเจ็ด tuples ของต้นไม้สามารถสร้างโดยตรง cf เลย Andreas Blass ของ "เซเว่นต้นไม้ในที่เดียว"

แก้ไข× 2:ในเรื่องของการสร้าง "อนุพันธ์ของประเภท" ที่กล่าวถึงในคำตอบอื่น ๆ คุณอาจสนุกกับกระดาษนี้จากผู้เขียนคนเดียวกันซึ่งสร้างความคิดต่อไปรวมถึงพัฒนาการของการแบ่งและสิ่งที่น่าสนใจอื่น ๆ


3
นี่เป็นคำอธิบายที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งในฐานะที่เป็นจุดกระโดดลงสู่สิ่งต่าง ๆอย่างเคร่งครัด
pospositive.org/diff.pdf

26
@ acfoltzer: ขอบคุณ! :] และใช่ว่าเป็นกระดาษที่ดีที่พัฒนาความคิดเหล่านี้ คุณรู้ไหมฉันคิดว่าอย่างน้อย 5% ของชื่อเสียงทั้งหมดของฉันใน SO สามารถนำมาประกอบกับ "ช่วยให้ผู้คนเข้าใจเอกสารของ Conor McBride" ...
CA McCann

45

ต้นไม้ไบนารีถูกกำหนดโดยสมการT=1+XT^2ใน semiring ประเภท โดยการก่อสร้างT=(1-sqrt(1-4X))/(2X)ถูกกำหนดโดยสมการเดียวกันใน semiring ของจำนวนเชิงซ้อน ดังนั้นเมื่อเรากำลังแก้สมการเดียวกันในโครงสร้างพีชคณิตระดับเดียวกันจริง ๆ แล้วมันไม่น่าแปลกใจที่เราเห็นความคล้ายคลึงกัน

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

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

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

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

มีความสุข!


สิ่งที่แตกต่าง / บริบทของหลุมหนึ่งนั้นค่อนข้างดี ลองดูว่าฉันมีตรงนี้ไหม คู่ซึ่งมีการแทนพีชคณิตP = X^2มีอนุพันธ์dP = X + Xดังนั้นEitherบริบทของคู่หนึ่งคือ มันค่อนข้างเท่ห์ เราสามารถ 'รวม' Eitherเพื่อรับคู่ด้วย แต่ถ้าเราพยายาม 'รวม' Maybe(กับประเภทM = 1 + X) แล้วเราต้องมี\int M = X + X^2 / 2สิ่งที่ไร้ความหมาย (ครึ่งหนึ่งเป็นประเภทใด?) นี่หมายความว่าMaybeไม่ใช่บริบทแบบหนึ่งหลุมของประเภทอื่นหรือไม่?
Chris Taylor

6
@ChrisTaylor: บริบทหนึ่งหลุมเก็บรักษาข้อมูลเกี่ยวกับตำแหน่งภายในผลิตภัณฑ์เช่น(A,A)มีรูอยู่ในนั้นAและจะบอกคุณว่าด้านใดของรูที่เปิดอยู่ Aคนเดียวไม่มีหลุมที่โดดเด่นในการกรอกซึ่งเป็นเหตุผลที่คุณไม่สามารถ "บูรณาการ" มัน 2ประเภทของข้อมูลที่หายไปในกรณีนี้เป็นของหลักสูตร
CA McCann

ฉันเขียนเกี่ยวกับการทำความเข้าใจกับประเภทเช่นX^2/2 blog.sigfpe.com/2007/09/type-of-distinct-pairs.html
sigfpe

@ user207442 คุณไม่ได้ทำอะไรเกี่ยวกับความเอนเอียงระหว่างต้นไม้ต้นหนึ่งกับเจ็ดต้นเลยเหรอ? ฉันเชื่อมโยงกับบทความเกี่ยวกับเรื่องนั้นในคำตอบของฉัน แต่ฉันสามารถสาบานได้ว่าฉันจำได้ว่าอ่านครั้งแรกในบล็อกของคุณ
CA McCann

1
@ChrisTaylor ในความแตกต่าง (จริง ๆ แล้ว "หาร") มีความแตกต่างนี้: เคร่งครัด pos.org.org/CJ.pdf แต่ ณ จุดนี้ Conor ไม่รู้ว่าเขาอธิบายความแตกต่าง ฉันเขียนสิ่งนี้แม้ว่ามันอาจจะเป็นเรื่องยุ่งยากในการติดตาม: blog.sigfpe.com/2010/08/…ฉันเขียนบทความ แต่ฉันไม่เก่งในการทำมันให้เสร็จ
sigfpe

22

ดูเหมือนว่าสิ่งที่คุณทำคือการขยายความสัมพันธ์ที่เกิดซ้ำ

L = 1 + X  L
L = 1 + X  (1 + X  (1 + X  (1 + X  ...)))
  = 1 + X + X^2 + X^3 + X^4 ...

T = 1 + X  T^2
L = 1 + X  (1 + X  (1 + X  (1 + X  ...^2)^2)^2)^2
  = 1 + X + 2  X^2 + 5  X^3 + 14  X^4 + ...

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


1
"เนื่องจากกฎสำหรับการดำเนินการกับประเภททำงานเหมือนกับกฎสำหรับการดำเนินการทางคณิตศาสตร์ ... " - พวกเขาทำไม่ได้ ไม่มีความคิดเกี่ยวกับการลบประเภทให้แบ่งเพียงอย่างเดียวและรากที่สอง ดังนั้นฉันเดาคำถามของฉันคือเมื่อคุณสามารถไปจากการจัดการพีชคณิตสมมติว่าXเป็นองค์ประกอบของจำนวนจริงเพื่องบจริงเกี่ยวกับประเภทและยิ่งไปกว่านั้นที่จดหมายติดต่อ (สัมประสิทธิ์ของnระยะเทอม) <=> (จำนวน ประเภทของnองค์ประกอบที่ถือครอง) มาจากไหน?
Chris Taylor

1
ยกตัวอย่างเช่นจากการแสดงออกสำหรับต้นไม้ ( T = 1 + T^2) ฉันสามารถได้รับมาT^6 = 1(การแก้ปัญหาคือจะx^2 - x + 1 = 0มีรากที่หกของความสามัคคี) แต่ก็เห็นได้ชัดว่าไม่()จริงที่ประเภทผลิตภัณฑ์ประกอบด้วยหกต้นไม้ไบนารีเทียบเท่ากับหน่วย
Chris Taylor

3
@ChrisTaylor แต่มีบางสิ่งบางอย่างที่เกิดขึ้นมีเป็นมีเป็นมอร์ฟระหว่างและT^7 Tcf เลย arxiv.org/abs/math/9405205
luqui

7
@ChrisTaylor ต่อไปนี้เป็นสิ่งที่ควรพิจารณา เมื่อคุณเพิ่มการดำเนินการเกี่ยวกับพีชคณิตใหม่คุณหวังว่าจะไม่ทำลายคุณสมบัติของการดำเนินการที่มีอยู่เดิม หากคุณสามารถหาคำตอบเดียวกันได้สองวิธีพวกเขาควรเห็นด้วย ดังนั้นหากมีการแสดงใด ๆสำหรับL = 1 + X * Lมันได้ดีกว่าเป็นคนเดียวกันกับที่คุณได้รับเมื่อคุณขยายชุดโดยสอดคล้อง มิฉะนั้นคุณสามารถเรียกใช้ผลลัพธ์ย้อนหลังเพื่อรับสิ่งที่ผิดเกี่ยวกับ reals
luqui

2
@ChrisTaylor มีความคิดเกี่ยวกับการแบ่งประเภทให้ค้นหา "Quotient Types" สำหรับข้อมูลเพิ่มเติม ไม่ว่าจะสอดคล้องกับการแบ่งพหุนามหรือไม่ฉันไม่รู้ มันเกิดขึ้นที่จะทำไม่ได้อย่างเป็นธรรม imho แต่มันอยู่ที่นั่น
Doug McClean

18

ฉันไม่มีคำตอบที่สมบูรณ์ แต่กิจวัตรเหล่านี้มีแนวโน้มที่จะ 'แค่ทำงาน' กระดาษที่เกี่ยวข้องอาจจะมีวัตถุหมวดหมู่เป็นเบอร์คอมเพล็กซ์โดย Fiore และสเตอร์ - ฉันมาข้ามที่หนึ่งในขณะที่อ่านบล็อกของ sigfpe ในเรื่องที่เกี่ยวข้อง ; ส่วนที่เหลือของบล็อกนั้นเป็นทองคำสำหรับแนวคิดที่คล้ายกันและควรค่าแก่การตรวจสอบ!

นอกจากนี้คุณยังสามารถแยกประเภทข้อมูลโดยวิธี - ที่จะให้คุณซิปที่เหมาะสมสำหรับประเภทข้อมูล!


12
ซิปเคล็ดลับน่ากลัว ฉันหวังว่าฉันจะเข้าใจมัน
spraff

นอกจากนี้คุณยังสามารถสร้างซิปใน Schemeโดยใช้การต่อเนื่องแบบคั่นซึ่งช่วยให้คุณได้มาโดยทั่วไป
Jon Purdy

10

พีชคณิตของกระบวนการสื่อสาร (ACP) จะจัดการกับนิพจน์ที่คล้ายกันสำหรับกระบวนการ มันมีการเพิ่มและการคูณเป็นตัวดำเนินการสำหรับตัวเลือกและลำดับด้วยองค์ประกอบที่เป็นกลางที่เกี่ยวข้อง จากสิ่งเหล่านี้มีตัวดำเนินการสำหรับสิ่งก่อสร้างอื่น ๆ เช่นการขนานและการหยุดชะงัก ดูhttp://en.wikipedia.org/wiki/Algebra_of_Communicating_Processes นอกจากนี้ยังมีเอกสารออนไลน์ชื่อ "ประวัติย่อของพีชคณิตกระบวนการ"

ฉันกำลังทำงานเพื่อขยายการเขียนโปรแกรมภาษาด้วย ACP เมื่อเดือนเมษายนที่แล้วฉันนำเสนอรายงานการวิจัยที่ Scala Days 2012 มีให้ที่http://code.google.com/p/subscript/

ในการประชุมฉันแสดงให้เห็นถึงการดีบั๊กที่ใช้สเปคเรียกซ้ำแบบขนานของถุง:

กระเป๋า = A; (กระเป๋า & A)

โดยที่ A และขาตั้งสำหรับการดำเนินการอินพุตและเอาต์พุต เซมิโคลอนและเครื่องหมายและยืนสำหรับลำดับและขนาน ดูวิดีโอที่ SkillsMatter เข้าถึงได้จากลิงค์ก่อนหน้า

สเปคกระเป๋าเปรียบได้มากกว่า

L = 1 + X • L

อยากจะเป็น

B = 1 + X&B

ACP กำหนดความขนานในแง่ของการเลือกและลำดับโดยใช้สัจพจน์ ดูบทความ Wikipedia ฉันสงสัยว่าการเปรียบเทียบถุงจะเป็นอย่างไร

L = 1 / (1-X)

การเขียนโปรแกรมสไตล์ ACP มีประโยชน์สำหรับตัวแยกวิเคราะห์ข้อความและตัวควบคุม GUI ข้อมูลจำเพาะเช่น

searchCommand = คลิกแล้ว (searchButton) + แป้น (Enter)

cancelCommand = คลิกแล้ว (cancelButton) + แป้น (Escape)

อาจถูกเขียนลงอย่างกระชับยิ่งขึ้นโดยการปรับแต่งทั้งสองแบบ "คลิก" และ "คีย์" โดยนัย (เช่นเดียวกับที่ Scala อนุญาตให้ใช้กับฟังก์ชัน) ดังนั้นเราสามารถเขียน:

searchCommand = searchButton + Enter

cancelCommand = cancelButton + Escape

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

กระบวนการรับข้อมูลด้วยวิธีนี้ในฐานะที่เป็นสหาย ดังนั้นฉันจึงเหรียญคำว่า "item algebra"


6

ชุดแคลคูลัสและ Maclaurin พร้อมชนิด

นี่คือนอกจากเล็ก ๆ น้อย ๆ อื่น - ความเข้าใจรวมกันว่าทำไมค่าสัมประสิทธิ์ในการขยายตัวชุดควร 'งาน' โดยเฉพาะมุ่งเน้นไปที่ชุดซึ่งสามารถจะได้มาโดยใช้เทย์เลอร์ Maclaurinวิธีการจากแคลคูลัส หมายเหตุ: การขยายตัวของชุดตัวอย่างที่คุณให้กับประเภทรายการที่จัดการคือชุด Maclaurin

เนื่องจากคำตอบและความคิดเห็นอื่น ๆ จัดการกับพฤติกรรมของนิพจน์ประเภทเกี่ยวกับพีชคณิต (ผลรวมผลิตภัณฑ์และเลขชี้กำลัง) คำตอบนี้จะอธิบายรายละเอียดและมุ่งเน้นไปที่ประเภท 'แคลคูลัส'

คุณอาจสังเกตเห็นว่าเครื่องหมายจุลภาคคว่ำกลับยกหนักในคำตอบนี้ มีสองเหตุผล:

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

ความหมายของซีรี่ส์ Maclaurin

ชุด Maclaurinของฟังก์ชั่นf : ℝ → ℝถูกกำหนดให้เป็น

f(0) + f'(0)X + (1/2)f''(0)X² + ... + (1/n!)f⁽ⁿ⁾(0)Xⁿ + ...

ที่f⁽ⁿ⁾หมายถึงอนุพันธ์ของวันที่nf

เพื่อให้สามารถเข้าใจชุด Maclaurin ตามที่ตีความด้วยประเภทเราจำเป็นต้องเข้าใจว่าเราสามารถตีความสามสิ่งในบริบทประเภทได้อย่างไร:

  • อนุพันธ์ (อาจเป็นหลายรายการ)
  • ใช้ฟังก์ชั่นเพื่อ 0
  • คำที่ชอบ (1/n!)

และปรากฎว่าแนวคิดเหล่านี้จากการวิเคราะห์มีคู่ที่เหมาะสมในโลกประเภท

ฉันหมายถึงอะไรโดย 'คู่ที่เหมาะสม'? มันควรจะมีรสชาติของมอร์ฟิซึ่มส์ - ถ้าเราสามารถรักษาความจริงในทั้งสองทิศทางข้อเท็จจริงที่สืบเนื่องมาจากบริบทหนึ่งสามารถถ่ายโอนไปยังอีกด้านหนึ่งได้

แคลคูลัสที่มีประเภท

ดังนั้นอนุพันธ์ของการแสดงออกประเภทหมายความว่าอย่างไร ปรากฎว่าสำหรับการแสดงออกประเภทและฟังก์ชั่นประเภทใหญ่และดี ('differentiable') มีการดำเนินการตามธรรมชาติที่มีพฤติกรรมคล้ายกันมากพอที่จะตีความที่เหมาะสม!

ในการทำให้บาดแผลถูกทำลายการดำเนินการที่คล้ายคลึงกับความแตกต่างคือการสร้าง 'หนึ่งบริบทแวดล้อม' นี่เป็นสถานที่ที่ยอดเยี่ยมในการขยายจุดนี้โดยเฉพาะ แต่แนวคิดพื้นฐานของบริบทแบบหนึ่งหลุม ( da/dx) คือมันแสดงถึงผลลัพธ์ของการแยกส่วนย่อยเดี่ยวของประเภทเฉพาะ ( x) จากคำ (ของประเภทa), การเก็บรักษา ข้อมูลอื่น ๆ ทั้งหมดรวมถึงสิ่งที่จำเป็นในการกำหนดตำแหน่งดั้งเดิมของรายการย่อย ตัวอย่างเช่นวิธีหนึ่งในการแสดงบริบทหนึ่งหลุมสำหรับรายการนั้นมีสองรายการ: อีกวิธีหนึ่งสำหรับรายการที่มาก่อนรายการที่แยกแล้วและอีกรายการสำหรับรายการที่มาหลัง

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

d1/dx = 0
dx/dx = 1
d(a + b)/dx = da/dx + db/dx
d(a × b)/dx = a × db/dx + b × da/dx
d(g(f(x))/dx = d(g(y))/dy[f(x)/a] × df(x)/dx

ที่นี่1และ0เป็นตัวแทนประเภทที่มีผู้อาศัยอยู่หนึ่งคนและเป็นศูนย์อย่างแน่นอนตามลำดับ+และ×แสดงประเภทรวมและประเภทผลิตภัณฑ์ตามปกติ fและgถูกใช้เพื่อแสดงฟังก์ชั่นประเภทหรือตัวสร้างนิพจน์ชนิดและ[f(x)/a]หมายถึงการดำเนินการของการแทนที่f(x)สำหรับทุกคนaในการแสดงออกก่อนหน้านี้

สิ่งนี้อาจถูกเขียนในรูปแบบปลอดจุดเขียนf'เพื่อหมายถึงฟังก์ชันอนุพันธ์ของฟังก์ชันประเภทfดังนั้น:

(x ↦ 1)' = x ↦ 0
(x ↦ x)' = x ↦ 1
(f + g)' = f' + g'
(f × g)' = f × g' + g × f'
(g ∘ f)' = (g' ∘ f) × f'

ซึ่งอาจจะดีกว่า

NB ความเท่าเทียมกันสามารถทำได้อย่างเข้มงวดและแน่นอนถ้าเรานิยามอนุพันธ์โดยใช้คลาสมอร์ฟิซึ่มของประเภทและฟังก์ชั่น

ตอนนี้เราสังเกตเห็นโดยเฉพาะอย่างยิ่งว่ากฎในแคลคูลัสที่เกี่ยวข้องกับการดำเนินงานเชิงพีชคณิตของการบวกการคูณและการจัดองค์ประกอบ (มักเรียกว่ากฎ Sum, Product และ Chain) สะท้อนให้เห็นอย่างชัดเจนจากการทำงานของ 'หลุม' นอกจากนี้กรณีพื้นฐานของ 'การสร้างรู' ในนิพจน์คงที่หรือคำศัพท์xนั้นก็มีความแตกต่างดังนั้นเราจึงได้รับพฤติกรรมที่แตกต่างสำหรับการแสดงออกทางพีชคณิตทุกประเภท

ตอนนี้เราสามารถตีความความแตกต่างได้แล้วn'อนุพันธ์' ของการแสดงออกประเภทdⁿe/dxⁿหมายความว่าอย่างไร มันเป็นประเภทที่เป็นตัวแทนnบริบทสถานที่: คำที่เมื่อ 'เต็มไปด้วย' กับnประเภทของxผลตอบแทนeและ มีการสังเกตที่สำคัญอีกประการหนึ่งที่เกี่ยวข้องกับ ' (1/n!)' มาในภายหลัง

ส่วนที่ไม่เปลี่ยนแปลงของ functor ประเภท: การใช้ฟังก์ชันกับ 0

เรามีการตีความสำหรับ0ในโลกประเภท: ประเภทที่ว่างเปล่าที่ไม่มีสมาชิก จากมุมมองของ combinatorial ในการใช้ฟังก์ชั่นประเภทกับมันหมายความว่าอะไร? ในแง่ที่เป็นรูปธรรมมากขึ้นสมมติว่าfเป็นฟังก์ชั่นประเภทอะไรจะf(0)มีลักษณะอย่างไร แน่นอนว่าเราไม่สามารถเข้าถึงประเภท0ใด ๆ ได้ดังนั้นสิ่งก่อสร้างใด ๆf(x)ที่จำเป็นต้องxมี สิ่งที่เหลืออยู่คือคำศัพท์เหล่านั้นซึ่งสามารถเข้าถึงได้ในที่ที่ไม่มีพวกเขาซึ่งเราสามารถเรียกส่วนที่ว่า 'คงที่' หรือ 'คงที่' ได้

สำหรับตัวอย่างที่ชัดเจนใช้Maybefunctor x ↦ 1 + xซึ่งสามารถเป็นตัวแทนของพีชคณิตเป็น เมื่อเราใช้สิ่งนี้กับ0เราจะได้รับ1 + 0- มันก็เหมือนกับ1: ค่าที่เป็นไปได้เท่านั้นคือNoneค่า สำหรับรายการในทำนองเดียวกันเราได้รับเพียงคำที่สอดคล้องกับรายการที่ว่างเปล่า

เมื่อเรานำมันกลับมาและตีความประเภทf(0)เป็นตัวเลขมันสามารถคิดได้ว่าเป็นการนับจำนวนชนิดของคำสั่งf(x)(สำหรับใด ๆx) ที่สามารถรับได้โดยไม่ต้องเข้าถึงx: นั่นคือจำนวนของคำว่า 'ว่างเปล่าเหมือน' .

นำมารวมกัน: ตีความชุด Maclaurin ให้สมบูรณ์

ฉันเกรงว่าฉันไม่สามารถนึกถึงการตีความโดยตรงที่เหมาะสม(1/n!)ว่าเป็นประเภท

หากเราพิจารณาถึงประเภทf⁽ⁿ⁾(0)ของแสงด้านบนเราจะเห็นว่าสามารถตีความได้ว่าเป็นnบริบทของสถานที่สำหรับประเภทของคำf(x)ที่ไม่ได้มี x - นั่นคือเมื่อเรา 'รวม' พวกเขาnครั้ง คำที่เกิดขึ้นได้ว่า n x s ไม่มากไม่น้อย จากนั้นการตีความประเภทf⁽ⁿ⁾(0)เป็นตัวเลข (ดังในค่าสัมประสิทธิ์ของชุด Maclaurin ของf) เป็นเพียงการนับจำนวนnบริบทว่างเปล่าดังกล่าวมี เราใกล้จะถึงแล้ว!

แต่จะ(1/n!)จบที่ไหน การตรวจสอบกระบวนการ 'แยกความแตกต่าง' นั้นแสดงให้เราเห็นว่าเมื่อนำมาใช้หลายครั้งมันจะรักษา 'ลำดับ' ที่มีการแตกเทอร์มินอล ตัวอย่างเช่นพิจารณาคำว่า(x₀, x₁)ประเภทx × xและการทำงานของ 'การสร้างรู' ในสองครั้ง เราได้รับทั้งสองลำดับ

(x₀, x₁)  ↝  (_₀, x₁)  ↝  (_₀, _₁)
(x₀, x₁)  ↝  (x₀, _₀)  ↝  (_₁, _₀)
(where _ represents a 'hole')

แม้ว่าทั้งสองมาจากคำเดียวกันเพราะมี2! = 2วิธีที่จะนำองค์ประกอบสองจากสองรักษาความสงบเรียบร้อย โดยทั่วไปมีn!วิธีการใช้องค์ประกอบจากn nดังนั้นเพื่อที่จะได้รับการนับจำนวนของการกำหนดค่าของประเภท functor ซึ่งมีเป็นnองค์ประกอบที่เราต้องนับชนิดf⁽ⁿ⁾(0)และหารด้วยn!, ว่าในขณะที่ค่าสัมประสิทธิ์ของชุด Maclaurin

ดังนั้นการหารด้วยผลn!ออกมาสามารถตีความได้ง่ายเช่นเดียวกับตัวเอง

ความคิดสุดท้าย: คำจำกัดความ 'การเรียกซ้ำ' และการวิเคราะห์

ก่อนสังเกตบาง:

  • ถ้าฟังก์ชั่น f: ℝ→, มีอนุพันธ์อนุพันธ์นี้จะไม่ซ้ำกัน
  • กันถ้าฟังก์ชัน f: ℝ→ℝคือการวิเคราะห์มันมีพหุนามแบบเดียวกัน

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

L(X) ≅ 1 + X × L(X)
L'(X) = X × L'(X) + L(X)

แล้วเราสามารถประเมินได้

L'(0) = L(0) = 1

เพื่อให้ได้ค่าสัมประสิทธิ์ในซีรีย์ Maclaurin

แต่เนื่องจากเรามั่นใจว่าการแสดงออกเหล่านี้แน่นอน 'differentiable' ถ้าเพียงนัยและเนื่องจากเรามีการติดต่อกับฟังก์ชั่นℝ→ℝที่อนุพันธ์มีความโดดเด่นแน่นอนเราสามารถมั่นใจได้ว่าแม้ว่าเราจะได้รับค่าใช้ ' การดำเนินการที่ผิดกฎหมายผลที่ถูกต้อง

ตอนนี้ในทำนองเดียวกันการใช้การสังเกตครั้งที่สองเนื่องจากการโต้ตอบ (มันคือโฮโมมอร์ฟิซึมหรือไม่?) กับฟังก์ชั่นℝ→ℝเรารู้ว่าถ้าเรามีความพึงพอใจว่าฟังก์ชั่นมีซีรี่ส์ Maclaurin ถ้าเราสามารถหาอนุกรมใด ๆ ทั้งหมดหลักการที่ระบุไว้ข้างต้นสามารถนำไปใช้เพื่อทำให้มันเข้มงวด

สำหรับคำถามของคุณเกี่ยวกับองค์ประกอบของฟังก์ชั่นฉันคิดว่ากฎลูกโซ่ให้คำตอบบางส่วน

ฉันไม่แน่ใจว่าจะใช้ ADT แบบ Haskell ได้กี่แบบ แต่ฉันคิดว่ามันจะมีมากมายถ้าไม่ใช่ทั้งหมด ฉันได้ค้นพบหลักฐานที่น่าอัศจรรย์อย่างแท้จริงของความจริงข้อนี้ แต่ส่วนต่างนี้เล็กเกินไปที่จะเก็บไว้ ...

ตอนนี้แน่นอนว่านี่เป็นเพียงวิธีเดียวในการแก้ไขสิ่งที่เกิดขึ้นที่นี่และอาจมีวิธีอื่น ๆ อีกมากมาย

สรุป: TL; DR

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

6

ทฤษฎีประเภทขึ้นอยู่กับและฟังก์ชั่นประเภท 'โดยพลการ'

คำตอบแรกของฉันสำหรับคำถามนี้อยู่ในระดับสูงในแนวคิดและรายละเอียดต่ำและสะท้อนให้เห็นถึงคำถามย่อย 'เกิดอะไรขึ้น?'; คำตอบนี้จะเหมือนกัน แต่มุ่งเน้นไปที่คำถามย่อย 'เราจะได้ฟังก์ชั่นประเภทใดก็ได้หรือไม่'

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

ดังนั้นผลรวม

a + aX + aX² + ...

อาจจะเขียน

Σ[i  ℕ]aX

ซึ่งaเป็นลำดับของจำนวนจริงตัวอย่างเช่น ผลิตภัณฑ์ที่จะเป็นตัวแทนในทำนองเดียวกันกับแทนΠΣ

เมื่อคุณมองจากระยะไกลชนิดของการแสดงออกลักษณะนี้เป็นจำนวนมากเช่น 'พล' ฟังก์ชั่นในX; เรามีข้อ จำกัด สำหรับซีรีย์ที่แสดงออกได้และฟังก์ชั่นการวิเคราะห์ที่เกี่ยวข้อง นี่คือผู้สมัครเพื่อเป็นตัวแทนในทฤษฎีประเภทหรือไม่? อย่างแน่นอน!

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

Curry-Howard และประเภทตาม

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

สำหรับการแนะนำให้แกง-โฮเวิร์ดมอร์ฟสำหรับเพียงแค่พิมพ์แคลคูลัสแลมบ์ดาดูที่นี่ ตัวอย่างเช่นถ้าเราต้องการที่จะพิสูจน์ว่าA ∧ Bเราจะต้องพิสูจน์Aและพิสูจน์B; หลักฐานรวมเป็นเพียงคู่ของการพิสูจน์: หนึ่งสำหรับแต่ละ conjunct

ในการหักตามธรรมชาติ:

Γ  A    Γ  B
Γ  A  B

และในแคลคูลัสแลมบ์ดาที่พิมพ์ง่าย:

Γ  a : A    Γ  b : B
Γ  (a, b) : A × B

การติดต่อที่คล้ายกันมีอยู่สำหรับและประเภทผลรวมและประเภทฟังก์ชั่นและกฎการกำจัดต่างๆ

ข้อเสนอที่ไม่สามารถพิสูจน์ได้ (เป็นเท็จ intuitionistically) สอดคล้องกับประเภทที่ไม่มีใครอยู่

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

พิจารณาเพียงหลักฐานอันสร้างสรรค์สิ่งที่ถือว่าเป็นหลักฐานของ∀x ∈ X.P(x)? เราสามารถคิดว่ามันเป็นฟังก์ชั่นการพิสูจน์โดยใช้เงื่อนไข ( x) เพื่อพิสูจน์ข้อเสนอที่เกี่ยวข้องของพวกเขา ( P(x)) เพื่อให้สมาชิก (พิสูจน์) ประเภท (เรื่อง) ∀x : X.P(x)เป็น 'ฟังก์ชั่นขึ้นอยู่กับ' ซึ่งแต่ละxในให้ระยะเวลาของประเภทXP(x)

เกี่ยวกับ∃x ∈ X.P(x)อะไร เราจำเป็นต้องมีสมาชิกของใด ๆX, ร่วมกับหลักฐานของx P(x)เพื่อให้สมาชิก (พิสูจน์) ประเภท (เรื่อง) ∃x : X.P(x)เป็น 'คู่ขึ้นอยู่กับ': คำที่โดดเด่นxในการร่วมกับระยะเวลาของการพิมพ์XP(x)

โน้ต: ฉันจะใช้

x  X...

สำหรับข้อความจริงเกี่ยวกับสมาชิกของกลุ่มXและ

x : X...

Xสำหรับประเภทการแสดงออกที่สอดคล้องกับปริมาณสากลมากกว่าประเภท ในทำนองเดียวกันสำหรับ

ข้อพิจารณาร่วมกัน: ผลิตภัณฑ์และผลรวม

เช่นเดียวกับการติดต่อกับ Curry-Howard ประเภทที่มีข้อเสนอเรามีการติดต่อเชิง Combinatorial ประเภทพีชคณิตพร้อมตัวเลขและฟังก์ชั่นซึ่งเป็นประเด็นหลักของคำถามนี้ มีความสุขที่สามารถขยายไปยังประเภทตามที่ระบุไว้ข้างต้น!

ฉันจะใช้เครื่องหมายโมดูลัส

|A|

เพื่อเป็นตัวแทน 'ขนาด' ของประเภทAเพื่อให้การโต้ตอบที่ชัดเจนที่ระบุไว้ในคำถามระหว่างประเภทและตัวเลข โปรดทราบว่านี่เป็นแนวคิดนอกทฤษฎี ฉันไม่อ้างว่าจำเป็นต้องมีผู้ให้บริการดังกล่าวในภาษา

ให้เรานับสมาชิกประเภทที่เป็นไปได้ (ลดลงอย่างเต็มที่ตามบัญญัติ)

x : X.P(x)

ซึ่งเป็นประเภทของการทำงานขึ้นอยู่กับการใช้ข้อตกลงxประเภทเงื่อนไขของประเภทX P(x)แต่ละฟังก์ชั่นดังกล่าวจะต้องมีเอาต์พุตสำหรับทุกเทอมของXและเอาต์พุตนี้จะต้องเป็นประเภทเฉพาะ xในแต่ละXครั้งจะมี|P(x)|'ตัวเลือก' ของเอาต์พุต

มุกคือ

|∀x : X.P(x)| = Π[x : X]|P(x)|

ซึ่งแน่นอนไม่ได้ทำให้รู้สึกอย่างมากถ้าXเป็นIO ()แต่ใช้ได้กับประเภทพีชคณิต

ในทำนองเดียวกันคำชนิด

x : X.P(x)

เป็นประเภทของคู่ที่(x, p)มีp : P(x)ให้xในสิ่งใดก็ตามXเราสามารถสร้างคู่ที่เหมาะสมกับสมาชิกคนใดก็ได้P(x)โดยให้|P(x)|'ตัวเลือก'

ดังนั้น

|∃x : X.P(x)| = Σ[x : X]|P(x)|

กับ caveats เดียวกัน

สิ่งนี้แสดงให้เห็นถึงสัญกรณ์ทั่วไปสำหรับประเภทอ้างอิงในทฤษฎีโดยใช้สัญลักษณ์ΠและΣและแน่นอนว่าทฤษฎีจำนวนมากทำให้ความแตกต่างระหว่าง 'สำหรับทุก' และ 'ผลิตภัณฑ์' และระหว่าง 'มี' และ 'ผลรวม' เนื่องจากการโต้ตอบที่กล่าวถึงข้างต้น

เราใกล้เข้ามาแล้ว!

เวกเตอร์: ตัวแทน tuples ขึ้นอยู่กับ

ตอนนี้เราสามารถเข้ารหัสนิพจน์ตัวเลขได้ไหม

Σ[n  ℕ]X

เป็นประเภทการแสดงออก?

ไม่มาก ในขณะที่เราสามารถพิจารณาความหมายของการแสดงออกเช่นXⁿใน Haskell อย่างไม่เป็นทางการซึ่งXเป็นประเภทและnจำนวนธรรมชาติมันเป็นการละเมิดของสัญกรณ์; นี่คือนิพจน์ประเภทที่มีตัวเลข: ไม่ใช่นิพจน์ที่ถูกต้องชัดเจน

ในทางกลับกันเมื่อมีประเภทที่อ้างอิงในรูปภาพประเภทที่มีตัวเลขจะเป็นจุดที่แม่นยำ ในความเป็นจริงสิ่งอันดับขึ้นหรือ 'เวกเตอร์' เป็นตัวอย่างที่มากมักอ้างของวิธีการขึ้นอยู่กับชนิดสามารถให้ความปลอดภัยประเภทระดับปฏิบัติสำหรับการดำเนินงานเช่นการเข้าถึงรายการ เวกเตอร์เป็นเพียงรายการพร้อมกับข้อมูลประเภทระดับเกี่ยวกับความยาวของมัน: Xⁿสิ่งที่เรามีความหลังสำหรับการแสดงออกประเภทเช่น

ในช่วงเวลาของคำตอบนี้ให้

Vec X n

เป็นประเภทของความยาวnเวกเตอร์ของXค่าประเภท

เทคนิคnที่นี่คือแทนที่จะเป็นจำนวนธรรมชาติจริงๆ การแสดงในระบบของจำนวนธรรมชาติ เราสามารถเป็นตัวแทนของจำนวนธรรมชาติ ( Nat) ในสไตล์อาโน่เป็นทั้งศูนย์ ( 0) หรือทายาท ( S) ของจำนวนธรรมชาติอื่นและสำหรับn ∈ ℕผมเขียน˻n˼หมายถึงคำในซึ่งหมายถึงNat nยกตัวอย่างเช่นเป็น˻3˼S (S (S 0))

ถ้าอย่างนั้นเราก็มี

|Vec X ˻n˼| = |X|ⁿ

n ∈ ℕสำหรับการใด ๆ

ประเภท Nat: การส่งเสริมข้อตกลงกับประเภท

ตอนนี้เราสามารถเข้ารหัสการแสดงออกเช่น

Σ[n  ℕ]X

เป็นประเภท นิพจน์นี้โดยเฉพาะจะก่อให้เกิดประเภทที่แน่นอน isomorphic กับประเภทของรายการXตามที่ระบุไว้ในคำถาม (ไม่เพียงแค่นั้น แต่จากมุมมองเชิงทฤษฎีหมวดหมู่ฟังก์ชั่นประเภท - ซึ่งเป็น functor - การXไปที่ประเภทข้างต้นเป็นธรรมชาติ isomorphicไปยังรายการ functor.)

หนึ่งชิ้นสุดท้ายของปริศนาสำหรับฟังก์ชั่น 'arbitrary' คือวิธีการเข้ารหัสสำหรับ

f :   

การแสดงออกที่ชอบ

Σ[n  ℕ]f(n)X

เพื่อให้เราสามารถใช้สัมประสิทธิ์โดยพลการกับอนุกรมกำลัง

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

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

มีหลายวิธีในการแสดงประเภทในระดับคำ ฉันจะใช้สัญกรณ์ Haskellish ในจินตนาการที่นี่กับ*เอกภพประเภทต่างๆ 1

ในทำนองเดียวกันก็มีอย่างน้อยหลายวิธีในการสังเกต ' -elimination' เนื่องจากมีทฤษฎีแบบพึ่งพา ฉันจะใช้สัญลักษณ์การจับคู่รูปแบบ Haskellish

เราต้องการการแมปαจากNatถึง*กับคุณสมบัติ

n  ℕ.|α ˻n˼| = n.

pseudodefinition ต่อไปนี้เพียงพอ

data Zero -- empty type
data Successor a = Z | Suc a -- Successor ≅ Maybe

α : Nat -> *
α 0 = Zero
α (S n) = Successor  n)

ดังนั้นเราจะเห็นว่าการกระทำของαกระจกสะท้อนพฤติกรรมของผู้สืบทอดSทำให้มันเป็นแบบโฮโมมอร์ฟิซึม Successorเป็นฟังก์ชั่นประเภทที่ 'เพิ่มหนึ่ง' กับจำนวนสมาชิกของประเภท; นั่นคือ|Successor a| = 1 + |a|สำหรับaขนาดที่กำหนด

ตัวอย่างเช่นα ˻4˼(ซึ่งก็คือα (S (S (S (S 0))))) คือ

Successor (Successor (Successor (Successor Zero)))

และข้อกำหนดของประเภทนี้คือ

Z
Suc Z
Suc (Suc Z)
Suc (Suc (Suc Z))

ให้องค์ประกอบสี่อย่างกับเรา: |α ˻4˼| = 4.

n ∈ ℕเราก็มีเช่นเดียวกัน

 ˻n˼| = n

ตามความจำเป็น.

  1. ทฤษฎีจำนวนมากต้องการให้สมาชิก*เป็นเพียงตัวแทนของประเภทและการดำเนินการที่มีให้เป็นการทำแผนที่ที่ชัดเจนจากแง่ของประเภท*เพื่อประเภทที่เกี่ยวข้องของพวกเขา ทฤษฎีอื่น ๆ อนุญาตให้ใช้ตัวอักษรเป็นหน่วยงานระดับคำ

ฟังก์ชั่น 'Arbitrary'?

ตอนนี้เรามีเครื่องมือในการแสดงซีรีย์พาวเวอร์ทั่วไปแบบเต็ม!

ซีรี่ย์

Σ[n  ℕ]f(n)X

กลายเป็นประเภท

n : Nat f˼ n) × (Vec X n)

ที่เป็นตัวแทนที่เหมาะสมบางอย่างที่อยู่ในภาษาของฟังก์ชั่น˻f˼ : Nat → Nat fเราสามารถดูได้ดังนี้

|∃n : Nat f˼ n) × (Vec X n)|
    = Σ[n : Nat]|α f˼ n) × (Vec X n)|          (property of  types)
    = Σ[n  ℕ]|α f˼ ˻n˼) × (Vec X ˻n˼)|        (switching Nat for ℕ)
    = Σ[n  ℕ]|α ˻f(n × (Vec X ˻n˼)|           (applying ˻f˼ to ˻n˼)
    = Σ[n  ℕ]|α ˻f(n)˼||Vec X ˻n˼|              (splitting product)
    = Σ[n  ℕ]f(n)|X|ⁿ                           (properties of α and Vec)

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

ฉันไม่ได้ตรวจสอบการโต้ตอบของสิ่งนี้ด้วยเช่นกรณีที่ให้ไว้ในคำถามList X ≅ 1/(1 - X)หรือความรู้สึกที่เป็นไปได้เช่น 'ประเภท' เชิงลบและไม่ใช่จำนวนเต็มอาจมีในบริบทนี้

หวังว่าคำตอบนี้ไปทางเพื่อสำรวจว่าเราสามารถไปกับฟังก์ชันประเภทโดยพลการ

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