ทำไมจึงเป็นสิ่งสำคัญสำหรับฟังก์ชั่นที่จะไม่ระบุชื่อในแลมบ์ดาแคลคูลัส?


19

ฉันกำลังดูการบรรยายของ Jim Weirich หัวข้อ ' Adventures in Functional Programming ' ในการบรรยายครั้งนี้เขาแนะนำแนวคิดของ Y-combinators ซึ่งโดยพื้นฐานแล้วพบว่าจุดคงที่สำหรับฟังก์ชันลำดับที่สูงขึ้น

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

ปัญหาก็คือฟังก์ชั่นไม่สามารถเรียกตัวเองได้อย่างง่าย ๆ เพราะแคลคูลัสแลมบ์ดาไม่อนุญาตให้ใช้ฟังก์ชั่นที่ตั้งชื่อเช่น

n(x,y)=x+Y

ไม่สามารถรับชื่อ ' ' ได้จะต้องกำหนดโดยไม่ระบุชื่อ:n

(x,y)x+y

ทำไมการแคลคูลัสแลมบ์ดาจึงมีฟังก์ชั่นที่ไม่มีชื่อ หลักการใดที่ถูกละเมิดหากมีฟังก์ชั่นที่มีชื่อ? หรือว่าฉันเพิ่งเข้าใจผิดวิดีโอของจิม


4
นี่มันฟังดูไม่สำคัญเลย คุณสามารถกำหนดให้กับตัวแปรnจากนั้นคุณได้ตั้งชื่อให้กับฟังก์ชัน (x,t)x+yn
Yuval Filmus

@YuvalFilmus ใช่คุณสามารถผูกชื่อกับฟังก์ชันได้ ฉันคิดว่าคำถามจริงที่นี่การไขปริศนาทำไม (ในแลมบ์ดาแคลคูลัส) ฟังก์ชั่นเรียกชื่อตัวเองไม่ได้? เหตุใดเราจึงต้องการเทคนิคเช่นตัวดำเนินการ Y เพื่อทำหน้าที่เรียกซ้ำ ฉันหวังว่าคำตอบของฉันด้านล่างช่วย
Jerry101

1
@ Jerry101 เหตุผลทางประวัติศาสตร์สำหรับตัวตนของตัวเองแอพลิเคชันที่เป็นที่แคลคูลัสมีวัตถุประสงค์เพื่อเป็นรากฐานของคณิตศาสตร์และความสามารถในการใช้ตัวเองทำให้รากฐานดังกล่าวไม่สอดคล้องทันที ดังนั้นนี้ไม่สามารถเห็นได้ชัด (ซึ่งเรารู้ว่าตอนนี้สามารถโกง) เป็นคุณลักษณะการออกแบบของλแคลคูลัส λλ
Martin Berger

@MartinBerger กรุณาพูดมากกว่านี้ ไม่สอดคล้องกับเหตุผลในคำตอบของฉัน? หรือด้วยเหตุผลอื่น?
Jerry101

1
@ Jerry101 ไม่สอดคล้องกันในแง่ที่ว่าคุณสามารถพิสูจน์ได้ว่า 0 = 1 ในรากฐานของคณิตศาสตร์ หลังจาก Kleene และร็อสแสดงให้เห็นความไม่สอดคล้องกันของบริสุทธิ์ untyped แคลคูลัส, เพียงแค่พิมพ์λแคลคูลัสได้รับการพัฒนาเป็นทางเลือกที่ไม่ได้ช่วยให้เราสามารถกำหนด combintors แก้ไขจุดเช่นY แต่ถ้าคุณเพิ่มการเรียกซ้ำไปเพียงแค่พิมพ์λแคลคูลัสอีกครั้งกลายเป็นไม่สอดคล้องกันเพราะทุกประเภทโดยอาศัยโปรแกรมที่ไม่ใช่การยกเลิก λλYλ
Martin Berger

คำตอบ:


24

ทฤษฎีบทหลักเกี่ยวกับปัญหานี้เกิดจากการเป็นนักคณิตศาสตร์ชาวอังกฤษจากจุดสิ้นสุดของศตวรรษที่ 16 ที่เรียกว่าวิลเลียมเช็คสเปียร์ บทความที่รู้จักกันดีที่สุดของเขาในเรื่องนี้มีชื่อว่า " Romeo and Juliet " ถูกตีพิมพ์ในปี ค.ศ. 1597 แม้ว่างานวิจัยได้ดำเนินการเมื่อไม่กี่ปีก่อนได้รับแรงบันดาลใจ

ผลลัพธ์หลักของเขาระบุไว้ในAct II ฉากที่สองเป็นทฤษฎีบทที่มีชื่อเสียง :

ชื่ออะไร? สิ่งที่เราเรียกว่ากุหลาบ
โดยชื่ออื่นจะมีกลิ่นหอมหวาน

ทฤษฎีบทนี้สามารถเข้าใจได้โดยสัญชาตญาณว่า "ชื่อไม่ได้มีส่วนช่วยในความหมาย"

ส่วนใหญ่ของบทความนี้อุทิศให้กับตัวอย่างที่สนับสนุนทฤษฎีบทและแสดงให้เห็นว่าแม้ว่าชื่อจะไม่มีความหมายก็ตาม แต่พวกเขาก็เป็นต้นเหตุของปัญหาที่ไม่รู้จบ

ตามที่ Shakespeare ชี้ให้เห็นชื่อสามารถเปลี่ยนแปลงได้โดยไม่เปลี่ยนความหมายการดำเนินการที่เรียกว่า -conversionαโดยAlonzo Churchและผู้ติดตามของเขา ดังนั้นจึงไม่จำเป็นที่จะต้องกำหนดว่าชื่อใดจะแสดงแทนได้ง่าย สิ่งนี้ทำให้เกิดปัญหาที่หลากหลายเช่นการพัฒนาแนวคิดของสภาพแวดล้อมที่ระบุการเชื่อมโยงความหมายของชื่อและกฎที่จะรู้ว่าสภาพแวดล้อมปัจจุบันคืออะไรเมื่อคุณพยายามกำหนดความหมายที่เกี่ยวข้องกับชื่อ นักวิทยาศาสตร์คอมพิวเตอร์ที่งงงวยอยู่ครู่หนึ่งก่อให้เกิดปัญหาทางเทคนิคเช่นปัญหา Funarg ที่น่าอับอาย. สภาพแวดล้อมยังคงเป็นปัญหาในภาษาการเขียนโปรแกรมยอดนิยมบางอย่าง แต่โดยทั่วไปแล้วถือว่าไม่ปลอดภัยทางร่างกายที่จะเฉพาะเจาะจงมากขึ้นเกือบจะเป็นอันตรายถึงตายเป็นตัวอย่างที่ทำงานโดย Shakespeare ในกระดาษของเขา

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

นี้ผลที่สำคัญโดยแสดงให้เห็นว่าเช็คสเปียร์ยังว่าวิทยาศาสตร์นั้นก็แยกจากเวทมนตร์และศาสนาที่เป็นอยู่หรือความหมายอาจจะมีชื่อที่แท้จริง

บทสรุปของทั้งหมดนี้คืองานทางทฤษฎีมักจะสะดวกกว่าที่จะไม่เข้าไปยุ่งกับชื่อแม้ว่ามันอาจจะง่ายกว่าสำหรับงานภาคปฏิบัติและชีวิตประจำวัน แต่จำไว้ว่าไม่ใช่ทุกคนที่เรียกว่าแม่คือแม่ของคุณ

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

ดอกกุหลาบเป็นดอกกุหลาบเป็นดอกกุหลาบเป็นดอกกุหลาบ

ตีพิมพ์ในปี 2456 ในการสื่อสารสั้น ๆ เรื่อง "ศักดิ์สิทธิ์เอมิลี่"


3
หมายเหตุเพิ่มเติม: ในช่วงทศวรรษที่ผ่านมา "กุหลาบ" (ในวิทยาการคอมพิวเตอร์) ส่วนใหญ่ถูกแทนที่ด้วย "foobar" (และบางส่วนของมัน) เป็นตัวอย่างที่เป็นที่ยอมรับสำหรับชื่อที่ดีเหมือนกัน เห็นได้ชัดว่าการตั้งค่านี้ได้รับการแนะนำให้รู้จักกับวิศวกรรถไฟอเมริกัน
FrankW

ที่กล่าวว่าชื่อบัญญัติสำหรับแนวคิดที่ใช้บ่อยมีความสำคัญต่อการสื่อสารที่มีประสิทธิภาพ
Raphael

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

10

ผมอยากที่จะร่วมมีความคิดเห็นที่แตกต่างจากบรรดา @babou และ @YuvalFilmus นี้: มันเป็นสิ่งสำคัญสำหรับบริสุทธิ์λแคลคูลัสจะมีฟังก์ชั่นที่ไม่ระบุชื่อ ปัญหาของการมีฟังก์ชั่นที่ตั้งชื่อเท่านั้นคือคุณต้องรู้ล่วงหน้าว่าจะต้องใช้ชื่อกี่ชื่อ แต่ในความบริสุทธิ์λแคลคูลัสคุณไม่มีเบื้องต้นผูกพันอยู่กับจำนวนของฟังก์ชั่นที่ใช้ (คิดเกี่ยวกับการเรียกซ้ำ) เพื่อให้คุณใช้งานอย่างใดอย่างหนึ่ง (1) ฟังก์ชั่นที่ไม่ระบุชื่อหรือ (2) คุณไปπแคลคูลัสเส้นทางและให้สด name combinator ( νx.Pในπ -calculus) ที่ให้ชื่อที่สดใหม่ ณ รันไทม์

เหตุผลบริสุทธิ์λแคลคูลัสไม่ได้มีกลไกที่ชัดเจนสำหรับการเรียกซ้ำคือว่าบริสุทธิ์λแคลคูลัสเดิมทีตั้งใจจะเป็นรากฐานของคณิตศาสตร์โดยคริสตจักรกและการเรียกซ้ำทำให้เช่นรากฐานไม่มั่นคงนิด ดังนั้นจึงมาเป็นช็อตเมื่อสตีเฟ่น Kleene และเจร็อสพบว่าบริสุทธิ์λแคลคูลัสไม่เหมาะสมเป็นรากฐานของคณิตศาสตร์ (กKleene-ร็อส Paradox ) Haskell Curry วิเคราะห์ Kleene-Rosser บุคคลที่ผิดธรรมดาและตระหนักว่าสาระสำคัญของมันคือสิ่งที่เรารู้ในฐานะ Y-Combinator

letf=MinN(λf.N)Mλ


1
ฉันคิดว่า OP ต้องการความสามารถในการตั้งชื่อฟังก์ชั่นไม่ใช่เพื่อห้ามคนที่ไม่ระบุชื่อ สิ่งนี้กล่าวว่าฉันจะคิดว่าความต้องการของ calcul-แคลคูลัสเกี่ยวกับความต้องการฟังก์ชั่นที่ไม่ระบุชื่อจะแสดงเป็นภาษาเช่น Lisp / Scheme หรือ ML ในกรณีของ Lisp / Scheme, meta-circularity ของผู้ประเมินควรทำให้สามารถสร้างชื่อใหม่ได้ตามต้องการถึงแม้ว่าฉันไม่แน่ใจว่าฉันจะต้องการมันในระบบที่เป็นทางการ การใช้ฟังก์ชันจำนวนไม่ จำกัด ไม่จำเป็นต้องเป็นปัญหาเมื่อการเรียกซ้ำอนุญาตให้ใช้ชื่อที่ใช้แล้วในเครื่องซ้ำได้
babou

λλ

บรรทัดสุดท้ายควรอ่าน (lambda f. N) M หรือไม่
Joe the Person

@JoethePerson ใช่เห็นดี แก้ไขแล้ว. ขอบคุณ
Martin Berger

4

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

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

ในแลมบ์ดาแคลคูลัสจุดคือชื่อไม่จำเป็นต้องอธิบายอัลกอริทึมในระดับพื้นฐานที่สุด


4

ฉันสนุกกับ 3 คำตอบที่นี่จนถึงที่สุดโดยเฉพาะอย่างยิ่ง @ วิเคราะห์ Babakes ของ Shakespearen - แต่พวกเขาไม่ได้อธิบายสิ่งที่ฉันคิดว่าเป็นสาระสำคัญของคำถาม

calcul-แคลคูลัสทำการผูกชื่อกับฟังก์ชันเมื่อใดก็ตามที่คุณใช้ฟังก์ชันกับฟังก์ชัน ปัญหาไม่ได้ขาดชื่อ

"ปัญหาคือฟังก์ชั่นไม่สามารถเรียกตัวเองได้อย่างง่ายดาย" โดยอ้างถึงชื่อของมัน

(ใน Pure Lisp ชื่อ -> function binding ไม่ได้อยู่ในขอบเขตภายในเนื้อความของฟังก์ชั่นสำหรับฟังก์ชั่นที่จะเรียกตัวเองด้วยชื่อของฟังก์ชั่นจะต้องอ้างถึงสภาพแวดล้อมที่หมายถึงฟังก์ชั่น Pure Lisp ไม่มี โครงสร้างข้อมูลแบบวนรอบ Impure Lisp ทำโดยการแปลงสภาพแวดล้อมที่ฟังก์ชันอ้างถึง)

ดังที่ @MartinBerger ชี้ให้เห็นว่าเหตุผลทางประวัติศาสตร์ที่ calcul-แคลคูลัสไม่อนุญาตให้ฟังก์ชั่นเรียกชื่อตัวเองนั้นเป็นความพยายามที่จะตัดความขัดแย้งของ Curryเมื่อพยายามใช้ calcul-แคลคูลัสเป็นพื้นฐานของคณิตศาสตร์รวมถึงตรรกะเชิงนิรนัย สิ่งนี้ไม่ทำงานเนื่องจากเทคนิคอย่าง Y combinator อนุญาตการเรียกซ้ำแม้ว่าจะไม่มีการอ้างอิงด้วยตนเองก็ตาม

จากวิกิพีเดีย:

ถ้าเราสามารถกำหนดฟังก์ชั่นแล้วr = (λ.x x x ⇒ y)r r = (r r ⇒ y)

หากr rเป็นจริงแล้วyเป็นจริง หากr rเป็นเท็จก็r r ⇒ yเป็นจริงซึ่งเป็นความขัดแย้ง ดังนั้นจึงyเป็นจริงและyสามารถเป็นคำสั่งใด ๆ คำสั่งใด ๆ อาจได้รับการพิสูจน์จริง

r rเป็นการคำนวณที่ไม่สิ้นสุด ถือเป็นตรรกะr rคือการแสดงออกสำหรับค่าที่ไม่มีอยู่


λ.x xxxxx

@RohanPrabhu λ.x x xแปลเป็นเสียงกระเพื่อมเป็น(lambda (x) (x x))และ JavaScript เป็นfunction (x) {return x(x);}ที่ x⇒yวิธีการเกี่ยวกับการเช่นเดียวกับx implies y (NOT x) OR yดูen.wikipedia.org/wiki/Lambda_calculus
Jerry101

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